From 7cd26a48fa6c7d913fd23c79dd1bfdc0a74f5f70 Mon Sep 17 00:00:00 2001 From: lucha <lucha@paranoici.org> Date: Sun, 9 Dec 2018 12:18:20 -0800 Subject: [PATCH] [auto] plugin: nextgen-gallery 3.1.1 --- .../plugins/nextgen-gallery/changelog.txt | 46 + .../plugins/nextgen-gallery/composer.json | 2 +- .../nextgen-gallery/freemius/LICENSE.txt | 906 +- .../nextgen-gallery/freemius/README.md | 253 + .../freemius/assets/css/admin/account.css | 2 +- .../freemius/assets/css/admin/account.min.css | 2 +- .../freemius/assets/css/admin/add-ons.min.css | 2 +- .../freemius/assets/css/admin/affiliation.css | 1 + .../assets/css/admin/affiliation.min.css | 1 + .../freemius/assets/css/admin/checkout.css | 1 + .../assets/css/admin/checkout.min.css | 1 + .../freemius/assets/css/admin/common.css | 3 +- .../freemius/assets/css/admin/common.min.css | 2 +- .../freemius/assets/css/admin/connect.css | 97 +- .../freemius/assets/css/admin/connect.min.css | 2 +- .../css/admin/deactivation-feedback.min.css | 2 +- .../freemius/assets/css/admin/debug.css | 2 +- .../freemius/assets/css/admin/debug.min.css | 2 +- .../assets/css/admin/dialog-boxes.css | 44 +- .../assets/css/admin/dialog-boxes.min.css | 2 +- .../assets/css/admin/gdpr-optin-notice.css | 1 + .../css/admin/gdpr-optin-notice.min.css | 1 + .../freemius/assets/css/admin/index.php | 3 + .../css/admin/license-activation.min.css | 2 +- .../freemius/assets/css/customizer.css | 1 + .../freemius/assets/css/customizer.min.css | 1 + .../freemius/assets/css/index.php | 3 + .../freemius/assets/img/index.php | 3 + .../freemius/assets/img/theme-icon.png | Bin 0 -> 11237 bytes .../nextgen-gallery/freemius/assets/index.php | 3 + .../freemius/assets/js/index.php | 3 + .../freemius/assets/scss/_colors.scss | 16 +- .../freemius/assets/scss/_mixins.scss | 83 +- .../freemius/assets/scss/_vars.scss | 3 +- .../assets/scss/admin/_ajax-loader.scss | 49 + .../assets/scss/admin/_auto-install.scss | 33 + .../assets/scss/admin/_gdpr-consent.scss | 81 + .../scss/admin/_license-activation.scss | 40 + .../scss/admin/_license-key-resend.scss | 84 +- .../assets/scss/admin/_modal-common.scss | 39 + .../assets/scss/admin/_multisite-options.scss | 40 + .../freemius/assets/scss/admin/_themes.scss | 21 + .../freemius/assets/scss/admin/_tooltip.scss | 66 + .../freemius/assets/scss/admin/account.scss | 62 +- .../assets/scss/admin/affiliation.scss | 97 + .../freemius/assets/scss/admin/checkout.scss | 5 + .../freemius/assets/scss/admin/common.scss | 376 +- .../freemius/assets/scss/admin/connect.scss | 77 + .../freemius/assets/scss/admin/debug.scss | 44 + .../assets/scss/admin/dialog-boxes.scss | 5 +- .../assets/scss/admin/gdpr-optin-notice.scss | 17 + .../freemius/assets/scss/admin/index.php | 3 + .../freemius/assets/scss/customizer.scss | 125 + .../freemius/assets/scss/index.php | 3 + .../nextgen-gallery/freemius/composer.json | 10 + .../nextgen-gallery/freemius/config.php | 681 +- .../nextgen-gallery/freemius/gulpfile.js | 167 + .../nextgen-gallery/freemius/gulpfile.min.js | 1 + .../includes/class-freemius-abstract.php | 88 +- .../freemius/includes/class-freemius.php | 32313 ++++++++++------ .../includes/class-fs-admin-notices.php | 321 + .../freemius/includes/class-fs-api.php | 1171 +- .../freemius/includes/class-fs-logger.php | 516 +- .../freemius/includes/class-fs-options.php | 431 + .../includes/class-fs-plugin-updater.php | 1449 +- .../freemius/includes/class-fs-security.php | 10 +- .../freemius/includes/class-fs-storage.php | 524 + .../freemius/includes/class-fs-user-lock.php | 126 + .../class-fs-customizer-support-section.php | 102 + .../class-fs-customizer-upsell-control.php | 157 + .../freemius/includes/customizer/index.php | 3 + .../debug/class-fs-debug-bar-panel.php | 12 +- .../includes/debug/debug-bar-start.php | 6 +- .../freemius/includes/debug/index.php | 3 + .../entities/class-fs-affiliate-terms.php | 128 + .../includes/entities/class-fs-affiliate.php | 84 + .../includes/entities/class-fs-billing.php | 2 +- .../includes/entities/class-fs-entity.php | 8 +- .../includes/entities/class-fs-payment.php | 186 +- .../entities/class-fs-plugin-info.php | 2 +- .../entities/class-fs-plugin-license.php | 483 +- .../entities/class-fs-plugin-plan.php | 2 +- .../includes/entities/class-fs-plugin-tag.php | 32 +- .../includes/entities/class-fs-plugin.php | 192 +- .../includes/entities/class-fs-pricing.php | 2 +- .../entities/class-fs-scope-entity.php | 2 +- .../includes/entities/class-fs-site.php | 374 +- .../entities/class-fs-subscription.php | 2 +- .../includes/entities/class-fs-user.php | 2 +- .../freemius/includes/entities/index.php | 3 + .../freemius/includes/fs-core-functions.php | 1803 +- .../includes/fs-essential-functions.php | 910 +- .../includes/fs-plugin-info-dialog.php | 2043 +- .../freemius/includes/i18n.php | 985 +- .../freemius/includes/index.php | 3 + .../freemius/includes/l10n.php | 48 + .../managers/class-fs-admin-menu-manager.php | 518 +- .../class-fs-admin-notice-manager.php | 709 +- .../managers/class-fs-cache-manager.php | 561 +- .../managers/class-fs-gdpr-manager.php | 202 + .../managers/class-fs-key-value-storage.php | 104 +- .../managers/class-fs-license-manager.php | 2 +- .../managers/class-fs-option-manager.php | 784 +- .../managers/class-fs-plan-manager.php | 2 +- .../managers/class-fs-plugin-manager.php | 372 +- .../freemius/includes/managers/index.php | 3 + .../includes/sdk/Exceptions/index.php | 3 + .../freemius/includes/sdk/FreemiusBase.php | 51 +- .../includes/sdk/FreemiusWordPress.php | 704 + .../freemius/includes/sdk/index.php | 3 + .../fs-essential-functions-1.1.7.1.php | 6 +- .../freemius/includes/supplements/index.php | 3 + .../nextgen-gallery/freemius/index.php | 3 + .../freemius/languages/freemius-da_DK.mo | Bin 25892 -> 243 bytes .../freemius/languages/freemius-da_DK.po | 1669 +- .../freemius/languages/freemius-en.mo | Bin 34518 -> 48279 bytes .../freemius/languages/freemius-en.po | 2935 +- .../freemius/languages/freemius-es_ES.mo | Bin 0 -> 51453 bytes .../freemius/languages/freemius-es_ES.po | 2299 ++ .../freemius/languages/freemius-fr_FR.mo | Bin 0 -> 52553 bytes .../freemius/languages/freemius-fr_FR.po | 2299 ++ .../freemius/languages/freemius-he_IL.mo | Bin 0 -> 51365 bytes .../freemius/languages/freemius-he_IL.po | 2300 ++ .../freemius/languages/freemius-it_IT.mo | Bin 37308 -> 50788 bytes .../freemius/languages/freemius-it_IT.po | 3174 +- .../freemius/languages/freemius-ja_JP.mo | Bin 0 -> 57224 bytes .../freemius/languages/freemius-ja_JP.po | 2302 ++ .../freemius/languages/freemius-nl_NL.mo | Bin 0 -> 50763 bytes .../freemius/languages/freemius-nl_NL.po | 2299 ++ .../freemius/languages/freemius-ru_RU.mo | Bin 0 -> 65758 bytes .../freemius/languages/freemius-ru_RU.po | 2298 ++ .../freemius/languages/freemius.pot | 2275 +- .../freemius/languages/index.php | 3 + .../nextgen-gallery/freemius/package.json | 27 + .../nextgen-gallery/freemius/require.php | 10 +- .../nextgen-gallery/freemius/start.php | 243 +- .../freemius/templates/account.php | 1455 +- .../freemius/templates/account/billing.php | 431 + .../freemius/templates/account/index.php | 3 + .../partials/activate-license-button.php | 54 + .../templates/account/partials/addon.php | 345 + .../partials/deactivate-license-button.php | 36 + .../templates/account/partials/index.php | 3 + .../templates/account/partials/site.php | 331 + .../freemius/templates/account/payments.php | 59 + .../freemius/templates/add-ons.php | 121 +- .../templates/add-trial-to-pricing.php | 8 +- .../freemius/templates/admin-notice.php | 8 +- .../freemius/templates/ajax-loader.php | 1 + .../freemius/templates/auto-installation.php | 249 + .../freemius/templates/checkout.php | 197 +- .../freemius/templates/connect.php | 999 +- .../freemius/templates/contact.php | 80 +- .../freemius/templates/debug.php | 1057 +- .../freemius/templates/debug/api-calls.php | 51 +- .../freemius/templates/debug/index.php | 3 + .../freemius/templates/debug/logger.php | 24 +- .../templates/debug/plugins-themes-sync.php | 46 +- .../templates/debug/scheduled-crons.php | 135 +- .../freemius/templates/email.php | 8 +- .../freemius/templates/firewall-issues-js.php | 37 +- .../freemius/templates/forms/affiliation.php | 486 + .../templates/forms/deactivation/contact.php | 16 +- .../templates/forms/deactivation/form.php | 135 +- .../templates/forms/deactivation/index.php | 3 + .../forms/deactivation/retry-skip.php | 22 +- .../freemius/templates/forms/index.php | 3 + .../templates/forms/license-activation.php | 577 +- .../freemius/templates/forms/optout.php | 370 +- .../premium-versions-upgrade-handler.php | 183 + .../premium-versions-upgrade-metadata.php | 29 + .../freemius/templates/forms/resend-key.php | 200 +- .../freemius/templates/forms/trial-start.php | 45 +- .../freemius/templates/gdpr-optin-js.php | 66 + .../freemius/templates/index.php | 3 + .../freemius/templates/js/index.php | 3 + .../templates/js/jquery.content-change.php | 58 + .../templates/js/open-license-activation.php | 37 + .../templates/js/style-premium-theme.php | 45 + .../templates/partials/network-activation.php | 81 + .../freemius/templates/plugin-icon.php | 115 +- .../templates/plugin-info/description.php | 11 +- .../templates/plugin-info/features.php | 49 +- .../freemius/templates/plugin-info/index.php | 3 + .../templates/plugin-info/screenshots.php | 9 +- .../freemius/templates/powered-by.php | 27 +- .../freemius/templates/pricing.php | 293 +- .../templates/secure-https-header.php | 39 + .../templates/sticky-admin-notice-js.php | 19 +- .../freemius/templates/tabs-capture-js.php | 63 + .../freemius/templates/tabs.php | 186 + .../plugins/nextgen-gallery/nggallery.php | 53 +- .../non_pope/class.nextgen_settings.php | 18 +- .../class.nextgen_shortcode_manager.php | 7 +- .../non_pope/class.photocrati_installer.php | 5 +- .../class.photocrati_resource_manager.php | 5 +- .../class.photocrati_settings_manager.php | 31 +- .../pope/lib/class.base_module.php | 8 + .../pope/lib/class.component.php | 9 +- .../pope/lib/class.component_registry.php | 29 +- .../pope/lib/class.extensibleobject.php | 17 +- .../pope/lib/class.pope_cache.php | 2 +- .../modules/ajax/package.module.ajax.php | 2 +- .../attach_to_post/module.attach_to_post.php | 153 +- .../package.module.attach_to_post.php | 38 +- .../attach_to_post/static/attach_to_post.css | 4 + .../static/attach_to_post.min.css | 2 +- .../static/attach_to_post_dialog.css | 55 +- .../static/attach_to_post_dialog.min.css | 2 +- .../attach_to_post/static/display_tab.js | 97 +- .../attach_to_post/static/display_tab.min.js | 2 +- .../attach_to_post/static/iframely.min.css | 2 +- .../ngg_attach_to_post_tinymce_plugin.css | 53 +- .../ngg_attach_to_post_tinymce_plugin.js | 122 +- .../ngg_attach_to_post_tinymce_plugin.min.css | 2 +- .../ngg_attach_to_post_tinymce_plugin.min.js | 2 +- .../templates/display_settings_form.php | 6 +- .../templates/tinymce_placeholder.php | 19 +- .../modules/cache/module.cache.php | 3 + .../modules/cache/package.module.cache.php | 4 + .../modules/datamapper/module.datamapper.php | 4 +- .../datamapper/package.module.datamapper.php | 128 +- .../package.module.dynamic_stylesheet.php | 6 +- .../package.module.dynamic_thumbnails.php | 6 +- .../package.module.frame_communication.php | 6 +- .../modules/fs/package.module.fs.php | 38 +- .../modules/i18n/lang/nggallery-da_DK.po | 4 +- .../modules/i18n/lang/nggallery-sv_SE.po | 6 +- .../modules/i18n/lang/nggallery.po | 4 +- .../modules/i18n/module.i18n.php | 6 +- .../modules/imagify/module.imagify.php | 10 +- .../imagify/package.module.imagify.php | 2 +- .../lightbox/package.module.lightbox.php | 14 +- .../fancybox/jquery.fancybox-1.3.4.min.css | 2 +- .../lightbox/static/shutter/shutter.min.css | 2 +- .../static/shutter_reloaded/shutter.min.css | 2 +- .../nextgen_simple_lightbox_init.js | 14 + .../nextgen_simple_lightbox_init.min.js | 1 + .../static/simplelightbox/simple-lightbox.js | 581 + .../simplelightbox/simple-lightbox.min.js | 1 + .../static/simplelightbox/simplelightbox.css | 298 + .../simplelightbox/simplelightbox.min.css | 1 + .../modules/mvc/module.mvc.php | 2 +- .../modules/mvc/package.module.mvc.php | 42 +- .../module.nextgen_addgallery_page.php | 56 +- ...package.module.nextgen_addgallery_page.php | 2 +- .../jquery.filetree/jquery.filetree.min.css | 2 +- .../static/media-library-import.min.css | 2 +- .../css/jquery.plupload.queue.min.css | 2 +- .../static/styles.min.css | 2 +- .../templates/upload_images.php | 1 + .../nextgen_admin/module.nextgen_admin.php | 230 +- .../package.module.nextgen_admin.php | 221 +- .../bootstrap/css/bootstrap-theme.min.css | 2 +- .../bootstrap/css/bootstrap-tooltip.css | 1 + .../bootstrap/css/bootstrap-tooltip.min.css | 2 +- .../static/bootstrap/css/bootstrap.min.css | 2 +- .../static/gritter/css/gritter.css | 2 +- .../static/gritter/css/gritter.min.css | 2 +- .../jquery-ui/jquery-ui-1.10.4.custom.min.css | 2 +- .../jquery-ui/jquery-ui-1.9.1.custom.min.css | 2 +- .../static/nextgen_admin_page.css | 29 +- .../static/nextgen_admin_page.js | 11 + .../static/nextgen_admin_page.min.css | 2 +- .../static/nextgen_admin_page.min.js | 2 +- .../nextgen_admin/static/nextgen_wizards.css | 3 +- .../nextgen_admin/static/nextgen_wizards.js | 28 +- .../static/nextgen_wizards.min.css | 2 +- .../static/nextgen_wizards.min.js | 2 +- .../static/ngg_progressbar.min.css | 2 +- .../static/select2/select2.min.css | 2 +- .../nextgen_admin/static/tourist/tourist.css | 4 +- .../static/tourist/tourist.min.css | 2 +- .../templates/requirement_notice.php | 6 + .../module.nextgen_basic_album.php | 24 +- .../package.module.nextgen_basic_album.php | 38 +- .../static/breadcrumbs.css | 4 + .../static/breadcrumbs.min.css | 2 +- .../static/nextgen_basic_album.css | 125 + .../static/nextgen_basic_album.min.css | 2 +- .../templates/compact/default-view.php | 51 + .../templates/extended/default-view.php | 39 + .../module.nextgen_basic_gallery.php | 28 +- .../package.module.nextgen_basic_gallery.php | 113 +- .../static/slideshow/jquery.waitforimages.js | 12 +- .../static/slideshow/ngg_basic_slideshow.css | 115 + .../static/slideshow/ngg_basic_slideshow.js | 29 + .../slideshow/ngg_basic_slideshow.min.css | 1 + .../slideshow/ngg_basic_slideshow.min.js | 1 + .../static/slideshow/slick/ajax-loader.gif | Bin 0 -> 4178 bytes .../static/slideshow/slick/config.rb | 10 + .../static/slideshow/slick/fonts/slick.eot | Bin 0 -> 2048 bytes .../static/slideshow/slick/fonts/slick.svg | 14 + .../static/slideshow/slick/fonts/slick.ttf | Bin 0 -> 1892 bytes .../static/slideshow/slick/fonts/slick.woff | Bin 0 -> 1380 bytes .../static/slideshow/slick/slick-theme.css | 204 + .../static/slideshow/slick/slick-theme.less | 168 + .../slideshow/slick/slick-theme.min.css | 1 + .../static/slideshow/slick/slick-theme.scss | 194 + .../static/slideshow/slick/slick.css | 119 + .../static/slideshow/slick/slick.js | 3011 ++ .../static/slideshow/slick/slick.less | 100 + .../static/slideshow/slick/slick.min.css | 1 + .../static/slideshow/slick/slick.min.js | 2 + .../static/slideshow/slick/slick.scss | 100 + .../thumbnails/nextgen_basic_thumbnails.css | 215 +- .../nextgen_basic_thumbnails.min.css | 2 +- .../templates/slideshow/index.php | 127 +- .../templates/thumbnails/default-view.php | 92 + .../module.nextgen_basic_imagebrowser.php | 10 +- ...kage.module.nextgen_basic_imagebrowser.php | 12 +- .../static/style.css | 101 +- .../static/style.min.css | 2 +- .../templates/default-view.php | 71 + .../module.nextgen_basic_singlepic.php | 6 +- ...package.module.nextgen_basic_singlepic.php | 11 +- .../static/nextgen_basic_singlepic.min.css | 2 +- .../module.nextgen_basic_tagcloud.php | 3 +- .../package.module.nextgen_basic_tagcloud.php | 12 +- .../static/nextgen_basic_tagcloud.min.css | 2 +- .../module.nextgen_basic_templates.php | 2 +- ...package.module.nextgen_basic_templates.php | 16 +- .../nextgen_block/module.nextgen_block.php | 60 + .../package.module.nextgen_block.php | 1 + .../nextgen_block/static/build/block.min.js | 15 + .../static/build/block.min.js.map | 1 + .../modules/nextgen_block/static/editor.css | 136 + .../nextgen_block/static/editor.min.css | 1 + .../nextgen_block/static/src/block.min.js | 58 + .../nextgen_block/static/src/edit.min.js | 74 + .../nextgen_block/static/src/icons.min.js | 8 + .../nextgen_data/module.nextgen_data.php | 112 +- .../package.module.nextgen_data.php | 426 +- .../pel-0.9.6/class.exif_writer.php | 151 +- .../module.nextgen_gallery_display.php | 172 +- ...package.module.nextgen_gallery_display.php | 339 +- .../static/jquery.waitforimages.js | 135 + .../static/jquery.waitforimages.min.js | 1 + .../nextgen_gallery_related_images.min.css | 2 +- .../module.nextgen_other_options.php | 2 +- .../package.module.nextgen_other_options.php | 77 +- .../static/nextgen_settings_page.min.css | 2 +- .../module.nextgen_pagination.php | 2 +- .../package.module.nextgen_pagination.php | 1 + .../nextgen_pagination/static/style.css | 54 +- .../nextgen_pagination/static/style.min.css | 2 +- .../package.module.nextgen_pro_upgrade.php | 2 +- .../nextgen_pro_upgrade/static/style.min.css | 2 +- .../module.nextgen_settings.php | 30 +- .../package.module.nextgen_xmlrpc.php | 91 +- .../modules/ngglegacy/admin/admin.php | 21 +- .../modules/ngglegacy/admin/album.php | 62 +- .../admin/css/jquery.ui.tabs.min.css | 2 +- .../admin/css/nggColorPicker.min.css | 2 +- .../ngglegacy/admin/css/nggSorter.min.css | 2 +- .../modules/ngglegacy/admin/css/nggadmin.css | 34 +- .../ngglegacy/admin/css/nggadmin.min.css | 2 +- .../ngglegacy/admin/css/tags-admin.min.css | 2 +- .../modules/ngglegacy/admin/functions.php | 34 +- .../admin/js/Jcrop/css/jquery.Jcrop.min.css | 2 +- .../modules/ngglegacy/admin/manage-sort.php | 3 + .../modules/ngglegacy/admin/manage.php | 81 +- .../modules/ngglegacy/admin/media-upload.php | 2 +- .../modules/ngglegacy/admin/overview.php | 108 +- .../modules/ngglegacy/lib/core.php | 2 +- .../ngglegacy/lib/gd.thumbnail.inc.php | 9 +- .../modules/ngglegacy/lib/imagemagick.inc.php | 10 +- .../modules/ngglegacy/lib/media-rss.php | 4 +- .../modules/ngglegacy/lib/meta.php | 34 +- .../modules/ngglegacy/lib/multisite.php | 15 +- .../modules/ngglegacy/lib/ngg-db.php | 167 +- .../modules/ngglegacy/lib/rewrite.php | 10 +- .../modules/ngglegacy/lib/sitemap.php | 20 +- .../modules/ngglegacy/lib/tags.php | 2 +- .../modules/ngglegacy/module.ngglegacy.php | 2 +- .../ngglegacy/static/Black_Minimalism.min.css | 2 +- .../modules/ngglegacy/static/default.min.css | 2 +- .../ngglegacy/static/hovereffect.min.css | 2 +- .../ngglegacy/static/ngg_dkret3.min.css | 2 +- .../modules/ngglegacy/static/ngg_k2.min.css | 2 +- .../ngglegacy/static/ngg_shadow.min.css | 2 +- .../ngglegacy/static/ngg_shadow2.min.css | 2 +- .../modules/ngglegacy/static/overview.min.css | 2 +- .../modules/router/package.module.router.php | 56 +- .../security/package.module.security.php | 8 + .../module.third_party_compat.php | 35 +- .../validation/package.module.validation.php | 23 +- .../modules/widget/package.module.widget.php | 24 +- .../modules/widget/static/widgets.min.css | 2 +- .../module.wordpress_routing.php | 2 +- .../package.module.wordpress_routing.php | 7 + .../modules/wpcli/module.wpcli.php | 11 +- .../product.photocrati_nextgen.php | 1 + wp-content/plugins/nextgen-gallery/readme.txt | 52 +- 394 files changed, 69997 insertions(+), 25813 deletions(-) create mode 100644 wp-content/plugins/nextgen-gallery/freemius/README.md create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.min.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.min.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.min.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.min.css create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/css/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/img/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/img/theme-icon.png create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/js/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_ajax-loader.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_auto-install.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_gdpr-consent.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_multisite-options.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_themes.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_tooltip.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/affiliation.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/checkout.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/gdpr-optin-notice.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/customizer.scss create mode 100644 wp-content/plugins/nextgen-gallery/freemius/assets/scss/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/composer.json create mode 100644 wp-content/plugins/nextgen-gallery/freemius/gulpfile.js create mode 100644 wp-content/plugins/nextgen-gallery/freemius/gulpfile.min.js create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-admin-notices.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-options.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-storage.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-user-lock.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-support-section.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-upsell-control.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/customizer/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/debug/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate-terms.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/entities/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/l10n.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-gdpr-manager.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/managers/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/sdk/Exceptions/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusWordPress.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/sdk/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/includes/supplements/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.mo create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.po create mode 100644 wp-content/plugins/nextgen-gallery/freemius/languages/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/package.json create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/billing.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/activate-license-button.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/addon.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/deactivate-license-button.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/site.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/account/payments.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/ajax-loader.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/auto-installation.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/debug/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/forms/affiliation.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/forms/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-handler.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-metadata.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/gdpr-optin-js.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/js/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/js/jquery.content-change.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/js/open-license-activation.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/js/style-premium-theme.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/partials/network-activation.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/index.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/secure-https-header.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/tabs-capture-js.php create mode 100644 wp-content/plugins/nextgen-gallery/freemius/templates/tabs.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.min.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/templates/requirement_notice.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact/default-view.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended/default-view.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/ajax-loader.gif create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/config.rb create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.eot create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.svg create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.ttf create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.woff create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.less create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.min.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.scss create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.less create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.scss create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/default-view.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/package.module.nextgen_block.php create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js.map create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/block.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/edit.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/icons.min.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.js create mode 100644 wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.min.js diff --git a/wp-content/plugins/nextgen-gallery/changelog.txt b/wp-content/plugins/nextgen-gallery/changelog.txt index f77df021e..a10c7c44b 100644 --- a/wp-content/plugins/nextgen-gallery/changelog.txt +++ b/wp-content/plugins/nextgen-gallery/changelog.txt @@ -1,6 +1,52 @@ NextGEN Gallery by Imagely += V3.1.1 - 11.29.2018 = +* Fixed: Don't enqueue block editor assets on frontend. +* Fixed: Broken styling for column blocks + += V3.1.0 - 11.28.2018 = +* NEW: Gutengerg block for NextGEN Gallery +* Secured: Other options page +* Updated: Freemius SDK +* Fixed: Getting started wizard compatible with Gutenberg +* Fixed: WPML redirects +* Fixed: Missing descriptions and tags when re-importing image metadata + += V3.0.16 - 10.24.2018 = +* Fixed Fontawesome 4 compatibility + += v3.0.15 - 10.23.2018 = +* NEW: Added requirements notification manager +* Changed: Basic Thumbnails default setting from "[Show slideshow]" to "Show slideshow" +* Changed: Fixed order_by=rand and 'variations' system not working by storing random results in a transient for 24h +* Changed: How gallery directories are removed +* Changed: Improved memory use during thumbnail generation +* Changed: Manage Albums page now uses GET for editing navigation +* Changed: Upgrading FontAwesome to 5.0.13 +* Fixed: Attribute 'target=_blank' not working in lightbox effects +* Fixed: Conflict with WP Social Widget +* Fixed: Corrected numerous phpdoc problems found by Phan +* Fixed: Editing of image attributes from search-galleries page +* Fixed: Gritter messages with long texts overlapped their close-notification icon +* Fixed: IGW gallery selections not persisting between edits +* Fixed: Orphaned entries being created and/or left in wp_postmeta +* Fixed: Repeated and missing images in featured images list + += V3.0.13 - 10.11.2018 = +* Changed: Added settings for basic slideshow + += V3.0.9 - 09.25.2018 = +* NEW: Added 2.0 template mechanism for basic galleries +* NEW: Simple Lightbox is the new default Lightbox +* Changed: Changed Javascript library and styling for basic slideshow +* Changed: New default template and styling for thumbnail galleries +* Changed: New default template and styling for imagebrowser galleries +* Changed: New default template and styling for compact albums +* Changed: New default template and styling for extended albums +* Changed: Changed implementation of "Number of Columns" setting +* Changed: Significantly simplified NextGEN default shortcodes + = V3.0.8 - 09.05.2018 = * Fixed: IGW broken with Chrome 69+ diff --git a/wp-content/plugins/nextgen-gallery/composer.json b/wp-content/plugins/nextgen-gallery/composer.json index 360d0af97..399d0d3fb 100644 --- a/wp-content/plugins/nextgen-gallery/composer.json +++ b/wp-content/plugins/nextgen-gallery/composer.json @@ -1,6 +1,6 @@ { "name": "imagely/nextgen-gallery", - "description": "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 22 million downloads.", + "description": "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 23 million downloads.", "keywords": ["nextgen", "nextgen gallery", "gallery", "galleries", "image", "images", "image gallery", "photo", "photos", "photo gallery", "picture", "pictures", "picture gallery", "album", "albums", "photo albums", "image album", "media", "media gallery", "thumbnails", "thumbnail gallery", "thumbnail galleries", "slideshow", "slideshows", "slideshow gallery", "slideshow galleries", "fancybox", "lightbox", "responsive", "responsive gallery", "responsive galleries", "singlepic", "watermarks", "watermarking", "photography", "photographer"], "homepage": "https://www.imagely.com/", "license": "GPLv2", diff --git a/wp-content/plugins/nextgen-gallery/freemius/LICENSE.txt b/wp-content/plugins/nextgen-gallery/freemius/LICENSE.txt index d6a93266f..30ace6a87 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/LICENSE.txt +++ b/wp-content/plugins/nextgen-gallery/freemius/LICENSE.txt @@ -1,281 +1,622 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 - Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/> - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. END OF TERMS AND CONDITIONS @@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least +state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - {description} - Copyright (C) {year} {fullname} + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -303,38 +644,31 @@ the "copyright" line and a pointer to where the full notice is found. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/README.md b/wp-content/plugins/nextgen-gallery/freemius/README.md new file mode 100644 index 000000000..d75ee5db3 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/README.md @@ -0,0 +1,253 @@ +Freemius WordPress SDK +====================== + +[Monetization](https://freemius.com/wordpress/), [analytics](https://freemius.com/wordpress/insights/), and marketing automation platform for plugin & theme developers. Freemius empower developers to create prosperous subscription based businesses. + +You can see some of the WordPress.org plugins & themes that are utilizing the power of Freemius here: + +https://includewp.com/freemius/#focus + +If you are a WordPress plugin or theme developer and you are interested to monetize with Freemius you can [sign-up here for free](https://dashboard.freemius.com/register/): + +https://dashboard.freemius.com/register/ + +**Below you'll find the integration instructions for our WordPress SDK.** + +## Code Documentation + +You can find the SDK's PHP-Doc documentation here: +https://codedoc.pub/freemius/wordpress-sdk/master/ + +## Initializing the SDK + +Copy the code below and paste it into the top of your main plugin's PHP file, right after the plugin's header comment: + +```php +<?php + // Create a helper function for easy SDK access. + function my_prefix_fs() { + global $my_prefix_fs; + if ( ! isset( $my_prefix_fs ) ) { + // Include Freemius SDK. + require_once dirname(__FILE__) . '/freemius/start.php'; + + $my_prefix_fs = fs_dynamic_init( array( + 'id' => '1234', + 'slug' => 'my-plugin-slug', + 'menu_slug' => 'my_menu_slug', // You can also use __FILE__ + 'public_key' => 'pk_MY_PUBLIC_KEY', + 'is_live' => true, + 'is_premium' => true, + 'has_addons' => false, + 'has_paid_plans' => false, + // Set the SDK to work in a sandbox mode (for development & testing). + // IMPORTANT: MAKE SURE TO REMOVE SECRET KEY BEFORE DEPLOYMENT. + 'secret_key' => 'sk_MY_SECRET_KEY', + ) ); + } + + return $my_prefix_fs; + } + + // Init Freemius. + my_prefix_fs(); +?> +``` + +- **1234** - Replace with your plugin's ID. +- **pk_MY_PUBLIC_KEY** - Replace with your plugin's public key. +- **sk_MY_SECRET_KEY** - Replace with your plugin's secret key. +- **my-plugin-slug** - Replace with your plugin's WordPress.org slug. +- **my_menu_slug** - Replace with your admin dashboard settings menu slug. + + +## Usage example + +You can call the SDK by using the shortcode function: + +```php +<?php my_prefix_fs()->get_upgrade_url(); ?> +``` + +Or when calling Freemius multiple times in a scope, it's recommended to use it with the global variable: + +```php +<?php + global $my_prefix_fs; + $my_prefix_fs->get_account_url(); +?> +``` + +## Adding license based logic examples + +Add marketing content to encourage your users to upgrade for your paid version: + +```php +<?php + if ( my_prefix_fs()->is_not_paying() ) { + echo '<section><h1>' . esc_html__('Awesome Premium Features', 'my-plugin-slug') . '</h1>'; + echo '<a href="' . my_prefix_fs()->get_upgrade_url() . '">' . + esc_html__('Upgrade Now!', 'my-plugin-slug') . + '</a>'; + echo '</section>'; + } +?> +``` + +Add logic which will only be available in your premium plugin version: + +```php +<?php + // This "if" block will be auto removed from the Free version. + if ( my_prefix_fs()->is__premium_only() ) { + + // ... premium only logic ... + + } +?> +``` + +To add a function which will only be available in your premium plugin version, simply add __premium_only as the suffix of the function name. Just make sure that all lines that call that method directly or by hooks, are also wrapped in premium only logic: + +```php +<?php + class My_Plugin { + function init() { + ... + + // This "if" block will be auto removed from the free version. + if ( my_prefix_fs()->is__premium_only() ) { + // Init premium version. + $this->admin_init__premium_only(); + + add_action( 'admin_init', array( &$this, 'admin_init_hook__premium_only' ); + } + + ... + } + + // This method will be only included in the premium version. + function admin_init__premium_only() { + ... + } + + // This method will be only included in the premium version. + function admin_init_hook__premium_only() { + ... + } + } +?> +``` + +Add logic which will only be executed for customers in your 'professional' plan: + +```php +<?php + if ( my_prefix_fs()->is_plan('professional', true) ) { + // .. logic related to Professional plan only ... + } +?> +``` + +Add logic which will only be executed for customers in your 'professional' plan or higher plans: + +```php +<?php + if ( my_prefix_fs()->is_plan('professional') ) { + // ... logic related to Professional plan and higher plans ... + } +?> +``` + +Add logic which will only be available in your premium plugin version AND will only be executed for customers in your 'professional' plan (and higher plans): + +```php +<?php + // This "if" block will be auto removed from the Free version. + if ( my_prefix_fs()->is_plan__premium_only('professional') ) { + // ... logic related to Professional plan and higher plans ... + } +?> +``` + +Add logic only for users in trial: + +```php +<?php + if ( my_prefix_fs()->is_trial() ) { + // ... logic for users in trial ... + } +?> +``` + +Add logic for specified paid plan: + +```php +<?php + // This "if" block will be auto removed from the Free version. + if ( my_prefix_fs()->is__premium_only() ) { + if ( my_prefix_fs()->is_plan( 'professional', true ) ) { + + // ... logic related to Professional plan only ... + + } else if ( my_prefix_fs()->is_plan( 'business' ) ) { + + // ... logic related to Business plan and higher plans ... + + } + } +?> +``` + +## Excluding files and folders from the free plugin version +There are two ways to exclude files from your free version. + +1. Add `__premium_only` just before the file extension. For example, functions__premium_only.php will be only included in the premium plugin version. This works for all type of files, not only PHP. +2. Add `@fs_premium_only` a sepcial meta tag to the plugin's main PHP file header. Example: +```php +<?php + /** + * Plugin Name: My Very Awesome Plugin + * Plugin URI: http://my-awesome-plugin.com + * Description: Create and manage Awesomeness right in WordPress. + * Version: 1.0.0 + * Author: Awesomattic + * Author URI: http://my-awesome-plugin.com/me/ + * License: GPLv2 + * Text Domain: myplugin + * Domain Path: /langs + * + * @fs_premium_only /lib/functions.php, /premium-files/ + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + // ... my code ... +?> +``` +The file `/lib/functions.php` and the directory `/premium-files/` will be removed from the free plugin version. + +# WordPress.org Compliance +Based on [WordPress.org Guidelines](https://wordpress.org/plugins/about/guidelines/) you are not allowed to submit a plugin that has premium code in it: +> All code hosted by WordPress.org servers must be free and fully-functional. If you want to sell advanced features for a plugin (such as a "pro" version), then you must sell and serve that code from your own site, we will not host it on our servers. + +Therefore, if you want to deploy your free plugin's version to WordPress.org, make sure you wrap all your premium code with `if ( my_prefix_fs()->{{ method }}__premium_only() )` or the other methods provided to exclude premium features & files from the free version. + +## Deployment +Zip your plugin's root folder and upload it in the Deployment section in the *Freemius Developer's Dashboard*. +The plugin will be scanned and processed by a custom developed *PHP Processor* which will auto-generate two versions of your plugin: + +1. **Premium version**: Identical to your uploaded version, including all code (except your `secret_key`). Will be enabled for download ONLY for your paying or in trial customers. +2. **Free version**: The code stripped from all your paid features (based on the logic added wrapped in `{ method }__premium_only()`). + +The free version is the one that you should give your users to download. Therefore, download the free generated version and upload to your site. Or, if your plugin was WordPress.org complaint and you made sure to exclude all your premium code with the different provided techniques, you can deploy the downloaded free version to the .org repo. + +## Reporting Bugs +Email dev [at] freemius [dot] com + +## FAQ + +## Copyright +Freemius, Inc. diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.css index 5b8bc549d..3f47f4098 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.css @@ -1 +1 @@ -#fs_account .postbox,#fs_account .widefat{max-width:700px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .button i.dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:0.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type="text"]{color:#0073AA;font-size:16px;background:none}.fs-key-value-table input[type="text"]{width:100%;font-weight:bold}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%} +#fs_account .postbox,#fs_account .widefat{max-width:700px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:0.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:bold}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table var,.fs-key-value-table code,.fs-key-value-table input[type="text"]{color:#0073AA;font-size:16px;background:none}.fs-key-value-table input[type="text"]{width:100%;font-weight:bold}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none !important}#fs_sites .fs-scrollable-table .fs-main-column{width:100%}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:grey;width:1px}#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type{text-align:right}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:bold}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:bold}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:bold}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:none}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.min.css index fa18eb018..78debcb2c 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/account.min.css @@ -1 +1 @@ -#fs_account .postbox,#fs_account .widefat{max-width:700px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px 0;line-height:1.4;border-bottom:1px solid #f1f1f1}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_account .button i.dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li form{display:inline-block}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table{width:100%}.fs-key-value-table form{display:inline-block}.fs-key-value-table tr td:first-child{text-align:right}.fs-key-value-table tr td:first-child nobr{font-weight:700}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr td.fs-right{text-align:right}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table code,.fs-key-value-table input[type=text],.fs-key-value-table var{color:#0073aa;font-size:16px;background:0 0}.fs-key-value-table input[type=text]{width:100%;font-weight:700}label.fs-tag{background:#ffba00;color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-warn{background:#ffba00}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:700}#fs_addons td:last-child,#fs_addons th:last-child{text-align:right}#fs_addons th{font-weight:700}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address span{font-weight:700}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:0 0}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:0 0}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%} \ No newline at end of file +#fs_account .fs-header-actions li form,.fs-key-value-table form{display:inline-block}#fs_addons td:last-child,#fs_addons th:last-child,#fs_sites .fs-scrollable-table .fs-site-details td:last-of-type,.fs-key-value-table tr td.fs-right,.fs-key-value-table tr td:first-child{text-align:right}#fs_account .postbox,#fs_account .widefat{max-width:700px}#fs_account h3{font-size:1.3em;padding:12px 15px;margin:0 0 12px;line-height:1.4;border-bottom:1px solid #F1F1F1}#fs_account h3 .dashicons{width:26px;height:26px;font-size:1.3em}#fs_account i.dashicons{font-size:1.2em;height:1.2em;width:1.2em}#fs_sites .fs-scrollable-table .fs-main-column,.fs-key-value-table{width:100%}#fs_account .dashicons{vertical-align:middle}#fs_account .fs-header-actions{position:absolute;top:17px;right:15px;font-size:.9em}#fs_account .fs-header-actions ul{margin:0}#fs_account .fs-header-actions li{float:left}#fs_account .fs-header-actions li a{text-decoration:none}#fs_account_details .button-group{float:right}.rtl #fs_account .fs-header-actions{left:15px;right:auto}.fs-key-value-table tr td:first-child nobr{font-weight:700}.fs-key-value-table tr td:first-child form{display:block}.fs-key-value-table tr.fs-odd{background:#ebebeb}.fs-key-value-table td,.fs-key-value-table th{padding:10px}.fs-key-value-table code{line-height:28px}.fs-key-value-table code,.fs-key-value-table input[type=text],.fs-key-value-table var{color:#0073AA;font-size:16px;background:0 0}label.fs-tag,label.fs-tag.fs-warn{background:#ffba00}.fs-key-value-table input[type=text]{width:100%;font-weight:700}label.fs-tag{color:#fff;display:inline-block;border-radius:3px;padding:5px;font-size:11px;line-height:11px;vertical-align:baseline}label.fs-tag.fs-success{background:#46b450}label.fs-tag.fs-error{background:#dc3232}#fs_sites .fs-scrollable-table .fs-table-body{max-height:200px;overflow:auto;border:1px solid #e5e5e5}#fs_sites .fs-scrollable-table .fs-table-body>table.widefat{border:none!important}#fs_sites .fs-scrollable-table .fs-site-details td:first-of-type{text-align:right;color:grey;width:1px}#fs_sites .fs-scrollable-table .fs-install-details table tr td{width:1px;white-space:nowrap}#fs_sites .fs-scrollable-table .fs-install-details table tr td:last-of-type{width:auto}#fs_addons h3{border:none;margin-bottom:0;padding:4px 5px}#fs_addons td{vertical-align:middle}#fs_addons thead{white-space:nowrap}#fs_addons td:first-child,#fs_addons th:first-child{text-align:left;font-weight:700}#fs_addons th,#fs_billing_address span{font-weight:700}#fs_billing_address{width:100%}#fs_billing_address tr td{width:50%;padding:5px}#fs_billing_address tr:first-of-type td{padding-top:0}#fs_billing_address input,#fs_billing_address select{display:block;width:100%;margin-top:5px}#fs_billing_address input::-moz-placeholder,#fs_billing_address select::-moz-placeholder{color:transparent;opacity:1}#fs_billing_address input:-ms-input-placeholder,#fs_billing_address select:-ms-input-placeholder{color:transparent}#fs_billing_address input::-webkit-input-placeholder,#fs_billing_address select::-webkit-input-placeholder{color:transparent}#fs_billing_address input.fs-read-mode,#fs_billing_address select.fs-read-mode{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:0 0}#fs_billing_address.fs-read-mode td span{display:none}#fs_billing_address.fs-read-mode input,#fs_billing_address.fs-read-mode select{border-color:transparent;color:#777;border-bottom:1px dashed #ccc;padding-left:0;background:0 0}#fs_billing_address.fs-read-mode input::-moz-placeholder,#fs_billing_address.fs-read-mode select::-moz-placeholder{color:#ccc;opacity:1}#fs_billing_address.fs-read-mode input:-ms-input-placeholder,#fs_billing_address.fs-read-mode select:-ms-input-placeholder{color:#ccc}#fs_billing_address.fs-read-mode input::-webkit-input-placeholder,#fs_billing_address.fs-read-mode select::-webkit-input-placeholder{color:#ccc}#fs_billing_address button{display:block;width:100%} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/add-ons.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/add-ons.min.css index b3c667629..5a6606883 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/add-ons.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/add-ons.min.css @@ -1 +1 @@ -#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner ul{-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:700}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px 15px;border-top:1px solid #eee;margin:0 0 10px 0;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0;background:#adff2f;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:1px 1px 1px rgba(0,0,0,.3);text-transform:uppercase;font-size:.9em;font-weight:700}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button{position:absolute;top:112px;right:10px}@media screen and (min-width:960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title{color:#29abe1}}#TB_window,#TB_window iframe{width:772px!important}#plugin-information #section-description b,#plugin-information #section-description blockquote,#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description i,#plugin-information #section-description li,#plugin-information #section-description ol,#plugin-information #section-description p,#plugin-information #section-description ul{clear:none}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none outside none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px!important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:#adff2f;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid #006400;padding:2px;text-align:center;font-size:.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:700;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount,#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency{text-align:center;display:block;font-weight:700;margin-bottom:10px;text-transform:uppercase;background:#f3f3f3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:#adff2f}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:400;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}@media screen and (max-width:961px){#fs_addons .fs-cards-list .fs-card{height:265px}} \ No newline at end of file +#fs_addons .fs-cards-list{list-style:none}#fs_addons .fs-cards-list .fs-card{float:left;height:152px;width:310px;padding:0;margin:0 0 30px 30px;font-size:14px;list-style:none;border:1px solid #ddd;cursor:pointer;position:relative}#fs_addons .fs-cards-list .fs-card .fs-overlay{position:absolute;left:0;right:0;bottom:0;top:0;z-index:9}#fs_addons .fs-cards-list .fs-card .fs-inner{background-color:#fff;overflow:hidden;height:100%;position:relative}#fs_addons .fs-cards-list .fs-card .fs-inner ul{-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s;left:0;right:0;top:0;position:absolute}#fs_addons .fs-cards-list .fs-card .fs-inner li{list-style:none;line-height:18px;padding:0 15px;width:100%;display:block;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-card-banner{padding:0;margin:0;line-height:0;display:block;height:100px;background-repeat:repeat-x;background-size:100% 100%;-moz-transition:all,.15s;-o-transition:all,.15s;-ms-transition:all,.15s;-webkit-transition:all,.15s;transition:all,.15s}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-title{margin:10px 0 0;height:18px;overflow:hidden;color:#000;white-space:nowrap;text-overflow:ellipsis;font-weight:700}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-offer{font-size:.9em}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-description{background-color:#f9f9f9;padding:10px 15px 100px;border-top:1px solid #eee;margin:0 0 10px;color:#777}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-tag{position:absolute;top:10px;right:0;background:#adff2f;display:block;padding:2px 10px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.3);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.3);box-shadow:1px 1px 1px rgba(0,0,0,.3);text-transform:uppercase;font-size:.9em;font-weight:700}#fs_addons .fs-cards-list .fs-card .fs-inner .fs-cta .button{position:absolute;top:112px;right:10px}@media screen and (min-width:960px){#fs_addons .fs-cards-list .fs-card:hover .fs-overlay{border:2px solid #29abe1;margin-left:-1px;margin-top:-1px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner ul{top:-100px}#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-offer,#fs_addons .fs-cards-list .fs-card:hover .fs-inner .fs-title{color:#29abe1}}#TB_window,#TB_window iframe{width:772px!important}#plugin-information #section-description b,#plugin-information #section-description blockquote,#plugin-information #section-description h2,#plugin-information #section-description h3,#plugin-information #section-description i,#plugin-information #section-description li,#plugin-information #section-description ol,#plugin-information #section-description p,#plugin-information #section-description ul{clear:none}#plugin-information #section-description .fs-selling-points{padding-bottom:10px;border-bottom:1px solid #ddd}#plugin-information #section-description .fs-selling-points ul{margin:0}#plugin-information #section-description .fs-selling-points ul li{padding:0;list-style:none}#plugin-information #section-description .fs-selling-points ul li i.dashicons{color:#71ae00;font-size:3em;vertical-align:middle;line-height:30px;float:left;margin:0 0 0 -15px}#plugin-information #section-description .fs-selling-points ul li h3{margin:1em 30px!important}#plugin-information #section-description .fs-screenshots:after{content:"";display:table;clear:both}#plugin-information #section-description .fs-screenshots ul{list-style:none;margin:0}#plugin-information #section-description .fs-screenshots ul li{width:225px;height:225px;float:left;margin-bottom:20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#plugin-information #section-description .fs-screenshots ul li a{display:block;width:100%;height:100%;border:1px solid;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);background-size:cover}#plugin-information #section-description .fs-screenshots ul li.odd{margin-right:20px}#plugin-information .plugin-information-pricing{margin:-16px;border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan h3{margin-top:0;padding:20px;font-size:16px}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper{border-bottom:1px solid #ddd}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab{cursor:pointer;position:relative;padding:0 10px;font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab label{text-transform:uppercase;color:green;background:#adff2f;position:absolute;left:-1px;right:-1px;bottom:100%;border:1px solid #006400;padding:2px;text-align:center;font-size:.9em;line-height:1em}#plugin-information .plugin-information-pricing .fs-plan .nav-tab-wrapper .nav-tab.nav-tab-active{cursor:default;background:#fffeec;border-bottom-color:#fffeec}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle h3{background:#fffeec;margin:0;padding-bottom:0;color:#0073aa}#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .fs-billing-frequency,#plugin-information .plugin-information-pricing .fs-plan.fs-single-cycle .nav-tab-wrapper{display:none}#plugin-information .plugin-information-pricing .fs-plan .fs-pricing-body{background:#fffeec;padding:20px}#plugin-information .plugin-information-pricing .fs-plan .button{width:100%;text-align:center;font-weight:700;text-transform:uppercase;font-size:1.1em}#plugin-information .plugin-information-pricing .fs-plan label{white-space:nowrap}#plugin-information .plugin-information-pricing .fs-plan var{font-style:normal}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount,#plugin-information .plugin-information-pricing .fs-plan .fs-billing-frequency{text-align:center;display:block;font-weight:700;margin-bottom:10px;text-transform:uppercase;background:#F3F3F3;padding:2px;border:1px solid #ccc}#plugin-information .plugin-information-pricing .fs-plan .fs-annual-discount{text-transform:none;color:green;background:#adff2f}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms{font-size:.9em}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms i{float:left;margin:0 0 0 -15px}#plugin-information .plugin-information-pricing .fs-plan ul.fs-trial-terms li{margin:10px 0 0}#plugin-information #section-features .fs-features{margin:-20px -26px}#plugin-information #section-features table{width:100%;border-spacing:0;border-collapse:separate}#plugin-information #section-features table thead th{padding:10px 0}#plugin-information #section-features table thead .fs-price{color:#71ae00;font-weight:400;display:block;text-align:center}#plugin-information #section-features table tbody td{border-top:1px solid #ccc;padding:10px 0;text-align:center;width:100px;color:#71ae00}#plugin-information #section-features table tbody td:first-child{text-align:left;width:auto;color:inherit;padding-left:26px}#plugin-information #section-features table tbody tr.fs-odd td{background:#fefefe}#plugin-information #section-features .dashicons-yes{width:30px;height:30px;font-size:30px}@media screen and (max-width:961px){#fs_addons .fs-cards-list .fs-card{height:265px}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.css new file mode 100644 index 000000000..003ca3735 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.css @@ -0,0 +1 @@ +@charset "UTF-8";#fs_affiliation_content_wrapper #messages{margin-top:25px}#fs_affiliation_content_wrapper h3{font-size:24px;padding:0;margin-left:0}#fs_affiliation_content_wrapper ul li{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;list-style-type:none}#fs_affiliation_content_wrapper ul li:before{content:'✓';margin-right:10px;font-weight:bold}#fs_affiliation_content_wrapper p:not(.description),#fs_affiliation_content_wrapper li,#fs_affiliation_content_wrapper label{font-size:16px !important;line-height:26px !important}#fs_affiliation_content_wrapper .button{margin-top:20px;margin-bottom:7px;line-height:35px;height:40px;font-size:16px}#fs_affiliation_content_wrapper .button#cancel_button{margin-right:5px}#fs_affiliation_content_wrapper form .input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form .input-container .input-label{font-weight:bold;display:block;width:100%}#fs_affiliation_content_wrapper form .input-container.input-container-text label,#fs_affiliation_content_wrapper form .input-container.input-container-text input,#fs_affiliation_content_wrapper form .input-container.input-container-text textarea{display:block}#fs_affiliation_content_wrapper form .input-container #add_domain,#fs_affiliation_content_wrapper form .input-container .remove-domain{text-decoration:none;display:inline-block;margin-top:3px}#fs_affiliation_content_wrapper form .input-container #add_domain:focus,#fs_affiliation_content_wrapper form .input-container .remove-domain:focus{box-shadow:none}#fs_affiliation_content_wrapper form .input-container #add_domain.disabled,#fs_affiliation_content_wrapper form .input-container .remove-domain.disabled{color:#aaa;cursor:default}#fs_affiliation_content_wrapper form #extra_domains_container .description{margin-top:0;position:relative;top:-4px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container{margin-bottom:15px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain{display:inline-block;margin-right:5px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain:last-of-type{margin-bottom:0} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.min.css new file mode 100644 index 000000000..3c27b4549 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/affiliation.min.css @@ -0,0 +1 @@ +@charset "UTF-8";#fs_affiliation_content_wrapper #messages{margin-top:25px}#fs_affiliation_content_wrapper h3{font-size:24px;padding:0;margin-left:0}#fs_affiliation_content_wrapper ul li{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;list-style-type:none}#fs_affiliation_content_wrapper ul li:before{content:'✓';margin-right:10px;font-weight:700}#fs_affiliation_content_wrapper label,#fs_affiliation_content_wrapper li,#fs_affiliation_content_wrapper p:not(.description){font-size:16px!important;line-height:26px!important}#fs_affiliation_content_wrapper .button{margin-top:20px;margin-bottom:7px;line-height:35px;height:40px;font-size:16px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container,#fs_affiliation_content_wrapper form .input-container{margin-bottom:15px}#fs_affiliation_content_wrapper .button#cancel_button{margin-right:5px}#fs_affiliation_content_wrapper form .input-container .input-label{font-weight:700;display:block;width:100%}#fs_affiliation_content_wrapper form .input-container.input-container-text input,#fs_affiliation_content_wrapper form .input-container.input-container-text label,#fs_affiliation_content_wrapper form .input-container.input-container-text textarea{display:block}#fs_affiliation_content_wrapper form .input-container #add_domain,#fs_affiliation_content_wrapper form .input-container .remove-domain{text-decoration:none;display:inline-block;margin-top:3px}#fs_affiliation_content_wrapper form .input-container #add_domain:focus,#fs_affiliation_content_wrapper form .input-container .remove-domain:focus{box-shadow:none}#fs_affiliation_content_wrapper form .input-container #add_domain.disabled,#fs_affiliation_content_wrapper form .input-container .remove-domain.disabled{color:#aaa;cursor:default}#fs_affiliation_content_wrapper form #extra_domains_container .description{margin-top:0;position:relative;top:-4px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain{display:inline-block;margin-right:5px}#fs_affiliation_content_wrapper form #extra_domains_container .extra-domain-input-container .domain:last-of-type{margin-bottom:0} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.css new file mode 100644 index 000000000..56515d274 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.css @@ -0,0 +1 @@ +@media screen and (max-width: 782px){#wpbody-content{padding-bottom:0 !important}} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.min.css new file mode 100644 index 000000000..26d74ca5d --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/checkout.min.css @@ -0,0 +1 @@ +@media screen and (max-width:782px){#wpbody-content{padding-bottom:0!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.css index 3df4e6754..99384d124 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.css @@ -1 +1,2 @@ -.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;box-shadow:0px 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb} +.theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:bold;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);box-shadow:0 2px 1px -1px rgba(0,0,0,0.3);font-size:1.1em}#iframe{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width: 600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}} +.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px !important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2 !important;background-color:#f2fcff !important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,0.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:bold;cursor:auto}div.fs-notice.updated,div.fs-notice.success,div.fs-notice.promotion{display:block !important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,0.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,0.3);box-shadow:0 2px 2px rgba(6,113,6,0.3);opacity:0.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width: 960px){.fs-secure-notice{left:36px}}@media screen and (max-width: 600px){.fs-secure-notice{display:none}}@media screen and (max-width: 500px){#fs_promo_tab{display:none}}@media screen and (max-width: 782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:greenyellow}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url("/wp-admin/images/wpspin_light-2x.gif");background-size:contain}.wrap.fs-section h2{text-align:left} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.min.css index cf30094a0..733e9f259 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/common.min.css @@ -1 +1 @@ -.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px!important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2!important;background-color:#f2fcff!important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:700;cursor:auto}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;box-shadow:0 2px 2px rgba(6,113,6,.3);opacity:.95}.fs-secure-notice:hover{opacity:1}@media screen and (max-width:960px){.fs-secure-notice{left:36px}}@media screen and (max-width:500px){#fs_promo_tab{display:none}}@media screen and (max-width:782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:#adff2f}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb} \ No newline at end of file +.theme-browser .theme .fs-premium-theme-badge{position:absolute;top:10px;right:0;background:#71ae00;color:#fff;text-transform:uppercase;padding:5px 10px;-moz-border-radius:3px 0 0 3px;-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;font-weight:700;border-right:0;-moz-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.3);box-shadow:0 2px 1px -1px rgba(0,0,0,.3);font-size:1.1em}#iframe{line-height:0;font-size:0}.fs-full-size-wrapper{margin:40px 0 -65px -20px}@media (max-width:600px){.fs-full-size-wrapper{margin:0 0 -65px -10px}}.fs-notice{position:relative}.fs-notice.fs-has-title{margin-bottom:30px!important}.fs-notice.success{color:green}.fs-notice.promotion{border-color:#00a0d2!important;background-color:#f2fcff!important}.fs-notice .fs-notice-body{margin:.5em 0;padding:2px}.fs-notice .fs-close{cursor:pointer;color:#aaa;float:right}.fs-notice .fs-close:hover{color:#666}.fs-notice .fs-close>*{margin-top:7px;display:inline-block}.fs-notice label.fs-plugin-title{background:rgba(0,0,0,.3);color:#fff;padding:2px 10px;position:absolute;top:100%;bottom:auto;right:auto;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;left:10px;font-size:12px;font-weight:700;cursor:auto}div.fs-notice.promotion,div.fs-notice.success,div.fs-notice.updated{display:block!important}.rtl .fs-notice .fs-close{float:left}.fs-secure-notice{position:fixed;top:32px;left:160px;right:0;background:#ebfdeb;padding:10px 20px;color:green;z-index:9999;-moz-box-shadow:0 2px 2px rgba(6,113,6,.3);-webkit-box-shadow:0 2px 2px rgba(6,113,6,.3);box-shadow:0 2px 2px rgba(6,113,6,.3);opacity:.95;filter:alpha(opacity=95)}.fs-secure-notice:hover{opacity:1;filter:alpha(opacity=100)}.fs-secure-notice a.fs-security-proof{color:green;text-decoration:none}@media screen and (max-width:960px){.fs-secure-notice{left:36px}}@media screen and (max-width:600px){.fs-secure-notice{display:none}}@media screen and (max-width:500px){#fs_promo_tab{display:none}}@media screen and (max-width:782px){.fs-secure-notice{left:0;top:46px;text-align:center}}span.fs-submenu-item.fs-sub:before{content:'\21B3';padding:0 5px}.rtl span.fs-submenu-item.fs-sub:before{content:'\21B2'}.fs-submenu-item.pricing.upgrade-mode{color:#adff2f}.fs-submenu-item.pricing.trial-mode{color:#83e2ff}#adminmenu .update-plugins.fs-trial{background-color:#00b9eb}.fs-ajax-spinner{border:0;width:20px;height:20px;margin-right:5px;vertical-align:sub;display:inline-block;background:url(/wp-admin/images/wpspin_light-2x.gif);background-size:contain}.wrap.fs-section h2{text-align:left} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.css index 466bec353..ec5fea509 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.css @@ -1,96 +1 @@ -#fs_connect{width:480px;-moz-box-shadow:0px 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.3);box-shadow:0px 1px 2px rgba(0,0,0,0.3);margin:20px 0}@media screen and (max-width: 479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:' \279C'}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#FEFEFE;-moz-transition:background 0.5s ease;-o-transition:background 0.5s ease;-ms-transition:background 0.5s ease;-webkit-transition:background 0.5s ease;transition:background 0.5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions .fs-trigger{font-size:0.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li div{margin-left:55px}#fs_connect .fs-permissions ul li div span{font-weight:bold;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li div p{margin:2px 0 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{height:auto;margin:20px 20px 10px 20px}@media screen and (max-width: 479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#C2EEFF;text-decoration:underline}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:0.85em;padding:5px;background:rgba(0,0,0,0.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:' \000bb'}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li div{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa} - -/* Customizations for Imagely opt in form */ - -#fs_connect { - box-shadow: none; - border: 1px solid #e0e0e0; - margin-left: 10px; -} - -#fs_connect a { - color: #9fbb1a; -} - -#fs_connect a:hover { - color: #b8d433; -} - -#fs_connect .fs-visual { - padding: 30px 20px !important; - background: #fff; -} - -#fs_connect .fs-visual .fs-plugin-icon, -#fs_connect .fs-visual .fs-connect-logo, -#fs_connect .fs-visual .fs-site-icon { - border: none; - padding: 0; - top: 30px; -} - -#fs_connect .fs-content { - padding: 30px 20px; -} - -#fs_connect .fs-actions, -#fs_connect .fs-permissions, -#fs_connect .fs-permissions.fs-open, -#fs_connect .fs-terms { - background: #143650; - color: #fff; - padding: 0 !important; -} - -#fs_connect .fs-actions { - padding: 30px 20px !important; -} - -#fs_connect .fs-permissions ul li i.dashicons { - color: #9fbb1a; -} - -#fs_connect .fs-permissions.fs-open ul { - margin-bottom: 0; - padding-bottom: 20px; -} - -#fs_connect .fs-permissions ul li div span { - color: #fff; -} - -#fs_connect .fs-terms { - padding-bottom: 15px !important; -} - -#fs_connect .fs-actions .button.button-primary { - background-color: #9fbb1a !important; - color: #fff !important; - border: none !important; - box-shadow: none !important; - text-shadow: none !important; - height: 35px !important; - padding: 0 24px !important; - line-height: 35px; - width: auto !important; - border-radius: 3px; -} - -#fs_connect .fs-actions .button.button-secondary { - border: none !important; - box-shadow: none !important; - text-shadow: none !important; - height: 35px !important; - padding: 0 24px !important; - line-height: 35px; - width: auto !important; - border-radius: 3px; -} - -#fs_connect .fs-permissions a:hover, -#fs_connect .fs-terms a:hover { - color: #fff; -} - - - +#fs_connect{width:480px;-moz-box-shadow:0px 1px 2px rgba(0,0,0,0.3);-webkit-box-shadow:0px 1px 2px rgba(0,0,0,0.3);box-shadow:0px 1px 2px rgba(0,0,0,0.3);margin:20px 0}@media screen and (max-width: 479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect.require-license-key #sites_list_container td{cursor:pointer}#fs_connect #delegate_to_site_admins{margin-right:15px;float:right;height:26px;vertical-align:middle;line-height:37px;font-weight:bold;border-bottom:1px dashed;text-decoration:none}#fs_connect #delegate_to_site_admins.rtl{margin-left:15px;margin-right:0}#fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:' \279C'}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#FEFEFE;-moz-transition:background 0.5s ease;-o-transition:background 0.5s ease;-ms-transition:background 0.5s ease;-webkit-transition:background 0.5s ease;transition:background 0.5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions .fs-trigger{font-size:0.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li div{margin-left:55px}#fs_connect .fs-permissions ul li div span{font-weight:bold;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li div p{margin:2px 0 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{height:auto;margin:20px 20px 10px 20px}@media screen and (max-width: 479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#C2EEFF;text-decoration:underline}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:0.85em;padding:5px;background:rgba(0,0,0,0.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}#multisite_options_container{margin-top:10px;border:1px solid #ccc;padding:5px}#multisite_options_container a{text-decoration:none}#multisite_options_container a:focus{box-shadow:none}#multisite_options_container a.selected{font-weight:bold}#multisite_options_container.apply-on-all-sites{border:0 none;padding:0}#multisite_options_container.apply-on-all-sites #all_sites_options{border-spacing:0}#multisite_options_container.apply-on-all-sites #all_sites_options td:not(:first-child){display:none}#multisite_options_container #sites_list_container{display:none;overflow:auto}#multisite_options_container #sites_list_container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease-in-out;-o-transition:opacity 0.3s ease-in-out;-ms-transition:opacity 0.3s ease-in-out;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;position:absolute;background:rgba(0,0,0,0.8);color:#fff;font-family:'arial', serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);line-height:1.3em;font-weight:bold;text-align:left}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right}.fs-tooltip-trigger .fs-tooltip::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:rgba(0,0,0,0.8) transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}#fs_marketing_optin{display:none;margin-top:10px;border:1px solid #ccc;padding:10px;line-height:1.5em}#fs_marketing_optin .fs-message{display:block;margin-bottom:5px;font-size:1.05em;font-weight:600}#fs_marketing_optin.error{border:1px solid #d3135a;background:#fee}#fs_marketing_optin.error .fs-message{color:#d3135a}#fs_marketing_optin .fs-input-container{margin-top:5px}#fs_marketing_optin .fs-input-container label{margin-top:5px;display:block}#fs_marketing_optin .fs-input-container label input{float:left;margin:1px 0 0 0}#fs_marketing_optin .fs-input-container label:first-child{display:block;margin-bottom:2px}#fs_marketing_optin .fs-input-label{display:block;margin-left:20px}#fs_marketing_optin .fs-input-label .underlined{text-decoration:underline}.rtl #fs_marketing_optin .fs-input-container label input{float:right}.rtl #fs_marketing_optin .fs-input-label{margin-left:0;margin-right:20px}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:' \000bb'}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li div{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}#fs_theme_connect_wrapper{position:fixed;top:0;height:100%;width:100%;z-index:99990;background:rgba(0,0,0,0.75);text-align:center;overflow-y:auto}#fs_theme_connect_wrapper:before{content:"";display:inline-block;vertical-align:middle;height:100%}#fs_theme_connect_wrapper>button.close{color:white;cursor:pointer;height:40px;width:40px;position:absolute;right:0;border:0;background-color:transparent;top:32px}#fs_theme_connect_wrapper #fs_connect{top:0;text-align:left;display:inline-block;vertical-align:middle;margin-top:52px;margin-bottom:20px}#fs_theme_connect_wrapper #fs_connect .fs-terms{background:rgba(140,140,140,0.64)}#fs_theme_connect_wrapper #fs_connect .fs-terms,#fs_theme_connect_wrapper #fs_connect .fs-terms a{color:#c5c5c5}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.min.css index 3b37eb6ea..e73df72e9 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/connect.min.css @@ -1 +1 @@ -#fs_connect{width:480px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3);box-shadow:0 1px 2px rgba(0,0,0,.3);margin:20px 0}@media screen and (max-width:479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0 auto}#fs_connect .fs-license-key-container input{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect .fs-actions{padding:10px 20px;background:#c0c7ca}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:' \279C'}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-permissions{padding:10px 20px;background:#fefefe;-moz-transition:background .5s ease;-o-transition:background .5s ease;-ms-transition:background .5s ease;-webkit-transition:background .5s ease;transition:background .5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions .fs-trigger{font-size:.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li div{margin-left:55px}#fs_connect .fs-permissions ul li div span{font-weight:700;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li div p{margin:2px 0 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{height:auto;margin:20px 20px 10px 20px}@media screen and (max-width:479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#c2eeff;text-decoration:underline}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:.85em;padding:5px;background:rgba(0,0,0,.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#fs_connect .fs-terms a{text-decoration:none}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#c0c7ca}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:' \000bb'}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li div{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa}#fs_connect{box-shadow:none;border:1px solid #e0e0e0;margin-left:10px}#fs_connect a{color:#9fbb1a}#fs_connect a:hover{color:#b8d433}#fs_connect .fs-visual{padding:30px 20px!important;background:#fff}#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon{border:none;padding:0;top:30px}#fs_connect .fs-content{padding:30px 20px}#fs_connect .fs-actions,#fs_connect .fs-permissions,#fs_connect .fs-permissions.fs-open,#fs_connect .fs-terms{background:#143650;color:#fff;padding:0!important}#fs_connect .fs-actions{padding:30px 20px!important}#fs_connect .fs-permissions ul li i.dashicons{color:#9fbb1a}#fs_connect .fs-permissions.fs-open ul{margin-bottom:0;padding-bottom:20px}#fs_connect .fs-permissions ul li div span{color:#fff}#fs_connect .fs-terms{padding-bottom:15px!important}#fs_connect .fs-actions .button.button-primary{background-color:#9fbb1a!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px}#fs_connect .fs-actions .button.button-secondary{border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px}#fs_connect .fs-permissions a:hover,#fs_connect .fs-terms a:hover{color:#fff} \ No newline at end of file +#fs_connect{width:480px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3);box-shadow:0 1px 2px rgba(0,0,0,.3);margin:20px 0}@media screen and (max-width:479px){#fs_connect{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;width:auto;margin:0 0 0 -10px}}#fs_connect .fs-content{background:#fff;padding:15px 20px}#fs_connect .fs-content .fs-error{background:snow;color:#d3135a;border:1px solid #d3135a;-moz-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1);text-align:center;padding:5px;margin-bottom:10px}#fs_connect .fs-content p{margin:0;padding:0;font-size:1.2em}#fs_connect .fs-license-key-container{position:relative;width:280px;margin:10px auto 0}#fs_connect .fs-license-key-container input,#fs_connect.fs-anonymous-disabled .fs-actions .button.button-primary{width:100%}#fs_connect .fs-license-key-container .dashicons{position:absolute;top:5px;right:5px}#fs_connect.require-license-key #sites_list_container td{cursor:pointer}#fs_connect #delegate_to_site_admins{margin-right:15px;float:right;height:26px;vertical-align:middle;line-height:37px;font-weight:700;border-bottom:1px dashed;text-decoration:none}#fs_connect #delegate_to_site_admins.rtl{margin-left:15px;margin-right:0}#fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}#fs_connect .fs-actions .button{padding:0 10px 1px;line-height:35px;height:37px;font-size:16px;margin-bottom:0}#fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}#fs_connect .fs-actions .button.button-primary{padding-right:15px;padding-left:15px}#fs_connect .fs-actions .button.button-primary:after{content:' \279C'}#fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}#fs_connect .fs-actions .button.button-secondary{float:right}#fs_connect .fs-permissions{padding:10px 20px;background:#FEFEFE;-moz-transition:background .5s ease;-o-transition:background .5s ease;-ms-transition:background .5s ease;-webkit-transition:background .5s ease;transition:background .5s ease}#fs_connect .fs-permissions .fs-license-sync-disclaimer{text-align:center;margin-top:0}#fs_connect .fs-permissions .fs-trigger{font-size:.9em;text-decoration:none;text-align:center;display:block}#fs_connect .fs-permissions ul{height:0;overflow:hidden;margin:0}#fs_connect .fs-permissions ul li{margin-bottom:12px}#fs_connect .fs-permissions ul li:last-child{margin-bottom:0}#fs_connect .fs-permissions ul li i.dashicons{float:left;font-size:40px;width:40px;height:40px}#fs_connect .fs-permissions ul li div{margin-left:55px}#fs_connect .fs-permissions ul li div span{font-weight:700;text-transform:uppercase;color:#23282d}#fs_connect .fs-permissions ul li div p{margin:2px 0 0}#fs_connect .fs-permissions.fs-open{background:#fff}#fs_connect .fs-permissions.fs-open ul{height:auto;margin:20px 20px 10px}@media screen and (max-width:479px){#fs_connect .fs-permissions{background:#fff}#fs_connect .fs-permissions .fs-trigger{display:none}#fs_connect .fs-permissions ul{height:auto;margin:20px}}#fs_connect .fs-freemium-licensing{padding:8px;background:#777;color:#fff}#fs_connect .fs-freemium-licensing p{text-align:center;display:block;margin:0;padding:0}#fs_connect .fs-freemium-licensing a{color:#C2EEFF;text-decoration:underline}#fs_connect .fs-terms a,#multisite_options_container a{text-decoration:none}#fs_connect .fs-visual{padding:12px;line-height:0;background:#fafafa;height:80px;position:relative}#fs_connect .fs-visual .fs-site-icon{position:absolute;left:20px;top:10px}#fs_connect .fs-visual .fs-connect-logo{position:absolute;right:20px;top:10px}#fs_connect .fs-visual .fs-plugin-icon{position:absolute;top:10px;left:50%;margin-left:-40px}#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon,#fs_connect .fs-visual img,#fs_connect .fs-visual object{width:80px;height:80px}#fs_connect .fs-visual .dashicons-wordpress{font-size:64px;background:#01749a;color:#fff;width:64px;height:64px;padding:8px}#fs_connect .fs-visual .dashicons-plus{position:absolute;top:50%;font-size:30px;margin-top:-10px;color:#bbb}#fs_connect .fs-visual .dashicons-plus.fs-first{left:28%}#fs_connect .fs-visual .dashicons-plus.fs-second{left:65%}#fs_connect .fs-visual .fs-connect-logo,#fs_connect .fs-visual .fs-plugin-icon,#fs_connect .fs-visual .fs-site-icon{border:1px solid #ccc;padding:1px;background:#fff}#fs_connect .fs-terms{text-align:center;font-size:.85em;padding:5px;background:rgba(0,0,0,.05)}#fs_connect .fs-terms,#fs_connect .fs-terms a{color:#999}#multisite_options_container{margin-top:10px;border:1px solid #ccc;padding:5px}#multisite_options_container a:focus{box-shadow:none}#multisite_options_container a.selected{font-weight:700}#multisite_options_container.apply-on-all-sites{border:0;padding:0}#multisite_options_container.apply-on-all-sites #all_sites_options{border-spacing:0}#multisite_options_container.apply-on-all-sites #all_sites_options td:not(:first-child){display:none}#multisite_options_container #sites_list_container{display:none;overflow:auto}#multisite_options_container #sites_list_container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-tooltip-trigger{position:relative}.fs-tooltip-trigger:not(a){cursor:help}.fs-tooltip-trigger .fs-tooltip{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:rgba(0,0,0,.8);color:#fff;font-family:arial,serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:700;text-align:left}.rtl .fs-tooltip-trigger .fs-tooltip{text-align:right}.fs-tooltip-trigger .fs-tooltip::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:rgba(0,0,0,.8) transparent transparent;position:absolute;top:100%;left:21px}.rtl .fs-tooltip-trigger .fs-tooltip::after{right:21px;left:auto}.fs-tooltip-trigger:hover .fs-tooltip{visibility:visible;opacity:1}#fs_marketing_optin{display:none;margin-top:10px;border:1px solid #ccc;padding:10px;line-height:1.5em}#fs_marketing_optin .fs-message{display:block;margin-bottom:5px;font-size:1.05em;font-weight:600}#fs_marketing_optin.error{border:1px solid #d3135a;background:#fee}#fs_marketing_optin.error .fs-message{color:#d3135a}#fs_marketing_optin .fs-input-container{margin-top:5px}#fs_marketing_optin .fs-input-container label{margin-top:5px;display:block}#fs_marketing_optin .fs-input-container label input{float:left;margin:1px 0 0}#fs_marketing_optin .fs-input-container label:first-child{display:block;margin-bottom:2px}#fs_marketing_optin .fs-input-label{display:block;margin-left:20px}#fs_marketing_optin .fs-input-label .underlined{text-decoration:underline}.rtl #fs_marketing_optin .fs-input-container label input{float:right}.rtl #fs_marketing_optin .fs-input-label{margin-left:0;margin-right:20px}.rtl #fs_connect .fs-actions{padding:10px 20px;background:#C0C7CA}.rtl #fs_connect .fs-actions .button .dashicons{font-size:37px;margin-left:-8px;margin-right:12px}.rtl #fs_connect .fs-actions .button.button-primary:after{content:' \000bb'}.rtl #fs_connect .fs-actions .button.button-primary.fs-loading:after{content:''}.rtl #fs_connect .fs-actions .button.button-secondary{float:left}.rtl #fs_connect .fs-permissions ul li div{margin-right:55px;margin-left:0}.rtl #fs_connect .fs-permissions ul li i.dashicons{float:right}.rtl #fs_connect .fs-visual .fs-site-icon{right:20px;left:auto}.rtl #fs_connect .fs-visual .fs-connect-logo{right:auto;left:20px}#fs_theme_connect_wrapper{position:fixed;top:0;height:100%;width:100%;z-index:99990;background:rgba(0,0,0,.75);text-align:center;overflow-y:auto}#fs_theme_connect_wrapper:before{content:"";display:inline-block;vertical-align:middle;height:100%}#fs_theme_connect_wrapper>button.close{color:#fff;cursor:pointer;height:40px;width:40px;position:absolute;right:0;border:0;background-color:transparent;top:32px}#fs_theme_connect_wrapper #fs_connect{top:0;text-align:left;display:inline-block;vertical-align:middle;margin-top:52px;margin-bottom:20px}#fs_theme_connect_wrapper #fs_connect .fs-terms{background:rgba(140,140,140,.64)}#fs_theme_connect_wrapper #fs_connect .fs-terms,#fs_theme_connect_wrapper #fs_connect .fs-terms a{color:#c5c5c5}.wp-pointer-content #fs_connect{margin:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.fs-opt-in-pointer .wp-pointer-content{padding:0}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow{border-bottom-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-top .wp-pointer-arrow-inner{border-bottom-color:#fafafa}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow{border-top-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-bottom .wp-pointer-arrow-inner{border-top-color:#fafafa}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow{border-right-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-left .wp-pointer-arrow-inner{border-right-color:#fafafa}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow{border-left-color:#dfdfdf}.fs-opt-in-pointer.wp-pointer-right .wp-pointer-arrow-inner{border-left-color:#fafafa} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/deactivation-feedback.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/deactivation-feedback.min.css index 121dd059b..85dfd738e 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/deactivation-feedback.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/deactivation-feedback.min.css @@ -1 +1 @@ -.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}.fs-modal .fs-modal-dialog li.reason{margin-bottom:10px}.fs-modal .fs-modal-dialog li.reason .internal-message,.fs-modal .fs-modal-dialog li.reason .reason-input{margin-left:29px}.fs-modal .fs-modal-dialog li.reason label{display:table}.fs-modal .fs-modal-dialog li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body h2{font-size:20px}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel:not(.active){display:none}.fs-modal .internal-message,.fs-modal .reason-input{margin:3px 0 3px 22px}.fs-modal .internal-message input,.fs-modal .internal-message textarea,.fs-modal .reason-input input,.fs-modal .reason-input textarea{width:100%}.fs-modal li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}body.has-fs-modal{overflow:hidden}#the-list .deactivate>.fs-slug{display:none} \ No newline at end of file +.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}.fs-modal .fs-modal-dialog li.reason{margin-bottom:10px}.fs-modal .fs-modal-dialog li.reason .internal-message,.fs-modal .fs-modal-dialog li.reason .reason-input{margin-left:29px}.fs-modal .fs-modal-dialog li.reason label{display:table}.fs-modal .fs-modal-dialog li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.active,.fs-modal.active:before{display:block}#the-list .deactivate>.fs-slug,.fs-modal .fs-modal-panel:not(.active){display:none}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body h2{font-size:20px}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .internal-message,.fs-modal .reason-input{margin:3px 0 3px 22px}.fs-modal .internal-message input,.fs-modal .internal-message textarea,.fs-modal .reason-input input,.fs-modal .reason-input textarea{width:100%}.fs-modal li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}body.has-fs-modal{overflow:hidden} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.css index 48fe92f9b..808068d27 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.css @@ -1 +1 @@ -.switch{position:relative;display:inline-block;font-size:1.6em;font-weight:bold;color:#ccc;text-shadow:0px 1px 1px rgba(255,255,255,0.8);height:18px;padding:6px 6px 5px 6px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:4px;background:#ececec;box-shadow:0px 0px 4px rgba(0,0,0,0.1),inset 0px 1px 3px 0px rgba(0,0,0,0.1);cursor:pointer}.switch span{display:inline-block;width:35px;text-transform:uppercase}.switch span.on{color:#6bc406}.switch .toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.3);border-radius:4px;background:#fff;background:-moz-linear-gradient(top, #ececec 0%, #fff 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ececec), color-stop(100%, #fff));background:-webkit-linear-gradient(top, #ececec 0%, #fff 100%);background:-o-linear-gradient(top, #ececec 0%, #fff 100%);background:-ms-linear-gradient(top, #ececec 0%, #fff 100%);background:linear-gradient(top, #ececec 0%, #fff 100%);box-shadow:inset 0px 1px 0px 0px rgba(255,255,255,0.5);z-index:999;-moz-transition:all 0.15s ease-in-out;-o-transition:all 0.15s ease-in-out;-ms-transition:all 0.15s ease-in-out;-webkit-transition:all 0.15s ease-in-out;transition:all 0.15s ease-in-out}.switch.on .toggle{left:2%}.switch.off .toggle{left:54%}.switch.round{padding:0px 20px;border-radius:40px}.switch.round .toggle{border-radius:40px;width:14px;height:14px}.switch.round.on .toggle{left:3%;background:#6bc406}.switch.round.off .toggle{left:58%}.switch-label{font-size:20px;line-height:31px;margin:0 5px} +.switch{position:relative;display:inline-block;font-size:1.6em;font-weight:bold;color:#ccc;text-shadow:0px 1px 1px rgba(255,255,255,0.8);height:18px;padding:6px 6px 5px 6px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:4px;background:#ececec;box-shadow:0px 0px 4px rgba(0,0,0,0.1),inset 0px 1px 3px 0px rgba(0,0,0,0.1);cursor:pointer}.switch span{display:inline-block;width:35px;text-transform:uppercase}.switch span.on{color:#6bc406}.switch .toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.3);border-radius:4px;background:#fff;background:-moz-linear-gradient(top, #ececec 0%, #fff 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ececec), color-stop(100%, #fff));background:-webkit-linear-gradient(top, #ececec 0%, #fff 100%);background:-o-linear-gradient(top, #ececec 0%, #fff 100%);background:-ms-linear-gradient(top, #ececec 0%, #fff 100%);background:linear-gradient(top, #ececec 0%, #fff 100%);box-shadow:inset 0px 1px 0px 0px rgba(255,255,255,0.5);z-index:999;-moz-transition:all 0.15s ease-in-out;-o-transition:all 0.15s ease-in-out;-ms-transition:all 0.15s ease-in-out;-webkit-transition:all 0.15s ease-in-out;transition:all 0.15s ease-in-out}.switch.on .toggle{left:2%}.switch.off .toggle{left:54%}.switch.round{padding:0px 20px;border-radius:40px}.switch.round .toggle{border-radius:40px;width:14px;height:14px}.switch.round.on .toggle{left:3%;background:#6bc406}.switch.round.off .toggle{left:58%}.switch-label{font-size:20px;line-height:31px;margin:0 5px}#fs_log_book table{font-family:Consolas,Monaco,monospace;font-size:12px}#fs_log_book table th{color:#ccc}#fs_log_book table tr{background:#232525}#fs_log_book table tr.alternate{background:#2b2b2b}#fs_log_book table tr td.fs-col--logger{color:#5a7435}#fs_log_book table tr td.fs-col--type{color:#ffc861}#fs_log_book table tr td.fs-col--function{color:#a7b7b1;font-weight:bold}#fs_log_book table tr td.fs-col--message,#fs_log_book table tr td.fs-col--message a{color:#9a73ac !important}#fs_log_book table tr td.fs-col--file{color:#d07922}#fs_log_book table tr td.fs-col--timestamp{color:#6596be} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.min.css index d563d3771..c7a353a69 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/debug.min.css @@ -1 +1 @@ -.switch{position:relative;display:inline-block;font-size:1.6em;font-weight:700;color:#ccc;text-shadow:0 1px 1px rgba(255,255,255,.8);height:18px;padding:6px 6px 5px 6px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:4px;background:#ececec;box-shadow:0 0 4px rgba(0,0,0,.1),inset 0 1px 3px 0 rgba(0,0,0,.1);cursor:pointer}.switch span{display:inline-block;width:35px;text-transform:uppercase}.switch span.on{color:#6bc406}.switch .toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.3);border-radius:4px;background:#fff;background:-moz-linear-gradient(top,#ececec 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ececec),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ececec 0,#fff 100%);background:-o-linear-gradient(top,#ececec 0,#fff 100%);background:-ms-linear-gradient(top,#ececec 0,#fff 100%);background:linear-gradient(top,#ececec 0,#fff 100%);box-shadow:inset 0 1px 0 0 rgba(255,255,255,.5);z-index:999;-moz-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;-ms-transition:all .15s ease-in-out;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.switch.on .toggle{left:2%}.switch.off .toggle{left:54%}.switch.round{padding:0 20px;border-radius:40px}.switch.round .toggle{border-radius:40px;width:14px;height:14px}.switch.round.on .toggle{left:3%;background:#6bc406}.switch.round.off .toggle{left:58%}.switch-label{font-size:20px;line-height:31px;margin:0 5px} \ No newline at end of file +.switch,.switch span{display:inline-block}.switch{position:relative;font-size:1.6em;font-weight:700;color:#ccc;text-shadow:0 1px 1px rgba(255,255,255,.8);height:18px;padding:6px 6px 5px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:4px;background:#ececec;box-shadow:0 0 4px rgba(0,0,0,.1),inset 0 1px 3px 0 rgba(0,0,0,.1);cursor:pointer}.switch span{width:35px;text-transform:uppercase}.switch span.on{color:#6bc406}.switch .toggle{position:absolute;top:1px;width:37px;height:25px;border:1px solid #ccc;border:1px solid rgba(0,0,0,.3);border-radius:4px;background:#fff;background:-moz-linear-gradient(top,#ececec 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ececec),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ececec 0,#fff 100%);background:-o-linear-gradient(top,#ececec 0,#fff 100%);background:-ms-linear-gradient(top,#ececec 0,#fff 100%);background:linear-gradient(top,#ececec 0,#fff 100%);box-shadow:inset 0 1px 0 0 rgba(255,255,255,.5);z-index:999;-moz-transition:all .15s ease-in-out;-o-transition:all .15s ease-in-out;-ms-transition:all .15s ease-in-out;-webkit-transition:all .15s ease-in-out;transition:all .15s ease-in-out}.switch.on .toggle{left:2%}.switch.off .toggle{left:54%}.switch.round{padding:0 20px;border-radius:40px}.switch.round .toggle{border-radius:40px;width:14px;height:14px}.switch.round.on .toggle{left:3%;background:#6bc406}.switch.round.off .toggle{left:58%}.switch-label{font-size:20px;line-height:31px;margin:0 5px}#fs_log_book table{font-family:Consolas,Monaco,monospace;font-size:12px}#fs_log_book table th{color:#ccc}#fs_log_book table tr{background:#232525}#fs_log_book table tr.alternate{background:#2b2b2b}#fs_log_book table tr td.fs-col--logger{color:#5a7435}#fs_log_book table tr td.fs-col--type{color:#ffc861}#fs_log_book table tr td.fs-col--function{color:#a7b7b1;font-weight:700}#fs_log_book table tr td.fs-col--message,#fs_log_book table tr td.fs-col--message a{color:#9a73ac!important}#fs_log_book table tr td.fs-col--file{color:#d07922}#fs_log_book table tr td.fs-col--timestamp{color:#6596be} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.css index cf1309eec..bc33fe883 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.css @@ -1,42 +1,2 @@ -.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,0.6)}.fs-modal .fs-modal-dialog{background:transparent;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width: 650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eeeeee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:bold;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:0.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:bold;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eeeeee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .reason-input,.fs-modal.fs-modal-deactivation-feedback .internal-message{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media (max-width: 650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label{float:left}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0 !important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-license-activation .fs-modal-body input.license_key{width:100%}.fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend .fs-modal-body input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:right;margin-left:7px}@media (max-width: 650px){.fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{margin-top:2px}} -.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block} - -/* Customizations for NextGEN Gallery */ - -.fs-modal .fs-modal-header { - background: #143650; - color: #fff; -} - -.fs-modal .fs-modal-header h4 { - text-shadow: none; - color: #fff; -} - -.fs-modal .fs-modal-body { - padding-top: 35px; -} - -.fs-modal a.button-primary { - background-color: #9fbb1a !important; - color: #fff !important; - border: none !important; - box-shadow: none !important; - text-shadow: none !important; - height: 35px !important; - padding: 0 24px !important; - line-height: 35px; - width: auto !important; - border-radius: 3px; -} - -.fs-modal a.button-secondary { - border: none !important; - box-shadow: none !important; - text-shadow: none !important; - height: 35px !important; - padding: 0 24px !important; - line-height: 35px; - width: auto !important; - border-radius: 3px; -} \ No newline at end of file +.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,0.6)}.fs-modal .fs-modal-dialog{background:transparent;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width: 650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal.fs-success .fs-modal-header{border-bottom-color:#46b450}.fs-modal.fs-success .fs-modal-body{background-color:#f7fff7}.fs-modal.fs-warn .fs-modal-header{border-bottom-color:#ffb900}.fs-modal.fs-warn .fs-modal-body{background-color:#fff8e5}.fs-modal.fs-error .fs-modal-header{border-bottom-color:#dc3232}.fs-modal.fs-error .fs-modal-body{background-color:#ffeaea}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eeeeee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:bold;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:0.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;-ms-transition:all 0.2s ease-in-out;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-header .fs-close .dashicons,.fs-modal .fs-modal-header .fs-close:hover .dashicons{text-decoration:none}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:bold;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eeeeee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .reason-input,.fs-modal.fs-modal-deactivation-feedback .internal-message{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media (max-width: 650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label{float:left}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0 !important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-license-activation .fs-modal-body input.license_key{width:100%}#license_options_container table,#license_options_container table select,#license_options_container table #available_license_key{width:100%}#license_options_container table td:first-child{width:1%}#license_options_container table #other_license_key_container label{position:relative;top:6px;float:left;margin-right:5px}#license_options_container table #other_license_key_container div{overflow:hidden;width:auto;height:30px;display:block;top:2px;position:relative}#license_options_container table #other_license_key_container div input{margin:0}#sites_list_container td{cursor:pointer}#multisite_options_container{margin-top:10px;border:1px solid #ccc;padding:5px}#multisite_options_container a{text-decoration:none}#multisite_options_container a:focus{box-shadow:none}#multisite_options_container a.selected{font-weight:bold}#multisite_options_container.apply-on-all-sites{border:0 none;padding:0}#multisite_options_container.apply-on-all-sites #all_sites_options{border-spacing:0}#multisite_options_container.apply-on-all-sites #all_sites_options td:not(:first-child){display:none}#multisite_options_container #sites_list_container{display:none;overflow:auto}#multisite_options_container #sites_list_container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-modal.fs-modal-license-key-resend .email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend.fs-freemium input.email-address{width:300px}.fs-modal.fs-modal-license-key-resend.fs-freemium label{display:block;margin-bottom:10px}.fs-modal.fs-modal-license-key-resend.fs-premium input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{float:right;margin-left:7px}@media (max-width: 650px){.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{margin-top:2px}} +.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-ajax-loader{position:relative;width:170px;height:20px;margin:auto}.fs-ajax-loader .fs-ajax-loader-bar{position:absolute;top:0;background-color:#0074a3;width:20px;height:20px;-webkit-animation-name:bounce_ajaxLoader;-moz-animation-name:bounce_ajaxLoader;-ms-animation-name:bounce_ajaxLoader;-o-animation-name:bounce_ajaxLoader;animation-name:bounce_ajaxLoader;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s;animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-webkit-animation-direction:normal;-moz-animation-direction:normal;-ms-animation-direction:normal;-o-animation-direction:normal;animation-direction:normal;-moz-transform:0.3;-o-transform:0.3;-ms-transform:0.3;-webkit-transform:0.3;transform:0.3}.fs-ajax-loader .fs-ajax-loader-bar-1{left:0px;animation-delay:0.6s;-o-animation-delay:0.6s;-ms-animation-delay:0.6s;-webkit-animation-delay:0.6s;-moz-animation-delay:0.6s}.fs-ajax-loader .fs-ajax-loader-bar-2{left:19px;animation-delay:0.75s;-o-animation-delay:0.75s;-ms-animation-delay:0.75s;-webkit-animation-delay:0.75s;-moz-animation-delay:0.75s}.fs-ajax-loader .fs-ajax-loader-bar-3{left:38px;animation-delay:0.9s;-o-animation-delay:0.9s;-ms-animation-delay:0.9s;-webkit-animation-delay:0.9s;-moz-animation-delay:0.9s}.fs-ajax-loader .fs-ajax-loader-bar-4{left:57px;animation-delay:1.05s;-o-animation-delay:1.05s;-ms-animation-delay:1.05s;-webkit-animation-delay:1.05s;-moz-animation-delay:1.05s}.fs-ajax-loader .fs-ajax-loader-bar-5{left:76px;animation-delay:1.2s;-o-animation-delay:1.2s;-ms-animation-delay:1.2s;-webkit-animation-delay:1.2s;-moz-animation-delay:1.2s}.fs-ajax-loader .fs-ajax-loader-bar-6{left:95px;animation-delay:1.35s;-o-animation-delay:1.35s;-ms-animation-delay:1.35s;-webkit-animation-delay:1.35s;-moz-animation-delay:1.35s}.fs-ajax-loader .fs-ajax-loader-bar-7{left:114px;animation-delay:1.5s;-o-animation-delay:1.5s;-ms-animation-delay:1.5s;-webkit-animation-delay:1.5s;-moz-animation-delay:1.5s}.fs-ajax-loader .fs-ajax-loader-bar-8{left:133px;animation-delay:1.65s;-o-animation-delay:1.65s;-ms-animation-delay:1.65s;-webkit-animation-delay:1.65s;-moz-animation-delay:1.65s}@-moz-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-ms-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-o-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@-webkit-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}@keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(0.3);-o-transform:scale(0.3);-ms-transform:scale(0.3);-webkit-transform:scale(0.3);transform:scale(0.3);background-color:#fff}}.fs-modal-auto-install #request-filesystem-credentials-form h2,.fs-modal-auto-install #request-filesystem-credentials-form .request-filesystem-credentials-action-buttons{display:none}.fs-modal-auto-install #request-filesystem-credentials-form input[type=password],.fs-modal-auto-install #request-filesystem-credentials-form input[type=email],.fs-modal-auto-install #request-filesystem-credentials-form input[type=text]{-webkit-appearance:none;padding:10px 10px 5px 10px;width:300px;max-width:100%}.fs-modal-auto-install #request-filesystem-credentials-form>div,.fs-modal-auto-install #request-filesystem-credentials-form label,.fs-modal-auto-install #request-filesystem-credentials-form fieldset{width:300px;max-width:100%;margin:0 auto;display:block} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.min.css index 6b2cd4408..925d67f97 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/dialog-boxes.min.css @@ -1 +1 @@ -.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:700;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .internal-message,.fs-modal.fs-modal-deactivation-feedback .reason-input{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea,.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea{width:100%}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media (max-width:650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label{float:left}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0!important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-license-activation .fs-modal-body input.license_key{width:100%}.fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend .fs-modal-body input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:right;margin-left:7px}@media (max-width:650px){.fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{margin-top:2px}}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-modal .fs-modal-header{background:#143650;color:#fff}.fs-modal .fs-modal-header h4{text-shadow:none;color:#fff}.fs-modal .fs-modal-body{padding-top:35px}.fs-modal a.button-primary{background-color:#9fbb1a!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px}.fs-modal a.button-secondary{border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px} \ No newline at end of file +#multisite_options_container a,.fs-modal .fs-modal-header .fs-close .dashicons,.fs-modal .fs-modal-header .fs-close:hover .dashicons{text-decoration:none}.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}#license_options_container table,#license_options_container table #available_license_key,#license_options_container table select,.fs-modal.fs-modal-deactivation-feedback .internal-message input,.fs-modal.fs-modal-deactivation-feedback .internal-message textarea,.fs-modal.fs-modal-deactivation-feedback .reason-input input,.fs-modal.fs-modal-deactivation-feedback .reason-input textarea,.fs-modal.fs-modal-license-activation .fs-modal-body input.license_key{width:100%}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active,.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal.fs-success .fs-modal-header{border-bottom-color:#46b450}.fs-modal.fs-success .fs-modal-body{background-color:#f7fff7}.fs-modal.fs-warn .fs-modal-header{border-bottom-color:#ffb900}.fs-modal.fs-warn .fs-modal-body{background-color:#fff8e5}.fs-modal.fs-error .fs-modal-header{border-bottom-color:#dc3232}.fs-modal.fs-error .fs-modal-body{background-color:#ffeaea}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-header{border-bottom:#eee solid 1px;background:#fbfbfb;padding:15px 20px;position:relative;margin-bottom:-10px}.fs-modal .fs-modal-header h4{margin:0;padding:0;text-transform:uppercase;font-size:1.2em;font-weight:700;color:#cacaca;text-shadow:1px 1px 1px #fff;letter-spacing:.6px;-webkit-font-smoothing:antialiased}.fs-modal .fs-modal-header .fs-close{position:absolute;right:10px;top:12px;cursor:pointer;color:#bbb;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;padding:3px;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.fs-modal .fs-modal-header .fs-close:hover{color:#fff;background:#aaa}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px;line-height:1.5em}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel>.notice.inline{margin:0;display:none}.fs-modal .fs-modal-panel:not(.active){display:none}.rtl .fs-modal .fs-modal-header .fs-close{right:auto;left:20px}body.has-fs-modal{overflow:hidden}.fs-modal.fs-modal-deactivation-feedback .internal-message,.fs-modal.fs-modal-deactivation-feedback .reason-input{margin:3px 0 3px 22px}.fs-modal.fs-modal-deactivation-feedback li.reason.has-internal-message .internal-message{border:1px solid #ccc;padding:7px;display:none}@media (max-width:650px){.fs-modal.fs-modal-deactivation-feedback li.reason li.reason{margin-bottom:10px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .internal-message,.fs-modal.fs-modal-deactivation-feedback li.reason li.reason .reason-input{margin-left:29px}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label{display:table}.fs-modal.fs-modal-deactivation-feedback li.reason li.reason label>span{display:table-cell;font-size:1.3em}}#multisite_options_container.apply-on-all-sites #all_sites_options td:not(:first-child),#the-list .deactivate>.fs-slug{display:none}.fs-modal.fs-modal-deactivation-feedback .anonymous-feedback-label{float:left}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel{margin-top:0!important}.fs-modal.fs-modal-deactivation-feedback .fs-modal-panel h3{margin-top:0;line-height:1.5em}#license_options_container table td:first-child{width:1%}#license_options_container table #other_license_key_container label{position:relative;top:6px;float:left;margin-right:5px}#license_options_container table #other_license_key_container div{overflow:hidden;width:auto;height:30px;display:block;top:2px;position:relative}#license_options_container table #other_license_key_container div input{margin:0}#sites_list_container td{cursor:pointer}#multisite_options_container{margin-top:10px;border:1px solid #ccc;padding:5px}#multisite_options_container a:focus{box-shadow:none}#multisite_options_container a.selected{font-weight:700}#multisite_options_container.apply-on-all-sites{border:0;padding:0}#multisite_options_container.apply-on-all-sites #all_sites_options{border-spacing:0}#multisite_options_container #sites_list_container{display:none;overflow:auto}#multisite_options_container #sites_list_container table td{border-top:1px solid #ccc;padding:4px 2px}.fs-modal.fs-modal-license-key-resend .email-address-container{overflow:hidden;padding-right:2px}.fs-modal.fs-modal-license-key-resend.fs-freemium input.email-address{width:300px}.fs-modal.fs-modal-license-key-resend.fs-freemium label{display:block;margin-bottom:10px}.fs-modal.fs-modal-license-key-resend.fs-premium input.email-address{width:100%}.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{float:right;margin-left:7px}@media (max-width:650px){.fs-modal.fs-modal-license-key-resend.fs-premium .button-container{margin-top:2px}}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .input-container>.email-address-container{padding-left:2px;padding-right:0}.rtl .fs-modal.fs-modal-license-key-resend .fs-modal-body .button-container{float:left;margin-right:7px;margin-left:0}a.show-license-resend-modal{margin-top:4px;display:inline-block}.fs-ajax-loader{position:relative;width:170px;height:20px;margin:auto}.fs-ajax-loader .fs-ajax-loader-bar{position:absolute;top:0;background-color:#0074a3;width:20px;height:20px;-webkit-animation-name:bounce_ajaxLoader;-moz-animation-name:bounce_ajaxLoader;-ms-animation-name:bounce_ajaxLoader;-o-animation-name:bounce_ajaxLoader;animation-name:bounce_ajaxLoader;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s;animation-iteration-count:infinite;-o-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-webkit-animation-direction:normal;-moz-animation-direction:normal;-ms-animation-direction:normal;-o-animation-direction:normal;animation-direction:normal;-moz-transform:.3;-o-transform:.3;-ms-transform:.3;-webkit-transform:.3;transform:.3}.fs-ajax-loader .fs-ajax-loader-bar-1{left:0;animation-delay:.6s;-o-animation-delay:.6s;-ms-animation-delay:.6s;-webkit-animation-delay:.6s;-moz-animation-delay:.6s}.fs-ajax-loader .fs-ajax-loader-bar-2{left:19px;animation-delay:.75s;-o-animation-delay:.75s;-ms-animation-delay:.75s;-webkit-animation-delay:.75s;-moz-animation-delay:.75s}.fs-ajax-loader .fs-ajax-loader-bar-3{left:38px;animation-delay:.9s;-o-animation-delay:.9s;-ms-animation-delay:.9s;-webkit-animation-delay:.9s;-moz-animation-delay:.9s}.fs-ajax-loader .fs-ajax-loader-bar-4{left:57px;animation-delay:1.05s;-o-animation-delay:1.05s;-ms-animation-delay:1.05s;-webkit-animation-delay:1.05s;-moz-animation-delay:1.05s}.fs-ajax-loader .fs-ajax-loader-bar-5{left:76px;animation-delay:1.2s;-o-animation-delay:1.2s;-ms-animation-delay:1.2s;-webkit-animation-delay:1.2s;-moz-animation-delay:1.2s}.fs-ajax-loader .fs-ajax-loader-bar-6{left:95px;animation-delay:1.35s;-o-animation-delay:1.35s;-ms-animation-delay:1.35s;-webkit-animation-delay:1.35s;-moz-animation-delay:1.35s}.fs-ajax-loader .fs-ajax-loader-bar-7{left:114px;animation-delay:1.5s;-o-animation-delay:1.5s;-ms-animation-delay:1.5s;-webkit-animation-delay:1.5s;-moz-animation-delay:1.5s}.fs-ajax-loader .fs-ajax-loader-bar-8{left:133px;animation-delay:1.65s;-o-animation-delay:1.65s;-ms-animation-delay:1.65s;-webkit-animation-delay:1.65s;-moz-animation-delay:1.65s}@-moz-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(.3);-o-transform:scale(.3);-ms-transform:scale(.3);-webkit-transform:scale(.3);transform:scale(.3);background-color:#fff}}@-ms-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(.3);-o-transform:scale(.3);-ms-transform:scale(.3);-webkit-transform:scale(.3);transform:scale(.3);background-color:#fff}}@-o-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(.3);-o-transform:scale(.3);-ms-transform:scale(.3);-webkit-transform:scale(.3);transform:scale(.3);background-color:#fff}}@-webkit-keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(.3);-o-transform:scale(.3);-ms-transform:scale(.3);-webkit-transform:scale(.3);transform:scale(.3);background-color:#fff}}@keyframes bounce_ajaxLoader{0%{-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);-webkit-transform:scale(1);transform:scale(1);background-color:#0074a3}100%{-moz-transform:scale(.3);-o-transform:scale(.3);-ms-transform:scale(.3);-webkit-transform:scale(.3);transform:scale(.3);background-color:#fff}}.fs-modal-auto-install #request-filesystem-credentials-form .request-filesystem-credentials-action-buttons,.fs-modal-auto-install #request-filesystem-credentials-form h2{display:none}.fs-modal-auto-install #request-filesystem-credentials-form input[type=email],.fs-modal-auto-install #request-filesystem-credentials-form input[type=password],.fs-modal-auto-install #request-filesystem-credentials-form input[type=text]{-webkit-appearance:none;padding:10px 10px 5px;width:300px;max-width:100%}.fs-modal-auto-install #request-filesystem-credentials-form fieldset,.fs-modal-auto-install #request-filesystem-credentials-form label,.fs-modal-auto-install #request-filesystem-credentials-form>div{width:300px;max-width:100%;margin:0 auto;display:block} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.css new file mode 100644 index 000000000..0da5146f6 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.css @@ -0,0 +1 @@ +.fs-notice[data-id^="gdpr_optin_actions"] .underlined{text-decoration:underline}.fs-notice[data-id^="gdpr_optin_actions"] ul .button,.fs-notice[data-id^="gdpr_optin_actions"] ul .action-description{vertical-align:middle}.fs-notice[data-id^="gdpr_optin_actions"] ul .action-description{display:inline-block;margin-left:3px} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.min.css new file mode 100644 index 000000000..836dcd197 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/gdpr-optin-notice.min.css @@ -0,0 +1 @@ +.fs-notice[data-id^=gdpr_optin_actions] .underlined{text-decoration:underline}.fs-notice[data-id^=gdpr_optin_actions] ul .action-description,.fs-notice[data-id^=gdpr_optin_actions] ul .button{vertical-align:middle}.fs-notice[data-id^=gdpr_optin_actions] ul .action-description{display:inline-block;margin-left:3px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/license-activation.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/license-activation.min.css index 7c3564e89..0b1874fec 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/license-activation.min.css +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/admin/license-activation.min.css @@ -1 +1 @@ -.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active{display:block}.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body .license-activation-message{margin:0;display:none}.fs-modal .fs-modal-body input.license_key{width:100%}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel:not(.active){display:none}body.has-fs-modal{overflow:hidden} \ No newline at end of file +.fs-modal{position:fixed;overflow:auto;height:100%;width:100%;top:0;z-index:100000;display:none;background:rgba(0,0,0,.6)}.fs-modal .fs-modal-dialog{background:0 0;position:absolute;left:50%;margin-left:-298px;padding-bottom:30px;top:-100%;z-index:100001;width:596px}@media (max-width:650px){.fs-modal .fs-modal-dialog{margin-left:-50%;box-sizing:border-box;padding-left:10px;padding-right:10px;width:100%}.fs-modal .fs-modal-dialog .fs-modal-panel>h3>strong{font-size:1.3em}}.fs-modal.active,.fs-modal.active:before{display:block}.fs-modal.active .fs-modal-dialog{top:10%}.fs-modal .fs-modal-body,.fs-modal .fs-modal-footer{border:0;background:#fefefe;padding:20px}.fs-modal .fs-modal-body{border-bottom:0}.fs-modal .fs-modal-body .license-activation-message{margin:0;display:none}.fs-modal .fs-modal-body input.license_key{width:100%}.fs-modal .fs-modal-body p{font-size:14px}.fs-modal .fs-modal-body h2{font-size:20px}.fs-modal .fs-modal-body>div{margin-top:10px}.fs-modal .fs-modal-body>div h2{font-weight:700;font-size:20px;margin-top:0}.fs-modal .fs-modal-footer{border-top:#eee solid 1px;text-align:right}.fs-modal .fs-modal-footer>.button{margin:0 7px}.fs-modal .fs-modal-footer>.button:first-child{margin:0}.fs-modal .fs-modal-panel:not(.active){display:none}body.has-fs-modal{overflow:hidden} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.css new file mode 100644 index 000000000..381bcd1bd --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.css @@ -0,0 +1 @@ +#fs_customizer_upsell .fs-customizer-plan{padding:10px 20px 20px 20px;border-radius:3px;background:#fff}#fs_customizer_upsell .fs-customizer-plan h2{position:relative;margin:0;line-height:2em;text-transform:uppercase}#fs_customizer_upsell .fs-customizer-plan h2 .button-link{top:-2px}#fs_customizer_upsell .fs-feature{position:relative}#fs_customizer_upsell .dashicons-yes{color:#0085ba;font-size:2em;vertical-align:bottom;margin-left:-7px;margin-right:10px}.rtl #fs_customizer_upsell .dashicons-yes{margin-left:10px;margin-right:-7px}#fs_customizer_upsell .dashicons-editor-help{color:#bbb;cursor:help}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease-in-out;-o-transition:opacity 0.3s ease-in-out;-ms-transition:opacity 0.3s ease-in-out;-webkit-transition:opacity 0.3s ease-in-out;transition:opacity 0.3s ease-in-out;position:absolute;background:#000;color:#fff;font-family:'arial', serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,0.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,0.2);box-shadow:1px 1px 1px rgba(0,0,0,0.2);line-height:1.3em;font-weight:bold;text-align:left}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{text-align:right}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0 5px;border-color:#000 transparent transparent transparent;position:absolute;top:100%;left:21px}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{right:21px;left:auto}#fs_customizer_upsell .dashicons-editor-help:hover .fs-feature-desc{visibility:visible;opacity:1}#fs_customizer_upsell .button-primary{display:block;text-align:center;margin-top:10px}#fs_customizer_support{display:block !important}#fs_customizer_support .button{float:right}#fs_customizer_support .button-group{width:100%;display:block;margin-top:10px}#fs_customizer_support .button-group .button{float:none;width:50%;text-align:center} diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.min.css b/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.min.css new file mode 100644 index 000000000..034b5229c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/customizer.min.css @@ -0,0 +1 @@ +#fs_customizer_upsell .fs-customizer-plan{padding:10px 20px 20px;border-radius:3px;background:#fff}#fs_customizer_upsell .fs-customizer-plan h2{position:relative;margin:0;line-height:2em;text-transform:uppercase}#fs_customizer_upsell .fs-customizer-plan h2 .button-link{top:-2px}#fs_customizer_upsell .fs-feature{position:relative}#fs_customizer_upsell .dashicons-yes{color:#0085ba;font-size:2em;vertical-align:bottom;margin-left:-7px;margin-right:10px}.rtl #fs_customizer_upsell .dashicons-yes{margin-left:10px;margin-right:-7px}#fs_customizer_upsell .dashicons-editor-help{color:#bbb;cursor:help}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{opacity:0;visibility:hidden;-moz-transition:opacity .3s ease-in-out;-o-transition:opacity .3s ease-in-out;-ms-transition:opacity .3s ease-in-out;-webkit-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;position:absolute;background:#000;color:#fff;font-family:arial,serif;font-size:12px;padding:10px;z-index:999999;bottom:100%;margin-bottom:5px;left:0;right:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:1px 1px 1px rgba(0,0,0,.2);-webkit-box-shadow:1px 1px 1px rgba(0,0,0,.2);box-shadow:1px 1px 1px rgba(0,0,0,.2);line-height:1.3em;font-weight:700;text-align:left}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc{text-align:right}#fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{content:' ';display:block;width:0;height:0;border-style:solid;border-width:5px 5px 0;border-color:#000 transparent transparent;position:absolute;top:100%;left:21px}.rtl #fs_customizer_upsell .dashicons-editor-help .fs-feature-desc::after{right:21px;left:auto}#fs_customizer_upsell .dashicons-editor-help:hover .fs-feature-desc{visibility:visible;opacity:1}#fs_customizer_upsell .button-primary{display:block;text-align:center;margin-top:10px}#fs_customizer_support{display:block!important}#fs_customizer_support .button{float:right}#fs_customizer_support .button-group{width:100%;display:block;margin-top:10px}#fs_customizer_support .button-group .button{float:none;width:50%;text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/css/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/css/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/css/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/img/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/img/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/img/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/img/theme-icon.png b/wp-content/plugins/nextgen-gallery/freemius/assets/img/theme-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..045d4b25f9727fada65dcfd66cf0a0a3d167ee84 GIT binary patch literal 11237 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 YThH6xnawkufq{X+)78&qol`;+06i{jTmS$7 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/js/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/js/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/js/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_colors.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_colors.scss index d2fc52f45..77349cb40 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_colors.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_colors.scss @@ -20,9 +20,6 @@ $fs-logo-blue-color: #29abe1; $fs-logo-green-color: #71ae00; $fs-logo-magenta-color: #d3135a; -$fs-notice-promotion-border-color: #00a0d2; -$fs-notice-promotion-bkg: #f2fcff; - // WordPress colors. $page-header-bkg: #333; $page-header-color: $fms-white; @@ -30,6 +27,16 @@ $text-dark-color: #333; $text-light-color: #666; $text-lightest-color: #999; +// Notices. +$wp-notice-success-color: #f7fff7; +$wp-notice-success-dark-color: #46b450; +$wp-notice-error-color: #ffeaea; +$wp-notice-error-dark-color: #dc3232; +$wp-notice-warn-color: #fff8e5; +$wp-notice-warn-dark-color: #ffb900; +$fs-notice-promotion-border-color: #00a0d2; +$fs-notice-promotion-bkg: #f2fcff; + // WP Buttons. $button-primary-bkg: #6bc406; $button-primary-color: $fms-white; @@ -56,3 +63,6 @@ $linkedin_color: #4875b4; $youtube_color: #ff3333; $gplus_color: #c63d2d; +// Tooltip +$tooltip-color: #fff; +$tooltip-bkg-color: rgba(0,0,0,0.8); diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_mixins.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_mixins.scss index 7048b1692..1fcea8633 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_mixins.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_mixins.scss @@ -78,13 +78,13 @@ $useIEFilters: 0; } // requires sass 3.2 -//@mixin keyframes { -// @-moz-keyframes { @content; } -// @-ms-keyframes { @content; } -// @-o-keyframes { @content; } -// @-webkit-keyframes { @content; } -// @keyframes { @content; } -//} +@mixin keyframes($name){ + @-moz-keyframes #{$name} { @content; } + @-ms-keyframes #{$name} { @content; } + @-o-keyframes #{$name} { @content; } + @-webkit-keyframes #{$name} { @content; } + @keyframes #{$name} { @content; } +} @mixin linear-gradient($from, $to, $ie: $useIEFilters) { @if $ie != 1 { background-color: $to; } @@ -132,19 +132,6 @@ $useIEFilters: 0; } } -/*@mixin rgba-bg ($hex, $alpha, $ie: $useIEFilters) { - @if $ie == 1 { - background-color: none; - $hexopac: ie-hex-str(rgba($hex, $alpha)); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#{$hexopac}',EndColorStr='#{$hexopac}}'); - -ms-filter: quote(progid:DXImageTransform.Microsoft.gradient(startColorStr='#{$hexopac}',EndColorStr='#{$hexopac}')); - } - @else { - background-color: $hex; - background-color: rgba($hex, $alpha); - } -}*/ - @mixin perspective($perspective) { -moz-perspective: $perspective; -ms-perspective: $perspective; @@ -192,6 +179,62 @@ $useIEFilters: 0; transition: $value; } +@mixin animation($str) { + -webkit-animation: #{$str}; + -moz-animation: #{$str}; + -ms-animation: #{$str}; + -o-animation: #{$str}; + animation: #{$str}; +} + +@mixin animation-name($str) { + -webkit-animation-name: #{$str}; + -moz-animation-name: #{$str}; + -ms-animation-name: #{$str}; + -o-animation-name: #{$str}; + animation-name: #{$str}; +} + +@mixin animation-duration($str) { + -webkit-animation-duration: #{$str}; + -moz-animation-duration: #{$str}; + -ms-animation-duration: #{$str}; + -o-animation-duration: #{$str}; + animation-duration: #{$str}; +} + +@mixin animation-direction($str) { + -webkit-animation-direction: #{$str}; + -moz-animation-direction: #{$str}; + -ms-animation-direction: #{$str}; + -o-animation-direction: #{$str}; + animation-direction: #{$str}; +} + +@mixin animation-delay($str) { + animation-delay:#{$str}; + -o-animation-delay:#{$str}; + -ms-animation-delay:#{$str}; + -webkit-animation-delay:#{$str}; + -moz-animation-delay:#{$str}; +} + +@mixin animation-iteration-count($str) { + animation-iteration-count:#{$str}; + -o-animation-iteration-count:#{$str}; + -ms-animation-iteration-count:#{$str}; + -webkit-animation-iteration-count:#{$str}; + -moz-animation-iteration-count:#{$str}; +} + +@mixin animation-timing-function($str) { + -webkit-animation-timing-function: #{$str}; + -moz-animation-timing-function: #{$str}; + -ms-animation-timing-function: #{$str}; + -o-animation-timing-function: #{$str}; + animation-timing-function: #{$str}; +} + // ==== /CSS3 SASS MIXINS ==== @mixin opacity($opacity) { diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_vars.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_vars.scss index d75ec6d99..656497251 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_vars.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/_vars.scss @@ -2,4 +2,5 @@ $is_production: true; $img_common: if($is_production == true, '//img.freemius.com', 'http://img.freemius:8080'); -$layout_width: 960px; \ No newline at end of file +$layout_width: 960px; +$admin_mobile_max_width: 782px; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_ajax-loader.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_ajax-loader.scss new file mode 100644 index 000000000..f748beba6 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_ajax-loader.scss @@ -0,0 +1,49 @@ +$color: $wp-selected-color; +$bkg-color: #fff; +$size: 20; + +.fs-ajax-loader +{ + position: relative; + width: #{8*$size + 10}px; + height: #{$size}px; + margin: auto; + + .fs-ajax-loader-bar + { + position: absolute; + top: 0; + background-color: $color; + width: #{$size}px; + height: #{$size}px; + @include animation-name(bounce_ajaxLoader); + @include animation-duration(1.5s); + @include animation-iteration-count(infinite); + @include animation-direction(normal); + @include transform(.3); + } + + @for $i from 0 through 7 + { + .fs-ajax-loader-bar-#{$i + 1} + { + left: #{$i*($size - 1)}px; + @include animation-delay(#{0.6 + $i*0.15}s); + } + } +} + +@include keyframes(bounce_ajaxLoader) +{ + 0% + { + @include transform(scale(1)); + background-color: $color; + } + + 100% + { + @include transform(scale(.3)); + background-color: $bkg-color; + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_auto-install.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_auto-install.scss new file mode 100644 index 000000000..b1cac8eb4 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_auto-install.scss @@ -0,0 +1,33 @@ +.fs-modal-auto-install +{ + $max-width: 300px; + + #request-filesystem-credentials-form + { + h2, + .request-filesystem-credentials-action-buttons + { + display: none; + } + + input[type=password], + input[type=email], + input[type=text] + { + -webkit-appearance: none; + padding: 10px 10px 5px 10px; + width: $max-width; + max-width: 100%; + } + + > div, + label, + fieldset + { + width: $max-width; + max-width: 100%; + margin: 0 auto; + display: block; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_gdpr-consent.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_gdpr-consent.scss new file mode 100644 index 000000000..712cc8add --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_gdpr-consent.scss @@ -0,0 +1,81 @@ +#fs_marketing_optin +{ + display: none; + margin-top: 10px; + border: 1px solid #ccc; + padding: 10px; + line-height: 1.5em; + + .fs-message + { + display: block; + margin-bottom: 5px; + font-size: 1.05em; + font-weight: 600; + } + + &.error + { + border: 1px solid $fs-logo-magenta-color; + background: #fee; + + .fs-message + { + color: $fs-logo-magenta-color; + } + } + + .fs-input-container + { + margin-top: 5px; + + label + { + margin-top: 5px; + display: block; + + input + { + float: left; + margin: 1px 0 0 0; + } + + &:first-child + { + display: block; + margin-bottom: 2px; + } + } + } + + .fs-input-label + { + display: block; + margin-left: 20px; + + .underlined + { + text-decoration: underline; + } + } +} + +.rtl +{ + #fs_marketing_optin + { + .fs-input-container + { + label input + { + float: right; + } + } + + .fs-input-label + { + margin-left: 0; + margin-right: 20px; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-activation.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-activation.scss index 2eb8accee..2c3ddac54 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-activation.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-activation.scss @@ -4,4 +4,44 @@ width: 100%; } } +} + +#license_options_container { + table { + &, select, #available_license_key { + width: 100%; + } + + td:first-child { + width: 1%; + } + + #other_license_key_container { + label { + position: relative; + top: 6px; + float: left; + margin-right: 5px; + } + + div { + overflow: hidden; + width: auto; + height: 30px; + display: block; + top: 2px; + position: relative; + + input { + margin: 0; + } + } + } + } +} + +#sites_list_container { + td { + cursor: pointer; + } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-key-resend.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-key-resend.scss index 5dc64cca3..6ec9f8671 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-key-resend.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_license-key-resend.scss @@ -1,44 +1,68 @@ -.fs-modal.fs-modal-license-key-resend { - .fs-modal-body { - .input-container > .email-address-container { - overflow: hidden; - padding-right: 2px; - } - - input.email-address { - width: 100%; - } - - .button-container { - float: right; - margin-left: 7px; - - @media (max-width: 650px) { - margin-top: 2px; - } - } - } +.fs-modal.fs-modal-license-key-resend +{ + .email-address-container + { + overflow: hidden; + padding-right: 2px; + } + + &.fs-freemium + { + input.email-address + { + width: 300px; + } + + label + { + display: block; + margin-bottom: 10px; + } + } + + &.fs-premium + { + input.email-address + { + width: 100%; + } + + .button-container + { + float: right; + margin-left: 7px; + + @media (max-width: 650px) { + margin-top: 2px; + } + } + } } .rtl { - .fs-modal.fs-modal-license-key-resend { - .fs-modal-body { - .input-container > .email-address-container { - padding-left: 2px; + .fs-modal.fs-modal-license-key-resend + { + .fs-modal-body + { + .input-container > .email-address-container + { + padding-left: 2px; padding-right: 0; } - .button-container { - float: left; + .button-container + { + float: left; margin-right: 7px; - margin-left: 0; + margin-left: 0; } } } } -a.show-license-resend-modal { - margin-top: 4px; - display: inline-block; +a.show-license-resend-modal +{ + margin-top: 4px; + display: inline-block; } diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_modal-common.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_modal-common.scss index e4260ce9d..3f65617fb 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_modal-common.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_modal-common.scss @@ -46,6 +46,37 @@ } } + &.fs-success { + .fs-modal-header { + border-bottom-color: $wp-notice-success-dark-color; + } + + .fs-modal-body { + background-color: $wp-notice-success-color; + } + } + + &.fs-warn { + .fs-modal-header { + border-bottom-color: $wp-notice-warn-dark-color; + } + + .fs-modal-body { + background-color: $wp-notice-warn-color; + } + } + + &.fs-error { + .fs-modal-header { + border-bottom-color: $wp-notice-error-dark-color; + } + + .fs-modal-body { + background-color: $wp-notice-error-color; + } + } + + .fs-modal-body, .fs-modal-footer { border: 0; @@ -87,6 +118,14 @@ color: #fff; background: #aaa; } + + &, &:hover + { + .dashicons + { + text-decoration: none; + } + } } } diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_multisite-options.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_multisite-options.scss new file mode 100644 index 000000000..9f2ab60f6 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_multisite-options.scss @@ -0,0 +1,40 @@ +#multisite_options_container { + margin-top: 10px; + border: 1px solid #ccc; + padding: 5px; + + a { + text-decoration: none; + + &:focus { + box-shadow: none; + } + + &.selected { + font-weight: bold; + } + } + + &.apply-on-all-sites { + border: 0 none; + padding: 0; + + #all_sites_options { + border-spacing: 0; + + td:not(:first-child) { + display: none; + } + } + } + + #sites_list_container { + display: none; + overflow: auto; + + table td { + border-top: 1px solid #ccc; + padding: 4px 2px; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_themes.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_themes.scss new file mode 100644 index 000000000..7eb405273 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_themes.scss @@ -0,0 +1,21 @@ +.theme-browser +{ + .theme + { + .fs-premium-theme-badge + { + position: absolute; + top: 10px; + right: 0; + background: $fs-logo-green-color; + color: #fff; + text-transform: uppercase; + padding: 5px 10px; + @include border-radius(3px 0 0 3px); + font-weight: bold; + border-right: 0; + @include box-shadow(0 2px 1px -1px rgba(0, 0, 0, .3)); + font-size: 1.1em; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_tooltip.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_tooltip.scss new file mode 100644 index 000000000..d48f52dcf --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/_tooltip.scss @@ -0,0 +1,66 @@ +.fs-tooltip-trigger +{ + &:not(a) + { + cursor: help; + } + + position: relative; + + .fs-tooltip + { + opacity: 0; + visibility: hidden; + @include transition(opacity 0.3s ease-in-out); + position: absolute; + background: $tooltip-bkg-color; + color: $tooltip-color; + font-family: 'arial', serif; + font-size: 12px; + padding: 10px; + z-index: 999999; + bottom: 100%; + margin-bottom: 5px; + left: 0; + right: 0; + @include border-radius(5px); + @include box-shadow(1px 1px 1px rgba(0, 0, 0, 0.2)); + line-height: 1.3em; + font-weight: bold; + text-align: left; + + .rtl & + { + text-align: right; + } + + &::after + { + content: ' '; + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 5px 5px 0 5px; + border-color: $tooltip-bkg-color transparent transparent transparent; + position: absolute; + top: 100%; + left: 21px; + + .rtl & + { + right: 21px; + left: auto; + } + } + } + + &:hover + { + .fs-tooltip + { + visibility: visible; + opacity: 1; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/account.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/account.scss index 423cead5e..01e0644d3 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/account.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/account.scss @@ -15,6 +15,12 @@ margin: 0 0 12px 0; line-height: 1.4; border-bottom: 1px solid #F1F1F1; + + .dashicons { + width: 26px; + height: 26px; + font-size: 1.3em; + } } i.dashicons @@ -24,12 +30,9 @@ width: 1.2em; } - .button + .dashicons { - i.dashicons - { - vertical-align: middle; - } + vertical-align: middle; } .fs-header-actions @@ -154,6 +157,55 @@ label.fs-tag } } +#fs_sites +{ + .fs-scrollable-table + { + .fs-table-body { + max-height: 200px; + overflow: auto; + border: 1px solid #e5e5e5; + + & > table.widefat { + border: none !important; + } + } + + .fs-main-column { + width: 100%; + } + + .fs-site-details + { + td:first-of-type + { + text-align: right; + color: grey; + width: 1px; + } + + td:last-of-type + { + text-align: right; + } + } + + .fs-install-details table + { + tr td + { + width: 1px; + white-space: nowrap; + + &:last-of-type + { + width: auto; + } + } + } + } +} + #fs_addons { h3 diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/affiliation.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/affiliation.scss new file mode 100644 index 000000000..469d24eb6 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/affiliation.scss @@ -0,0 +1,97 @@ +@import "../start"; + +#fs_affiliation_content_wrapper { + #messages { + margin-top: 25px; + } + + h3 { + font-size: 24px; + padding: 0; + margin-left: 0; + } + + ul { + li { + @include box-sizing(border-box); + list-style-type: none; + + &:before { + content: '✓'; + margin-right: 10px; + font-weight: bold; + } + } + } + + p:not(.description), li, label { + font-size: 16px !important; + line-height: 26px !important; + } + + .button { + margin-top: 20px; + margin-bottom: 7px; + line-height: 35px; + height: 40px; + font-size: 16px; + + &#cancel_button { + margin-right: 5px; + } + } + + form { + .input-container { + .input-label { + font-weight: bold; + display: block; + width: 100%; + } + + &.input-container-text { + label, input, textarea { + display: block; + } + } + + margin-bottom: 15px; + + #add_domain, .remove-domain { + text-decoration: none; + display: inline-block; + margin-top: 3px; + + &:focus { + box-shadow: none; + } + + &.disabled { + color: #aaa; + cursor: default; + } + } + } + + #extra_domains_container { + .description { + margin-top: 0; + position: relative; + top: -4px; + } + + .extra-domain-input-container { + margin-bottom: 15px; + + .domain { + display: inline-block; + margin-right: 5px; + + &:last-of-type { + margin-bottom: 0; + } + } + } + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/checkout.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/checkout.scss new file mode 100644 index 000000000..f60ab4de3 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/checkout.scss @@ -0,0 +1,5 @@ +@media screen and (max-width: 782px) { + #wpbody-content { + padding-bottom: 0 !important; + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/common.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/common.scss index 2f2d3cc20..86cc6c347 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/common.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/common.scss @@ -1,160 +1,218 @@ -@import "../start"; - -.fs-notice -{ - position: relative; - - &.fs-has-title - { - margin-bottom: 30px !important; - } - - &.success - { - color: green; - // font-weight: normal; - } - - &.promotion - { - border-color: $fs-notice-promotion-border-color !important; - background-color: $fs-notice-promotion-bkg !important; - } - - .fs-notice-body - { - margin: .5em 0; - padding: 2px; - } - - .fs-close - { - // position: absolute; - // top: 2px; - // bottom: 2px; - // right: 2px; - // min-width: 100px; - // text-align: center; - // padding-right: 2px; - cursor: pointer; - color: #aaa; - float: right; - - &:hover - { - color: #666; - // background: #A9A9A9; - } - - > * - { - margin-top: 7px; - display: inline-block; - } - } - - label.fs-plugin-title - { - background: rgba(0, 0, 0, 0.3); - color: #fff; - padding: 2px 10px; - position: absolute; - top: 100%; - bottom: auto; - right: auto; - @include border-radius(0 0 3px 3px); - left: 10px; - font-size: 12px; - font-weight: bold; - cursor: auto; - } -} - -.rtl .fs-notice -{ - .fs-close - { - // left: 2px; - // right: auto; - // padding-right: 0; - // padding-left: 2px; - float: left; - } -} - -.fs-secure-notice -{ - position: fixed; - top: 32px; - left: 160px; - right: 0; - background: rgb(235, 253, 235); - padding: 10px 20px; - color: green; - z-index: 9999; - box-shadow: 0px 2px 2px rgba(6, 113, 6, 0.3); - @include opacity(0.95); - - &:hover - { - @include opacity(1); - } -} - -@media screen and (max-width: 960px) { - .fs-secure-notice - { - left: 36px; - } -} - -@media screen and (max-width:500px) { - #fs_promo_tab { - display: none; - } -} - -@media screen and (max-width: 782px) { - .fs-secure-notice - { - left: 0; - top: 46px; - text-align: center; - } -} - -span.fs-submenu-item.fs-sub:before -{ - // Add small arrow. - content: '\21B3'; - padding: 0 5px; -} - -.rtl -{ - span.fs-submenu-item.fs-sub:before - { - // Add small RTL arrow. - content: '\21B2'; - } -} - -.fs-submenu-item -{ - &.pricing - { - &.upgrade-mode - { - color: greenyellow; - } - - &.trial-mode - { - color: #83e2ff; - } - } -} - -#adminmenu .update-plugins.fs-trial { - background-color: #00b9eb; +@import "../start"; +@import "themes"; + +#iframe +{ + line-height: 0; + font-size: 0; +} + +.fs-full-size-wrapper +{ + margin: 40px 0 -65px -20px; + + @media (max-width: 600px) { + margin: 0 0 -65px -10px; + } +} + +.fs-notice +{ + position: relative; + + &.fs-has-title + { + margin-bottom: 30px !important; + } + + &.success + { + color: green; + // font-weight: normal; + } + + &.promotion + { + border-color: $fs-notice-promotion-border-color !important; + background-color: $fs-notice-promotion-bkg !important; + } + + .fs-notice-body + { + margin: .5em 0; + padding: 2px; + } + + .fs-close + { + // position: absolute; + // top: 2px; + // bottom: 2px; + // right: 2px; + // min-width: 100px; + // text-align: center; + // padding-right: 2px; + cursor: pointer; + color: #aaa; + float: right; + + &:hover + { + color: #666; + // background: #A9A9A9; + } + + > * + { + margin-top: 7px; + display: inline-block; + } + } + + label.fs-plugin-title + { + background: rgba(0, 0, 0, 0.3); + color: #fff; + padding: 2px 10px; + position: absolute; + top: 100%; + bottom: auto; + right: auto; + @include border-radius(0 0 3px 3px); + left: 10px; + font-size: 12px; + font-weight: bold; + cursor: auto; + } +} + +div.fs-notice +{ + &.updated, + &.success, + &.promotion + { + display: block !important; + } +} + +.rtl .fs-notice +{ + .fs-close + { + // left: 2px; + // right: auto; + // padding-right: 0; + // padding-left: 2px; + float: left; + } +} + +.fs-secure-notice +{ + position: fixed; + top: 32px; + left: 160px; + right: 0; + background: rgb(235, 253, 235); + padding: 10px 20px; + color: green; + z-index: 9999; + @include box-shadow(0 2px 2px rgba(6, 113, 6, 0.3)); + @include opacity(0.95); + + &:hover + { + @include opacity(1); + } + + a.fs-security-proof + { + color: green; + text-decoration: none; + } +} + +@media screen and (max-width: 960px) { + .fs-secure-notice + { + left: 36px; + } +} + +@media screen and (max-width: 600px) { + .fs-secure-notice + { + display: none; + } +} + +@media screen and (max-width: 500px) { + #fs_promo_tab + { + display: none; + } +} + +@media screen and (max-width: 782px) { + .fs-secure-notice + { + left: 0; + top: 46px; + text-align: center; + } +} + +span.fs-submenu-item.fs-sub:before +{ + // Add small arrow. + content: '\21B3'; + padding: 0 5px; +} + +.rtl +{ + span.fs-submenu-item.fs-sub:before + { + // Add small RTL arrow. + content: '\21B2'; + } +} + +.fs-submenu-item +{ + &.pricing + { + &.upgrade-mode + { + color: greenyellow; + } + + &.trial-mode + { + color: #83e2ff; + } + } +} + +#adminmenu .update-plugins.fs-trial +{ + background-color: #00b9eb; +} +.fs-ajax-spinner +{ + border: 0; + width: 20px; + height: 20px; + margin-right: 5px; + vertical-align: sub; + display: inline-block; + background: url('/wp-admin/images/wpspin_light-2x.gif'); + background-size: contain; +} + +.wrap.fs-section { + h2 { + text-align: left; + } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/connect.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/connect.scss index b8cf6cd83..c147fb653 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/connect.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/connect.scss @@ -53,6 +53,30 @@ $form_width: 480px; } } + &.require-license-key { + #sites_list_container { + td { + cursor: pointer; + } + } + } + + #delegate_to_site_admins { + margin-right: 15px; + float: right; + height: 26px; + vertical-align: middle; + line-height: 37px; + font-weight: bold; + border-bottom: 1px dashed; + text-decoration: none; + + &.rtl { + margin-left: 15px; + margin-right: 0; + } + } + .fs-actions { padding: 10px 20px; @@ -326,6 +350,10 @@ $form_width: 480px; } } +@import "multisite-options"; +@import "tooltip"; +@import "gdpr-consent"; + .rtl { #fs_connect @@ -405,6 +433,55 @@ $form_width: 480px; } } +#fs_theme_connect_wrapper { + position: fixed; + top: 0; + height: 100%; + width: 100%; + z-index: 99990; + background: rgba(0, 0, 0, 0.75); + text-align: center; + overflow-y: auto; + + &:before { + content: ""; + display: inline-block; + vertical-align: middle; + height: 100%; + } + + > button.close { + color: white; + cursor: pointer; + height: 40px; + width: 40px; + position: absolute; + right: 0; + border: 0; + background-color: transparent; + top: 32px; + } + + #fs_connect { + top: 0; + text-align: left; + display: inline-block; + vertical-align: middle; + margin-top: 52px; + margin-bottom: 20px; + + .fs-terms + { + background: rgba(140, 140, 140, 0.64); + + &, a + { + color: #c5c5c5; + } + } + } +} + .wp-pointer-content { #fs_connect diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/debug.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/debug.scss index f1ff00101..c8a81c5b3 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/debug.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/debug.scss @@ -88,4 +88,48 @@ font-size: 20px; line-height: 31px; margin: 0 5px; +} + +#fs_log_book { + table { + font-family: Consolas,Monaco,monospace; + font-size: 12px; + + th { + color: #ccc; + } + + tr { + background: #232525; + + &.alternate { + background: #2b2b2b; + } + + td { + &.fs-col--logger { + color: #5a7435; + } + &.fs-col--type { + color: #ffc861; + } + &.fs-col--function { + color: #a7b7b1; + font-weight: bold; + } + &.fs-col--message { + &, a + { + color: #9a73ac !important; + } + } + &.fs-col--file { + color: #d07922; + } + &.fs-col--timestamp { + color: #6596be; + } + } + } + } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/dialog-boxes.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/dialog-boxes.scss index 8c6ac684f..d479627bb 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/dialog-boxes.scss +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/dialog-boxes.scss @@ -2,4 +2,7 @@ @import "modal-common"; @import "deactivation-feedback"; @import "license-activation"; -@import "license-key-resend"; \ No newline at end of file +@import "multisite-options"; +@import "license-key-resend"; +@import "ajax-loader"; +@import "auto-install"; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/gdpr-optin-notice.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/gdpr-optin-notice.scss new file mode 100644 index 000000000..8d0e3e41e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/gdpr-optin-notice.scss @@ -0,0 +1,17 @@ +.fs-notice[data-id^="gdpr_optin_actions"] +{ + .underlined { + text-decoration: underline; + } + + ul { + .button, .action-description { + vertical-align: middle; + } + + .action-description { + display: inline-block; + margin-left: 3px; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/admin/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/customizer.scss b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/customizer.scss new file mode 100644 index 000000000..90b9f31a6 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/customizer.scss @@ -0,0 +1,125 @@ +@import "start"; + +#fs_customizer_upsell { + .fs-customizer-plan { + padding: 10px 20px 20px 20px; + border-radius: 3px; + background: #fff; + + h2 { + position: relative; + margin: 0; + line-height: 2em; + text-transform: uppercase; + + .button-link { + top: -2px; + } + } + } + + .fs-feature { + position: relative; + } + + .dashicons-yes { + color: #0085ba; + font-size: 2em; + vertical-align: bottom; + margin-left: -7px; + margin-right: 10px; + + .rtl & { + margin-left: 10px; + margin-right: -7px; + } + } + + .dashicons-editor-help + { + color: #bbb; + cursor: help; + + $tooltip-color: #000; + + .fs-feature-desc { + opacity: 0; + visibility: hidden; + @include transition(opacity 0.3s ease-in-out); + + position: absolute; + background: $tooltip-color; + color: #fff; + font-family: 'arial', serif; + font-size: 12px; + padding: 10px; + z-index: 999999; + bottom: 100%; + margin-bottom: 5px; + left: 0; + right: 0; + @include border-radius(5px); + @include box-shadow(1px 1px 1px rgba(0,0,0,0.2)); + line-height: 1.3em; + font-weight: bold; + text-align: left; + + .rtl & + { + text-align: right; + } + + &::after { + content: ' '; + display: block; + width: 0; + height: 0; + border-style: solid; + border-width: 5px 5px 0 5px; + border-color: $tooltip-color transparent transparent transparent; + position: absolute; + top: 100%; + left: 21px; + + .rtl & { + right: 21px; + left: auto; + } + } + } + + &:hover { + .fs-feature-desc { + visibility: visible; + opacity: 1; + } + } + } + + .button-primary { + display: block; + text-align: center; + margin-top: 10px; + } +} + +#fs_customizer_support +{ + display: block !important; + + .button { + float: right; + } + + .button-group { + width: 100%; + display: block; + margin-top: 10px; + + .button { + float: none; + width: 50%; + text-align: center; + } + } +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/assets/scss/index.php b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/assets/scss/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/composer.json b/wp-content/plugins/nextgen-gallery/freemius/composer.json new file mode 100644 index 000000000..49c1dbec2 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/composer.json @@ -0,0 +1,10 @@ +{ + "name": "freemius/wordpress-sdk", + "description": "Freemius WordPress SDK", + "keywords": ["freemius", "wordpress", "plugin", "sdk"], + "homepage": "https://freemius.com", + "license": "GPL-3.0-only", + "require": { + "php": ">=5.2" + } +} diff --git a/wp-content/plugins/nextgen-gallery/freemius/config.php b/wp-content/plugins/nextgen-gallery/freemius/config.php index fb81b1b0f..9c10b692d 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/config.php +++ b/wp-content/plugins/nextgen-gallery/freemius/config.php @@ -1,301 +1,388 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.4 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - if ( ! defined( 'WP_FS__SLUG' ) ) { - define( 'WP_FS__SLUG', 'freemius' ); - } - if ( ! defined( 'WP_FS__DEV_MODE' ) ) { - define( 'WP_FS__DEV_MODE', false ); - } - - #-------------------------------------------------------------------------------- - #region API Connectivity Issues Simulation - #-------------------------------------------------------------------------------- - - if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY' ) ) { - define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY', false ); - } - if ( ! defined( 'WP_FS__SIMULATE_NO_CURL' ) ) { - define( 'WP_FS__SIMULATE_NO_CURL', false ); - } - if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE' ) ) { - define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE', false ); - } - if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL' ) ) { - define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL', false ); - } - if ( WP_FS__SIMULATE_NO_CURL ) { - define( 'FS_SDK__SIMULATE_NO_CURL', true ); - } - if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE ) { - define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE', true ); - } - if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL ) { - define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL', true ); - } - - #endregion - - if ( ! defined( 'WP_FS__SIMULATE_FREEMIUS_OFF' ) ) { - define( 'WP_FS__SIMULATE_FREEMIUS_OFF', false ); - } - - if ( ! defined( 'WP_FS__PING_API_ON_IP_OR_HOST_CHANGES' ) ) { - /** - * @since 1.1.7.3 - * @author Vova Feldman (@svovaf) - * - * I'm not sure if shared servers periodically change IP, or the subdomain of the - * admin dashboard. Also, I've seen sites that have strange loop of switching - * between domains on a daily basis. Therefore, to eliminate the risk of - * multiple unwanted connectivity test pings, temporary ignore domain or - * server IP changes. - */ - define( 'WP_FS__PING_API_ON_IP_OR_HOST_CHANGES', false ); - } - - /** - * If your dev environment supports custom public network IP setup - * like VVV, please update WP_FS__LOCALHOST_IP with your public IP - * and uncomment it during dev. - */ - if ( ! defined( 'WP_FS__LOCALHOST_IP' ) ) { - // VVV default public network IP. - define( 'WP_FS__VVV_DEFAULT_PUBLIC_IP', '192.168.50.4' ); + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.4 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + if ( ! defined( 'WP_FS__SLUG' ) ) { + define( 'WP_FS__SLUG', 'freemius' ); + } + if ( ! defined( 'WP_FS__DEV_MODE' ) ) { + define( 'WP_FS__DEV_MODE', false ); + } + + #-------------------------------------------------------------------------------- + #region API Connectivity Issues Simulation + #-------------------------------------------------------------------------------- + + if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY' ) ) { + define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY', false ); + } + if ( ! defined( 'WP_FS__SIMULATE_NO_CURL' ) ) { + define( 'WP_FS__SIMULATE_NO_CURL', false ); + } + if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE' ) ) { + define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE', false ); + } + if ( ! defined( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL' ) ) { + define( 'WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL', false ); + } + if ( WP_FS__SIMULATE_NO_CURL ) { + define( 'FS_SDK__SIMULATE_NO_CURL', true ); + } + if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE ) { + define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE', true ); + } + if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL ) { + define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL', true ); + } + + #endregion + + if ( ! defined( 'WP_FS__SIMULATE_FREEMIUS_OFF' ) ) { + define( 'WP_FS__SIMULATE_FREEMIUS_OFF', false ); + } + + if ( ! defined( 'WP_FS__PING_API_ON_IP_OR_HOST_CHANGES' ) ) { + /** + * @since 1.1.7.3 + * @author Vova Feldman (@svovaf) + * + * I'm not sure if shared servers periodically change IP, or the subdomain of the + * admin dashboard. Also, I've seen sites that have strange loop of switching + * between domains on a daily basis. Therefore, to eliminate the risk of + * multiple unwanted connectivity test pings, temporary ignore domain or + * server IP changes. + */ + define( 'WP_FS__PING_API_ON_IP_OR_HOST_CHANGES', false ); + } + + /** + * If your dev environment supports custom public network IP setup + * like VVV, please update WP_FS__LOCALHOST_IP with your public IP + * and uncomment it during dev. + */ + if ( ! defined( 'WP_FS__LOCALHOST_IP' ) ) { + // VVV default public network IP. + define( 'WP_FS__VVV_DEFAULT_PUBLIC_IP', '192.168.50.4' ); // define( 'WP_FS__LOCALHOST_IP', WP_FS__VVV_DEFAULT_PUBLIC_IP ); - } - - /** - * If true and running with secret key, the opt-in process - * will skip the email activation process which is invoked - * when the email of the context user already exist in Freemius - * database (as a security precaution, to prevent sharing user - * secret with unauthorized entity). - * - * IMPORTANT: - * AS A SECURITY PRECAUTION, WE VALIDATE THE TIMESTAMP OF THE OPT-IN REQUEST. - * THEREFORE, MAKE SURE THAT WHEN USING THIS PARAMETER,YOUR TESTING ENVIRONMENT'S - * CLOCK IS SYNCED. - */ - if ( ! defined( 'WP_FS__SKIP_EMAIL_ACTIVATION' ) ) { - define( 'WP_FS__SKIP_EMAIL_ACTIVATION', false ); - } - - - #-------------------------------------------------------------------------------- - #region Directories - #-------------------------------------------------------------------------------- - - if ( ! defined( 'WP_FS__DIR' ) ) { - define( 'WP_FS__DIR', dirname( __FILE__ ) ); - } - if ( ! defined( 'WP_FS__DIR_INCLUDES' ) ) { - define( 'WP_FS__DIR_INCLUDES', WP_FS__DIR . '/includes' ); - } - if ( ! defined( 'WP_FS__DIR_TEMPLATES' ) ) { - define( 'WP_FS__DIR_TEMPLATES', WP_FS__DIR . '/templates' ); - } - if ( ! defined( 'WP_FS__DIR_ASSETS' ) ) { - define( 'WP_FS__DIR_ASSETS', WP_FS__DIR . '/assets' ); - } - if ( ! defined( 'WP_FS__DIR_CSS' ) ) { - define( 'WP_FS__DIR_CSS', WP_FS__DIR_ASSETS . '/css' ); - } - if ( ! defined( 'WP_FS__DIR_JS' ) ) { - define( 'WP_FS__DIR_JS', WP_FS__DIR_ASSETS . '/js' ); - } - if ( ! defined( 'WP_FS__DIR_IMG' ) ) { - define( 'WP_FS__DIR_IMG', WP_FS__DIR_ASSETS . '/img' ); - } - if ( ! defined( 'WP_FS__DIR_SDK' ) ) { - define( 'WP_FS__DIR_SDK', WP_FS__DIR_INCLUDES . '/sdk' ); - } - - #endregion - - /** - * Domain / URL / Address - */ - define( 'WP_FS__DOMAIN_PRODUCTION', 'wp.freemius.com' ); - define( 'WP_FS__ADDRESS_PRODUCTION', 'https://' . WP_FS__DOMAIN_PRODUCTION ); - - if ( ! defined( 'WP_FS__DOMAIN_LOCALHOST' ) ) { - define( 'WP_FS__DOMAIN_LOCALHOST', 'wp.freemius' ); - } - if ( ! defined( 'WP_FS__ADDRESS_LOCALHOST' ) ) { - define( 'WP_FS__ADDRESS_LOCALHOST', 'http://' . WP_FS__DOMAIN_LOCALHOST . ':8080' ); - } - - if ( ! defined( 'WP_FS__TESTING_DOMAIN' ) ) { - define( 'WP_FS__TESTING_DOMAIN', 'fswp' ); - } - - #-------------------------------------------------------------------------------- - #region HTTP - #-------------------------------------------------------------------------------- - - if ( ! defined( 'WP_FS__IS_HTTP_REQUEST' ) ) { - define( 'WP_FS__IS_HTTP_REQUEST', isset( $_SERVER['HTTP_HOST'] ) ); - } - - if ( ! defined( 'WP_FS__IS_HTTPS' ) ) { - define( 'WP_FS__IS_HTTPS', ( WP_FS__IS_HTTP_REQUEST && - // Checks if CloudFlare's HTTPS (Flexible SSL support). - isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && - 'https' === strtolower( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) - ) || - // Check if HTTPS request. - ( isset( $_SERVER['HTTPS'] ) && 'on' == $_SERVER['HTTPS'] ) || - ( isset( $_SERVER['SERVER_PORT'] ) && 443 == $_SERVER['SERVER_PORT'] ) - ); - } - - if ( ! defined( 'WP_FS__IS_POST_REQUEST' ) ) { - define( 'WP_FS__IS_POST_REQUEST', ( WP_FS__IS_HTTP_REQUEST && - strtoupper( $_SERVER['REQUEST_METHOD'] ) == 'POST' ) ); - } - - if ( ! defined( 'WP_FS__REMOTE_ADDR' ) ) { - define( 'WP_FS__REMOTE_ADDR', fs_get_ip() ); - } - - if ( ! defined( 'WP_FS__IS_LOCALHOST' ) ) { - if ( defined( 'WP_FS__LOCALHOST_IP' ) ) { - define( 'WP_FS__IS_LOCALHOST', ( WP_FS__LOCALHOST_IP === WP_FS__REMOTE_ADDR ) ); - } else { - define( 'WP_FS__IS_LOCALHOST', WP_FS__IS_HTTP_REQUEST && - is_string( WP_FS__REMOTE_ADDR ) && - ( substr( WP_FS__REMOTE_ADDR, 0, 4 ) === '127.' || - WP_FS__REMOTE_ADDR === '::1' ) - ); - } - } - - if ( ! defined( 'WP_FS__IS_LOCALHOST_FOR_SERVER' ) ) { - define( 'WP_FS__IS_LOCALHOST_FOR_SERVER', ( ! WP_FS__IS_HTTP_REQUEST || - false !== strpos( $_SERVER['HTTP_HOST'], 'localhost' ) ) ); - } - - #endregion - - if ( ! defined( 'WP_FS__IS_PRODUCTION_MODE' ) ) { - // By default, run with Freemius production servers. - define( 'WP_FS__IS_PRODUCTION_MODE', true ); - } - - if ( ! defined( 'WP_FS__ADDRESS' ) ) { - define( 'WP_FS__ADDRESS', ( WP_FS__IS_PRODUCTION_MODE ? WP_FS__ADDRESS_PRODUCTION : WP_FS__ADDRESS_LOCALHOST ) ); - } - - - #-------------------------------------------------------------------------------- - #region API - #-------------------------------------------------------------------------------- - - if ( ! defined( 'WP_FS__API_ADDRESS_LOCALHOST' ) ) { - define( 'WP_FS__API_ADDRESS_LOCALHOST', 'http://api.freemius:8080' ); - } - if ( ! defined( 'WP_FS__API_SANDBOX_ADDRESS_LOCALHOST' ) ) { - define( 'WP_FS__API_SANDBOX_ADDRESS_LOCALHOST', 'http://sandbox-api.freemius:8080' ); - } - - // Set API address for local testing. - if ( ! WP_FS__IS_PRODUCTION_MODE ) { - if ( ! defined( 'FS_API__ADDRESS' ) ) { - define( 'FS_API__ADDRESS', WP_FS__API_ADDRESS_LOCALHOST ); - } - if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { - define( 'FS_API__SANDBOX_ADDRESS', WP_FS__API_SANDBOX_ADDRESS_LOCALHOST ); - } - } - - #endregion - - define( 'WP_FS___OPTION_PREFIX', 'fs' . ( WP_FS__IS_PRODUCTION_MODE ? '' : '_dbg' ) . '_' ); - - if ( ! defined( 'WP_FS__ACCOUNTS_OPTION_NAME' ) ) { - define( 'WP_FS__ACCOUNTS_OPTION_NAME', WP_FS___OPTION_PREFIX . 'accounts' ); - } - if ( ! defined( 'WP_FS__API_CACHE_OPTION_NAME' ) ) { - define( 'WP_FS__API_CACHE_OPTION_NAME', WP_FS___OPTION_PREFIX . 'api_cache' ); - } - define( 'WP_FS__OPTIONS_OPTION_NAME', WP_FS___OPTION_PREFIX . 'options' ); - - /** - * Billing Frequencies - */ - define( 'WP_FS__PERIOD_ANNUALLY', 'annual' ); - define( 'WP_FS__PERIOD_MONTHLY', 'monthly' ); - define( 'WP_FS__PERIOD_LIFETIME', 'lifetime' ); - - /** - * Plans - */ - define( 'WP_FS__PLAN_DEFAULT_PAID', false ); - define( 'WP_FS__PLAN_FREE', 'free' ); - define( 'WP_FS__PLAN_TRIAL', 'trial' ); - - /** - * Times in seconds - */ - if ( ! defined( 'WP_FS__TIME_5_MIN_IN_SEC' ) ) { - define( 'WP_FS__TIME_5_MIN_IN_SEC', 300 ); - } - if ( ! defined( 'WP_FS__TIME_10_MIN_IN_SEC' ) ) { - define( 'WP_FS__TIME_10_MIN_IN_SEC', 600 ); - } + } + + /** + * If true and running with secret key, the opt-in process + * will skip the email activation process which is invoked + * when the email of the context user already exist in Freemius + * database (as a security precaution, to prevent sharing user + * secret with unauthorized entity). + * + * IMPORTANT: + * AS A SECURITY PRECAUTION, WE VALIDATE THE TIMESTAMP OF THE OPT-IN REQUEST. + * THEREFORE, MAKE SURE THAT WHEN USING THIS PARAMETER,YOUR TESTING ENVIRONMENT'S + * CLOCK IS SYNCED. + */ + if ( ! defined( 'WP_FS__SKIP_EMAIL_ACTIVATION' ) ) { + define( 'WP_FS__SKIP_EMAIL_ACTIVATION', false ); + } + + + #-------------------------------------------------------------------------------- + #region Directories + #-------------------------------------------------------------------------------- + + if ( ! defined( 'WP_FS__DIR' ) ) { + define( 'WP_FS__DIR', dirname( __FILE__ ) ); + } + if ( ! defined( 'WP_FS__DIR_INCLUDES' ) ) { + define( 'WP_FS__DIR_INCLUDES', WP_FS__DIR . '/includes' ); + } + if ( ! defined( 'WP_FS__DIR_TEMPLATES' ) ) { + define( 'WP_FS__DIR_TEMPLATES', WP_FS__DIR . '/templates' ); + } + if ( ! defined( 'WP_FS__DIR_ASSETS' ) ) { + define( 'WP_FS__DIR_ASSETS', WP_FS__DIR . '/assets' ); + } + if ( ! defined( 'WP_FS__DIR_CSS' ) ) { + define( 'WP_FS__DIR_CSS', WP_FS__DIR_ASSETS . '/css' ); + } + if ( ! defined( 'WP_FS__DIR_JS' ) ) { + define( 'WP_FS__DIR_JS', WP_FS__DIR_ASSETS . '/js' ); + } + if ( ! defined( 'WP_FS__DIR_IMG' ) ) { + define( 'WP_FS__DIR_IMG', WP_FS__DIR_ASSETS . '/img' ); + } + if ( ! defined( 'WP_FS__DIR_SDK' ) ) { + define( 'WP_FS__DIR_SDK', WP_FS__DIR_INCLUDES . '/sdk' ); + } + + #endregion + + /** + * Domain / URL / Address + */ + define( 'WP_FS__ROOT_DOMAIN_PRODUCTION', 'freemius.com' ); + define( 'WP_FS__DOMAIN_PRODUCTION', 'wp.freemius.com' ); + define( 'WP_FS__ADDRESS_PRODUCTION', 'https://' . WP_FS__DOMAIN_PRODUCTION ); + + if ( ! defined( 'WP_FS__DOMAIN_LOCALHOST' ) ) { + define( 'WP_FS__DOMAIN_LOCALHOST', 'wp.freemius' ); + } + if ( ! defined( 'WP_FS__ADDRESS_LOCALHOST' ) ) { + define( 'WP_FS__ADDRESS_LOCALHOST', 'http://' . WP_FS__DOMAIN_LOCALHOST . ':8080' ); + } + + if ( ! defined( 'WP_FS__TESTING_DOMAIN' ) ) { + define( 'WP_FS__TESTING_DOMAIN', 'fswp' ); + } + + #-------------------------------------------------------------------------------- + #region HTTP + #-------------------------------------------------------------------------------- + + if ( ! defined( 'WP_FS__IS_HTTP_REQUEST' ) ) { + define( 'WP_FS__IS_HTTP_REQUEST', isset( $_SERVER['HTTP_HOST'] ) ); + } + + if ( ! defined( 'WP_FS__IS_HTTPS' ) ) { + define( 'WP_FS__IS_HTTPS', ( WP_FS__IS_HTTP_REQUEST && + // Checks if CloudFlare's HTTPS (Flexible SSL support). + isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && + 'https' === strtolower( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) + ) || + // Check if HTTPS request. + ( isset( $_SERVER['HTTPS'] ) && 'on' == $_SERVER['HTTPS'] ) || + ( isset( $_SERVER['SERVER_PORT'] ) && 443 == $_SERVER['SERVER_PORT'] ) + ); + } + + if ( ! defined( 'WP_FS__IS_POST_REQUEST' ) ) { + define( 'WP_FS__IS_POST_REQUEST', ( WP_FS__IS_HTTP_REQUEST && + strtoupper( $_SERVER['REQUEST_METHOD'] ) == 'POST' ) ); + } + + if ( ! defined( 'WP_FS__REMOTE_ADDR' ) ) { + define( 'WP_FS__REMOTE_ADDR', fs_get_ip() ); + } + + if ( ! defined( 'WP_FS__IS_LOCALHOST' ) ) { + if ( defined( 'WP_FS__LOCALHOST_IP' ) ) { + define( 'WP_FS__IS_LOCALHOST', ( WP_FS__LOCALHOST_IP === WP_FS__REMOTE_ADDR ) ); + } else { + define( 'WP_FS__IS_LOCALHOST', WP_FS__IS_HTTP_REQUEST && + is_string( WP_FS__REMOTE_ADDR ) && + ( substr( WP_FS__REMOTE_ADDR, 0, 4 ) === '127.' || + WP_FS__REMOTE_ADDR === '::1' ) + ); + } + } + + if ( ! defined( 'WP_FS__IS_LOCALHOST_FOR_SERVER' ) ) { + define( 'WP_FS__IS_LOCALHOST_FOR_SERVER', ( ! WP_FS__IS_HTTP_REQUEST || + false !== strpos( $_SERVER['HTTP_HOST'], 'localhost' ) ) ); + } + + #endregion + + if ( ! defined( 'WP_FS__IS_PRODUCTION_MODE' ) ) { + // By default, run with Freemius production servers. + define( 'WP_FS__IS_PRODUCTION_MODE', true ); + } + + if ( ! defined( 'WP_FS__ADDRESS' ) ) { + define( 'WP_FS__ADDRESS', ( WP_FS__IS_PRODUCTION_MODE ? WP_FS__ADDRESS_PRODUCTION : WP_FS__ADDRESS_LOCALHOST ) ); + } + + + #-------------------------------------------------------------------------------- + #region API + #-------------------------------------------------------------------------------- + + if ( ! defined( 'WP_FS__API_ADDRESS_LOCALHOST' ) ) { + define( 'WP_FS__API_ADDRESS_LOCALHOST', 'http://api.freemius:8080' ); + } + if ( ! defined( 'WP_FS__API_SANDBOX_ADDRESS_LOCALHOST' ) ) { + define( 'WP_FS__API_SANDBOX_ADDRESS_LOCALHOST', 'http://sandbox-api.freemius:8080' ); + } + + // Set API address for local testing. + if ( ! WP_FS__IS_PRODUCTION_MODE ) { + if ( ! defined( 'FS_API__ADDRESS' ) ) { + define( 'FS_API__ADDRESS', WP_FS__API_ADDRESS_LOCALHOST ); + } + if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { + define( 'FS_API__SANDBOX_ADDRESS', WP_FS__API_SANDBOX_ADDRESS_LOCALHOST ); + } + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Checkout + #-------------------------------------------------------------------------------- + + if ( ! defined( 'FS_CHECKOUT__ADDRESS_PRODUCTION' ) ) { + define( 'FS_CHECKOUT__ADDRESS_PRODUCTION', 'https://checkout.freemius.com' ); + } + + if ( ! defined( 'FS_CHECKOUT__ADDRESS_LOCALHOST' ) ) { + define( 'FS_CHECKOUT__ADDRESS_LOCALHOST', 'http://checkout.freemius-local.com:8080' ); + } + + if ( ! defined( 'FS_CHECKOUT__ADDRESS' ) ) { + define( 'FS_CHECKOUT__ADDRESS', ( WP_FS__IS_PRODUCTION_MODE ? FS_CHECKOUT__ADDRESS_PRODUCTION : FS_CHECKOUT__ADDRESS_LOCALHOST ) ); + } + + #endregion + + define( 'WP_FS___OPTION_PREFIX', 'fs' . ( WP_FS__IS_PRODUCTION_MODE ? '' : '_dbg' ) . '_' ); + + if ( ! defined( 'WP_FS__ACCOUNTS_OPTION_NAME' ) ) { + define( 'WP_FS__ACCOUNTS_OPTION_NAME', WP_FS___OPTION_PREFIX . 'accounts' ); + } + if ( ! defined( 'WP_FS__API_CACHE_OPTION_NAME' ) ) { + define( 'WP_FS__API_CACHE_OPTION_NAME', WP_FS___OPTION_PREFIX . 'api_cache' ); + } + if ( ! defined( 'WP_FS__GDPR_OPTION_NAME' ) ) { + define( 'WP_FS__GDPR_OPTION_NAME', WP_FS___OPTION_PREFIX . 'gdpr' ); + } + define( 'WP_FS__OPTIONS_OPTION_NAME', WP_FS___OPTION_PREFIX . 'options' ); + + /** + * Module types + * + * @since 1.2.2 + */ + define( 'WP_FS__MODULE_TYPE_PLUGIN', 'plugin' ); + define( 'WP_FS__MODULE_TYPE_THEME', 'theme' ); + + /** + * Billing Frequencies + */ + define( 'WP_FS__PERIOD_ANNUALLY', 'annual' ); + define( 'WP_FS__PERIOD_MONTHLY', 'monthly' ); + define( 'WP_FS__PERIOD_LIFETIME', 'lifetime' ); + + /** + * Plans + */ + define( 'WP_FS__PLAN_DEFAULT_PAID', false ); + define( 'WP_FS__PLAN_FREE', 'free' ); + define( 'WP_FS__PLAN_TRIAL', 'trial' ); + + /** + * Times in seconds + */ + if ( ! defined( 'WP_FS__TIME_5_MIN_IN_SEC' ) ) { + define( 'WP_FS__TIME_5_MIN_IN_SEC', 300 ); + } + if ( ! defined( 'WP_FS__TIME_10_MIN_IN_SEC' ) ) { + define( 'WP_FS__TIME_10_MIN_IN_SEC', 600 ); + } // define( 'WP_FS__TIME_15_MIN_IN_SEC', 900 ); - if ( ! defined( 'WP_FS__TIME_24_HOURS_IN_SEC' ) ) { - define( 'WP_FS__TIME_24_HOURS_IN_SEC', 86400 ); - } - - #-------------------------------------------------------------------------------- - #region Debugging - #-------------------------------------------------------------------------------- - - if ( ! defined( 'WP_FS__DEBUG_SDK' ) ) { - $debug_mode = get_option( 'fs_debug_mode', null ); - - if ( $debug_mode === null ) { - $debug_mode = false; - add_option( 'fs_debug_mode', $debug_mode ); - } - - define( 'WP_FS__DEBUG_SDK', is_numeric( $debug_mode ) ? ( 0 < $debug_mode ) : WP_FS__DEV_MODE ); - } - - if ( ! defined( 'WP_FS__ECHO_DEBUG_SDK' ) ) { - define( 'WP_FS__ECHO_DEBUG_SDK', WP_FS__DEV_MODE && ! empty( $_GET['fs_dbg_echo'] ) ); - } - if ( ! defined( 'WP_FS__LOG_DATETIME_FORMAT' ) ) { - define( 'WP_FS__LOG_DATETIME_FORMAT', 'Y-m-d H:i:s' ); - } - if ( ! defined( 'FS_API__LOGGER_ON' ) ) { - define( 'FS_API__LOGGER_ON', WP_FS__DEBUG_SDK ); - } - - if ( WP_FS__ECHO_DEBUG_SDK ) { - error_reporting( E_ALL ); - } - - #endregion - - if ( ! defined( 'WP_FS__SCRIPT_START_TIME' ) ) { - define( 'WP_FS__SCRIPT_START_TIME', time() ); - } - if ( ! defined( 'WP_FS__DEFAULT_PRIORITY' ) ) { - define( 'WP_FS__DEFAULT_PRIORITY', 10 ); - } - if ( ! defined( 'WP_FS__LOWEST_PRIORITY' ) ) { - define( 'WP_FS__LOWEST_PRIORITY', 999999999 ); - } + if ( ! defined( 'WP_FS__TIME_12_HOURS_IN_SEC' ) ) { + define( 'WP_FS__TIME_12_HOURS_IN_SEC', 43200 ); + } + if ( ! defined( 'WP_FS__TIME_24_HOURS_IN_SEC' ) ) { + define( 'WP_FS__TIME_24_HOURS_IN_SEC', WP_FS__TIME_12_HOURS_IN_SEC * 2 ); + } + if ( ! defined( 'WP_FS__TIME_WEEK_IN_SEC' ) ) { + define( 'WP_FS__TIME_WEEK_IN_SEC', 7 * WP_FS__TIME_24_HOURS_IN_SEC ); + } + + #-------------------------------------------------------------------------------- + #region Debugging + #-------------------------------------------------------------------------------- + + if ( ! defined( 'WP_FS__DEBUG_SDK' ) ) { + $debug_mode = get_option( 'fs_debug_mode', null ); + + if ( $debug_mode === null ) { + $debug_mode = false; + add_option( 'fs_debug_mode', $debug_mode ); + } + + define( 'WP_FS__DEBUG_SDK', is_numeric( $debug_mode ) ? ( 0 < $debug_mode ) : WP_FS__DEV_MODE ); + } + + if ( ! defined( 'WP_FS__ECHO_DEBUG_SDK' ) ) { + define( 'WP_FS__ECHO_DEBUG_SDK', WP_FS__DEV_MODE && ! empty( $_GET['fs_dbg_echo'] ) ); + } + if ( ! defined( 'WP_FS__LOG_DATETIME_FORMAT' ) ) { + define( 'WP_FS__LOG_DATETIME_FORMAT', 'Y-m-d H:i:s' ); + } + if ( ! defined( 'FS_API__LOGGER_ON' ) ) { + define( 'FS_API__LOGGER_ON', WP_FS__DEBUG_SDK ); + } + + if ( WP_FS__ECHO_DEBUG_SDK ) { + error_reporting( E_ALL ); + } + + #endregion + + if ( ! defined( 'WP_FS__SCRIPT_START_TIME' ) ) { + define( 'WP_FS__SCRIPT_START_TIME', time() ); + } + if ( ! defined( 'WP_FS__DEFAULT_PRIORITY' ) ) { + define( 'WP_FS__DEFAULT_PRIORITY', 10 ); + } + if ( ! defined( 'WP_FS__LOWEST_PRIORITY' ) ) { + define( 'WP_FS__LOWEST_PRIORITY', 999999999 ); + } + + #-------------------------------------------------------------------------------- + #region Multisite Network + #-------------------------------------------------------------------------------- + + /** + * Do not use this define directly, it will have the wrong value + * during plugin uninstall/deletion when the inclusion of the plugin + * is triggered due to registration with register_uninstall_hook(). + * + * Instead, use fs_is_network_admin(). + * + * @author Vova Feldman (@svovaf) + */ + if ( ! defined( 'WP_FS__IS_NETWORK_ADMIN' ) ) { + define( 'WP_FS__IS_NETWORK_ADMIN', + is_network_admin() || + ( is_multisite() && + ( ( defined( 'DOING_AJAX' ) && DOING_AJAX && + ( isset( $_REQUEST['_fs_network_admin'] ) /*|| + ( ! empty( $_REQUEST['action'] ) && 'delete-plugin' === $_REQUEST['action'] )*/ ) + ) || + // Plugin uninstall. + defined( 'WP_UNINSTALL_PLUGIN' ) ) + ) + ); + } + + /** + * Do not use this define directly, it will have the wrong value + * during plugin uninstall/deletion when the inclusion of the plugin + * is triggered due to registration with register_uninstall_hook(). + * + * Instead, use fs_is_blog_admin(). + * + * @author Vova Feldman (@svovaf) + */ + if ( ! defined( 'WP_FS__IS_BLOG_ADMIN' ) ) { + define( 'WP_FS__IS_BLOG_ADMIN', is_blog_admin() || ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_REQUEST['_fs_blog_admin'] ) ) ); + } + + if ( ! defined( 'WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED' ) ) { + // Set to true to show network level settings even if delegated to site admins. + define( 'WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED', false ); + } + + #endregion + + if ( ! defined( 'WP_FS__DEMO_MODE' ) ) { + define( 'WP_FS__DEMO_MODE', false ); + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/gulpfile.js b/wp-content/plugins/nextgen-gallery/freemius/gulpfile.js new file mode 100644 index 000000000..a08b2e738 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/gulpfile.js @@ -0,0 +1,167 @@ +var gulp = require('gulp'); +var path = require('path'); +var filesystem = require('fs'); +var wpPot = require('gulp-wp-pot'); +var gettext = require('gulp-gettext'); +var sort = require('gulp-sort'); +var pofill = require('gulp-pofill'); +var rename = require('gulp-rename'); +var clean = require('gulp-clean'); + +var languagesFolder = './languages/'; + +var options = require('./transifex-config.json'); + +function getFolders(dir) { + return filesystem.readdirSync(dir) + .filter(function (file) { + return filesystem.statSync(path.join(dir, file)).isDirectory(); + }); +} + +var transifex = require('gulp-transifex').createClient(options); + +// Create POT out of i18n.php. +gulp.task('prepare-source', function () { + gulp.src('**/*.php') + .pipe(sort()) + .pipe(wpPot({ + destFile : 'freemius.pot', + package : 'freemius', + bugReport : 'https://github.com/Freemius/wordpress-sdk/issues', + lastTranslator : 'Vova Feldman <vova@freemius.com>', + team : 'Freemius Team <admin@freemius.com>', + /*gettextMethods: { + instances: ['this', '_fs'], + methods: [ + 'get_text_inline' + ] + },*/ + gettextFunctions: [ + {name: 'get_text_inline'}, + + {name: 'fs_text_inline'}, + {name: 'fs_echo_inline'}, + {name: 'fs_esc_js_inline'}, + {name: 'fs_esc_attr_inline'}, + {name: 'fs_esc_attr_echo_inline'}, + {name: 'fs_esc_html_inline'}, + {name: 'fs_esc_html_echo_inline'}, + + {name: 'get_text_x_inline', context: 2}, + {name: 'fs_text_x_inline', context: 2}, + {name: 'fs_echo_x_inline', context: 2}, + {name: 'fs_esc_attr_x_inline', context: 2}, + {name: 'fs_esc_js_x_inline', context: 2}, + {name: 'fs_esc_js_echo_x_inline', context: 2}, + {name: 'fs_esc_html_x_inline', context: 2}, + {name: 'fs_esc_html_echo_x_inline', context: 2} + /*, + + + {name: '_fs_text'}, + {name: '_fs_x', context: 2}, + {name: '_fs_echo'}, + {name: '_fs_esc_attr'}, + {name: '_fs_esc_attr_echo'}, + {name: '_fs_esc_html'}, + {name: '_fs_esc_html_echo'}, + {name: '_fs_ex', context: 2}, + {name: '_fs_esc_attr_x', context: 2}, + {name: '_fs_esc_html_x', context: 2}, + + {name: '_fs_n', plural: 2}, + {name: '_fs_n_noop', plural: 2}, + {name: '_fs_nx', plural: 2, context: 4}, + {name: '_fs_nx_noop', plural: 2, context: 3}*/ + ] + })) + .pipe(gulp.dest(languagesFolder + 'freemius.pot')); + + // Create English PO out of the POT. + return gulp.src(languagesFolder + 'freemius.pot') + .pipe(pofill({ + items: function (item) { + // If msgstr is empty, use identity translation + if (!item.msgstr.length) { + item.msgstr = ['']; + } + if (!item.msgstr[0]) { + item.msgstr[0] = item.msgid; + } + return item; + } + })) + .pipe(rename('freemius-en.po')) + .pipe(gulp.dest(languagesFolder)); +}); + +// Push updated po resource to transifex. +gulp.task('update-transifex', ['prepare-source'], function () { + return gulp.src(languagesFolder + 'freemius-en.po') + .pipe(transifex.pushResource()); +}); + +// Download latest *.po translations. +gulp.task('download-translations', ['update-transifex'], function () { + return gulp.src(languagesFolder + 'freemius-en.po') + .pipe(transifex.pullResource()); +}); + +// Move translations to languages root. +gulp.task('prepare-translations', ['download-translations'], function () { + var folders = getFolders(languagesFolder); + + return folders.map(function (folder) { + return gulp.src(path.join(languagesFolder, folder, 'freemius-en.po')) + .pipe(rename('freemius-' + folder + '.po')) + .pipe(gulp.dest(languagesFolder)); + }); +}); + +// Feel up empty translations with English. +gulp.task('translations-feelup', ['prepare-translations'], function () { + return gulp.src(languagesFolder + '*.po') + .pipe(pofill({ + items: function (item) { + // If msgstr is empty, use identity translation + if (0 == item.msgstr.length) { + item.msgstr = ['']; + } + if (0 == item.msgstr[0].length) { +// item.msgid[0] = item.msgid; + item.msgstr[0] = item.msgid; + } + return item; + } + })) + .pipe(gulp.dest(languagesFolder)); +}); + +// Cleanup temporary translation folders. +gulp.task('cleanup', ['prepare-translations'], function () { + var folders = getFolders(languagesFolder); + + return folders.map(function (folder) { + return gulp.src(path.join(languagesFolder, folder), {read: false}) + .pipe(clean()); + }); +}); + +// Compile *.po to *.mo binaries for usage. +gulp.task('compile-translations', ['translations-feelup'], function () { + // Compile POs to MOs. + return gulp.src(languagesFolder + '*.po') + .pipe(gettext()) + .pipe(gulp.dest(languagesFolder)) +}); + +gulp.task('default', [], function () { + gulp.run('prepare-source'); + gulp.run('update-transifex'); + gulp.run('download-translations'); + gulp.run('prepare-translations'); + gulp.run('translations-feelup'); + gulp.run('cleanup'); + gulp.run('compile-translations'); +}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/gulpfile.min.js b/wp-content/plugins/nextgen-gallery/freemius/gulpfile.min.js new file mode 100644 index 000000000..b924f3d55 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/gulpfile.min.js @@ -0,0 +1 @@ +function getFolders(e){return filesystem.readdirSync(e).filter(function(n){return filesystem.statSync(path.join(e,n)).isDirectory()})}var gulp=require("gulp"),path=require("path"),filesystem=require("fs"),wpPot=require("gulp-wp-pot"),gettext=require("gulp-gettext"),sort=require("gulp-sort"),pofill=require("gulp-pofill"),rename=require("gulp-rename"),clean=require("gulp-clean"),languagesFolder="./languages/",options=require("./transifex-config.json"),transifex=require("gulp-transifex").createClient(options);gulp.task("prepare-source",function(){return gulp.src("**/*.php").pipe(sort()).pipe(wpPot({destFile:"freemius.pot",package:"freemius",bugReport:"https://github.com/Freemius/wordpress-sdk/issues",lastTranslator:"Vova Feldman <vova@freemius.com>",team:"Freemius Team <admin@freemius.com>",gettextFunctions:[{name:"get_text_inline"},{name:"fs_text_inline"},{name:"fs_echo_inline"},{name:"fs_esc_js_inline"},{name:"fs_esc_attr_inline"},{name:"fs_esc_attr_echo_inline"},{name:"fs_esc_html_inline"},{name:"fs_esc_html_echo_inline"},{name:"get_text_x_inline",context:2},{name:"fs_text_x_inline",context:2},{name:"fs_echo_x_inline",context:2},{name:"fs_esc_attr_x_inline",context:2},{name:"fs_esc_js_x_inline",context:2},{name:"fs_esc_js_echo_x_inline",context:2},{name:"fs_esc_html_x_inline",context:2},{name:"fs_esc_html_echo_x_inline",context:2}]})).pipe(gulp.dest(languagesFolder+"freemius.pot")),gulp.src(languagesFolder+"freemius.pot").pipe(pofill({items:function(e){return e.msgstr.length||(e.msgstr=[""]),e.msgstr[0]||(e.msgstr[0]=e.msgid),e}})).pipe(rename("freemius-en.po")).pipe(gulp.dest(languagesFolder))}),gulp.task("update-transifex",["prepare-source"],function(){return gulp.src(languagesFolder+"freemius-en.po").pipe(transifex.pushResource())}),gulp.task("download-translations",["update-transifex"],function(){return gulp.src(languagesFolder+"freemius-en.po").pipe(transifex.pullResource())}),gulp.task("prepare-translations",["download-translations"],function(){return getFolders(languagesFolder).map(function(e){return gulp.src(path.join(languagesFolder,e,"freemius-en.po")).pipe(rename("freemius-"+e+".po")).pipe(gulp.dest(languagesFolder))})}),gulp.task("translations-feelup",["prepare-translations"],function(){return gulp.src(languagesFolder+"*.po").pipe(pofill({items:function(e){return 0==e.msgstr.length&&(e.msgstr=[""]),0==e.msgstr[0].length&&(e.msgstr[0]=e.msgid),e}})).pipe(gulp.dest(languagesFolder))}),gulp.task("cleanup",["prepare-translations"],function(){return getFolders(languagesFolder).map(function(e){return gulp.src(path.join(languagesFolder,e),{read:!1}).pipe(clean())})}),gulp.task("compile-translations",["translations-feelup"],function(){return gulp.src(languagesFolder+"*.po").pipe(gettext()).pipe(gulp.dest(languagesFolder))}),gulp.task("default",[],function(){gulp.run("prepare-source"),gulp.run("update-transifex"),gulp.run("download-translations"),gulp.run("prepare-translations"),gulp.run("translations-feelup"),gulp.run("cleanup"),gulp.run("compile-translations")}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius-abstract.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius-abstract.php index bca00c168..18d9fb59d 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius-abstract.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius-abstract.php @@ -2,9 +2,10 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.7 */ + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -27,7 +28,13 @@ #---------------------------------------------------------------------------------- /** - * Check if user registered with Freemius by connecting his account. + * Check if user has connected his account (opted-in). + * + * Note: + * If the user opted-in and opted-out on a later stage, + * this will still return true. If you want to check if the + * user is currently opted-in, use: + * `$fs->is_registered() && $fs->is_tracking_allowed()` * * @since 1.0.1 * @return bool @@ -116,6 +123,34 @@ #endregion + #---------------------------------------------------------------------------------- + #region Module Type + #---------------------------------------------------------------------------------- + + /** + * Checks if the plugin's type is "plugin". The other type is "theme". + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool + */ + abstract function is_plugin(); + + /** + * Checks if the module type is "theme". The other type is "plugin". + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool + */ + function is_theme() { + return ( ! $this->is_plugin() ); + } + + #endregion + #---------------------------------------------------------------------------------- #region Permissions #---------------------------------------------------------------------------------- @@ -227,7 +262,7 @@ * * @since 1.0.9 * - * @param string $plan Plan name + * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool @@ -243,7 +278,7 @@ * * @since 1.0.9 * - * @param string $plan Plan name + * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool @@ -324,7 +359,7 @@ #---------------------------------------------------------------------------------- /** - * Check if plugin using the free plan. + * Check if the user is on the free plan of the product. * * @since 1.0.4 * @@ -335,7 +370,7 @@ /** * @since 1.0.2 * - * @param string $plan Plan name + * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool @@ -347,7 +382,7 @@ * * @since 1.0.9 * - * @param string $plan Plan name + * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool @@ -359,7 +394,7 @@ * * @since 1.0.9 * - * @param string $plan Plan name + * @param string $plan Plan name. * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. * * @return bool @@ -403,6 +438,31 @@ */ abstract function is_only_premium(); + /** + * Check if module has a premium code version. + * + * Serviceware module might be freemium without any + * premium code version, where the paid features + * are all part of the service. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @return bool + */ + abstract function has_premium_version(); + + /** + * Check if module has any release on Freemius, + * or all plugin's code is on WordPress.org (Serviceware). + * + * @return bool + */ + function has_release_on_freemius() { + return ! $this->is_org_repo_compliant() || + $this->has_premium_version(); + } + /** * Checks if it's a freemium plugin. * @@ -416,6 +476,16 @@ $this->has_free_plan(); } + /** + * Check if module has only one plan. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @return bool + */ + abstract function is_single_plan(); + #endregion /** @@ -451,7 +521,7 @@ * @author Vova Feldman (@svovaf) * @since 1.0.2 * - * @param string $period Billing cycle + * @param string $period Billing cycle. * * @return string */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius.php index 44aff2115..a8265372c 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-freemius.php @@ -1,11344 +1,20969 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - // "final class" - class Freemius extends Freemius_Abstract { - /** - * SDK Version - * - * @var string - */ - public $version = WP_FS__SDK_VERSION; - - #region Plugin Info - - /** - * @since 1.0.1 - * - * @var string - */ - private $_slug; - - /** - * @since 1.0.0 - * - * @var string - */ - private $_plugin_basename; - /** - * @since 1.0.0 - * - * @var string - */ - private $_free_plugin_basename; - /** - * @since 1.0.0 - * - * @var string - */ - private $_plugin_dir_path; - /** - * @since 1.0.0 - * - * @var string - */ - private $_plugin_dir_name; - /** - * @since 1.0.0 - * - * @var string - */ - private $_plugin_main_file_path; - /** - * @var string[] - */ - private $_plugin_data; - /** - * @since 1.0.9 - * - * @var string - */ - private $_plugin_name; - - #endregion Plugin Info - - /** - * @since 1.0.9 - * - * @var bool If false, don't turn Freemius on. - */ - private $_is_on; - - /** - * @since 1.1.3 - * - * @var bool If false, don't turn Freemius on. - */ - private $_is_anonymous; - - /** - * @since 1.0.9 - * @var bool If false, issues with connectivity to Freemius API. - */ - private $_has_api_connection; - - /** - * @since 1.0.9 - * @var bool Hints the SDK if plugin can support anonymous mode (if skip connect is visible). - */ - private $_enable_anonymous; - - /** - * @since 1.1.7.5 - * @var bool Hints the SDK if plugin should run in anonymous mode (only adds feedback form). - */ - private $_anonymous_mode; - - /** - * @since 1.1.9 - * @var bool Hints the SDK if plugin have any free plans. - */ - private $_is_premium_only; - - /** - * @since 1.0.8 - * @var bool Hints the SDK if the plugin has any paid plans. - */ - private $_has_paid_plans; - - /** - * @since 1.2.1.5 - * @var int Hints the SDK if the plugin offers a trial period. If negative, no trial, if zero - has a trial but - * without a specified period, if positive - the number of trial days. - */ - private $_trial_days = - 1; - - /** - * @since 1.2.1.5 - * @var bool Hints the SDK if the trial requires a payment method or not. - */ - private $_is_trial_require_payment = false; - - /** - * @since 1.0.7 - * @var bool Hints the SDK if the plugin is WordPress.org compliant. - */ - private $_is_org_compliant; - - /** - * @since 1.0.7 - * @var bool Hints the SDK if the plugin is has add-ons. - */ - private $_has_addons; - - /** - * @since 1.1.6 - * @var string[]bool. - */ - private $_permissions; - - /** - * @var FS_Key_Value_Storage - */ - private $_storage; - - /** - * @since 1.0.0 - * - * @var FS_Logger - */ - private $_logger; - /** - * @since 1.0.4 - * - * @var FS_Plugin - */ - private $_plugin = false; - /** - * @since 1.0.4 - * - * @var FS_Plugin|false - */ - private $_parent_plugin = false; - /** - * @since 1.1.1 - * - * @var Freemius - */ - private $_parent = false; - /** - * @since 1.0.1 - * - * @var FS_User - */ - private $_user = false; - /** - * @since 1.0.1 - * - * @var FS_Site - */ - private $_site = false; - /** - * @since 1.0.1 - * - * @var FS_Plugin_License - */ - private $_license; - /** - * @since 1.0.2 - * - * @var FS_Plugin_Plan[] - */ - private $_plans = false; - /** - * @var FS_Plugin_License[] - * @since 1.0.5 - */ - private $_licenses = false; - - /** - * @since 1.0.1 - * - * @var FS_Admin_Menu_Manager - */ - private $_menu; - - /** - * @var FS_Admin_Notice_Manager - */ - private $_admin_notices; - - /** - * @since 1.1.6 - * - * @var FS_Admin_Notice_Manager - */ - private static $_global_admin_notices; - - /** - * @var FS_Logger - * @since 1.0.0 - */ - private static $_static_logger; - - /** - * @var FS_Option_Manager - * @since 1.0.2 - */ - private static $_accounts; - - /** - * @var Freemius[] - */ - private static $_instances = array(); - - #region Uninstall Reasons IDs - - const REASON_NO_LONGER_NEEDED = 1; - const REASON_FOUND_A_BETTER_PLUGIN = 2; - const REASON_NEEDED_FOR_A_SHORT_PERIOD = 3; - const REASON_BROKE_MY_SITE = 4; - const REASON_SUDDENLY_STOPPED_WORKING = 5; - const REASON_CANT_PAY_ANYMORE = 6; - const REASON_OTHER = 7; - const REASON_DIDNT_WORK = 8; - const REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION = 9; - const REASON_COULDNT_MAKE_IT_WORK = 10; - const REASON_GREAT_BUT_NEED_SPECIFIC_FEATURE = 11; - const REASON_NOT_WORKING = 12; - const REASON_NOT_WHAT_I_WAS_LOOKING_FOR = 13; - const REASON_DIDNT_WORK_AS_EXPECTED = 14; - const REASON_TEMPORARY_DEACTIVATION = 15; - - #endregion - - /* Ctor -------------------------------------------------------------------------------------------------------------------*/ - - /** - * Main singleton instance. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @param string $slug - * @param bool $is_init Since 1.2.1 Is initiation sequence. - */ - private function __construct( $slug, $is_init = false ) { - $this->_slug = $slug; - - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_storage = FS_Key_Value_Storage::instance( 'plugin_data', $this->_slug ); - - $this->_plugin_main_file_path = $this->_find_caller_plugin_file( $is_init ); - $this->_plugin_dir_path = plugin_dir_path( $this->_plugin_main_file_path ); - $this->_plugin_basename = plugin_basename( $this->_plugin_main_file_path ); - $this->_free_plugin_basename = str_replace( '-premium/', '/', $this->_plugin_basename ); - - $base_name_split = explode( '/', $this->_plugin_basename ); - $this->_plugin_dir_name = $base_name_split[0]; - - if ( $this->_logger->is_on() ) { - $this->_logger->info( 'plugin_main_file_path = ' . $this->_plugin_main_file_path ); - $this->_logger->info( 'plugin_dir_path = ' . $this->_plugin_dir_path ); - $this->_logger->info( 'plugin_basename = ' . $this->_plugin_basename ); - $this->_logger->info( 'free_plugin_basename = ' . $this->_free_plugin_basename ); - $this->_logger->info( 'plugin_dir_name = ' . $this->_plugin_dir_name ); - } - - // Remember link between file to slug. - $this->store_file_slug_map(); - - // Store plugin's initial install timestamp. - if ( ! isset( $this->_storage->install_timestamp ) ) { - $this->_storage->install_timestamp = WP_FS__SCRIPT_START_TIME; - } - - $this->_plugin = FS_Plugin_Manager::instance( $this->_slug )->get(); - - $this->_admin_notices = FS_Admin_Notice_Manager::instance( - $slug, - is_object( $this->_plugin ) ? $this->_plugin->title : '' - ); - - if ( 'true' === fs_request_get( 'fs_clear_api_cache' ) || - 'true' === fs_request_is_action( 'restart_freemius' ) - ) { - FS_Api::clear_cache(); - } - - $this->_register_hooks(); - - $this->_load_account(); - - $this->_version_updates_handler(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - private function _version_updates_handler() { - if ( ! isset( $this->_storage->sdk_version ) || $this->_storage->sdk_version != $this->version ) { - // Freemius version upgrade mode. - $this->_storage->sdk_last_version = $this->_storage->sdk_version; - $this->_storage->sdk_version = $this->version; - - if ( empty( $this->_storage->sdk_last_version ) || - version_compare( $this->_storage->sdk_last_version, $this->version, '<' ) - ) { - $this->_storage->sdk_upgrade_mode = true; - $this->_storage->sdk_downgrade_mode = false; - } else { - $this->_storage->sdk_downgrade_mode = true; - $this->_storage->sdk_upgrade_mode = false; - - } - - $this->do_action( 'sdk_version_update', $this->_storage->sdk_last_version, $this->version ); - } - - $plugin_version = $this->get_plugin_version(); - if ( ! isset( $this->_storage->plugin_version ) || $this->_storage->plugin_version != $plugin_version ) { - // Plugin version upgrade mode. - $this->_storage->plugin_last_version = $this->_storage->plugin_version; - $this->_storage->plugin_version = $plugin_version; - - if ( empty( $this->_storage->plugin_last_version ) || - version_compare( $this->_storage->plugin_last_version, $plugin_version, '<' ) - ) { - $this->_storage->plugin_upgrade_mode = true; - $this->_storage->plugin_downgrade_mode = false; - } else { - $this->_storage->plugin_downgrade_mode = true; - $this->_storage->plugin_upgrade_mode = false; - } - - if ( ! empty( $this->_storage->plugin_last_version ) ) { - // Different version of the plugin was installed before, therefore it's an update. - $this->_storage->is_plugin_new_install = false; - } - - $this->do_action( 'plugin_version_update', $this->_storage->plugin_last_version, $plugin_version ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.5 - * - * @param string $sdk_prev_version - * @param string $sdk_version - */ - function _data_migration( $sdk_prev_version, $sdk_version ) { - /** - * @since 1.1.7.3 Fixed unwanted connectivity test cleanup. - */ - if ( empty( $sdk_prev_version ) ) { - return; - } - - if ( version_compare( $sdk_prev_version, '1.1.5', '<' ) && - version_compare( $sdk_version, '1.1.5', '>=' ) - ) { - // On version 1.1.5 merged connectivity and is_on data. - if ( isset( $this->_storage->connectivity_test ) ) { - if ( ! isset( $this->_storage->is_on ) ) { - unset( $this->_storage->connectivity_test ); - } else { - $connectivity_data = $this->_storage->connectivity_test; - $connectivity_data['is_active'] = $this->_storage->is_on['is_active']; - $connectivity_data['timestamp'] = $this->_storage->is_on['timestamp']; - - // Override. - $this->_storage->connectivity_test = $connectivity_data; - - // Remove previous structure. - unset( $this->_storage->is_on ); - } - - } - } - } - - /** - * This action is connected to the 'plugins_loaded' hook and helps to determine - * if this is a new plugin installation or a plugin update. - * - * There are 3 different use-cases: - * 1) New plugin installation right with Freemius: - * 1.1 _activate_plugin_event_hook() will be executed first - * 1.2 Since $this->_storage->is_plugin_new_install is not set, - * and $this->_storage->plugin_last_version is not set, - * $this->_storage->is_plugin_new_install will be set to TRUE. - * 1.3 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will - * be already set to TRUE. - * - * 2) Plugin update, didn't have Freemius before, and now have the SDK: - * 2.1 _activate_plugin_event_hook() will not be executed, because - * the activation hook do NOT fires on updates since WP 3.1. - * 2.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will - * be empty, therefore, it will be set to FALSE. - * - * 3) Plugin update, had Freemius in prev version as well: - * 3.1 _version_updates_handler() will be executed 1st, since FS was installed - * before, $this->_storage->plugin_last_version will NOT be empty, - * therefore, $this->_storage->is_plugin_new_install will be set to FALSE. - * 3.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install is - * already set, therefore, it will not be modified. - * - * Use-case #3 is backward compatible, #3.1 will be executed since 1.0.9. - * - * NOTE: - * The only fallback of this mechanism is if an admin updates a plugin based on use-case #2, - * and then, the next immediate PageView is the plugin's main settings page, it will not - * show the opt-in right away. The reason it will happen is because Freemius execution - * will be turned off till the plugin is fully loaded at least once - * (till $this->_storage->was_plugin_loaded is TRUE). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - * - */ - function _plugins_loaded() { - // Update flag that plugin was loaded with Freemius at least once. - $this->_storage->was_plugin_loaded = true; - - if ( ! isset( $this->_storage->is_plugin_new_install ) ) { - $this->_storage->is_plugin_new_install = false; - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - private function _register_hooks() { - $this->_logger->entrance(); - - if ( is_admin() ) { - $plugin_dir = dirname( $this->_plugin_dir_path ) . '/'; - - /** - * @since 1.2.2 - * - * Hook to both free and premium version activations to support - * auto deactivation on the other version activation. - */ - register_activation_hook( - $plugin_dir . $this->_free_plugin_basename, - array( &$this, '_activate_plugin_event_hook' ) - ); - register_activation_hook( - $plugin_dir . $this->premium_plugin_basename(), - array( &$this, '_activate_plugin_event_hook' ) - ); - - /** - * Part of the mechanism to identify new plugin install vs. plugin update. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - */ - if ( empty( $this->_storage->was_plugin_loaded ) ) { - if ( $this->is_activation_mode( false ) ) { - add_action( 'plugins_loaded', array( &$this, '_plugins_loaded' ) ); - } else { - // If was activated before, then it was already loaded before. - $this->_plugins_loaded(); - } - } - - if ( ! $this->is_ajax() ) { - if ( ! $this->is_addon() ) { - add_action( 'init', array( &$this, '_add_default_submenu_items' ), WP_FS__LOWEST_PRIORITY ); - add_action( 'admin_menu', array( &$this, '_prepare_admin_menu' ), WP_FS__LOWEST_PRIORITY ); - } - } - } - - register_deactivation_hook( $this->_plugin_main_file_path, array( &$this, '_deactivate_plugin_hook' ) ); - - add_action( 'init', array( &$this, '_redirect_on_clicked_menu_link' ), WP_FS__LOWEST_PRIORITY ); - - add_action( 'admin_init', array( &$this, '_add_tracking_links' ) ); - add_action( 'admin_init', array( &$this, '_add_license_activation' ) ); - $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) ); - $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) ); - - $this->add_action( 'after_plans_sync', array( &$this, '_check_for_trial_plans' ) ); - - $this->add_action( 'sdk_version_update', array( &$this, '_data_migration' ), WP_FS__DEFAULT_PRIORITY, 2 ); - - add_action( 'admin_init', array( &$this, '_add_trial_notice' ) ); - add_action( 'admin_init', array( &$this, '_enqueue_common_css' ) ); - - /** - * Handle request to reset anonymous mode for `get_reconnect_url()`. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - */ - if ( fs_request_is_action( 'reset_anonymous_mode' ) && - $this->_slug === fs_request_get( 'fs_slug' ) - ) { - add_action( 'admin_init', array( &$this, 'connect_again' ) ); - } - } - - /** - * Keeping the uninstall hook registered for free or premium plugin version may result to a fatal error that - * could happen when a user tries to uninstall either version while one of them is still active. Uninstalling a - * plugin will trigger inclusion of the free or premium version and if one of them is active during the - * uninstallation, a fatal error may occur in case the plugin's class or functions are already defined. - * - * @author Leo Fajardo (leorw) - * - * @since 1.2.0 - */ - private function unregister_uninstall_hook() { - $uninstallable_plugins = (array) get_option( 'uninstall_plugins' ); - unset( $uninstallable_plugins[ $this->_free_plugin_basename ] ); - unset( $uninstallable_plugins[ $this->premium_plugin_basename() ] ); - - update_option( 'uninstall_plugins', $uninstallable_plugins ); - } - - /** - * @since 1.2.0 Invalidate module's main file cache, otherwise, FS_Plugin_Updater will not fetch updates. - */ - private function clear_module_main_file_cache() { - if ( ! isset( $this->_storage->plugin_main_file ) || - empty( $this->_storage->plugin_main_file->path ) - ) { - return; - } - - $plugin_main_file = clone $this->_storage->plugin_main_file; - - // Store cached path (2nd layer cache). - $plugin_main_file->prev_path = $plugin_main_file->path; - - // Clear cached path. - unset( $plugin_main_file->path ); - - $this->_storage->plugin_main_file = $plugin_main_file; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - private function _register_account_hooks() { - if ( is_admin() ) { - // If user is paying or in trial and have the free version installed, - // assume that the deactivation is for the upgrade process. - if ( ! $this->is_paying_or_trial() || $this->is_premium() ) { - $this->add_ajax_action( - 'submit_uninstall_reason', - array( &$this, '_submit_uninstall_reason_action' ) - ); - - if ( $this->is_plugins_page() ) { - add_action( 'admin_footer', array( &$this, '_add_deactivation_feedback_dialog_box' ) ); - } - } - - if ( ! $this->is_addon() ) { - if ( $this->is_registered() ) { - $this->add_filter( 'after_code_type_change', array( &$this, '_after_code_type_change' ) ); - } - } - } - } - - /** - * Leverage backtrace to find caller plugin file path. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool $is_init Is initiation sequence. - * - * @return string - * - * @uses fs_find_caller_plugin_file - */ - private function _find_caller_plugin_file( $is_init = false ) { - // Try to load the cached value of the file path. - if ( isset( $this->_storage->plugin_main_file ) ) { - $plugin_main_file = $this->_storage->plugin_main_file; - if ( isset( $plugin_main_file->path ) && file_exists( $plugin_main_file->path ) ) { - return $this->_storage->plugin_main_file->path; - } - } - - /** - * @since 1.2.1 - * - * `clear_module_main_file_cache()` is clearing the plugin's cached path on - * deactivation. Therefore, if any plugin/theme was initiating `Freemius` - * with that plugin's slug, it was overriding the empty plugin path with a wrong path. - * - * So, we've added a special mechanism with a 2nd layer of cache that uses `prev_path` - * when the class instantiator isn't the module. - */ - if ( ! $is_init ) { - // Fetch prev path cache. - if ( isset( $this->_storage->plugin_main_file ) && - isset( $this->_storage->plugin_main_file->prev_path ) - ) { - if ( file_exists( $this->_storage->plugin_main_file->prev_path ) ) { - return $this->_storage->plugin_main_file->prev_path; - } - } - - wp_die( - __fs( 'failed-finding-main-path', $this->_slug ), - __fs( 'error' ), - array( 'back_link' => true ) - ); - } - - /** - * @since 1.2.1 - * - * Only the original instantiator that calls dynamic_init can modify the module's path. - */ - // Find caller module. - $plugin_file = fs_find_caller_plugin_file(); - - $this->_storage->plugin_main_file = (object) array( - 'path' => fs_normalize_path( $plugin_file ), - ); - - return $plugin_file; - } - - - #---------------------------------------------------------------------------------- - #region Deactivation Feedback Form - #---------------------------------------------------------------------------------- - - /** - * Displays a confirmation and feedback dialog box when the user clicks on the "Deactivate" link on the plugins - * page. - * - * @author Vova Feldman (@svovaf) - * @author Leo Fajardo (@leorw) - * @since 1.1.2 - */ - function _add_deactivation_feedback_dialog_box() { - /* Check the type of user: - * 1. Long-term (long-term) - * 2. Non-registered and non-anonymous short-term (non-registered-and-non-anonymous-short-term). - * 3. Short-term (short-term) - */ - $is_long_term_user = true; - - // Check if the site is at least 2 days old. - $time_installed = $this->_storage->install_timestamp; - - // Difference in seconds. - $date_diff = time() - $time_installed; - - // Convert seconds to days. - $date_diff_days = floor( $date_diff / ( 60 * 60 * 24 ) ); - - if ( $date_diff_days < 2 ) { - $is_long_term_user = false; - } - - $is_long_term_user = $this->apply_filters( 'is_long_term_user', $is_long_term_user ); - - if ( $is_long_term_user ) { - $user_type = 'long-term'; - } else { - if ( ! $this->is_registered() && ! $this->is_anonymous() ) { - $user_type = 'non-registered-and-non-anonymous-short-term'; - } else { - $user_type = 'short-term'; - } - } - - $uninstall_reasons = $this->_get_uninstall_reasons( $user_type ); - - // Load the HTML template for the deactivation feedback dialog box. - $vars = array( - 'reasons' => $uninstall_reasons, - 'slug' => $this->_slug - ); - - /** - * @todo Deactivation form core functions should be loaded only once! Otherwise, when there are multiple Freemius powered plugins the same code is loaded multiple times. The only thing that should be loaded differently is the various deactivation reasons object based on the state of the plugin. - */ - fs_require_template( 'forms/deactivation/form.php', $vars ); - } - - /** - * @author Leo Fajardo (leorw) - * @since 1.1.2 - * - * @param string $user_type - * - * @return array The uninstall reasons for the specified user type. - */ - function _get_uninstall_reasons( $user_type = 'long-term' ) { - $internal_message_template_var = array( - 'slug' => $this->_slug - ); - - if ( $this->is_registered() && false !== $this->get_plan() && $this->get_plan()->has_technical_support() ) { - $contact_support_template = fs_get_template( 'forms/deactivation/contact.php', $internal_message_template_var ); - } else { - $contact_support_template = ''; - } - - $reason_found_better_plugin = array( - 'id' => self::REASON_FOUND_A_BETTER_PLUGIN, - 'text' => __fs( 'reason-found-a-better-plugin', $this->_slug ), - 'input_type' => 'textfield', - 'input_placeholder' => __fs( 'placeholder-plugin-name', $this->_slug ) - ); - - $reason_temporary_deactivation = array( - 'id' => self::REASON_TEMPORARY_DEACTIVATION, - 'text' => __fs( 'reason-temporary-deactivation', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '' - ); - - $reason_other = array( - 'id' => self::REASON_OTHER, - 'text' => __fs( 'reason-other', $this->_slug ), - 'input_type' => 'textfield', - 'input_placeholder' => '' - ); - - $long_term_user_reasons = array( - array( - 'id' => self::REASON_NO_LONGER_NEEDED, - 'text' => __fs( 'reason-no-longer-needed', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '' - ), - $reason_found_better_plugin, - array( - 'id' => self::REASON_NEEDED_FOR_A_SHORT_PERIOD, - 'text' => __fs( 'reason-needed-for-a-short-period', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '' - ), - array( - 'id' => self::REASON_BROKE_MY_SITE, - 'text' => __fs( 'reason-broke-my-site', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '', - 'internal_message' => $contact_support_template - ), - array( - 'id' => self::REASON_SUDDENLY_STOPPED_WORKING, - 'text' => __fs( 'reason-suddenly-stopped-working', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '', - 'internal_message' => $contact_support_template - ) - ); - - if ( $this->is_paying() ) { - $long_term_user_reasons[] = array( - 'id' => self::REASON_CANT_PAY_ANYMORE, - 'text' => __fs( 'reason-cant-pay-anymore', $this->_slug ), - 'input_type' => 'textfield', - 'input_placeholder' => __fs( 'placeholder-comfortable-price', $this->_slug ) - ); - } - - $reason_dont_share_info = array( - 'id' => self::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION, - 'text' => __fs( 'reason-dont-like-to-share-my-information', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '' - ); - - /** - * If the current user has selected the "don't share data" reason in the deactivation feedback modal, inform the - * user by showing additional message that he doesn't have to share data and can just choose to skip the opt-in - * (the Skip button is included in the message to show). This message will only be shown if anonymous mode is - * enabled and the user's account is currently not in pending activation state (similar to the way the Skip - * button in the opt-in form is shown/hidden). - */ - if ( $this->is_enable_anonymous() && ! $this->is_pending_activation() ) { - $reason_dont_share_info['internal_message'] = fs_get_template( 'forms/deactivation/retry-skip.php', $internal_message_template_var ); - } - - $uninstall_reasons = array( - 'long-term' => $long_term_user_reasons, - 'non-registered-and-non-anonymous-short-term' => array( - array( - 'id' => self::REASON_DIDNT_WORK, - 'text' => __fs( 'reason-didnt-work', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '' - ), - $reason_dont_share_info, - $reason_found_better_plugin - ), - 'short-term' => array( - array( - 'id' => self::REASON_COULDNT_MAKE_IT_WORK, - 'text' => __fs( 'reason-couldnt-make-it-work', $this->_slug ), - 'input_type' => '', - 'input_placeholder' => '', - 'internal_message' => $contact_support_template - ), - $reason_found_better_plugin, - array( - 'id' => self::REASON_GREAT_BUT_NEED_SPECIFIC_FEATURE, - 'text' => __fs( 'reason-great-but-need-specific-feature', $this->_slug ), - 'input_type' => 'textarea', - 'input_placeholder' => __fs( 'placeholder-feature', $this->_slug ) - ), - array( - 'id' => self::REASON_NOT_WORKING, - 'text' => __fs( 'reason-not-working', $this->_slug ), - 'input_type' => 'textarea', - 'input_placeholder' => __fs( 'placeholder-share-what-didnt-work', $this->_slug ) - ), - array( - 'id' => self::REASON_NOT_WHAT_I_WAS_LOOKING_FOR, - 'text' => __fs( 'reason-not-what-i-was-looking-for', $this->_slug ), - 'input_type' => 'textarea', - 'input_placeholder' => __fs( 'placeholder-what-youve-been-looking-for', $this->_slug ) - ), - array( - 'id' => self::REASON_DIDNT_WORK_AS_EXPECTED, - 'text' => __fs( 'reason-didnt-work-as-expected', $this->_slug ), - 'input_type' => 'textarea', - 'input_placeholder' => __fs( 'placeholder-what-did-you-expect', $this->_slug ) - ) - ) - ); - - // Randomize the reasons for the current user type. - shuffle( $uninstall_reasons[ $user_type ] ); - - // Keep the following reasons as the last items in the list. - $uninstall_reasons[ $user_type ][] = $reason_temporary_deactivation; - $uninstall_reasons[ $user_type ][] = $reason_other; - - $uninstall_reasons = $this->apply_filters( 'uninstall_reasons', $uninstall_reasons ); - - return $uninstall_reasons[ $user_type ]; - } - - /** - * Called after the user has submitted his reason for deactivating the plugin. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.2 - */ - function _submit_uninstall_reason_action() { - $reason_id = fs_request_get( 'reason_id' ); - - // Check if the given reason ID is an unsigned integer. - if ( ! ctype_digit( $reason_id ) ) { - exit; - } - - $reason_info = trim( fs_request_get( 'reason_info', '' ) ); - if ( ! empty( $reason_info ) ) { - $reason_info = substr( $reason_info, 0, 128 ); - } - - $reason = (object) array( - 'id' => $reason_id, - 'info' => $reason_info, - 'is_anonymous' => fs_request_get_bool( 'is_anonymous' ) - ); - - $this->_storage->store( 'uninstall_reason', $reason ); - - // Print '1' for successful operation. - echo 1; - exit; - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Instance - #---------------------------------------------------------------------------------- - - /** - * Main singleton instance. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @param string $slug - * @param bool $is_init Is initiation sequence. - * - * @return Freemius - */ - static function instance( $slug, $is_init = false ) { - $slug = strtolower( $slug ); - - if ( ! isset( self::$_instances[ $slug ] ) ) { - if ( 0 === count( self::$_instances ) ) { - self::_load_required_static(); - } - - self::$_instances[ $slug ] = new Freemius( $slug, $is_init ); - } - - return self::$_instances[ $slug ]; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string|number $slug_or_id - * - * @return bool - */ - private static function has_instance( $slug_or_id ) { - return ! is_numeric( $slug_or_id ) ? - isset( self::$_instances[ strtolower( $slug_or_id ) ] ) : - ( false !== self::get_instance_by_id( $slug_or_id ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param $id - * - * @return false|Freemius - */ - static function get_instance_by_id( $id ) { - foreach ( self::$_instances as $slug => $instance ) { - if ( $id == $instance->get_id() ) { - return $instance; - } - } - - return false; - } - - /** - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param $plugin_file - * - * @return false|Freemius - */ - static function get_instance_by_file( $plugin_file ) { - $slug = self::find_slug_by_basename( $plugin_file ); - - return ( false !== $slug ) ? - self::instance( $slug ) : - false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return false|Freemius - */ - function get_parent_instance() { - return self::get_instance_by_id( $this->_plugin->parent_plugin_id ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param $slug_or_id - * - * @return bool|Freemius - */ - function get_addon_instance( $slug_or_id ) { - return ! is_numeric( $slug_or_id ) ? - self::instance( strtolower( $slug_or_id ) ) : - self::get_instance_by_id( $slug_or_id ); - } - - #endregion ------------------------------------------------------------------ - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function is_parent_plugin_installed() { - return self::has_instance( $this->_plugin->parent_plugin_id ); - } - - /** - * Check if add-on parent plugin in activation mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function is_parent_in_activation() { - $parent_fs = $this->get_parent_instance(); - if ( ! is_object( $parent_fs ) ) { - return false; - } - - return ( $parent_fs->is_activation_mode() ); - } - - /** - * Is plugin in activation mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @param bool $and_on - * - * @return bool - */ - function is_activation_mode( $and_on = true ) { - return ( - ( $this->is_on() || ! $and_on ) && - ! $this->is_registered() && - ( ! $this->is_enable_anonymous() || - ( ! $this->is_anonymous() && ! $this->is_pending_activation() ) ) - ); - } - - /** - * Get collection of all active plugins. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return array[string]array - */ - private static function get_active_plugins() { - self::require_plugin_essentials(); - - $active_plugin = array(); - $all_plugins = get_plugins(); - $active_plugins_basenames = get_option( 'active_plugins' ); - - foreach ( $active_plugins_basenames as $plugin_basename ) { - $active_plugin[ $plugin_basename ] = $all_plugins[ $plugin_basename ]; - } - - return $active_plugin; - } - - /** - * Get collection of all plugins. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8 - * - * @return array Key is the plugin file path and the value is an array of the plugin data. - */ - private static function get_all_plugins() { - self::require_plugin_essentials(); - - $all_plugins = get_plugins(); - $active_plugins_basenames = get_option( 'active_plugins' ); - - foreach ( $all_plugins as $basename => &$data ) { - // By default set to inactive (next foreach update the active plugins). - $data['is_active'] = false; - // Enrich with plugin slug. - $data['slug'] = self::get_plugin_slug( $basename ); - } - - // Flag active plugins. - foreach ( $active_plugins_basenames as $basename ) { - if ( isset( $all_plugins[ $basename ] ) ) { - $all_plugins[ $basename ]['is_active'] = true; - } - } - - return $all_plugins; - } - - - /** - * Cached result of get_site_transient( 'update_plugins' ) - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8 - * - * @var object - */ - private static $_plugins_info; - - /** - * Helper function to get specified plugin's slug. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8 - * - * @param $basename - * - * @return string - */ - private static function get_plugin_slug( $basename ) { - if ( ! isset( self::$_plugins_info ) ) { - self::$_plugins_info = get_site_transient( 'update_plugins' ); - } - - $slug = ''; - - if ( is_object( self::$_plugins_info ) ) { - if ( isset( self::$_plugins_info->no_update ) && - isset( self::$_plugins_info->no_update[ $basename ] ) && - ! empty( self::$_plugins_info->no_update[ $basename ]->slug ) - ) { - $slug = self::$_plugins_info->no_update[ $basename ]->slug; - } else if ( isset( self::$_plugins_info->response ) && - isset( self::$_plugins_info->response[ $basename ] ) && - ! empty( self::$_plugins_info->response[ $basename ]->slug ) - ) { - $slug = self::$_plugins_info->response[ $basename ]->slug; - } - } - - if ( empty( $slug ) ) { - // Try to find slug from FS data. - $slug = self::find_slug_by_basename( $basename ); - } - - if ( empty( $slug ) ) { - // Fallback to plugin's folder name. - $slug = dirname( $basename ); - } - - return $slug; - } - - private static $_statics_loaded = false; - - /** - * Load static resources. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - private static function _load_required_static() { - if ( self::$_statics_loaded ) { - return; - } - - self::$_static_logger = FS_Logger::get_logger( WP_FS__SLUG, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - self::$_static_logger->entrance(); - - self::$_accounts = FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); - - self::$_global_admin_notices = FS_Admin_Notice_Manager::instance( 'global' ); - - // Configure which Freemius powered plugins should be auto updated. -// add_filter( 'auto_update_plugin', '_include_plugins_in_auto_update', 10, 2 ); - - add_action( 'admin_menu', array( 'Freemius', 'add_debug_page' ) ); - - add_action( "wp_ajax_fs_toggle_debug_mode", array( 'Freemius', '_toggle_debug_mode' ) ); - - add_action( 'plugins_loaded', array( 'Freemius', '_load_textdomain' ), 1 ); - - self::$_statics_loaded = true; - } - - #---------------------------------------------------------------------------------- - #region Localization - #---------------------------------------------------------------------------------- - - /** - * Load framework's text domain. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - */ - static function _load_textdomain() { - if ( ! is_admin() ) { - return; - } - - global $fs_active_plugins; - - load_plugin_textdomain( - 'freemius', - false, - $fs_active_plugins->newest->sdk_path . '/languages/' - ); - - // @todo Load for themes. - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Debugging - #---------------------------------------------------------------------------------- - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.8 - */ - static function add_debug_page() { - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - self::$_static_logger->entrance(); - - $title = sprintf( '%s [v.%s]', __fs( 'freemius-debug' ), WP_FS__SDK_VERSION ); - - if ( WP_FS__DEV_MODE ) { - // Add top-level debug menu item. - $hook = add_menu_page( - $title, - $title, - 'manage_options', - 'freemius', - array( 'Freemius', '_debug_page_render' ) - ); - } else { - // Add hidden debug page. - $hook = add_submenu_page( - null, - $title, - $title, - 'manage_options', - 'freemius', - array( 'Freemius', '_debug_page_render' ) - ); - } - - add_action( "load-$hook", array( 'Freemius', '_debug_page_actions' ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - static function _toggle_debug_mode() { - if ( in_array( $_POST['is_on'], array( 0, 1 ) ) ) { - update_option( 'fs_debug_mode', $_POST['is_on'] ); - } - - exit; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.8 - */ - static function _debug_page_actions() { - self::_clean_admin_content_section(); - - if ( fs_request_is_action( 'restart_freemius' ) ) { - check_admin_referer( 'restart_freemius' ); - - // Clear accounts data. - self::$_accounts->clear( true ); - - // Clear SDK reference cache. - delete_option( 'fs_active_plugins' ); - } else if ( fs_request_is_action( 'simulate_trial' ) ) { - check_admin_referer( 'simulate_trial' ); - - $slug = fs_request_get( 'slug' ); - - $fs = freemius( $slug ); - - // Update SDK install to at least 24 hours before. - $fs->_storage->install_timestamp = ( time() - WP_FS__TIME_24_HOURS_IN_SEC ); - // Unset the trial shown timestamp. - unset( $fs->_storage->trial_promotion_shown ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.8 - */ - static function _debug_page_render() { - self::$_static_logger->entrance(); - - $sites = self::get_all_sites(); - $users = self::get_all_users(); - $addons = self::get_all_addons(); - $account_addons = self::get_all_account_addons(); - $licenses = self::get_all_licenses(); - -// $plans = self::get_all_plans(); -// $licenses = self::get_all_licenses(); - - $vars = array( - 'sites' => $sites, - 'users' => $users, - 'addons' => $addons, - 'account_addons' => $account_addons, - 'licenses' => $licenses, - ); - - fs_enqueue_local_style( 'fs_account', '/admin/debug.css' ); - fs_require_once_template( 'debug.php', $vars ); - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Connectivity Issues - #---------------------------------------------------------------------------------- - - /** - * Check if Freemius should be turned on for the current plugin install. - * - * Note: - * $this->_is_on is updated in has_api_connectivity() - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_on() { - self::$_static_logger->entrance(); - - if ( isset( $this->_is_on ) ) { - return $this->_is_on; - } - - // If already installed or pending then sure it's on :) - if ( $this->is_registered() || $this->is_pending_activation() ) { - $this->_is_on = true; - - return true; - } - - return false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @param bool $flush_if_no_connectivity - * - * @return bool - */ - private function should_run_connectivity_test( $flush_if_no_connectivity = false ) { - if ( ! isset( $this->_storage->connectivity_test ) ) { - // Connectivity test was never executed, or cache was cleared. - return true; - } - - if ( WP_FS__PING_API_ON_IP_OR_HOST_CHANGES ) { - if ( WP_FS__IS_HTTP_REQUEST ) { - if ( $_SERVER['HTTP_HOST'] != $this->_storage->connectivity_test['host'] ) { - // Domain changed. - return true; - } - - if ( WP_FS__REMOTE_ADDR != $this->_storage->connectivity_test['server_ip'] ) { - // Server IP changed. - return true; - } - } - } - - if ( $this->_storage->connectivity_test['is_connected'] && - $this->_storage->connectivity_test['is_active'] - ) { - // API connected and Freemius is active - no need to run connectivity check. - return false; - } - - if ( $flush_if_no_connectivity ) { - /** - * If explicitly asked to flush when no connectivity - do it only - * if at least 10 sec passed from the last API connectivity test. - */ - return ( isset( $this->_storage->connectivity_test['timestamp'] ) && - ( WP_FS__SCRIPT_START_TIME - $this->_storage->connectivity_test['timestamp'] ) > 10 ); - } - - /** - * @since 1.1.7 Don't check for connectivity on plugin downgrade. - */ - $version = $this->get_plugin_version(); - if ( version_compare( $version, $this->_storage->connectivity_test['version'], '>' ) ) { - // If it's a plugin version upgrade and Freemius is off or no connectivity, run connectivity test. - return true; - } - - return false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @return object|false - */ - private function ping() { - if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY ) { - return false; - } - - $version = $this->get_plugin_version(); - - $is_update = $this->apply_filters( 'is_plugin_update', $this->is_plugin_update() ); - - return $this->get_api_plugin_scope()->ping( - $this->get_anonymous_id(), - array( - 'is_update' => json_encode( $is_update ), - 'version' => $version, - 'sdk' => $this->version, - 'is_admin' => json_encode( is_admin() ), - 'is_ajax' => json_encode( $this->is_ajax() ), - 'is_cron' => json_encode( $this->is_cron() ), - 'is_http' => json_encode( WP_FS__IS_HTTP_REQUEST ), - ) - ); - } - - /** - * Check if there's any connectivity issue to Freemius API. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param bool $flush_if_no_connectivity - * - * @return bool - */ - function has_api_connectivity( $flush_if_no_connectivity = false ) { - $this->_logger->entrance(); - - if ( isset( $this->_has_api_connection ) && ( $this->_has_api_connection || ! $flush_if_no_connectivity ) ) { - return $this->_has_api_connection; - } - - if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY && - isset( $this->_storage->connectivity_test ) && - true === $this->_storage->connectivity_test['is_connected'] - ) { - unset( $this->_storage->connectivity_test ); - } - - if ( ! $this->should_run_connectivity_test( $flush_if_no_connectivity ) ) { - $this->_has_api_connection = $this->_storage->connectivity_test['is_connected']; - /** - * @since 1.1.6 During dev mode, if there's connectivity - turn Freemius on regardless the configuration. - * - * @since 1.2.1.5 If the user running the premium version then ignore the 'is_active' flag and turn Freemius on to enable license key activation. - */ - $this->_is_on = $this->_storage->connectivity_test['is_active'] || - $this->is_premium() || - ( WP_FS__DEV_MODE && $this->_has_api_connection && ! WP_FS__SIMULATE_FREEMIUS_OFF ); - - return $this->_has_api_connection; - } - - $pong = $this->ping(); - $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); - - if ( ! $is_connected ) { - // API failure. - $this->_add_connectivity_issue_message( $pong ); - } - - $this->store_connectivity_info( $pong, $is_connected ); - - return $this->_has_api_connection; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param object $pong - * @param bool $is_connected - */ - private function store_connectivity_info( $pong, $is_connected ) { - $this->_logger->entrance(); - - $version = $this->get_plugin_version(); - - if ( ! $is_connected || WP_FS__SIMULATE_FREEMIUS_OFF ) { - $is_active = false; - } else { - $is_active = ( isset( $pong->is_active ) && true == $pong->is_active ); - } - - $is_active = $this->apply_filters( - 'is_on', - $is_active, - $this->is_plugin_update(), - $version - ); - - $this->_storage->connectivity_test = array( - 'is_connected' => $is_connected, - 'host' => $_SERVER['HTTP_HOST'], - 'server_ip' => WP_FS__REMOTE_ADDR, - 'is_active' => $is_active, - 'timestamp' => WP_FS__SCRIPT_START_TIME, - // Last version with connectivity attempt. - 'version' => $version, - ); - - $this->_has_api_connection = $is_connected; - $this->_is_on = $is_active || ( WP_FS__DEV_MODE && $is_connected && ! WP_FS__SIMULATE_FREEMIUS_OFF ); - } - - /** - * Force turning Freemius on. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8.1 - * - * @return bool TRUE if successfully turned on. - */ - private function turn_on() { - $this->_logger->entrance(); - - if ( $this->is_on() || ! isset( $this->_storage->connectivity_test['is_active'] ) ) { - return false; - } - - $updated_connectivity = $this->_storage->connectivity_test; - $updated_connectivity['is_active'] = true; - $updated_connectivity['timestamp'] = WP_FS__SCRIPT_START_TIME; - $this->_storage->connectivity_test = $updated_connectivity; - - $this->_is_on = true; - - return true; - } - - /** - * Anonymous and unique site identifier (Hash). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.0 - * - * @return string - */ - function get_anonymous_id() { - $unique_id = self::$_accounts->get_option( 'unique_id' ); - - if ( empty( $unique_id ) || ! is_string( $unique_id ) ) { - $key = get_site_url(); - - // If localhost, assign microtime instead of domain. - if ( WP_FS__IS_LOCALHOST || - false !== strpos( $key, 'localhost' ) || - false === strpos( $key, '.' ) - ) { - $key = microtime(); - } - - $unique_id = md5( $key ); - - self::$_accounts->set_option( 'unique_id', $unique_id, true ); - } - - $this->_logger->departure( $unique_id ); - - return $unique_id; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @return \WP_User - */ - static function _get_current_wp_user() { - self::require_pluggable_essentials(); - - return wp_get_current_user(); - } - - /** - * Generate API connectivity issue message. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param mixed $api_result - * @param bool $is_first_failure - */ - function _add_connectivity_issue_message( $api_result, $is_first_failure = true ) { - if ( ! $this->is_premium() && $this->_enable_anonymous ) { - // Don't add message if it's the free version and can run anonymously. - return; - } - - if ( ! function_exists( 'wp_nonce_url' ) ) { - require_once( ABSPATH . 'wp-includes/functions.php' ); - } - - $current_user = self::_get_current_wp_user(); -// $admin_email = get_option( 'admin_email' ); - $admin_email = $current_user->user_email; - - $message = false; - if ( is_object( $api_result ) && - isset( $api_result->error ) && - isset( $api_result->error->code ) - ) { - switch ( $api_result->error->code ) { - case 'curl_missing': - $message = sprintf( - __fs( 'x-requires-access-to-api', $this->_slug ) . ' ' . - __fs( 'curl-missing-message', $this->_slug ) . ' ' . - ' %s', - '<b>' . $this->get_plugin_name() . '</b>', - sprintf( - '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', - sprintf( - '<a class="fs-resolve" data-type="curl" href="#"><b>%s</b></a>%s', - __fs( 'curl-missing-no-clue-title', $this->_slug ), - ' - ' . sprintf( - __fs( 'curl-missing-no-clue-desc', $this->_slug ), - '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' - ) - ), - sprintf( - '<b>%s</b> - %s', - __fs( 'sysadmin-title', $this->_slug ), - __fs( 'curl-missing-sysadmin-desc', $this->_slug ) - ), - sprintf( - '<a href="%s"><b>%s</b></a>%s', - wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=' . 'all' . '&paged=' . '1' . '&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), - __fs( 'deactivate-plugin-title', $this->_slug ), - ' - ' . __fs( 'deactivate-plugin-desc', 'freemius', $this->_slug ) - ) - ) - ); - break; - case 'cloudflare_ddos_protection': - $message = sprintf( - __fs( 'x-requires-access-to-api', $this->_slug ) . ' ' . - __fs( 'cloudflare-blocks-connection-message', $this->_slug ) . ' ' . - __fs( 'happy-to-resolve-issue-asap', $this->_slug ) . - ' %s', - '<b>' . $this->get_plugin_name() . '</b>', - sprintf( - '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', - sprintf( - '<a class="fs-resolve" data-type="cloudflare" href="#"><b>%s</b></a>%s', - __fs( 'fix-issue-title', $this->_slug ), - ' - ' . sprintf( - __fs( 'fix-issue-desc', $this->_slug ), - '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' - ) - ), - sprintf( - '<a href="%s" target="_blank"><b>%s</b></a>%s', - sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ), - __fs( 'install-previous-title', $this->_slug ), - ' - ' . __fs( 'install-previous-desc', $this->_slug ) - ), - sprintf( - '<a href="%s"><b>%s</b></a>%s', - wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=' . 'all' . '&paged=' . '1' . '&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), - __fs( 'deactivate-plugin-title', $this->_slug ), - ' - ' . __fs( 'deactivate-plugin-desc', $this->_slug ) - ) - ) - ); - break; - case 'squid_cache_block': - $message = sprintf( - __fs( 'x-requires-access-to-api', $this->_slug ) . ' ' . - __fs( 'squid-blocks-connection-message', $this->_slug ) . - ' %s', - '<b>' . $this->get_plugin_name() . '</b>', - sprintf( - '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', - sprintf( - '<a class="fs-resolve" data-type="squid" href="#"><b>%s</b></a>%s', - __fs( 'squid-no-clue-title', $this->_slug ), - ' - ' . sprintf( - __fs( 'squid-no-clue-desc', $this->_slug ), - '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' - ) - ), - sprintf( - '<b>%s</b> - %s', - __fs( 'sysadmin-title', $this->_slug ), - sprintf( - __fs( 'squid-sysadmin-desc', $this->_slug ), - // We use a filter since the plugin might require additional API connectivity. - '<b>' . implode( ', ', $this->apply_filters( 'api_domains', array( 'api.freemius.com' ) ) ) . '</b>' ) - ), - sprintf( - '<a href="%s"><b>%s</b></a>%s', - wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=' . 'all' . '&paged=' . '1' . '&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), - __fs( 'deactivate-plugin-title', $this->_slug ), - ' - ' . __fs( 'deactivate-plugin-desc', $this->_slug ) - ) - ) - ); - break; -// default: -// $message = __fs( 'connectivity-test-fails-message', $this->_slug ); -// break; - } - } - - $message_id = 'failed_connect_api'; - $type = 'error'; - - if ( false === $message ) { - if ( $is_first_failure ) { - // First attempt failed. - $message = sprintf( - __fs( 'x-requires-access-to-api', $this->_slug ) . ' ' . - __fs( 'connectivity-test-fails-message', $this->_slug ) . ' ' . - __fs( 'connectivity-test-maybe-temporary', $this->_slug ) . '<br><br>' . - '%s', - '<b>' . $this->get_plugin_name() . '</b>', - sprintf( - '<div id="fs_firewall_issue_options">%s %s</div>', - sprintf( - '<a class="button button-primary fs-resolve" data-type="retry_ping" href="#">%s</a>', - __fs( 'yes-do-your-thing', $this->_slug ) - ), - sprintf( - '<a href="%s" class="button">%s</a>', - wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=' . 'all' . '&paged=' . '1' . '&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), - __fs( 'no-deactivate', $this->_slug ) - ) - ) - ); - - $message_id = 'failed_connect_api_first'; - $type = 'promotion'; - } else { - // Second connectivity attempt failed. - $message = sprintf( - __fs( 'x-requires-access-to-api', $this->_slug ) . ' ' . - __fs( 'connectivity-test-fails-message', $this->_slug ) . ' ' . - __fs( 'happy-to-resolve-issue-asap', $this->_slug ) . - ' %s', - '<b>' . $this->get_plugin_name() . '</b>', - sprintf( - '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', - sprintf( - '<a class="fs-resolve" data-type="general" href="#"><b>%s</b></a>%s', - __fs( 'fix-issue-title', $this->_slug ), - ' - ' . sprintf( - __fs( 'fix-issue-desc', $this->_slug ), - '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' - ) - ), - sprintf( - '<a href="%s" target="_blank"><b>%s</b></a>%s', - sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ), - __fs( 'install-previous-title', $this->_slug ), - ' - ' . __fs( 'install-previous-desc', $this->_slug ) - ), - sprintf( - '<a href="%s"><b>%s</b></a>%s', - wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=' . 'all' . '&paged=' . '1' . '&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), - __fs( 'deactivate-plugin-title', $this->_slug ), - ' - ' . __fs( 'deactivate-plugin-desc', $this->_slug ) - ) - ) - ); - } - } - - $this->_admin_notices->add_sticky( - $message, - $message_id, - __fs( 'oops', $this->_slug ) . '...', - $type - ); - } - - /** - * Handle user request to resolve connectivity issue. - * This method will send an email to Freemius API technical staff for resolution. - * The email will contain server's info and installed plugins (might be caching issue). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function _email_about_firewall_issue() { - $this->_admin_notices->remove_sticky( 'failed_connect_api' ); - - $pong = $this->ping(); - - $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); - - if ( $is_connected ) { - $this->store_connectivity_info( $pong, $is_connected ); - - echo $this->get_after_plugin_activation_redirect_url(); - exit; - } - - $current_user = self::_get_current_wp_user(); - $admin_email = $current_user->user_email; - - $error_type = fs_request_get( 'error_type', 'general' ); - - switch ( $error_type ) { - case 'squid': - $title = 'Squid ACL Blocking Issue'; - break; - case 'cloudflare': - $title = 'CloudFlare Blocking Issue'; - break; - default: - $title = 'API Connectivity Issue'; - break; - } - - $custom_email_sections = array(); - - if ( 'squid' === $error_type ) { - // Override the 'Site' email section. - $custom_email_sections['site'] = array( - 'rows' => array( - 'hosting_company' => array( 'Hosting Company', fs_request_get( 'hosting_company' ) ) - ) - ); - } - - // Add 'API Error' custom email section. - $custom_email_sections['api_error'] = array( - 'title' => 'API Error', - 'rows' => array( - 'ping' => array( is_string( $pong ) ? htmlentities( $pong ) : json_encode( $pong ) ) - ) - ); - - // Add PHP info for deeper investigation. - ob_start(); - phpinfo(); - $php_info = ob_get_clean(); - $custom_email_sections['php_info'] = array( - 'title' => 'PHP Info', - 'rows' => array( - 'info' => array( $php_info ) - ) - ); - - // Send email with technical details to resolve CloudFlare's firewall unnecessary protection. - $this->send_email( - 'api@freemius.com', // recipient - $title . ' [' . $this->get_plugin_name() . ']', // subject - $custom_email_sections, - array( "Reply-To: $admin_email <$admin_email>" ) // headers - ); - - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'fix-request-sent-message', $this->_slug ), - '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' - ), - 'server_details_sent' - ); - - // Action was taken, tell that API connectivity troubleshooting should be off now. - - echo "1"; - exit; - } - - /** - * Handle connectivity test retry approved by the user. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - */ - function _retry_connectivity_test() { - $this->_admin_notices->remove_sticky( 'failed_connect_api_first' ); - - $pong = $this->ping(); - - $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); - - if ( $is_connected ) { - $this->store_connectivity_info( $pong, $is_connected ); - - echo $this->get_after_plugin_activation_redirect_url(); - } else { - // Add connectivity issue message after 2nd failed attempt. - $this->_add_connectivity_issue_message( $pong, false ); - - echo "1"; - } - - exit; - } - - static function _add_firewall_issues_javascript() { - $params = array(); - fs_require_once_template( 'firewall-issues-js.php', $params ); - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Email - #---------------------------------------------------------------------------------- - - /** - * Generates and sends an HTML email with customizable sections. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.2 - * - * @param string $to_address - * @param string $subject - * @param array $sections - * @param array $headers - * - * @return bool Whether the email contents were sent successfully. - */ - private function send_email( - $to_address, - $subject, - $sections = array(), - $headers = array() - ) { - $default_sections = $this->get_email_sections(); - - // Insert new sections or replace the default email sections. - if ( is_array( $sections ) && ! empty( $sections ) ) { - foreach ( $sections as $section_id => $custom_section ) { - if ( ! isset( $default_sections[ $section_id ] ) ) { - // If the section does not exist, add it. - $default_sections[ $section_id ] = $custom_section; - } else { - // If the section already exists, override it. - $current_section = $default_sections[ $section_id ]; - - // Replace the current section's title if a custom section title exists. - if ( isset( $custom_section['title'] ) ) { - $current_section['title'] = $custom_section['title']; - } - - // Insert new rows under the current section or replace the default rows. - if ( isset( $custom_section['rows'] ) && is_array( $custom_section['rows'] ) && ! empty( $custom_section['rows'] ) ) { - foreach ( $custom_section['rows'] as $row_id => $row ) { - $current_section['rows'][ $row_id ] = $row; - } - } - - $default_sections[ $section_id ] = $current_section; - } - } - } - - $vars = array( 'sections' => $default_sections ); - $message = fs_get_template( 'email.php', $vars ); - - // Set the type of email to HTML. - $headers[] = 'Content-type: text/html'; - - $header_string = implode( "\r\n", $headers ); - - return wp_mail( - $to_address, - $subject, - $message, - $header_string - ); - } - - /** - * Generates the data for the sections of the email content. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.2 - * - * @return array - */ - private function get_email_sections() { - // Retrieve the current user's information so that we can get the user's email, first name, and last name below. - $current_user = self::_get_current_wp_user(); - - // Retrieve the cURL version information so that we can get the version number below. - $curl_version_information = curl_version(); - - $active_plugin = self::get_active_plugins(); - - // Generate the list of active plugins separated by new line. - $active_plugin_string = ''; - foreach ( $active_plugin as $plugin ) { - $active_plugin_string .= sprintf( - '<a href="%s">%s</a> [v%s]<br>', - $plugin['PluginURI'], - $plugin['Name'], - $plugin['Version'] - ); - } - - $server_ip = WP_FS__REMOTE_ADDR; - - // Generate the default email sections. - $sections = array( - 'sdk' => array( - 'title' => 'SDK', - 'rows' => array( - 'fs_version' => array( 'FS Version', $this->version ), - 'curl_version' => array( 'cURL Version', $curl_version_information['version'] ) - ) - ), - 'plugin' => array( - 'title' => 'Plugin', - 'rows' => array( - 'name' => array( 'Name', $this->get_plugin_name() ), - 'version' => array( 'Version', $this->get_plugin_version() ) - ) - ), - 'site' => array( - 'title' => 'Site', - 'rows' => array( - 'unique_id' => array( 'Address', $this->get_anonymous_id() ), - 'address' => array( 'Address', site_url() ), - 'host' => array( - 'HTTP_HOST', - ( ! empty( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : '' ) - ), - 'server_addr' => array( - 'SERVER_ADDR', - '<a href="http://www.projecthoneypot.org/ip_' . $server_ip . '">' . $server_ip . '</a>' - ) - ) - ), - 'user' => array( - 'title' => 'User', - 'rows' => array( - 'email' => array( 'Email', $current_user->user_email ), - 'first' => array( 'First', $current_user->user_firstname ), - 'last' => array( 'Last', $current_user->user_lastname ) - ) - ), - 'plugins' => array( - 'title' => 'Plugins', - 'rows' => array( - 'active_plugins' => array( 'Active Plugins', $active_plugin_string ) - ) - ), - ); - - // Allow the sections to be modified by other code. - $sections = $this->apply_filters( 'email_template_sections', $sections ); - - return $sections; - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Initialization - #---------------------------------------------------------------------------------- - - /** - * Init plugin's Freemius instance. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param number $id - * @param string $public_key - * @param bool $is_live - * @param bool $is_premium - */ - function init( $id, $public_key, $is_live = true, $is_premium = true ) { - $this->_logger->entrance(); - - $this->dynamic_init( array( - 'id' => $id, - 'public_key' => $public_key, - 'is_live' => $is_live, - 'is_premium' => $is_premium, - ) ); - } - - /** - * Dynamic initiator, originally created to support initiation - * with parent_id for add-ons. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param array $plugin_info - * - * @throws Freemius_Exception - */ - function dynamic_init( array $plugin_info ) { - $this->_logger->entrance(); - - $this->parse_settings( $plugin_info ); - - if ( $this->should_stop_execution() ) { - return; - } - - if ( ! $this->is_registered() ) { - if ( $this->is_anonymous() ) { - // If user skipped, no need to test connectivity. - $this->_has_api_connection = true; - $this->_is_on = true; - } else { - if ( ! $this->has_api_connectivity() ) { - if ( $this->_admin_notices->has_sticky( 'failed_connect_api_first' ) || - $this->_admin_notices->has_sticky( 'failed_connect_api' ) - ) { - if ( ! $this->_enable_anonymous || $this->is_premium() ) { - // If anonymous mode is disabled, add firewall admin-notice message. - add_action( 'admin_footer', array( 'Freemius', '_add_firewall_issues_javascript' ) ); - - $this->add_ajax_action( 'resolve_firewall_issues', array( - &$this, - '_email_about_firewall_issue' - ) ); - - $this->add_ajax_action( 'retry_connectivity_test', array( - &$this, - '_retry_connectivity_test' - ) ); - } - } - - return; - } else { - $this->_admin_notices->remove_sticky( array( - 'failed_connect_api_first', - 'failed_connect_api', - ) ); - - if ( $this->_anonymous_mode ) { - // Simulate anonymous mode. - $this->_is_anonymous = true; - } - } - } - - // Check if Freemius is on for the current plugin. - // This MUST be executed after all the plugin variables has been loaded. - if ( ! $this->is_on() ) { - return; - } - } - - if ( $this->has_api_connectivity() ) { - if ( $this->is_cron() ) { - $this->hook_callback_to_sync_cron(); - } else if ( $this->is_user_in_admin() ) { - /** - * Schedule daily data sync cron if: - * - * 1. User opted-in (for tracking). - * 2. If skipped, but later upgraded (opted-in via upgrade). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - */ - if ( $this->is_registered() ) { - if ( ! $this->is_sync_cron_on() && $this->is_tracking_allowed() ) { - $this->schedule_sync_cron(); - } - } - - /** - * Check if requested for manual blocking background sync. - */ - if ( fs_request_has( 'background_sync' ) ) { - $this->run_manual_sync(); - } - } - } - - if ( $this->is_registered() ) { - $this->hook_callback_to_install_sync(); - } - - if ( $this->is_addon() ) { - if ( $this->is_parent_plugin_installed() ) { - // Link to parent FS. - $this->_parent = self::get_instance_by_id( $this->_plugin->parent_plugin_id ); - - // Get parent plugin reference. - $this->_parent_plugin = $this->_parent->get_plugin(); - } - } - - if ( $this->is_user_in_admin() ) { - if ( $this->is_plugins_page() ) { - $this->hook_plugin_action_links(); - } - - if ( $this->is_addon() ) { - if ( ! $this->is_parent_plugin_installed() ) { - $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); - - if ( isset( $plugin_info['parent'] ) ) { - $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); - } - - $this->_admin_notices->add( - ( ! empty( $parent_name ) ? - sprintf( __fs( 'addon-x-cannot-run-without-y', $this->_slug ), $this->get_plugin_name(), $parent_name ) : - sprintf( __fs( 'addon-x-cannot-run-without-parent', $this->_slug ), $this->get_plugin_name() ) - ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return; - } else { - if ( $this->_parent->is_registered() && ! $this->is_registered() ) { - // If parent plugin activated, automatically install add-on for the user. - $this->_activate_addon_account( $this->_parent ); - } - - // @todo This should be only executed on activation. It should be migrated to register_activation_hook() together with other activation related logic. - if ( $this->is_premium() ) { - // Remove add-on download admin-notice. - $this->_parent->_admin_notices->remove_sticky( array( - 'addon_plan_upgraded_' . $this->_slug, - 'no_addon_license_' . $this->_slug, - ) ); - } - - $this->deactivate_premium_only_addon_without_license(); - } - } else { - add_action( 'admin_init', array( &$this, '_admin_init_action' ) ); - - if ( $this->has_addons() && - 'plugin-information' === fs_request_get( 'tab', false ) && - $this->get_id() == fs_request_get( 'parent_plugin_id', false ) - ) { - require_once WP_FS__DIR_INCLUDES . '/fs-plugin-info-dialog.php'; - - new FS_Plugin_Info_Dialog( $this ); - } - } - - if ( $this->is_premium() ) { - new FS_Plugin_Updater( $this ); - } - -// if ( $this->is_registered() || -// $this->is_anonymous() || -// $this->is_pending_activation() -// ) { -// $this->_init_admin(); -// } - } - - $this->do_action( 'initiated' ); - - if ( $this->_storage->prev_is_premium !== $this->_plugin->is_premium ) { - if ( isset( $this->_storage->prev_is_premium ) ) { - $this->apply_filters( - 'after_code_type_change', - // New code type. - $this->_plugin->is_premium - ); - } else { - // Set for code type for the first time. - $this->_storage->prev_is_premium = $this->_plugin->is_premium; - } - } - - if ( ! $this->is_addon() ) { - if ( $this->is_registered() ) { - // Fix for upgrade from versions < 1.0.9. - if ( ! isset( $this->_storage->activation_timestamp ) ) { - $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; - } - - $this->do_action( 'after_init_plugin_registered' ); - } else if ( $this->is_anonymous() ) { - $this->do_action( 'after_init_plugin_anonymous' ); - } else if ( $this->is_pending_activation() ) { - $this->do_action( 'after_init_plugin_pending_activations' ); - } - } else { - if ( $this->is_registered() ) { - $this->do_action( 'after_init_addon_registered' ); - } else if ( $this->is_anonymous() ) { - $this->do_action( 'after_init_addon_anonymous' ); - } else if ( $this->is_pending_activation() ) { - $this->do_action( 'after_init_addon_pending_activations' ); - } - } - } - - /** - * @author Leo Fajardo (@leorw) - * - * @since 1.2.1.5 - */ - function _stop_tracking_callback() { - $result = $this->stop_tracking(); - - if ( true === $result ) { - $this->shoot_ajax_success(); - } - - $this->_logger->api_error( $result ); - - $this->shoot_ajax_failure( - __fs( 'unexpected-api-error', $this->_slug ) . - ( $this->is_api_error( $result ) && isset( $result->error ) ? - $result->error->message : - var_export( $result, true ) ) - ); - } - - /** - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - */ - function _allow_tracking_callback() { - $result = $this->allow_tracking(); - - if ( true === $result ) { - $this->shoot_ajax_success(); - } - - $this->_logger->api_error( $result ); - - $this->shoot_ajax_failure( - __fs( 'unexpected-api-error', $this->_slug ) . - ( $this->is_api_error( $result ) && isset( $result->error ) ? - $result->error->message : - var_export( $result, true ) ) - ); - } - - /** - * Opt-out from usage tracking. - * - * Note: This will not delete the account information but will stop all tracking. - * - * Returns: - * 1. FALSE - If the user never opted-in. - * 2. TRUE - If successfully opted-out. - * 3. object - API result on failure. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - * - * @return bool|object - */ - function stop_tracking() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - // User never opted-in. - return false; - } - - if ( $this->is_tracking_prohibited() ) { - // Already disconnected. - return true; - } - - // Send update to FS. - $result = $this->get_api_site_scope()->call( '/?fields=is_disconnected', 'put', array( - 'is_disconnected' => true - ) ); - - if ( ! $this->is_api_result_entity( $result ) || - ! isset( $result->is_disconnected ) || - ! $result->is_disconnected - ) { - $this->_logger->api_error( $result ); - - return $result; - } - - $this->_site->is_disconnected = $result->is_disconnected; - $this->_store_site(); - - $this->clear_sync_cron(); - - // Successfully disconnected. - return true; - } - - /** - * Opt-in back into usage tracking. - * - * Note: This will only work if the user opted-in previously. - * - * Returns: - * 1. FALSE - If the user never opted-in. - * 2. TRUE - If successfully opted-in back to usage tracking. - * 3. object - API result on failure. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - * - * @return bool|object - */ - function allow_tracking() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - // User never opted-in. - return false; - } - - if ( $this->is_tracking_allowed() ) { - // Tracking already allowed. - return true; - } - - $result = $this->get_api_site_scope()->call( '/?is_disconnected', 'put', array( - 'is_disconnected' => false - ) ); - - if ( ! $this->is_api_result_entity( $result ) || - ! isset( $result->is_disconnected ) || - $result->is_disconnected - ) { - $this->_logger->api_error( $result ); - - return $result; - } - - $this->_site->is_disconnected = $result->is_disconnected; - $this->_store_site(); - - $this->schedule_sync_cron(); - - // Successfully reconnected. - return true; - } - - /** - * If user opted-in and later disabled usage-tracking, - * re-allow tracking for licensing and updates. - * - * @author Leo Fajardo (@leorw) - * - * @since 1.2.1.5 - */ - private function reconnect_locally() { - $this->_logger->entrance(); - - if ( $this->is_tracking_prohibited() && - $this->is_registered() - ) { - $this->_site->is_disconnected = false; - $this->_store_site(); - } - } - - /** - * Parse plugin's settings (as defined by the plugin dev). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @param array $plugin_info - * - * @throws \Freemius_Exception - */ - private function parse_settings( &$plugin_info ) { - $this->_logger->entrance(); - - $id = $this->get_numeric_option( $plugin_info, 'id', false ); - $public_key = $this->get_option( $plugin_info, 'public_key', false ); - $secret_key = $this->get_option( $plugin_info, 'secret_key', null ); - $parent_id = $this->get_numeric_option( $plugin_info, 'parent_id', null ); - $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.9 Try to pull secret key from external config. - */ - if ( is_null( $secret_key ) && defined( "WP_FS__{$this->_slug}_SECRET_KEY" ) ) { - $secret_key = constant( "WP_FS__{$this->_slug}_SECRET_KEY" ); - } - - if ( isset( $plugin_info['parent'] ) ) { - $parent_id = $this->get_numeric_option( $plugin_info['parent'], 'id', null ); -// $parent_slug = $this->get_option( $plugin_info['parent'], 'slug', null ); -// $parent_public_key = $this->get_option( $plugin_info['parent'], 'public_key', null ); -// $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); - } - - if ( false === $id ) { - throw new Freemius_Exception( 'Plugin id parameter is not set.' ); - } - if ( false === $public_key ) { - throw new Freemius_Exception( 'Plugin public_key parameter is not set.' ); - } - - $plugin = ( $this->_plugin instanceof FS_Plugin ) ? - $this->_plugin : - new FS_Plugin(); - - $plugin->update( array( - 'id' => $id, - 'public_key' => $public_key, - 'slug' => $this->_slug, - 'parent_plugin_id' => $parent_id, - 'version' => $this->get_plugin_version(), - 'title' => $this->get_plugin_name(), - 'file' => $this->_plugin_basename, - 'is_premium' => $this->get_bool_option( $plugin_info, 'is_premium', true ), - 'is_live' => $this->get_bool_option( $plugin_info, 'is_live', true ), -// 'secret_key' => $secret_key, - ) ); - - if ( $plugin->is_updated() ) { - // Update plugin details. - $this->_plugin = FS_Plugin_Manager::instance( $this->_slug )->store( $plugin ); - } - // Set the secret key after storing the plugin, we don't want to store the key in the storage. - $this->_plugin->secret_key = $secret_key; - - if ( ! isset( $plugin_info['menu'] ) ) { - // Back compatibility to 1.1.2 - $plugin_info['menu'] = array( - 'slug' => isset( $plugin_info['menu_slug'] ) ? - $plugin_info['menu_slug'] : - $this->_slug - ); - } - - $this->_menu = FS_Admin_Menu_Manager::instance( $this->_slug ); - $this->_menu->init( $plugin_info['menu'], $this->is_addon() ); - - $this->_has_addons = $this->get_bool_option( $plugin_info, 'has_addons', false ); - $this->_has_paid_plans = $this->get_bool_option( $plugin_info, 'has_paid_plans', true ); - $this->_is_org_compliant = $this->get_bool_option( $plugin_info, 'is_org_compliant', true ); - $this->_is_premium_only = $this->get_bool_option( $plugin_info, 'is_premium_only', false ); - if ( $this->_is_premium_only ) { - // If premium only plugin, disable anonymous mode. - $this->_enable_anonymous = false; - $this->_anonymous_mode = false; - } else { - $this->_enable_anonymous = $this->get_bool_option( $plugin_info, 'enable_anonymous', true ); - $this->_anonymous_mode = $this->get_bool_option( $plugin_info, 'anonymous_mode', false ); - } - $this->_permissions = $this->get_option( $plugin_info, 'permissions', array() ); - - if ( ! empty( $plugin_info['trial'] ) ) { - $this->_trial_days = $this->get_numeric_option( - $plugin_info['trial'], - 'days', - // Default to 0 - trial without days specification. - 0 - ); - - $this->_is_trial_require_payment = $this->get_bool_option( $plugin_info['trial'], 'is_require_payment', false ); - } - } - - /** - * @param string[] $options - * @param string $key - * @param mixed $default - * - * @return bool - */ - private function get_option( &$options, $key, $default = false ) { - return ! empty( $options[ $key ] ) ? $options[ $key ] : $default; - } - - private function get_bool_option( &$options, $key, $default = false ) { - return isset( $options[ $key ] ) && is_bool( $options[ $key ] ) ? $options[ $key ] : $default; - } - - private function get_numeric_option( &$options, $key, $default = false ) { - return isset( $options[ $key ] ) && is_numeric( $options[ $key ] ) ? $options[ $key ] : $default; - } - - /** - * Gate keeper. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return bool - */ - private function should_stop_execution() { - if ( empty( $this->_storage->was_plugin_loaded ) ) { - /** - * Don't execute Freemius until plugin was fully loaded at least once, - * to give the opportunity for the activation hook to run before pinging - * the API for connectivity test. This logic is relevant for the - * identification of new plugin install vs. plugin update. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - */ - return true; - } - - if ( $this->is_activation_mode() ) { - if ( ! is_admin() ) { - /** - * If in activation mode, don't execute Freemius outside of the - * admin dashboard. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - return true; - } - - if ( ! WP_FS__IS_HTTP_REQUEST ) { - /** - * If in activation and executed without HTTP context (e.g. CLI, Cronjob), - * then don't start Freemius. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6.3 - * - * @link https://wordpress.org/support/topic/errors-in-the-freemius-class-when-running-in-wordpress-in-cli - */ - return true; - } - - if ( $this->is_cron() ) { - /** - * If in activation mode, don't execute Freemius during wp crons - * (wp crons have HTTP context - called as HTTP request). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - return true; - } - - if ( $this->is_ajax() && - ! $this->_admin_notices->has_sticky( 'failed_connect_api_first' ) && - ! $this->_admin_notices->has_sticky( 'failed_connect_api' ) - ) { - /** - * During activation, if running in AJAX mode, unless there's a sticky - * connectivity issue notice, don't run Freemius. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - return true; - } - } - - return false; - } - - /** - * Triggered after code type has changed. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9.1 - */ - function _after_code_type_change() { - $this->_logger->entrance(); - - add_action( is_admin() ? 'admin_init' : 'init', array( - &$this, - '_plugin_code_type_changed' - ) ); - } - - /** - * Handles plugin's code type change (free <--> premium). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function _plugin_code_type_changed() { - $this->_logger->entrance(); - - if ( $this->is_premium() ) { - $this->reconnect_locally(); - - // Activated premium code. - $this->do_action( 'after_premium_version_activation' ); - - // Remove all sticky messages related to download of the premium version. - $this->_admin_notices->remove_sticky( array( - 'trial_started', - 'plan_upgraded', - 'plan_changed', - 'license_activated', - ) ); - - $this->_admin_notices->add_sticky( - __fs( 'premium-activated-message', $this->_slug ), - 'premium_activated', - __fs( 'woot', $this->_slug ) . '!' - ); - } else { - // Remove sticky message related to premium code activation. - $this->_admin_notices->remove_sticky( 'premium_activated' ); - - // Activated free code (after had the premium before). - $this->do_action( 'after_free_version_reactivation' ); - - if ( $this->is_paying() && ! $this->is_premium() ) { - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'you-have-x-license', $this->_slug ), - $this->_site->plan->title - ) . $this->get_complete_upgrade_instructions(), - 'plan_upgraded', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - } - } - - // Schedule code type changes event. - $this->schedule_install_sync(); - - /** - * Unregister the uninstall hook for the other version of the plugin (with different code type) to avoid - * triggering a fatal error when uninstalling that plugin. For example, after deactivating the "free" version - * of a specific plugin, its uninstall hook should be unregistered after the "premium" version has been - * activated. If we don't do that, a fatal error will occur when we try to uninstall the "free" version since - * the main file of the "free" version will be loaded first before calling the hooked callback. Since the - * free and premium versions are almost identical (same class or have same functions), a fatal error like - * "Cannot redeclare class MyClass" or "Cannot redeclare my_function()" will occur. - */ - $this->unregister_uninstall_hook(); - - $this->clear_module_main_file_cache(); - - // Update is_premium of latest version. - $this->_storage->prev_is_premium = $this->_plugin->is_premium; - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Add-ons - #---------------------------------------------------------------------------------- - - /** - * Check if add-on installed and activated on site. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string|number $slug_or_id - * - * @return bool - */ - function is_addon_activated( $slug_or_id ) { - return self::has_instance( $slug_or_id ); - } - - /** - * Check if add-on was connected to install - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param string $slug - * - * @return bool - */ - function is_addon_connected( $slug ) { - $sites = self::get_all_sites(); - - if ( ! isset( $sites[ $slug ] ) ) { - return false; - } - - $site = $sites[ $slug ]; - - $plugin = FS_Plugin_Manager::instance( $slug )->get(); - - if ( $plugin->parent_plugin_id != $this->_plugin->id ) { - // The given slug do NOT belong to any of the plugin's add-ons. - return false; - } - - return ( is_object( $site ) && - is_numeric( $site->id ) && - is_numeric( $site->user_id ) && - is_object( $site->plan ) - ); - } - - /** - * Determines if add-on installed. - * - * NOTE: This is a heuristic and only works if the folder/file named as the slug. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string $slug - * - * @return bool - */ - function is_addon_installed( $slug ) { - return file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->get_addon_basename( $slug ) ) ); - } - - /** - * Get add-on basename. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string $slug - * - * @return string - */ - function get_addon_basename( $slug ) { - if ( $this->is_addon_activated( $slug ) ) { - self::instance( $slug )->get_plugin_basename(); - } - - $premium_basename = $slug . '-premium/' . $slug . '.php'; - - if ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $premium_basename ) ) ) { - return $premium_basename; - } - - $free_basename = $slug . '/' . $slug . '.php'; - - return $free_basename; - } - - /** - * Get installed add-ons instances. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return Freemius[] - */ - function get_installed_addons() { - $installed_addons = array(); - foreach ( self::$_instances as $slug => $instance ) { - if ( $instance->is_addon() && is_object( $instance->_parent_plugin ) ) { - if ( $this->_plugin->id == $instance->_parent_plugin->id ) { - $installed_addons[] = $instance; - } - } - } - - return $installed_addons; - } - - /** - * Check if any add-ons of the plugin are installed. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.1 - * - * @return bool - */ - function has_installed_addons() { - if ( ! $this->has_addons() ) { - return false; - } - - foreach ( self::$_instances as $slug => $instance ) { - if ( $instance->is_addon() && is_object( $instance->_parent_plugin ) ) { - if ( $this->_plugin->id == $instance->_parent_plugin->id ) { - return true; - } - } - } - - return false; - } - - /** - * Tell Freemius that the current plugin is an add-on. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param number $parent_plugin_id The parent plugin ID - */ - function init_addon( $parent_plugin_id ) { - $this->_plugin->parent_plugin_id = $parent_plugin_id; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function is_addon() { - return isset( $this->_plugin->parent_plugin_id ) && is_numeric( $this->_plugin->parent_plugin_id ); - } - - /** - * Deactivate add-on if it's premium only and the user does't have a valid license. - * - * @param bool $is_after_trial_cancel - * - * @return bool If add-on was deactivated. - */ - private function deactivate_premium_only_addon_without_license( $is_after_trial_cancel = false ) { - if ( ! $this->has_free_plan() && - ! $this->has_features_enabled_license() && - ! $this->_has_premium_license() - ) { - // IF wrapper is turned off because activation_timestamp is currently only stored for plugins (not addons). -// if (empty($this->_storage->activation_timestamp) || -// (WP_FS__SCRIPT_START_TIME - $this->_storage->activation_timestamp) > 30 -// ) { - /** - * @todo When it's first fail, there's no reason to try and re-sync because the licenses were just synced after initial activation. - * - * Retry syncing the user add-on licenses. - */ - // Sync licenses. - $this->_sync_licenses(); -// } - - // Try to activate premium license. - $this->_activate_license( true ); - - if ( ! $this->has_free_plan() && - ! $this->has_features_enabled_license() && - ! $this->_has_premium_license() - ) { - // @todo Check if deactivate plugins also call the deactivation hook. - - deactivate_plugins( array( $this->_plugin_basename ), true ); - - $this->_parent->_admin_notices->add_sticky( - sprintf( - __fs( ( $is_after_trial_cancel ? - 'addon-trial-cancelled-message' : - 'addon-no-license-message' ), - $this->_parent->_slug - ), - '<b>' . $this->_plugin->title . '</b>' - ) . ' ' . sprintf( - '<a href="%s" aria-label="%s" class="button button-primary" style="margin-left: 10px; vertical-align: middle;">%s ➜</a>', - $this->_parent->addon_url( $this->_slug ), - esc_attr( sprintf( __fs( 'more-information-about-x', $this->_parent->_slug ), $this->_plugin->title ) ), - __fs( 'purchase-license', $this->_parent->_slug ) - ), - 'no_addon_license_' . $this->_slug, - ( $is_after_trial_cancel ? '' : __fs( 'oops', $this->_parent->_slug ) . '...' ), - ( $is_after_trial_cancel ? 'success' : 'error' ) - ); - - return true; - } - } - - return false; - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Sandbox - #---------------------------------------------------------------------------------- - - /** - * Set Freemius into sandbox mode for debugging. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $secret_key - */ - function init_sandbox( $secret_key ) { - $this->_plugin->secret_key = $secret_key; - - // Update plugin details. - FS_Plugin_Manager::instance( $this->_slug )->update( $this->_plugin, true ); - } - - /** - * Check if running payments in sandbox mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return bool - */ - function is_payments_sandbox() { - return ( ! $this->is_live() ) || isset( $this->_plugin->secret_key ); - } - - #endregion - - /** - * Check if running test vs. live plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return bool - */ - function is_live() { - return $this->_plugin->is_live; - } - - /** - * Check if the user skipped connecting the account with Freemius. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function is_anonymous() { - if ( ! isset( $this->_is_anonymous ) ) { - if ( ! isset( $this->_storage->is_anonymous ) ) { - // Not skipped. - $this->_is_anonymous = false; - } else if ( is_bool( $this->_storage->is_anonymous ) ) { - // For back compatibility, since the variable was boolean before. - $this->_is_anonymous = $this->_storage->is_anonymous; - - // Upgrade stored data format to 1.1.3 format. - $this->set_anonymous_mode( $this->_storage->is_anonymous ); - } else { - // Version 1.1.3 and later. - $this->_is_anonymous = $this->_storage->is_anonymous['is']; - } - } - - return $this->_is_anonymous; - } - - /** - * Check if user connected his account and install pending email activation. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function is_pending_activation() { - return $this->_storage->get( 'is_pending_activation', false ); - } - - /** - * Check if plugin must be WordPress.org compliant. - * - * @since 1.0.7 - * - * @return bool - */ - function is_org_repo_compliant() { - return $this->_is_org_compliant; - } - - #---------------------------------------------------------------------------------- - #region Daily Sync Cron - #---------------------------------------------------------------------------------- - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function run_manual_sync() { - $this->require_pluggable_essentials(); - - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - // Run manual sync. - $this->_sync_cron(); - - // Reschedule next cron to run 24 hours from now (performance optimization). - $this->clear_sync_cron(); - - $this->schedule_sync_cron( time() + WP_FS__TIME_24_HOURS_IN_SEC, false ); - } - - /** - * Data sync cron job. Replaces the background sync non blocking HTTP request - * that doesn't halt page loading. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - function _sync_cron() { - $this->_logger->entrance(); - - // Store the last time data sync was executed. - $this->_storage->sync_timestamp = time(); - - // Check if API is temporary down. - if ( FS_Api::is_temporary_down() ) { - return; - } - - // @todo Add logic that identifies API latency, and reschedule the next background sync randomly between 8-16 hours. - - if ( $this->is_registered() ) { - if ( $this->has_paid_plan() ) { - // Initiate background plan sync. - $this->_sync_license( true ); - - if ( $this->is_paying() ) { - // Check for premium plugin updates. - $this->_check_updates( true ); - } - } else { - // Sync install (only if something changed locally). - $this->sync_install(); - } - } - - $this->do_action( 'after_sync_cron' ); - } - - /** - * Check if sync was executed in the last $period of seconds. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @param int $period In seconds - * - * @return bool - */ - private function is_sync_executed( $period = WP_FS__TIME_24_HOURS_IN_SEC ) { - if ( ! isset( $this->_storage->sync_timestamp ) ) { - return false; - } - - return ( $this->_storage->sync_timestamp > ( WP_FS__SCRIPT_START_TIME - $period ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return bool - */ - private function is_sync_cron_on() { - /** - * @var object $sync_cron_data - */ - $sync_cron_data = $this->_storage->get( 'sync_cron', null ); - - return ( ! is_null( $sync_cron_data ) && true === $sync_cron_data->on ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @param int $start_at Defaults to now. - * @param bool $randomize_start If true, schedule first job randomly during the next 12 hours. Otherwise, - * schedule job to start right away. - */ - private function schedule_sync_cron( $start_at = WP_FS__SCRIPT_START_TIME, $randomize_start = true ) { - $this->_logger->entrance(); - - if ( $randomize_start ) { - // Schedule first sync with a random 12 hour time range from now. - $start_at += rand( 0, ( WP_FS__TIME_24_HOURS_IN_SEC / 2 ) ); - } - - // Schedule daily WP cron. - wp_schedule_event( - $start_at, - 'daily', - $this->get_action_tag( 'data_sync' ) - ); - - $this->_storage->store( 'sync_cron', (object) array( - 'version' => $this->get_plugin_version(), - 'sdk_version' => $this->version, - 'timestamp' => WP_FS__SCRIPT_START_TIME, - 'on' => true, - ) ); - } - - /** - * Add the actual sync function to the cron job hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function hook_callback_to_sync_cron() { - $this->add_action( 'data_sync', array( &$this, '_sync_cron' ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function clear_sync_cron() { - $this->_logger->entrance(); - - if ( ! $this->is_sync_cron_on() ) { - return; - } - - $this->_storage->remove( 'sync_cron' ); - - wp_clear_scheduled_hook( $this->get_action_tag( 'data_sync' ) ); - } - - /** - * Unix timestamp for next sync cron execution or false if not scheduled. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return int|false - */ - function next_sync_cron() { - $this->_logger->entrance(); - - if ( ! $this->is_sync_cron_on() ) { - return false; - } - - return wp_next_scheduled( $this->get_action_tag( 'data_sync' ) ); - } - - /** - * Unix timestamp for previous sync cron execution or false if never executed. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return int|false - */ - function last_sync_cron() { - $this->_logger->entrance(); - - return $this->_storage->get( 'sync_timestamp' ); - } - - #endregion Daily Sync Cron ------------------------------------------------------------------ - - #---------------------------------------------------------------------------------- - #region Async Install Sync - #---------------------------------------------------------------------------------- - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return bool - */ - private function is_install_sync_scheduled() { - /** - * @var object $cron_data - */ - $cron_data = $this->_storage->get( 'install_sync_cron', null ); - - return ( ! is_null( $cron_data ) && true === $cron_data->on ); - } - - /** - * Instead of running blocking install sync event, execute non blocking scheduled wp-cron. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function schedule_install_sync() { - $this->_logger->entrance(); - - $this->clear_install_sync_cron(); - - // Schedule immediate install sync. - wp_schedule_single_event( - WP_FS__SCRIPT_START_TIME, - $this->get_action_tag( 'install_sync' ) - ); - - $this->_storage->store( 'install_sync_cron', (object) array( - 'version' => $this->get_plugin_version(), - 'sdk_version' => $this->version, - 'timestamp' => WP_FS__SCRIPT_START_TIME, - 'on' => true, - ) ); - } - - /** - * Unix timestamp for previous install sync cron execution or false if never executed. - * - * @todo There's some very strange bug that $this->_storage->install_sync_timestamp value is not being - * updated. But for sure the sync event is working. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return int|false - */ - function last_install_sync() { - $this->_logger->entrance(); - - return $this->_storage->get( 'install_sync_timestamp' ); - } - - /** - * Unix timestamp for next install sync cron execution or false if not scheduled. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return int|false - */ - function next_install_sync() { - $this->_logger->entrance(); - - if ( ! $this->is_install_sync_scheduled() ) { - return false; - } - - return wp_next_scheduled( $this->get_action_tag( 'install_sync' ) ); - } - - /** - * Add the actual install sync function to the cron job hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function hook_callback_to_install_sync() { - $this->add_action( 'install_sync', array( &$this, '_run_sync_install' ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - private function clear_install_sync_cron() { - $this->_logger->entrance(); - - if ( ! $this->is_install_sync_scheduled() ) { - return; - } - - $this->_storage->remove( 'install_sync_cron' ); - - wp_clear_scheduled_hook( $this->get_action_tag( 'install_sync' ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - */ - public function _run_sync_install() { - $this->_logger->entrance(); - - // Update last install sync timestamp. - $this->_storage->install_sync_timestamp = time(); - - $this->sync_install( array(), true ); - } - - #endregion Async Install Sync ------------------------------------------------------------------ - - /** - * Show a notice that activation is currently pending. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @param bool|string $email - * @param bool $is_pending_trial Since 1.2.1.5 - */ - function _add_pending_activation_notice( $email = false, $is_pending_trial = false ) { - if ( ! is_string( $email ) ) { - $current_user = self::_get_current_wp_user(); - $email = $current_user->user_email; - } - - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'pending-activation-message', $this->_slug ), - '<b>' . $this->get_plugin_name() . '</b>', - '<b>' . $email . '</b>', - __fs( $is_pending_trial ? 'start-the-trial' : 'complete-the-install', $this->_slug ) - ), - 'activation_pending', - 'Thanks!' - ); - } - - /** - * Check if currently in plugin activation. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - * - * @return bool - */ - function is_plugin_activation() { - return get_option( "fs_{$this->_slug}_activated", false ); - } - - /** - * - * NOTE: admin_menu action executed before admin_init. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - function _admin_init_action() { - /** - * Automatically redirect to connect/activation page after plugin activation. - * - * @since 1.1.7 Do NOT redirect to opt-in when running in network admin mode. - */ - if ( $this->is_plugin_activation() ) { - delete_option( "fs_{$this->_slug}_activated" ); - - if ( ! function_exists( 'is_network_admin' ) || ! is_network_admin() ) { - $this->_redirect_on_activation_hook(); - - return; - } - } - - if ( fs_request_is_action( $this->_slug . '_skip_activation' ) ) { - check_admin_referer( $this->_slug . '_skip_activation' ); - - $this->skip_connection(); - - fs_redirect( $this->get_after_activation_url( 'after_skip_url' ) ); - } - - if ( ! $this->is_addon() && ! $this->is_registered() && ! $this->is_anonymous() ) { - if ( ! $this->is_pending_activation() ) { - if ( ! $this->_menu->is_activation_page() ) { - if ( $this->is_plugin_new_install() || $this->is_only_premium() ) { - // Show notice for new plugin installations. - $this->_admin_notices->add( - sprintf( - __fs( 'you-are-step-away', $this->_slug ), - sprintf( '<b><a href="%s">%s</a></b>', - $this->get_activation_url(), - sprintf( __fs( 'activate-x-now', $this->_slug ), $this->get_plugin_name() ) - ) - ), - '', - 'update-nag' - ); - } else { - if ( ! isset( $this->_storage->sticky_optin_added ) ) { - $this->_storage->sticky_optin_added = true; - - // Show notice for new plugin installations. - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'few-plugin-tweaks', $this->_slug ), - sprintf( '<b><a href="%s">%s</a></b>', - $this->get_activation_url(), - sprintf( __fs( 'optin-x-now', $this->_slug ), $this->get_plugin_name() ) - ) - ), - 'connect_account', - '', - 'update-nag' - ); - } - - if ( $this->has_filter( 'optin_pointer_element' ) ) { - // Don't show admin nag if plugin update. - wp_enqueue_script( 'wp-pointer' ); - wp_enqueue_style( 'wp-pointer' ); - - $this->_enqueue_connect_essentials(); - - add_action( 'admin_print_footer_scripts', array( - $this, - '_add_connect_pointer_script' - ) ); - } - - } - } - } - } - - $this->_add_upgrade_action_link(); - } - - /** - * Enqueue connect requires scripts and styles. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - */ - function _enqueue_connect_essentials() { - wp_enqueue_script( 'jquery' ); - wp_enqueue_script( 'json2' ); - - fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); - fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); - - fs_enqueue_local_style( 'fs_connect', '/admin/connect.css' ); - } - - /** - * Add connect / opt-in pointer. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - */ - function _add_connect_pointer_script() { - $vars = array( 'slug' => $this->_slug ); - $pointer_content = fs_get_template( 'connect.php', $vars ); - ?> - <script type="text/javascript">// <![CDATA[ - jQuery(document).ready(function ($) { - if ('undefined' !== typeof(jQuery().pointer)) { - - var element = <?php echo $this->apply_filters( 'optin_pointer_element', '$("#non_existing_element");' ) ?>; - - if (element.length > 0) { - var optin = $(element).pointer($.extend(true, {}, { - content : <?php echo json_encode( $pointer_content ) ?>, - position : { - edge : 'left', - align: 'center' - }, - buttons : function () { - // Don't show pointer buttons. - return ''; - }, - pointerWidth: 482 - }, <?php echo $this->apply_filters( 'optin_pointer_options_json', '{}' ) ?>)); - - <?php - echo $this->apply_filters( 'optin_pointer_execute', " - - optin.pointer('open'); - - // Tag the opt-in pointer with custom class. - $('.wp-pointer #fs_connect') - .parents('.wp-pointer.wp-pointer-top') - .addClass('fs-opt-in-pointer'); - - ", 'element', 'optin' ) ?> - } - } - }); - // ]]></script> - <?php - } - - /** - * Return current page's URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return string - */ - function current_page_url() { - $url = 'http'; - - if ( isset( $_SERVER["HTTPS"] ) ) { - if ( $_SERVER["HTTPS"] == "on" ) { - $url .= "s"; - } - } - $url .= "://"; - if ( $_SERVER["SERVER_PORT"] != "80" ) { - $url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"]; - } else { - $url .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]; - } - - return esc_url( $url ); - } - - /** - * Check if the current page is the plugin's main admin settings page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function _is_plugin_page() { - return fs_is_plugin_page( $this->_menu->get_raw_slug() ) || - fs_is_plugin_page( $this->_slug ); - } - - /* Events - ------------------------------------------------------------------------------------------------------------------*/ - /** - * Delete site install from Database. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param bool $store - */ - function _delete_site( $store = true ) { - $sites = self::get_all_sites(); - - if ( isset( $sites[ $this->_slug ] ) ) { - unset( $sites[ $this->_slug ] ); - } - - self::$_accounts->set_option( 'sites', $sites, $store ); - } - - /** - * Delete plugin's plans information. - * - * @param bool $store Flush to Database if true. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - private function _delete_plans( $store = true ) { - $this->_logger->entrance(); - - $plans = self::get_all_plans(); - - unset( $plans[ $this->_slug ] ); - - self::$_accounts->set_option( 'plans', $plans, $store ); - } - - /** - * Delete all plugin licenses. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param bool $store - * @param string|bool $plugin_slug - */ - private function _delete_licenses( $store = true, $plugin_slug = false ) { - $this->_logger->entrance(); - - $all_licenses = self::get_all_licenses(); - - if ( ! is_string( $plugin_slug ) ) { - $plugin_slug = $this->_slug; - } - - unset( $all_licenses[ $plugin_slug ] ); - - self::$_accounts->set_option( 'licenses', $all_licenses, $store ); - } - - /** - * Check if Freemius was added on new plugin installation. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.5 - * - * @return bool - */ - function is_plugin_new_install() { - return isset( $this->_storage->is_plugin_new_install ) && - $this->_storage->is_plugin_new_install; - } - - /** - * Check if it's the first plugin release that is running Freemius. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @return bool - */ - function is_first_freemius_powered_version() { - return empty( $this->_storage->plugin_last_version ); - } - - /** - * Plugin activated hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @uses FS_Api - */ - function _activate_plugin_event_hook() { - $this->_logger->entrance( 'slug = ' . $this->_slug ); - - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $this->unregister_uninstall_hook(); - - // Clear API cache on activation. - FS_Api::clear_cache(); - - if ( $this->is_registered() ) { - $this->reconnect_locally(); - - // Schedule re-activation event and sync. -// $this->sync_install( array(), true ); - $this->schedule_install_sync(); - - $is_premium_version_activation = ( current_filter() !== ( 'activate_' . $this->_free_plugin_basename ) ); - - // 1. If running in the activation of the FREE module, get the basename of the PREMIUM. - // 2. If running in the activation of the PREMIUM module, get the basename of the FREE. - $other_version_basename = $is_premium_version_activation ? - $this->_free_plugin_basename : - $this->premium_plugin_basename(); - - /** - * If the other module version is activate, deactivate it. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.2 - */ - if ( is_plugin_active( $other_version_basename ) ) { - deactivate_plugins( $other_version_basename ); - } - - // If activating the premium module version, add an admin noitce to congratulate for an upgrade completion. - if ( $is_premium_version_activation ) { - $this->_admin_notices->add( - sprintf( __fs( 'successful-version-upgrade-message', $this->_slug ), sprintf( '<b>%s</b>', $this->_plugin->title ) ), - __fs( 'woot', $this->_slug ) . '!' - ); - } - } else if ( $this->is_anonymous() ) { - /** - * Reset "skipped" click cache on the following: - * 1. Development mode. - * 2. If the user skipped the exact same version before. - * - * @todo 3. If explicitly asked to retry after every activation. - */ - if ( WP_FS__DEV_MODE || - $this->get_plugin_version() == $this->_storage->is_anonymous['version'] - ) { - $this->reset_anonymous_mode(); - } - } - - if ( ! isset( $this->_storage->is_plugin_new_install ) ) { - /** - * If no previous version of plugin's version exist, it means that it's either - * the first time that the plugin installed on the site, or the plugin was installed - * before but didn't have Freemius integrated. - * - * Since register_activation_hook() do NOT fires on updates since 3.1, and only fires - * on manual activation via the dashboard, is_plugin_activation() is TRUE - * only after immediate activation. - * - * @since 1.1.4 - * @link https://make.wordpress.org/core/2010/10/27/plugin-activation-hooks-no-longer-fire-for-updates/ - */ - $this->_storage->is_plugin_new_install = empty( $this->_storage->plugin_last_version ); - } - - if ( ! $this->_anonymous_mode && $this->has_api_connectivity( WP_FS__DEV_MODE ) ) { - // Store hint that the plugin was just activated to enable auto-redirection to settings. - add_option( "fs_{$this->_slug}_activated", true ); - } - - /** - * Activation hook is executed after the plugin's main file is loaded, therefore, - * after the plugin was loaded. The logic is located at activate_plugin() - * ./wp-admin/includes/plugin.php. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - */ - $this->_storage->was_plugin_loaded = true; - } - - /** - * Delete account. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param bool $check_user Enforce checking if user have plugins activation privileges. - */ - function delete_account_event( $check_user = true ) { - $this->_logger->entrance( 'slug = ' . $this->_slug ); - - if ( $check_user && ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $this->do_action( 'before_account_delete' ); - - // Clear all admin notices. - $this->_admin_notices->clear_all_sticky(); - - $this->_delete_site( false ); - - $this->_delete_plans( false ); - - $this->_delete_licenses( false ); - - // Delete add-ons related to plugin's account. - $this->_delete_account_addons( false ); - - // @todo Delete plans and licenses of add-ons. - - self::$_accounts->store(); - - /** - * IMPORTANT: - * Clear crons must be executed before clearing all storage. - * Otherwise, the cron will not be cleared. - */ - $this->clear_sync_cron(); - $this->clear_install_sync_cron(); - - // Clear all storage data. - $this->_storage->clear_all( true, array( - 'connectivity_test', - 'is_on', - ) ); - - // Send delete event. - $this->get_api_site_scope()->call( '/', 'delete' ); - - $this->do_action( 'after_account_delete' ); - } - - /** - * Plugin deactivation hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - function _deactivate_plugin_hook() { - $this->_logger->entrance( 'slug = ' . $this->_slug ); - - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $this->_admin_notices->clear_all_sticky(); - if ( isset( $this->_storage->sticky_optin_added ) ) { - unset( $this->_storage->sticky_optin_added ); - } - - if ( ! isset( $this->_storage->is_plugin_new_install ) ) { - // Remember that plugin was already installed. - $this->_storage->is_plugin_new_install = false; - } - - // Hook to plugin uninstall. - register_uninstall_hook( $this->_plugin_main_file_path, array( 'Freemius', '_uninstall_plugin_hook' ) ); - - $this->clear_module_main_file_cache(); - $this->clear_sync_cron(); - $this->clear_install_sync_cron(); - - if ( $this->is_registered() ) { - // Send deactivation event. - $this->sync_install( array( - 'is_active' => false, - ) ); - } else { - if ( ! $this->has_api_connectivity() ) { - // Reset connectivity test cache. - unset( $this->_storage->connectivity_test ); - } - } - - // Clear API cache on deactivation. - FS_Api::clear_cache(); - - $this->remove_sdk_reference(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - */ - private function remove_sdk_reference() { - global $fs_active_plugins; - - foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { - if ( $this->_plugin_basename == $data->plugin_path ) { - unset( $fs_active_plugins->plugins[ $sdk_path ] ); - break; - } - } - - fs_fallback_to_newest_active_sdk(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param bool $is_anonymous - */ - private function set_anonymous_mode( $is_anonymous = true ) { - // Store information regarding skip to try and opt-in the user - // again in the future. - $this->_storage->is_anonymous = array( - 'is' => $is_anonymous, - 'timestamp' => WP_FS__SCRIPT_START_TIME, - 'version' => $this->get_plugin_version(), - ); - - // Update anonymous mode cache. - $this->_is_anonymous = $is_anonymous; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - */ - private function reset_anonymous_mode() { - unset( $this->_storage->is_anonymous ); - } - - /** - * Clears the anonymous mode and redirects to the opt-in screen. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - */ - function connect_again() { - if ( ! $this->is_anonymous() ) { - return; - } - - $this->reset_anonymous_mode(); - - fs_redirect( $this->get_activation_url() ); - } - - /** - * Skip account connect, and set anonymous mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - */ - private function skip_connection() { - $this->_logger->entrance(); - - $this->_admin_notices->remove_sticky( 'connect_account' ); - - $this->set_anonymous_mode(); - - // Send anonymous skip event. - // No user identified info nor any tracking will be sent after the user skips the opt-in. - $this->get_api_plugin_scope()->call( 'skip.json', 'put', array( - 'uid' => $this->get_anonymous_id(), - ) ); - } - - /** - * Plugin version update hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - */ - private function update_plugin_version_event() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return; - } - - $this->schedule_install_sync(); -// $this->sync_install( array(), true ); - } - - /** - * Return a list of modified plugins since the last sync. - * - * Note: - * There's no point to store a plugins counter since even if the number of - * plugins didn't change, we still need to check if the versions are all the - * same and the activity state is similar. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8 - * - * @return array|false - */ - private function get_plugins_data_for_api() { - // Alias. - $option_name = 'all_plugins'; - - $all_cached_plugins = self::$_accounts->get_option( $option_name ); - - if ( ! is_object( $all_cached_plugins ) ) { - $all_cached_plugins = (object) array( - 'timestamp' => '', - 'md5' => '', - 'plugins' => array(), - ); - } - - $time = time(); - - if ( ! empty( $all_cached_plugins->timestamp ) && - ( $time - $all_cached_plugins->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC - ) { - // Don't send plugin updates if last update was in the past 5 min. - return false; - } - - // Write timestamp to lock the logic. - $all_cached_plugins->timestamp = $time; - self::$_accounts->set_option( $option_name, $all_cached_plugins, true ); - - // Reload options from DB. - self::$_accounts->load( true ); - $all_cached_plugins = self::$_accounts->get_option( $option_name ); - - if ( $time != $all_cached_plugins->timestamp ) { - // If timestamp is different, then another thread captured the lock. - return false; - } - - // Check if there's a change in plugins. - $all_plugins = self::get_all_plugins(); - - // Check if plugins changed. - ksort( $all_plugins ); - - $plugins_signature = ''; - foreach ( $all_plugins as $basename => $data ) { - $plugins_signature .= $data['slug'] . ',' . - $data['Version'] . ',' . - ( $data['is_active'] ? '1' : '0' ) . ';'; - } - - // Check if plugins status changed (version or active/inactive). - $plugins_changed = ( $all_cached_plugins->md5 !== md5( $plugins_signature ) ); - - $plugins_update_data = array(); - - if ( $plugins_changed ) { - // Change in plugins, report changes. - - // Update existing plugins info. - foreach ( $all_cached_plugins->plugins as $basename => $data ) { - if ( ! isset( $all_plugins[ $basename ] ) ) { - // Plugin uninstalled. - $uninstalled_plugin_data = $data; - $uninstalled_plugin_data['is_active'] = false; - $uninstalled_plugin_data['is_uninstalled'] = true; - $plugins_update_data[] = $uninstalled_plugin_data; - - unset( $all_plugins[ $basename ] ); - unset( $all_cached_plugins->plugins[ $basename ] ); - } else if ( $data['is_active'] !== $all_plugins[ $basename ]['is_active'] || - $data['version'] !== $all_plugins[ $basename ]['Version'] - ) { - // Plugin activated or deactivated, or version changed. - $all_cached_plugins->plugins[ $basename ]['is_active'] = $all_plugins[ $basename ]['is_active']; - $all_cached_plugins->plugins[ $basename ]['version'] = $all_plugins[ $basename ]['Version']; - - $plugins_update_data[] = $all_cached_plugins->plugins[ $basename ]; - } - } - - // Find new plugins that weren't yet seen before. - foreach ( $all_plugins as $basename => $data ) { - if ( ! isset( $all_cached_plugins->plugins[ $basename ] ) ) { - // New plugin. - $new_plugin = array( - 'slug' => $data['slug'], - 'version' => $data['Version'], - 'title' => $data['Name'], - 'is_active' => $data['is_active'], - 'is_uninstalled' => false, - ); - - $plugins_update_data[] = $new_plugin; - $all_cached_plugins->plugins[ $basename ] = $new_plugin; - } - } - - $all_cached_plugins->md5 = md5( $plugins_signature ); - $all_cached_plugins->timestamp = $time; - self::$_accounts->set_option( $option_name, $all_cached_plugins, true ); - } - - return $plugins_update_data; - } - - /** - * Return a list of modified themes since the last sync. - * - * Note: - * There's no point to store a themes counter since even if the number of - * themes didn't change, we still need to check if the versions are all the - * same and the activity state is similar. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8 - * - * @return array|false - */ - private function get_themes_data_for_api() { - // Alias. - $option_name = 'all_themes'; - - $all_cached_themes = self::$_accounts->get_option( $option_name ); - - if ( ! is_object( $all_cached_themes ) ) { - $all_cached_themes = (object) array( - 'timestamp' => '', - 'md5' => '', - 'themes' => array(), - ); - } - - $time = time(); - - if ( ! empty( $all_cached_themes->timestamp ) && - ( $time - $all_cached_themes->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC - ) { - // Don't send theme updates if last update was in the past 5 min. - return false; - } - - // Write timestamp to lock the logic. - $all_cached_themes->timestamp = $time; - self::$_accounts->set_option( $option_name, $all_cached_themes, true ); - - // Reload options from DB. - self::$_accounts->load( true ); - $all_cached_themes = self::$_accounts->get_option( $option_name ); - - if ( $time != $all_cached_themes->timestamp ) { - // If timestamp is different, then another thread captured the lock. - return false; - } - - // Get active theme. - $active_theme = wp_get_theme(); - $active_theme_stylesheet = $active_theme->get_stylesheet(); - - // Check if there's a change in themes. - $all_themes = wp_get_themes(); - - // Check if themes changed. - ksort( $all_themes ); - - $themes_signature = ''; - foreach ( $all_themes as $slug => $data ) { - $is_active = ( $slug === $active_theme_stylesheet ); - $themes_signature .= $slug . ',' . - $data->version . ',' . - ( $is_active ? '1' : '0' ) . ';'; - } - - // Check if themes status changed (version or active/inactive). - $themes_changed = ( $all_cached_themes->md5 !== md5( $themes_signature ) ); - - $themes_update_data = array(); - - if ( $themes_changed ) { - // Change in themes, report changes. - - // Update existing themes info. - foreach ( $all_cached_themes->themes as $slug => $data ) { - $is_active = ( $slug === $active_theme_stylesheet ); - - if ( ! isset( $all_themes[ $slug ] ) ) { - // Plugin uninstalled. - $uninstalled_theme_data = $data; - $uninstalled_theme_data['is_active'] = false; - $uninstalled_theme_data['is_uninstalled'] = true; - $themes_update_data[] = $uninstalled_theme_data; - - unset( $all_themes[ $slug ] ); - unset( $all_cached_themes->themes[ $slug ] ); - } else if ( $data['is_active'] !== $is_active || - $data['version'] !== $all_themes[ $slug ]->version - ) { - // Plugin activated or deactivated, or version changed. - - $all_cached_themes->themes[ $slug ]['is_active'] = $is_active; - $all_cached_themes->themes[ $slug ]['version'] = $all_themes[ $slug ]->version; - - $themes_update_data[] = $all_cached_themes->themes[ $slug ]; - } - } - - // Find new themes that weren't yet seen before. - foreach ( $all_themes as $slug => $data ) { - if ( ! isset( $all_cached_themes->themes[ $slug ] ) ) { - $is_active = ( $slug === $active_theme_stylesheet ); - - // New plugin. - $new_plugin = array( - 'slug' => $slug, - 'version' => $data->version, - 'title' => $data->name, - 'is_active' => $is_active, - 'is_uninstalled' => false, - ); - - $themes_update_data[] = $new_plugin; - $all_cached_themes->themes[ $slug ] = $new_plugin; - } - } - - $all_cached_themes->md5 = md5( $themes_signature ); - $all_cached_themes->timestamp = time(); - self::$_accounts->set_option( $option_name, $all_cached_themes, true ); - } - - return $themes_update_data; - } - - /** - * Update install details. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.2 - * - * @param string[] string $override - * @param bool $include_plugins Since 1.1.8 by default include plugin changes. - * @param bool $include_themes Since 1.1.8 by default include plugin changes. - * - * @return array - */ - private function get_install_data_for_api( - array $override, - $include_plugins = true, - $include_themes = true - ) { - /** - * @since 1.1.8 Also send plugin updates. - */ - if ( $include_plugins && ! isset( $override['plugins'] ) ) { - $plugins = $this->get_plugins_data_for_api(); - if ( ! empty( $plugins ) ) { - $override['plugins'] = $plugins; - } - } - /** - * @since 1.1.8 Also send themes updates. - */ - if ( $include_themes && ! isset( $override['themes'] ) ) { - $themes = $this->get_themes_data_for_api(); - if ( ! empty( $themes ) ) { - $override['themes'] = $themes; - } - } - - return array_merge( array( - 'version' => $this->get_plugin_version(), - 'is_premium' => $this->is_premium(), - 'language' => get_bloginfo( 'language' ), - 'charset' => get_bloginfo( 'charset' ), - 'platform_version' => get_bloginfo( 'version' ), - 'sdk_version' => $this->version, - 'programming_language_version' => phpversion(), - 'title' => get_bloginfo( 'name' ), - 'url' => get_site_url(), - // Special params. - 'is_active' => true, - 'is_disconnected' => $this->is_tracking_prohibited(), - 'is_uninstalled' => false, - ), $override ); - } - - /** - * Update install only if changed. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string[] string $override - * @param bool $flush - * - * @return false|object|string - */ - private function send_install_update( $override = array(), $flush = false ) { - $this->_logger->entrance(); - - $check_properties = $this->get_install_data_for_api( $override ); - - if ( $flush ) { - $params = $check_properties; - } else { - $params = array(); - $special = array(); - $special_override = false; - - foreach ( $check_properties as $p => $v ) { - if ( property_exists( $this->_site, $p ) ) { - if ( ( is_bool( $this->_site->{$p} ) || ! empty( $this->_site->{$p} ) ) && - $this->_site->{$p} != $v - ) { - $this->_site->{$p} = $v; - $params[ $p ] = $v; - } - } else { - $special[ $p ] = $v; - - if ( isset( $override[ $p ] ) || - 'plugins' === $p || - 'themes' === $p - ) { - $special_override = true; - } - } - } - - if ( $special_override || 0 < count( $params ) ) { - // Add special params only if has at least one - // standard param, or if explicitly requested to - // override a special param or a param which is not exist - // in the install object. - $params = array_merge( $params, $special ); - } - } - - if ( 0 < count( $params ) ) { - // Update last install sync timestamp. - $this->_storage->install_sync_timestamp = time(); - - $params['uid'] = $this->get_anonymous_id(); - - // Send updated values to FS. - $site = $this->get_api_site_scope()->call( '/', 'put', $params ); - - if ( $this->is_api_result_entity( $site ) ) { - // I successfully sent install update, clear scheduled sync if exist. - $this->clear_install_sync_cron(); - } - - return $site; - } - - return false; - } - - /** - * Update install only if changed. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string[] string $override - * @param bool $flush - */ - private function sync_install( $override = array(), $flush = false ) { - $this->_logger->entrance(); - - $site = $this->send_install_update( $override, $flush ); - - if ( false === $site ) { - // No sync required. - return; - } - - if ( ! $this->is_api_result_entity( $site ) ) { - // Failed to sync, don't update locally. - return; - } - - $plan = $this->get_plan(); - $this->_site = new FS_Site( $site ); - $this->_site->plan = $plan; - - $this->_store_site( true ); - } - - /** - * Track install's custom event. - * - * IMPORTANT: - * Custom event tracking is currently only supported for specific clients. - * If you are not one of them, please don't use this method. If you will, - * the API will simply ignore your request based on the plugin ID. - * - * Need custom tracking for your plugin or theme? - * If you are interested in custom event tracking please contact yo@freemius.com - * for further details. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $name Event name. - * @param array $properties Associative key/value array with primitive values only - * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. - * @param bool $once If true, event will be tracked only once. IMPORTANT: Still trigger the API call. - * - * @return object|false Event data or FALSE on failure. - * - * @throws \Freemius_InvalidArgumentException - */ - public function track_event( $name, $properties = array(), $process_at = false, $once = false ) { - $this->_logger->entrance( http_build_query( array( 'name' => $name, 'once' => $once ) ) ); - - if ( ! $this->is_registered() ) { - return false; - } - - $event = array( 'type' => $name ); - - if ( is_numeric( $process_at ) && $process_at > time() ) { - $event['process_at'] = $process_at; - } - - if ( $once ) { - $event['once'] = true; - } - - if ( ! empty( $properties ) ) { - // Verify associative array values are primitive. - foreach ( $properties as $k => $v ) { - if ( ! is_scalar( $v ) ) { - throw new Freemius_InvalidArgumentException( 'The $properties argument must be an associative key/value array with primitive values only.' ); - } - } - - $event['properties'] = $properties; - } - - $result = $this->get_api_site_scope()->call( 'events.json', 'post', $event ); - - return $this->is_api_error( $result ) ? - false : - $result; - } - - /** - * Track install's custom event only once, but it still triggers the API call. - * - * IMPORTANT: - * Custom event tracking is currently only supported for specific clients. - * If you are not one of them, please don't use this method. If you will, - * the API will simply ignore your request based on the plugin ID. - * - * Need custom tracking for your plugin or theme? - * If you are interested in custom event tracking please contact yo@freemius.com - * for further details. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $name Event name. - * @param array $properties Associative key/value array with primitive values only - * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. - * - * @return object|false Event data or FALSE on failure. - * - * @throws \Freemius_InvalidArgumentException - * - * @user Freemius::track_event() - */ - public function track_event_once( $name, $properties = array(), $process_at = false ) { - return $this->track_event( $name, $properties, $process_at, true ); - } - - /** - * Plugin uninstall hook. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param bool $check_user Enforce checking if user have plugins activation privileges. - */ - function _uninstall_plugin_event( $check_user = true ) { - $this->_logger->entrance( 'slug = ' . $this->_slug ); - - if ( $check_user && ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $params = array(); - $uninstall_reason = null; - if ( isset( $this->_storage->uninstall_reason ) ) { - $uninstall_reason = $this->_storage->uninstall_reason; - $params['reason_id'] = $uninstall_reason->id; - $params['reason_info'] = $uninstall_reason->info; - } - - if ( ! $this->is_registered() && isset( $uninstall_reason ) ) { - // Send anonymous uninstall event only if user submitted a feedback. - if ( isset( $uninstall_reason->is_anonymous ) && ! $uninstall_reason->is_anonymous ) { - $this->opt_in( false, false, false, false, true ); - } else { - $params['uid'] = $this->get_anonymous_id(); - $this->get_api_plugin_scope()->call( 'uninstall.json', 'put', $params ); - } - } else { - // Send uninstall event. - $this->send_install_update( array_merge( $params, array( - 'is_active' => false, - 'is_uninstalled' => true, - ) ) ); - } - - // @todo Decide if we want to delete plugin information from db. - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * - * @return string - */ - private function premium_plugin_basename() { - return preg_replace( '/\//', '-premium/', $this->_free_plugin_basename, 1 ); - } - - /** - * Uninstall plugin hook. Called only when connected his account with Freemius for active sites tracking. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - */ - public static function _uninstall_plugin_hook() { - self::_load_required_static(); - - self::$_static_logger->entrance(); - - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $plugin_file = substr( current_filter(), strlen( 'uninstall_' ) ); - - self::$_static_logger->info( 'plugin = ' . $plugin_file ); - - define( 'WP_FS__UNINSTALL_MODE', true ); - - $fs = self::get_instance_by_file( $plugin_file ); - - if ( is_object( $fs ) ) { - self::require_plugin_essentials(); - - if ( is_plugin_active( $fs->_free_plugin_basename ) || - is_plugin_active( $fs->premium_plugin_basename() ) - ) { - // Deleting Free or Premium plugin version while the other version still installed. - return; - } - - $fs->_uninstall_plugin_event(); - - $fs->do_action( 'after_uninstall' ); - } - } - - #---------------------------------------------------------------------------------- - #region Plugin Information - #---------------------------------------------------------------------------------- - - /** - * Load WordPress core plugin.php essential module. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - */ - private static function require_plugin_essentials() { - if ( ! function_exists( 'get_plugins' ) ) { - self::$_static_logger->log( 'Including wp-admin/includes/plugin.php...' ); - - require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); - } - } - - /** - * Load WordPress core pluggable.php module. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.2 - */ - private static function require_pluggable_essentials() { - if ( ! function_exists( 'wp_get_current_user' ) ) { - require_once( ABSPATH . 'wp-includes/pluggable.php' ); - } - } - - /** - * Return plugin data. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @return array - */ - function get_plugin_data() { - if ( ! isset( $this->_plugin_data ) ) { - self::require_plugin_essentials(); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.0 When using get_plugin_data() do NOT translate plugin data. - * - * @link https://github.com/Freemius/wordpress-sdk/issues/77 - */ - $this->_plugin_data = get_plugin_data( - $this->_plugin_main_file_path, - false, - false - ); - } - - return $this->_plugin_data; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @return string Plugin slug. - */ - function get_slug() { - return $this->_slug; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @return number Plugin ID. - */ - function get_id() { - return $this->_plugin->id; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @return string Freemius SDK version - */ - function get_sdk_version() { - return $this->version; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @return number Parent plugin ID (if parent exist). - */ - function get_parent_id() { - return $this->is_addon() ? - $this->get_parent_instance()->get_id() : - $this->_plugin->id; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @return string Plugin public key. - */ - function get_public_key() { - return $this->_plugin->public_key; - } - - /** - * Will be available only on sandbox mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return mixed Plugin secret key. - */ - function get_secret_key() { - return $this->_plugin->secret_key; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * - * @return bool - */ - function has_secret_key() { - return ! empty( $this->_plugin->secret_key ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return string - */ - function get_plugin_name() { - $this->_logger->entrance(); - - if ( ! isset( $this->_plugin_name ) ) { - $plugin_data = $this->get_plugin_data(); - - // Get name. - $this->_plugin_name = $plugin_data['Name']; - - // Check if plugin name contains [Premium] suffix and remove it. - $suffix = '[premium]'; - $suffix_len = strlen( $suffix ); - - if ( strlen( $plugin_data['Name'] ) > $suffix_len && - $suffix === substr( strtolower( $plugin_data['Name'] ), - $suffix_len ) - ) { - $this->_plugin_name = substr( $plugin_data['Name'], 0, - $suffix_len ); - } - - $this->_logger->departure( 'Name = ' . $this->_plugin_name ); - } - - return $this->_plugin_name; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @return string - */ - function get_plugin_version() { - $this->_logger->entrance(); - - $plugin_data = $this->get_plugin_data(); - - $this->_logger->departure( 'Version = ' . $plugin_data['Version'] ); - - return $this->apply_filters( 'plugin_version', $plugin_data['Version'] ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return string - */ - function get_plugin_basename() { - return $this->_plugin_basename; - } - - function get_plugin_folder_name() { - $this->_logger->entrance(); - - $plugin_folder = $this->_plugin_basename; - - while ( '.' !== dirname( $plugin_folder ) ) { - $plugin_folder = dirname( $plugin_folder ); - } - - $this->_logger->departure( 'Folder Name = ' . $plugin_folder ); - - return $plugin_folder; - } - - #endregion ------------------------------------------------------------------ - - /* Account - ------------------------------------------------------------------------------------------------------------------*/ - - /** - * Find plugin's slug by plugin's basename. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string $plugin_base_name - * - * @return false|string - */ - private static function find_slug_by_basename( $plugin_base_name ) { - $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); - - if ( ! array( $file_slug_map ) || ! isset( $file_slug_map[ $plugin_base_name ] ) ) { - return false; - } - - return $file_slug_map[ $plugin_base_name ]; - } - - /** - * Store the map between the plugin's basename to the slug. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - private function store_file_slug_map() { - $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); - - if ( ! array( $file_slug_map ) ) { - $file_slug_map = array(); - } - - if ( ! isset( $file_slug_map[ $this->_plugin_basename ] ) || - $file_slug_map[ $this->_plugin_basename ] !== $this->_slug - ) { - $file_slug_map[ $this->_plugin_basename ] = $this->_slug; - self::$_accounts->set_option( 'file_slug_map', $file_slug_map, true ); - } - } - - /** - * @return FS_User[] - */ - static function get_all_users() { - $users = self::$_accounts->get_option( 'users', array() ); - - if ( ! is_array( $users ) ) { - $users = array(); - } - - return $users; - } - - /** - * @return FS_Site[] - */ - private static function get_all_sites() { - $sites = self::$_accounts->get_option( 'sites', array() ); - - if ( ! is_array( $sites ) ) { - $sites = array(); - } - - return $sites; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return FS_Plugin_License[] - */ - private static function get_all_licenses() { - $licenses = self::$_accounts->get_option( 'licenses', array() ); - - if ( ! is_array( $licenses ) ) { - $licenses = array(); - } - - return $licenses; - } - - /** - * @return FS_Plugin_Plan[] - */ - private static function get_all_plans() { - $plans = self::$_accounts->get_option( 'plans', array() ); - - if ( ! is_array( $plans ) ) { - $plans = array(); - } - - return $plans; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return FS_Plugin_Tag[] - */ - private static function get_all_updates() { - $updates = self::$_accounts->get_option( 'updates', array() ); - - if ( ! is_array( $updates ) ) { - $updates = array(); - } - - return $updates; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return array<number,FS_Plugin[]>|false - */ - private static function get_all_addons() { - $addons = self::$_accounts->get_option( 'addons', array() ); - - if ( ! is_array( $addons ) ) { - $addons = array(); - } - - return $addons; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return FS_Plugin[]|false - */ - private static function get_all_account_addons() { - $addons = self::$_accounts->get_option( 'account_addons', array() ); - - if ( ! is_array( $addons ) ) { - $addons = array(); - } - - return $addons; - } - - /** - * Check if user is registered. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * @return bool - */ - function is_registered() { - return is_object( $this->_user ); - } - - /** - * Returns TRUE if the user opted-in and didn't disconnect (opt-out). - * - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - * - * @return bool - */ - function is_tracking_allowed() { - return ( is_object( $this->_site ) && true !== $this->_site->is_disconnected ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return FS_Plugin - */ - function get_plugin() { - return $this->_plugin; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @return FS_User - */ - function get_user() { - return $this->_user; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @return FS_Site - */ - function get_site() { - return $this->_site; - } - - /** - * Get plugin add-ons. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @since 1.1.7.3 If not yet loaded, fetch data from the API. - * - * @param bool $flush - * - * @return FS_Plugin[]|false - */ - function get_addons( $flush = false ) { - $this->_logger->entrance(); - - if ( ! $this->_has_addons ) { - return false; - } - - $addons = $this->_sync_addons( $flush ); - - return ( ! is_array( $addons ) || empty( $addons ) ) ? - false : - $addons; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return FS_Plugin[]|false - */ - function get_account_addons() { - $this->_logger->entrance(); - - $addons = self::get_all_account_addons(); - - if ( ! is_array( $addons ) || - ! isset( $addons[ $this->_plugin->id ] ) || - ! is_array( $addons[ $this->_plugin->id ] ) || - 0 === count( $addons[ $this->_plugin->id ] ) - ) { - return false; - } - - return $addons[ $this->_plugin->id ]; - } - - /** - * Check if user has any - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @return bool - */ - function has_account_addons() { - $addons = $this->get_account_addons(); - - return is_array( $addons ) && ( 0 < count( $addons ) ); - } - - - /** - * Get add-on by ID (from local data). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param number $id - * - * @return FS_Plugin|false - */ - function get_addon( $id ) { - $this->_logger->entrance(); - - $addons = $this->get_addons(); - - if ( is_array( $addons ) ) { - foreach ( $addons as $addon ) { - if ( $id == $addon->id ) { - return $addon; - } - } - } - - return false; - } - - /** - * Get add-on by slug (from local data). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string $slug - * - * @param bool $flush - * - * @return FS_Plugin|false - */ - function get_addon_by_slug( $slug, $flush = false ) { - $this->_logger->entrance(); - - $addons = $this->get_addons( $flush ); - - if ( is_array( $addons ) ) { - foreach ( $addons as $addon ) { - if ( $slug === $addon->slug ) { - return $addon; - } - } - } - - return false; - } - - #---------------------------------------------------------------------------------- - #region Plans & Licensing - #---------------------------------------------------------------------------------- - - /** - * Check if running premium plugin code. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return bool - */ - function is_premium() { - return $this->_plugin->is_premium; - } - - /** - * Get site's plan ID. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @return number - */ - function get_plan_id() { - return $this->_site->plan->id; - } - - /** - * Get site's plan title. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @return string - */ - function get_plan_title() { - return $this->_site->plan->title; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return FS_Plugin_Plan|false - */ - function get_plan() { - return is_object( $this->_site->plan ) ? - $this->_site->plan : - false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @return bool - */ - function is_trial() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return false; - } - - return $this->_site->is_trial(); - } - - /** - * Check if currently in a trial with payment method (credit card or paypal). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @return bool - */ - function is_paid_trial() { - $this->_logger->entrance(); - - if ( ! $this->is_trial() ) { - return false; - } - - return $this->has_active_valid_license() && ( $this->_site->trial_plan_id == $this->_license->plan_id ); - } - - /** - * Check if trial already utilized. - * - * @since 1.0.9 - * - * @return bool - */ - function is_trial_utilized() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return false; - } - - return $this->_site->is_trial_utilized(); - } - - /** - * Get trial plan information (if in trial). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool|FS_Plugin_Plan - */ - function get_trial_plan() { - $this->_logger->entrance(); - - if ( ! $this->is_trial() ) { - return false; - } - - return $this->_storage->trial_plan; - } - - /** - * Check if the user has an activate, non-expired license on current plugin's install. - * - * @since 1.0.9 - * - * @return bool - */ - function is_paying() { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return false; - } - - if ( ! $this->has_paid_plan() ) { - return false; - } - - return ( - ! $this->is_trial() && - 'free' !== $this->_site->plan->name && - $this->has_active_valid_license() - ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @return bool - */ - function is_free_plan() { - if ( ! $this->is_registered() ) { - return true; - } - - if ( ! $this->has_paid_plan() ) { - return true; - } - - return ( - 'free' === $this->_site->plan->name || - ! $this->has_features_enabled_license() - ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return bool - */ - function _has_premium_license() { - $this->_logger->entrance(); - - $premium_license = $this->_get_available_premium_license(); - - return ( false !== $premium_license ); - } - - /** - * Check if user has any licenses associated with the plugin (including expired or blocking). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @return bool - */ - private function has_any_license() { - return is_array( $this->_licenses ) && ( 0 < count( $this->_licenses ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return FS_Plugin_License|false - */ - function _get_available_premium_license() { - $this->_logger->entrance(); - - if ( ! $this->has_paid_plan() ) { - return false; - } - - if ( is_array( $this->_licenses ) ) { - foreach ( $this->_licenses as $license ) { - if ( ! $license->is_utilized() && $license->is_features_enabled() ) { - return $license; - } - } - } - - return false; - } - - /** - * Sync local plugin plans with remote server. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return FS_Plugin_Plan[]|object - */ - function _sync_plans() { - $plans = $this->_fetch_plugin_plans(); - - if ( $this->is_array_instanceof( $plans, 'FS_Plugin_Plan' ) ) { - $this->_plans = $plans; - $this->_store_plans(); - } - - $this->do_action( 'after_plans_sync', $plans ); - - return $this->_plans; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param number $id - * - * @return FS_Plugin_Plan|false - */ - function _get_plan_by_id( $id ) { - $this->_logger->entrance(); - - if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { - $this->_sync_plans(); - } - - foreach ( $this->_plans as $plan ) { - if ( $id == $plan->id ) { - return $plan; - } - } - - return false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.8.1 - * - * @param string $name - * - * @return FS_Plugin_Plan|false - */ - private function get_plan_by_name( $name ) { - $this->_logger->entrance(); - - if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { - $this->_sync_plans(); - } - - foreach ( $this->_plans as $plan ) { - if ( $name == $plan->name ) { - return $plan; - } - } - - return false; - } - - /** - * Sync local plugin plans with remote server. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param number|bool $site_license_id - * - * @return FS_Plugin_License[]|object - */ - function _sync_licenses( $site_license_id = false ) { - $licenses = $this->_fetch_licenses( false, $site_license_id ); - - if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { - $this->_licenses = $licenses; - $this->_store_licenses(); - } - - // Update current license. - if ( is_object( $this->_license ) ) { - $this->_license = $this->_get_license_by_id( $this->_license->id ); - } - - return $this->_licenses; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param number $id - * - * @return FS_Plugin_License|false - */ - function _get_license_by_id( $id ) { - $this->_logger->entrance(); - - if ( ! is_numeric( $id ) ) { - return false; - } - - if ( ! $this->has_any_license() ) { - $this->_sync_licenses(); - } - - foreach ( $this->_licenses as $license ) { - if ( $id == $license->id ) { - return $license; - } - } - - return false; - } - - /** - * Sync site's license with user licenses. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param FS_Plugin_License|null $new_license - */ - function _update_site_license( $new_license ) { - $this->_logger->entrance(); - - $this->_license = $new_license; - - if ( ! is_object( $new_license ) ) { - $this->_site->license_id = null; - $this->_sync_site_subscription( null ); - - return; - } - - $this->_site->license_id = $this->_license->id; - - if ( ! is_array( $this->_licenses ) ) { - $this->_licenses = array(); - } - - $is_license_found = false; - for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { - if ( $new_license->id == $this->_licenses[ $i ]->id ) { - $this->_licenses[ $i ] = $new_license; - - $is_license_found = true; - break; - } - } - - // If new license just append. - if ( ! $is_license_found ) { - $this->_licenses[] = $new_license; - } - - $this->_sync_site_subscription( $new_license ); - } - - /** - * Sync site's subscription. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param FS_Plugin_License|null $license - * - * @return bool|\FS_Subscription - */ - private function _sync_site_subscription( $license ) { - if ( ! is_object( $license ) ) { - unset( $this->_storage->subscription ); - - return false; - } - - // Load subscription details if not lifetime. - $subscription = $license->is_lifetime() ? - false : - $this->_fetch_site_license_subscription(); - - if ( is_object( $subscription ) && ! isset( $subscription->error ) ) { - $this->_storage->subscription = $subscription; - } else { - unset( $this->_storage->subscription ); - } - - return $subscription; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool|\FS_Plugin_License - */ - function _get_license() { - return $this->_license; - } - - /** - * @return bool|\FS_Subscription - */ - function _get_subscription() { - return isset( $this->_storage->subscription ) ? - $this->_storage->subscription : - false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @param string $plan Plan name - * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. - * - * @return bool - */ - function is_plan( $plan, $exact = false ) { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return false; - } - - $plan = strtolower( $plan ); - - if ( $this->_site->plan->name === $plan ) // Exact plan. - { - return true; - } else if ( $exact ) // Required exact, but plans are different. - { - return false; - } - - $current_plan_order = - 1; - $required_plan_order = - 1; - for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { - if ( $plan === $this->_plans[ $i ]->name ) { - $required_plan_order = $i; - } else if ( $this->_site->plan->name === $this->_plans[ $i ]->name ) { - $current_plan_order = $i; - } - } - - return ( $current_plan_order > $required_plan_order ); - } - - /** - * Check if plan based on trial. If not in trial mode, should return false. - * - * @since 1.0.9 - * - * @param string $plan Plan name - * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. - * - * @return bool - */ - function is_trial_plan( $plan, $exact = false ) { - $this->_logger->entrance(); - - if ( ! $this->is_registered() ) { - return false; - } - - if ( ! $this->is_trial() ) { - return false; - } - - if ( ! isset( $this->_storage->trial_plan ) ) { - // Store trial plan information. - $this->_enrich_site_trial_plan( true ); - } - - if ( $this->_storage->trial_plan->name === $plan ) // Exact plan. - { - return true; - } else if ( $exact ) // Required exact, but plans are different. - { - return false; - } - - $current_plan_order = - 1; - $required_plan_order = - 1; - for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { - if ( $plan === $this->_plans[ $i ]->name ) { - $required_plan_order = $i; - } else if ( $this->_storage->trial_plan->name === $this->_plans[ $i ]->name ) { - $current_plan_order = $i; - } - } - - return ( $current_plan_order > $required_plan_order ); - } - - /** - * Check if plugin has any paid plans. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function has_paid_plan() { - return $this->_has_paid_plans || - FS_Plan_Manager::instance()->has_paid_plan( $this->_plans ); - } - - /** - * Check if plugin has any plan with a trail. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function has_trial_plan() { - if ( ! $this->is_registered() ) { - /** - * @author Vova Feldman(@svovaf) - * @since 1.2.1.5 - * - * Allow setting a trial from the SDK without calling the API. - * But, if the user did opt-in, continue using the real data from the API. - */ - if ( $this->_trial_days >= 0 ) { - return true; - } - - return false; - } - - return $this->_storage->get( 'has_trial_plan', false ); - } - - /** - * Check if plugin has any free plan, or is it premium only. - * - * Note: If no plans configured, assume plugin is free. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return bool - */ - function has_free_plan() { - return ! $this->is_only_premium(); - } - - /** - * Displays a license activation dialog box when the user clicks on the "Activate License" - * or "Change License" link on the plugins - * page. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.9 - */ - function _add_license_activation_dialog_box() { - $vars = array( - 'slug' => $this->_slug, - ); - - fs_require_template( 'forms/license-activation.php', $vars ); - fs_require_template( 'forms/resend-key.php', $vars ); - } - - /** - * Displays the opt-out dialog box when the user clicks on the "Opt Out" link on the "Plugins" - * page. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - */ - function _add_optout_dialog() { - $vars = array( - 'slug' => $this->_slug, - ); - - fs_require_template( 'forms/optout.php', $vars ); - } - - /** - * Prepare page to include all required UI and logic for the license activation dialog. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - */ - function _add_license_activation() { - if ( ! current_user_can( 'activate_plugins' ) ) { - // Only admins can activate a license. - return; - } - - if ( ! $this->has_paid_plan() ) { - // Module doesn't have any paid plans. - return; - } - - if ( ! $this->is_premium() ) { - // Only add license activation logic to the premium version. - return; - } - - // Add license activation link and AJAX request handler. - if ( $this->is_plugins_page() ) { - /** - * @since 1.2.0 Add license action link only on plugins page. - */ - $this->_add_license_action_link(); - } - - // Add license activation AJAX callback. - $this->add_ajax_action( 'activate_license', array( &$this, '_activate_license_ajax_action' ) ); - - // Add resend license AJAX callback. - $this->add_ajax_action( 'resend_license_key', array( &$this, '_resend_license_key_ajax_action' ) ); - } - - /** - * @author Leo Fajardo (@leorw) - * @since 1.1.9 - */ - function _activate_license_ajax_action() { - $license_key = trim( fs_request_get( 'license_key' ) ); - - if ( empty( $license_key ) ) { - exit; - } - - $slug = $_POST['slug']; - $fs = ( ( $slug === $this->_slug ) ? $this : self::instance( $slug ) ); - $error = false; - $next_page = false; - - if ( $this->is_registered() ) { - $api = $fs->get_api_site_scope(); - $install = $api->call( '/', 'put', array( - 'license_key' => $this->apply_filters( 'license_key', $license_key ) - ) ); - - if ( isset( $install->error ) ) { - $error = $install->error->message; - } else { - $fs = $this->is_addon() ? - $this->get_parent_instance() : - $this; - - $next_page = $fs->_get_sync_license_url( $this->get_id(), true ); - - $this->reconnect_locally(); - } - } else { - $next_page = $this->opt_in( false, false, false, $license_key ); - - if ( isset( $next_page->error ) ) { - $error = $next_page->error; - } - } - - $result = array( - 'success' => ( false === $error ) - ); - - if ( false !== $error ) { - $result['error'] = $error; - } else { - $result['next_page'] = $next_page; - } - - echo json_encode( $result ); - - exit; - } - - /** - * Billing update AJAX callback. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - */ - function _update_billing_ajax_action() { - check_ajax_referer( $this->get_action_tag( 'update_billing' ), 'security' ); - - if ( ! current_user_can( 'activate_plugins' ) ) { - // Only for admins. - $this->shoot_ajax_failure(); - } - - $billing = fs_request_get( 'billing' ); - - $api = $this->get_api_user_scope(); - $result = $api->call( '/billing.json', 'put', array_merge( $billing, array( - 'plugin_id' => $this->get_parent_id(), - ) ) ); - - if ( ! $this->is_api_result_entity( $result ) ) { - $this->shoot_ajax_failure(); - } - - // Purge cached billing. - $this->get_api_user_scope()->purge_cache( 'billing.json' ); - - $this->shoot_ajax_success(); - } - - /** - * Trial start for anonymous users (AJAX callback). - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - */ - function _start_trial_ajax_action() { - check_ajax_referer( $this->get_action_tag( 'start_trial' ), 'security' ); - - if ( ! current_user_can( 'activate_plugins' ) ) { - // Only for admins. - $this->shoot_ajax_failure(); - } - - $trial_data = fs_request_get( 'trial' ); - - $next_page = $this->opt_in( - false, - false, - false, - false, - false, - $trial_data['plan_id'] - ); - - if ( is_object( $next_page ) && $this->is_api_error( $next_page ) ) { - $this->shoot_ajax_failure( - isset( $next_page->error ) ? - $next_page->error->message : - var_export( $next_page, true ) - ); - } - - $this->shoot_ajax_success( array( - 'next_page' => $next_page, - ) ); - } - - /** - * @author Leo Fajardo (@leorw) - * @since 1.2.0 - */ - function _resend_license_key_ajax_action() { - if ( ! isset( $_POST['email'] ) ) { - exit; - } - - $email_address = trim( $_POST['email'] ); - if ( empty( $email_address ) ) { - exit; - } - - $error = false; - - $api = $this->get_api_plugin_scope(); - $result = $api->call( '/licenses/resend.json', 'post', - array( - 'email' => $email_address, - 'is_localhost' => WP_FS__IS_LOCALHOST - ) - ); - - if ( is_object( $result ) && isset( $result->error ) ) { - $error = $result->error; - - if ( in_array( $error->code, array( 'invalid_email', 'no_user' ) ) ) { - $error = __fs( 'email-not-found' ); - } else if ( 'no_license' === $error->code ) { - $error = __fs( 'no-active-licenses' ); - } else { - $error = $error->message; - } - } - - $licenses = array( - 'success' => ( false === $error ) - ); - - if ( false !== $error ) { - $licenses['error'] = sprintf( '%s... %s', __fs( 'oops', $this->_slug ), strtolower( $error ) ); - } - - echo json_encode( $licenses ); - - exit; - } - - /** - * Helper method to check if user in the plugins page. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @return bool - */ - private function is_plugins_page() { - global $pagenow; - - return ( 'plugins.php' === $pagenow ); - } - - #---------------------------------------------------------------------------------- - #region URL Generators - #---------------------------------------------------------------------------------- - - /** - * Alias to pricing_url(). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @uses pricing_url() - * - * @param string $period Billing cycle - * @param bool $is_trial - * - * @return string - */ - function get_upgrade_url( $period = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { - return $this->pricing_url( $period, $is_trial ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @uses get_upgrade_url() - * - * @return string - */ - function get_trial_url() { - return $this->get_upgrade_url( WP_FS__PERIOD_ANNUALLY, true ); - } - - /** - * Plugin's pricing URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $billing_cycle Billing cycle - * - * @param bool $is_trial - * - * @return string - */ - function pricing_url( $billing_cycle = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { - $this->_logger->entrance(); - - $params = array( - 'billing_cycle' => $billing_cycle - ); - - if ( $is_trial ) { - $params['trial'] = 'true'; - } - - return $this->_get_admin_page_url( 'pricing', $params ); - } - - /** - * Checkout page URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string $billing_cycle Billing cycle - * @param bool $is_trial - * @param array $extra (optional) Extra parameters, override other query params. - * - * @return string - */ - function checkout_url( - $billing_cycle = WP_FS__PERIOD_ANNUALLY, - $is_trial = false, - $extra = array() - ) { - $this->_logger->entrance(); - - $params = array( - 'checkout' => 'true', - 'billing_cycle' => $billing_cycle, - ); - - if ( $is_trial ) { - $params['trial'] = 'true'; - } - - /** - * Params in extra override other params. - */ - $params = array_merge( $params, $extra ); - - return $this->_get_admin_page_url( 'pricing', $params ); - } - - /** - * Add-on checkout URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param number $addon_id - * @param number $pricing_id - * @param string $billing_cycle - * @param bool $is_trial - * - * @return string - */ - function addon_checkout_url( - $addon_id, - $pricing_id, - $billing_cycle = WP_FS__PERIOD_ANNUALLY, - $is_trial = false - ) { - return $this->checkout_url( $billing_cycle, $is_trial, array( - 'plugin_id' => $addon_id, - 'pricing_id' => $pricing_id, - ) ); - } - - #endregion - - #endregion ------------------------------------------------------------------ - - /** - * Check if plugin has any add-ons. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @since 1.1.7.3 Base logic only on the parameter provided by the developer in the init function. - * - * @return bool - */ - function has_addons() { - $this->_logger->entrance(); - - return $this->_has_addons; - } - - /** - * Check if plugin can work in anonymous mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - * - * @deprecated Please use is_enable_anonymous() instead - */ - function enable_anonymous() { - return $this->_enable_anonymous; - } - - /** - * Check if plugin can work in anonymous mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - * - * @return bool - */ - function is_enable_anonymous() { - return $this->_enable_anonymous; - } - - /** - * Check if plugin is premium only (no free plans). - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9 - * - * @return bool - */ - function is_only_premium() { - return $this->_is_premium_only; - } - - /** - * Check if feature supported with current site's plan. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @todo IMPLEMENT - * - * @param number $feature_id - * - * @throws Exception - */ - function is_feature_supported( $feature_id ) { - throw new Exception( 'not implemented' ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @return bool Is running in SSL/HTTPS - */ - function is_ssl() { - return WP_FS__IS_HTTPS; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool Is running in AJAX call. - * - * @link http://wordpress.stackexchange.com/questions/70676/how-to-check-if-i-am-in-admin-ajax - */ - function is_ajax() { - return ( defined( 'DOING_AJAX' ) && DOING_AJAX ); - } - - /** - * Check if it's an AJAX call targeted for the current module. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - * - * @param array|string $actions Collection of AJAX actions. - * - * @return bool - */ - function is_ajax_action( $actions ) { - // Verify it's an ajax call. - if ( ! $this->is_ajax() ) { - return false; - } - - // Verify the call is relevant for the plugin. - if ( $this->_slug !== fs_request_get( 'slug' ) ) { - return false; - } - - // Verify it's one of the specified actions. - if ( is_string( $actions ) ) { - $actions = explode( ',', $actions ); - } - - if ( is_array( $actions ) && 0 < count( $actions ) ) { - $ajax_action = fs_request_get( 'action' ); - - foreach ( $actions as $action ) { - if ( $ajax_action === $this->get_action_tag( $action ) ) { - return true; - } - } - } - - return false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @return bool - */ - function is_cron() { - return ( defined( 'DOING_CRON' ) && DOING_CRON ); - } - - /** - * Check if a real user is visiting the admin dashboard. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @return bool - */ - function is_user_in_admin() { - return is_admin() && ! $this->is_ajax() && ! $this->is_cron(); - } - - /** - * Check if running in HTTPS and if site's plan matching the specified plan. - * - * @param string $plan - * @param bool $exact - * - * @return bool - */ - function is_ssl_and_plan( $plan, $exact = false ) { - return ( $this->is_ssl() && $this->is_plan( $plan, $exact ) ); - } - - /** - * Construct plugin's settings page URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $page - * @param array $params - * - * @return string - */ - function _get_admin_page_url( $page = '', $params = array() ) { - if ( 0 < count( $params ) ) { - foreach ( $params as $k => $v ) { - $params[ $k ] = urlencode( $v ); - } - } - - if ( ! $this->_menu->is_top_level() ) { - $parent_slug = $this->_menu->get_parent_slug(); - $menu_file = ( false !== strpos( $parent_slug, '.php' ) ) ? - $parent_slug : - 'admin.php'; - - return add_query_arg( array_merge( $params, array( - 'page' => $this->_menu->get_slug( $page ), - ) ), admin_url( $menu_file, 'admin' ) ); - } - - if ( $this->_menu->is_cpt() ) { - if ( empty( $page ) && $this->is_activation_mode() ) { - return add_query_arg( array_merge( $params, array( - 'page' => $this->_menu->get_slug() - ) ), admin_url( 'admin.php', 'admin' ) ); - } else { - if ( ! empty( $page ) ) { - $params['page'] = $this->_menu->get_slug( $page ); - } - - return add_query_arg( $params, admin_url( $this->_menu->get_raw_slug(), 'admin' ) ); - } - } else { - return add_query_arg( array_merge( $params, array( - 'page' => $this->_menu->get_slug( $page ), - ) ), admin_url( 'admin.php', 'admin' ) ); - } - } - - /** - * Plugin's account page + sync license URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.9.1 - * - * @param bool|number $plugin_id - * @param bool $add_action_nonce - * - * @return string - */ - function _get_sync_license_url( $plugin_id = false, $add_action_nonce = true ) { - $params = array(); - - if ( is_numeric( $plugin_id ) ) { - $params['plugin_id'] = $plugin_id; - } - - return $this->get_account_url( - $this->_slug . '_sync_license', - $params, - $add_action_nonce - ); - } - - /** - * Plugin's account URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool|string $action - * @param array $params - * - * @param bool $add_action_nonce - * - * @return string - */ - function get_account_url( $action = false, $params = array(), $add_action_nonce = true ) { - if ( is_string( $action ) ) { - $params['fs_action'] = $action; - } - - self::require_pluggable_essentials(); - - return ( $add_action_nonce && is_string( $action ) ) ? - fs_nonce_url( $this->_get_admin_page_url( 'account', $params ), $action ) : - $this->_get_admin_page_url( 'account', $params ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - * - * @param string $tab - * @param bool $action - * @param array $params - * @param bool $add_action_nonce - * - * @return string - * - * @uses get_account_url() - */ - function get_account_tab_url( $tab, $action = false, $params = array(), $add_action_nonce = true ) { - $params['tab'] = $tab; - - return $this->get_account_url( $action, $params, $add_action_nonce ); - } - - /** - * Plugin's account URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool|string $topic - * @param bool|string $message - * - * @return string - */ - function contact_url( $topic = false, $message = false ) { - $params = array(); - if ( is_string( $topic ) ) { - $params['topic'] = $topic; - } - if ( is_string( $message ) ) { - $params['message'] = $message; - } - - if ( $this->is_addon() ) { - $params['addon_id'] = $this->get_id(); - - return $this->get_parent_instance()->_get_admin_page_url( 'contact', $params ); - } else { - return $this->_get_admin_page_url( 'contact', $params ); - } - } - - /** - * Add-on direct info URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.0 - * - * @param string $slug - * - * @return string - */ - function addon_url( $slug ) { - return $this->_get_admin_page_url( 'addons', array( - 'slug' => $slug - ) ); - } - - /* Logger - ------------------------------------------------------------------------------------------------------------------*/ - /** - * @param string $id - * @param bool $prefix_slug - * - * @return FS_Logger - */ - function get_logger( $id = '', $prefix_slug = true ) { - return FS_Logger::get_logger( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id ); - } - - /** - * @param $id - * @param bool $load_options - * @param bool $prefix_slug - * - * @return FS_Option_Manager - */ - function get_options_manager( $id, $load_options = false, $prefix_slug = true ) { - return FS_Option_Manager::get_manager( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id, $load_options ); - } - - /* Security - ------------------------------------------------------------------------------------------------------------------*/ - private function _encrypt( $str ) { - if ( is_null( $str ) ) { - return null; - } - - return base64_encode( $str ); - } - - private function _decrypt( $str ) { - if ( is_null( $str ) ) { - return null; - } - - return base64_decode( $str ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param FS_Entity $entity - * - * @return FS_Entity Return an encrypted clone entity. - */ - private function _encrypt_entity( FS_Entity $entity ) { - $clone = clone $entity; - $props = get_object_vars( $entity ); - - foreach ( $props as $key => $val ) { - $clone->{$key} = $this->_encrypt( $val ); - } - - return $clone; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param FS_Entity $entity - * - * @return FS_Entity Return an decrypted clone entity. - */ - private function _decrypt_entity( FS_Entity $entity ) { - $clone = clone $entity; - $props = get_object_vars( $entity ); - - foreach ( $props as $key => $val ) { - $clone->{$key} = $this->_decrypt( $val ); - } - - return $clone; - } - - /** - * Tries to activate account based on POST params. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - */ - function _activate_account() { - if ( $this->is_registered() ) { - // Already activated. - return; - } - - self::_clean_admin_content_section(); - - if ( fs_request_is_action( 'activate' ) && fs_request_is_post() ) { -// check_admin_referer( 'activate_' . $this->_plugin->public_key ); - - // Verify matching plugin details. - if ( $this->_plugin->id != fs_request_get( 'plugin_id' ) || $this->_slug != fs_request_get( 'plugin_slug' ) ) { - return; - } - - $user = new FS_User(); - $user->id = fs_request_get( 'user_id' ); - $user->public_key = fs_request_get( 'user_public_key' ); - $user->secret_key = fs_request_get( 'user_secret_key' ); - $user->email = fs_request_get( 'user_email' ); - $user->first = fs_request_get( 'user_first' ); - $user->last = fs_request_get( 'user_last' ); - $user->is_verified = fs_request_get_bool( 'user_is_verified' ); - - $site = new FS_Site(); - $site->id = fs_request_get( 'install_id' ); - $site->public_key = fs_request_get( 'install_public_key' ); - $site->secret_key = fs_request_get( 'install_secret_key' ); - $site->plan->id = fs_request_get( 'plan_id' ); - $site->plan->title = fs_request_get( 'plan_title' ); - $site->plan->name = fs_request_get( 'plan_name' ); - - $plans = array(); - $plans_data = json_decode( urldecode( fs_request_get( 'plans' ) ) ); - foreach ( $plans_data as $p ) { - $plans[] = new FS_Plugin_Plan( $p ); - } - - $this->_set_account( $user, $site, $plans ); - - // Reload the page with the keys. - fs_redirect( $this->_get_admin_page_url() ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @param string $email - * - * @return FS_User|bool - */ - static function _get_user_by_email( $email ) { - self::$_static_logger->entrance(); - - $email = trim( strtolower( $email ) ); - $users = self::get_all_users(); - if ( is_array( $users ) ) { - foreach ( $users as $u ) { - if ( $email === trim( strtolower( $u->email ) ) ) { - return $u; - } - } - } - - return false; - } - - #---------------------------------------------------------------------------------- - #region Account (Loading, Updates & Activation) - #---------------------------------------------------------------------------------- - - /*** - * Load account information (user + site). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - private function _load_account() { - $this->_logger->entrance(); - - $this->do_action( 'before_account_load' ); - - $sites = self::get_all_sites(); - $users = self::get_all_users(); - $plans = self::get_all_plans(); - $licenses = self::get_all_licenses(); - - if ( $this->_logger->is_on() && is_admin() ) { - $this->_logger->log( 'sites = ' . var_export( $sites, true ) ); - $this->_logger->log( 'users = ' . var_export( $users, true ) ); - $this->_logger->log( 'plans = ' . var_export( $plans, true ) ); - $this->_logger->log( 'licenses = ' . var_export( $licenses, true ) ); - } - - $site = isset( $sites[ $this->_slug ] ) ? $sites[ $this->_slug ] : false; - - if ( is_object( $site ) && - is_numeric( $site->id ) && - is_numeric( $site->user_id ) && - is_object( $site->plan ) - ) { - // Load site. - $this->_site = clone $site; - $this->_site->plan = $this->_decrypt_entity( $this->_site->plan ); - - // Load relevant user. - $this->_user = clone $users[ $this->_site->user_id ]; - - // Load plans. - $this->_plans = $plans[ $this->_slug ]; - if ( ! is_array( $this->_plans ) || empty( $this->_plans ) ) { - $this->_sync_plans(); - } else { - for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { - if ( $this->_plans[ $i ] instanceof FS_Plugin_Plan ) { - $this->_plans[ $i ] = $this->_decrypt_entity( $this->_plans[ $i ] ); - } else { - unset( $this->_plans[ $i ] ); - } - } - } - - // Load licenses. - $this->_licenses = array(); - if ( is_array( $licenses ) && - isset( $licenses[ $this->_slug ] ) && - isset( $licenses[ $this->_slug ][ $this->_user->id ] ) - ) { - $this->_licenses = $licenses[ $this->_slug ][ $this->_user->id ]; - } - - $this->_license = $this->_get_license_by_id( $this->_site->license_id ); - - if ( $this->_site->version != $this->get_plugin_version() ) { - // If stored install version is different than current installed plugin version, - // then update plugin version event. - $this->update_plugin_version_event(); - } - } - - $this->_register_account_hooks(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param FS_User $user - * @param FS_Site $site - * @param bool|array $plans - */ - private function _set_account( FS_User $user, FS_Site $site, $plans = false ) { - $site->slug = $this->_slug; - $site->user_id = $user->id; - - $this->_site = $site; - $this->_user = $user; - if ( false !== $plans ) { - $this->_plans = $plans; - } - - $this->send_install_update(); - - $this->_store_account(); - - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param array $override_with - * - * @return array - */ - function get_opt_in_params( $override_with = array() ) { - $this->_logger->entrance(); - - $current_user = self::_get_current_wp_user(); - - $activation_action = $this->_slug . '_activate_new'; - $return_url = $this->is_anonymous() ? - // If skipped already, then return to the account page. - $this->get_account_url( $activation_action, array(), false ) : - // Return to the module's main page. - $this->_get_admin_page_url( - '', - array( 'fs_action' => $activation_action ) - ); - - $params = array( - 'user_firstname' => $current_user->user_firstname, - 'user_lastname' => $current_user->user_lastname, - 'user_nickname' => $current_user->user_nicename, - 'user_email' => $current_user->user_email, - 'user_ip' => WP_FS__REMOTE_ADDR, - 'plugin_slug' => $this->_slug, - 'plugin_id' => $this->get_id(), - 'plugin_public_key' => $this->get_public_key(), - 'plugin_version' => $this->get_plugin_version(), - 'return_url' => fs_nonce_url( $return_url, $activation_action ), - 'account_url' => fs_nonce_url( $this->_get_admin_page_url( - 'account', - array( 'fs_action' => 'sync_user' ) - ), 'sync_user' ), - 'site_uid' => $this->get_anonymous_id(), - 'site_url' => get_site_url(), - 'site_name' => get_bloginfo( 'name' ), - 'platform_version' => get_bloginfo( 'version' ), - 'sdk_version' => $this->version, - 'programming_language_version' => phpversion(), - 'language' => get_bloginfo( 'language' ), - 'charset' => get_bloginfo( 'charset' ), - 'is_premium' => $this->is_premium(), - 'is_active' => true, - 'is_uninstalled' => false, - ); - - if ( $this->is_pending_activation() && - ! empty( $this->_storage->pending_license_key ) - ) { - $params['license_key'] = $this->_storage->pending_license_key; - } - - if ( WP_FS__SKIP_EMAIL_ACTIVATION && $this->has_secret_key() ) { - // Even though rand() is known for its security issues, - // the timestamp adds another layer of protection. - // It would be very hard for an attacker to get the secret key form here. - // Plus, this should never run in production since the secret should never - // be included in the production version. - $params['ts'] = WP_FS__SCRIPT_START_TIME; - $params['salt'] = md5( uniqid( rand() ) ); - $params['secure'] = md5( - $params['ts'] . - $params['salt'] . - $this->get_secret_key() - ); - } - - return array_merge( $params, $override_with ); - } - - /** - * 1. If successful opt-in or pending activation returns the next page that the user should be redirected to. - * 2. If there was an API error, return the API result. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param string|bool $email - * @param string|bool $first - * @param string|bool $last - * @param string|bool $license_key - * @param bool $is_uninstall If "true", this means that the module is currently being uninstalled. - * In this case, the user and site info will be sent to the server but no - * data will be saved to the WP installation's database. - * @param number|bool $trial_plan_id - * - * @return string|object - * @use WP_Error - */ - function opt_in( - $email = false, - $first = false, - $last = false, - $license_key = false, - $is_uninstall = false, - $trial_plan_id = false - ) { - $this->_logger->entrance(); - - if ( false === $email ) { - $current_user = self::_get_current_wp_user(); - $email = $current_user->user_email; - } - - /** - * @since 1.2.1 If activating with license key, ignore the context-user - * since the user will be automatically loaded from the license. - */ - if ( empty( $license_key ) ) { - // Clean up pending license if opt-ing in again. - $this->_storage->remove( 'pending_license_key' ); - - if ( ! $is_uninstall ) { - $fs_user = Freemius::_get_user_by_email( $email ); - if ( is_object( $fs_user ) && ! $this->is_pending_activation() ) { - return $this->install_with_current_user( false, $trial_plan_id ); - } - } - } - - $user_info = array(); - if ( ! empty( $email ) ) { - $user_info['user_email'] = $email; - } - if ( ! empty( $first ) ) { - $user_info['user_firstname'] = $first; - } - if ( ! empty( $last ) ) { - $user_info['user_lastname'] = $last; - } - - $params = $this->get_opt_in_params( $user_info ); - - $filtered_license_key = false; - if ( is_string( $license_key ) ) { - $filtered_license_key = $this->apply_filters( 'license_key', $license_key ); - $params['license_key'] = $filtered_license_key; - } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { - $params['trial_plan_id'] = $trial_plan_id; - } - - if ( $is_uninstall ) { - $params['uninstall_params'] = array( - 'reason_id' => $this->_storage->uninstall_reason->id, - 'reason_info' => $this->_storage->uninstall_reason->info - ); - } - - $params['format'] = 'json'; - - $url = WP_FS__ADDRESS . '/action/service/user/install/'; - if ( isset( $_COOKIE['XDEBUG_SESSION'] ) ) { - $url = add_query_arg( 'XDEBUG_SESSION', 'PHPSTORM', $url ); - } - - $response = wp_remote_post( $url, array( - 'method' => 'POST', - 'body' => $params, - 'timeout' => 15, - ) ); - - if ( $response instanceof WP_Error ) { - if ( 'https://' === substr( $url, 0, 8 ) && - isset( $response->errors ) && - isset( $response->errors['http_request_failed'] ) - ) { - $http_error = strtolower( $response->errors['http_request_failed'][0] ); - - if ( false !== strpos( $http_error, 'ssl' ) ) { - // Failed due to old version of cURL or Open SSL (SSLv3 is not supported by CloudFlare). - $url = 'http://' . substr( $url, 8 ); - - $response = wp_remote_post( $url, array( - 'method' => 'POST', - 'body' => $params, - 'timeout' => 15, - ) ); - } - } - } - - if ( is_wp_error( $response ) ) { - /** - * @var WP_Error $response - */ - $result = new stdClass(); - - $error_code = $response->get_error_code(); - $error_type = str_replace( ' ', '', ucwords( str_replace( '_', ' ', $error_code ) ) ); - - $result->error = (object) array( - 'type' => $error_type, - 'message' => $response->get_error_message(), - 'code' => $error_code, - 'http' => 402 - ); - - return $result; - } - - // Module is being uninstalled, don't handle the returned data. - if ( $is_uninstall ) { - return true; - } - - $decoded = @json_decode( $response['body'] ); - - if ( empty( $decoded ) ) { - return false; - } - - if ( ! $this->is_api_result_object( $decoded ) ) { - if ( ! empty( $params['license_key'] ) ) { - // Pass the fully entered license key to the failure handler. - $params['license_key'] = $license_key; - } - - return $is_uninstall ? - $decoded : - $this->apply_filters( 'after_install_failure', $decoded, $params ); - } else if ( isset( $decoded->pending_activation ) && $decoded->pending_activation ) { - // Pending activation, add message. - return $this->set_pending_confirmation( - true, - false, - $filtered_license_key, - ! empty( $params['trial_plan_id'] ) - ); - } else if ( isset( $decoded->install_secret_key ) ) { - return $this->install_with_new_user( - $decoded->user_id, - $decoded->user_public_key, - $decoded->user_secret_key, - $decoded->install_id, - $decoded->install_public_key, - $decoded->install_secret_key, - false - ); - } - - return $decoded; - } - - /** - * Set user and site identities. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param FS_User $user - * @param FS_Site $site - * @param bool $redirect - * - * @return string If redirect is `false`, returns the next page the user should be redirected to. - */ - function setup_account( FS_User $user, FS_Site $site, $redirect = true ) { - $this->_user = $user; - $this->_site = $site; - - $this->_sync_plans(); - - $this->_enrich_site_plan( false ); - - $this->_set_account( $user, $site ); - - if ( $this->is_trial() ) { - // Store trial plan information. - $this->_enrich_site_trial_plan( true ); - } - - // If Freemius was OFF before, turn it on. - $this->turn_on(); - - $this->do_action( 'after_account_connection', $user, $site ); - - if ( is_numeric( $site->license_id ) ) { - $this->_license = $this->_get_license_by_id( $site->license_id ); - } - - $this->_admin_notices->remove_sticky( 'connect_account' ); - - if ( $this->is_pending_activation() ) { - // Remove pending activation sticky notice (if still exist). - $this->_admin_notices->remove_sticky( 'activation_pending' ); - - // Remove plugin from pending activation mode. - unset( $this->_storage->is_pending_activation ); - - if ( ! $this->is_paying_or_trial() ) { - $this->_admin_notices->add_sticky( - sprintf( __fs( 'plugin-x-activation-message', $this->_slug ), '<b>' . $this->get_plugin_name() . '</b>' ), - 'activation_complete' - ); - } - } - - if ( $this->is_paying_or_trial() && ! $this->is_premium() ) { - if ( $this->is_paying() ) { - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'activation-with-plan-x-message', $this->_slug ), - $this->_site->plan->title - ) . $this->get_complete_upgrade_instructions(), - 'plan_upgraded', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - } else { - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'trial-started-message', $this->_slug ), - '<i>' . $this->get_plugin_name() . '</i>' - ) . $this->get_complete_upgrade_instructions( $this->_storage->trial_plan->title ), - 'trial_started', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - } - - $this->_admin_notices->remove_sticky( array( - 'trial_promotion', - ) ); - } - - $plugin_id = fs_request_get( 'plugin_id', false ); - - // Store activation time ONLY for plugins (not add-ons). - if ( ! is_numeric( $plugin_id ) || ( $plugin_id == $this->_plugin->id ) ) { - $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; - } - - $next_page = ''; - - if ( is_numeric( $plugin_id ) ) { - if ( $plugin_id != $this->_plugin->id ) { - // Add-on was installed - sync license right after install. - $next_page = $this->_get_sync_license_url( $plugin_id ); - } - } else { - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.9 If site installed with a valid license, sync license. - */ - if ( $this->is_paying() ) { - $this->_sync_plugin_license( true ); - } - - // Reload the page with the keys. - $next_page = $this->is_anonymous() ? - // If user previously skipped, redirect to account page. - $this->get_account_url() : - $this->get_after_activation_url( 'after_connect_url' ); - } - - if ( ! empty( $next_page ) && $redirect ) { - fs_redirect( $next_page ); - } - - return $next_page; - } - - /** - * Install plugin with new user information after approval. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - function _install_with_new_user() { - $this->_logger->entrance(); - - if ( $this->is_registered() ) { - return; - } - - if ( fs_request_is_action( $this->_slug . '_activate_new' ) ) { -// check_admin_referer( $this->_slug . '_activate_new' ); - - if ( fs_request_has( 'user_secret_key' ) ) { - $this->install_with_new_user( - fs_request_get( 'user_id' ), - fs_request_get( 'user_public_key' ), - fs_request_get( 'user_secret_key' ), - fs_request_get( 'install_id' ), - fs_request_get( 'install_public_key' ), - fs_request_get( 'install_secret_key' ) - ); - } else if ( fs_request_has( 'pending_activation' ) ) { - $this->set_pending_confirmation( fs_request_get( 'user_email' ), true ); - } - } - } - - /** - * Install plugin with new user. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param number $user_id - * @param string $user_public_key - * @param string $user_secret_key - * @param number $install_id - * @param string $install_public_key - * @param string $install_secret_key - * @param bool $redirect - * - * @return string If redirect is `false`, returns the next page the user should be redirected to. - */ - private function install_with_new_user( - $user_id, - $user_public_key, - $user_secret_key, - $install_id, - $install_public_key, - $install_secret_key, - $redirect = true - ) { - $user = new FS_User(); - $user->id = $user_id; - $user->public_key = $user_public_key; - $user->secret_key = $user_secret_key; - - $this->_user = $user; - $user_result = $this->get_api_user_scope()->get(); - $user = new FS_User( $user_result ); - $this->_user = $user; - - $site = new FS_Site(); - $site->id = $install_id; - $site->public_key = $install_public_key; - $site->secret_key = $install_secret_key; - - $this->_site = $site; - $site_result = $this->get_api_site_scope()->get(); - $site = new FS_Site( $site_result ); - $this->_site = $site; - - return $this->setup_account( $this->_user, $this->_site, $redirect ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param string|bool $email - * @param bool $redirect - * @param string|bool $license_key Since 1.2.1.5 - * @param bool $is_pending_trial Since 1.2.1.5 - * - * @return string Since 1.2.1.5 if $redirect is `false`, return the pending activation page. - */ - private function set_pending_confirmation( - $email = false, - $redirect = true, - $license_key = false, - $is_pending_trial = false - ) { - // Install must be activated via email since - // user with the same email already exist. - $this->_storage->is_pending_activation = true; - $this->_add_pending_activation_notice( $email, $is_pending_trial ); - - if ( ! empty( $license_key ) ) { - $this->_storage->pending_license_key = $license_key; - } - - // Remove the opt-in sticky notice. - $this->_admin_notices->remove_sticky( array( - 'connect_account', - 'trial_promotion', - ) ); - - $next_page = $this->get_after_activation_url( 'after_pending_connect_url' ); - - // Reload the page with with pending activation message. - if ( $redirect ) { - fs_redirect( $next_page ); - } - - return $next_page; - } - - /** - * Install plugin with current logged WP user info. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - function _install_with_current_user() { - $this->_logger->entrance(); - - if ( $this->is_registered() ) { - return; - } - - if ( fs_request_is_action( $this->_slug . '_activate_existing' ) && fs_request_is_post() ) { -// check_admin_referer( 'activate_existing_' . $this->_plugin->public_key ); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.9 Add license key if given. - */ - $license_key = fs_request_get( 'license_secret_key' ); - - $this->install_with_current_user( $license_key ); - } - } - - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @param string|bool $license_key - * @param number|bool $trial_plan_id - * @param bool $redirect - * - * @return string|object If redirect is `false`, returns the next page the user should be redirected to, or the - * API error object if failed to install. - */ - private function install_with_current_user( - $license_key = false, - $trial_plan_id = false, - $redirect = true - ) { - // Get current logged WP user. - $current_user = self::_get_current_wp_user(); - - // Find the relevant FS user by the email. - $user = self::_get_user_by_email( $current_user->user_email ); - - // We have to set the user before getting user scope API handler. - $this->_user = $user; - - $extra_install_params = array( - 'uid' => $this->get_anonymous_id(), - ); - - if ( ! empty( $license_key ) ) { - $filtered_license_key = $this->apply_filters( 'license_key', $license_key ); - $extra_install_params['license_key'] = $filtered_license_key; - } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { - $extra_install_params['trial_plan_id'] = $trial_plan_id; - } - - $args = $this->get_install_data_for_api( $extra_install_params, false, false ); - - // Install the plugin. - $install = $this->get_api_user_scope()->call( - "/plugins/{$this->get_id()}/installs.json", - 'post', - $args - ); - - if ( ! $this->is_api_result_entity( $install ) ) { - if ( ! empty( $args['license_key'] ) ) { - // Pass full the fully entered license key to the failure handler. - $args['license_key'] = $license_key; - } - - $install = $this->apply_filters( 'after_install_failure', $install, $args ); - - $this->_admin_notices->add( - sprintf( __fs( 'could-not-activate-x', $this->_slug ), $this->get_plugin_name() ) . ' ' . - __fs( 'contact-us-with-error-message', $this->_slug ) . ' ' . '<b>' . $install->error->message . '</b>', - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - if ( $redirect ) { - fs_redirect( $this->get_activation_url( array( 'error' => $install->error->message ) ) ); - } - - return $install; - } - - $site = new FS_Site( $install ); - $this->_site = $site; - - return $this->setup_account( $this->_user, $this->_site, $redirect ); - } - - /** - * Tries to activate add-on account based on parent plugin info. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param Freemius $parent_fs - */ - private function _activate_addon_account( Freemius $parent_fs ) { - if ( $this->is_registered() ) { - // Already activated. - return; - } - - // Activate add-on with parent plugin credentials. - $addon_install = $parent_fs->get_api_site_scope()->call( - "/addons/{$this->_plugin->id}/installs.json", - 'post', - $this->get_install_data_for_api( array( - 'uid' => $this->get_anonymous_id(), - ), false, false ) - ); - - if ( isset( $addon_install->error ) ) { - $this->_admin_notices->add( - sprintf( __fs( 'could-not-activate-x', $this->_slug ), $this->get_plugin_name() ) . ' ' . - __fs( 'contact-us-with-error-message', $this->_slug ) . ' ' . '<b>' . $addon_install->error->message . '</b>', - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return; - } - - // First of all, set site info - otherwise we won't - // be able to invoke API calls. - $this->_site = new FS_Site( $addon_install ); - - // Sync add-on plans. - $this->_sync_plans(); - - // Get site's current plan. - $this->_site->plan = $this->_get_plan_by_id( $this->_site->plan->id ); - - // Get user information based on parent's plugin. - $user = $parent_fs->get_user(); - - $this->_set_account( $user, $this->_site ); - - // Sync licenses. - $this->_sync_licenses(); - - // Try to activate premium license. - $this->_activate_license( true ); - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Admin Menu Items - #---------------------------------------------------------------------------------- - - private $_menu_items = array(); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return string - */ - function get_menu_slug() { - return $this->_menu->get_slug(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function _prepare_admin_menu() { -// if ( ! $this->is_on() ) { -// return; -// } - - if ( ! $this->has_api_connectivity() && ! $this->is_enable_anonymous() ) { - $this->_menu->remove_menu_item(); - } else { - $this->do_action( 'before_admin_menu_init' ); - - $this->add_menu_action(); - $this->add_submenu_items(); - } - } - - /** - * Admin dashboard menu items modifications. - * - * NOTE: admin_menu action executed before admin_init. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - */ - private function add_menu_action() { - if ( $this->is_activation_mode() ) { - $this->override_plugin_menu_with_activation(); - } else { - // If not registered try to install user. - if ( ! $this->is_registered() && - fs_request_is_action( $this->_slug . '_activate_new' ) - ) { - $this->_install_with_new_user(); - } - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - function _redirect_on_clicked_menu_link() { - $this->_logger->entrance(); - - $page = strtolower( isset( $_REQUEST['page'] ) ? $_REQUEST['page'] : '' ); - - $this->_logger->log( 'page = ' . $page ); - - foreach ( $this->_menu_items as $priority => $items ) { - foreach ( $items as $item ) { - if ( isset( $item['url'] ) ) { - if ( $page === $this->_menu->get_slug( strtolower( $item['menu_slug'] ) ) ) { - $this->_logger->log( 'Redirecting to ' . $item['url'] ); - - fs_redirect( $item['url'] ); - } - } - } - } - } - - /** - * Remove plugin's all admin menu items & pages, and replace with activation page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - private function override_plugin_menu_with_activation() { - $this->_logger->entrance(); - - $hook = false; - - if ( $this->_menu->is_top_level() ) { - $hook = $this->_menu->override_menu_item( array( &$this, '_connect_page_render' ) ); - - if ( false === $hook ) { - // Create new menu item just for the opt-in. - $hook = add_menu_page( - $this->get_plugin_name(), - $this->get_plugin_name(), - 'manage_options', - $this->_menu->get_slug(), - array( &$this, '_connect_page_render' ) - ); - } - } else { - $menus = array( $this->_menu->get_parent_slug() ); - - if ( $this->_menu->is_override_exact() ) { - // Make sure the current page is matching the activation page. - $activation_url = strtolower( $this->get_activation_url() ); - $request_url = strtolower( $_SERVER['REQUEST_URI'] ); - - if ( parse_url( $activation_url, PHP_URL_PATH ) !== parse_url( $request_url, PHP_URL_PATH ) ) { - // Different path - DO NOT OVERRIDE PAGE. - return; - } - - $activation_url_params = array(); - parse_str( parse_url( $activation_url, PHP_URL_QUERY ), $activation_url_params ); - - $request_url_params = array(); - parse_str( parse_url( $request_url, PHP_URL_QUERY ), $request_url_params ); - - - foreach ( $activation_url_params as $key => $val ) { - if ( ! isset( $request_url_params[ $key ] ) || $val != $request_url_params[ $key ] ) { - // Not matching query string - DO NOT OVERRIDE PAGE. - return; - } - } - } - - foreach ( $menus as $parent_slug ) { - $hook = $this->_menu->override_submenu_action( - $parent_slug, - $this->_menu->get_raw_slug(), - array( &$this, '_connect_page_render' ) - ); - - if ( false !== $hook ) { - // Found plugin's submenu item. - break; - } - } - } - - if ( $this->_menu->is_activation_page() ) { - // Clean admin page from distracting content. - self::_clean_admin_content_section(); - } - - if ( false !== $hook ) { - if ( fs_request_is_action( $this->_slug . '_activate_existing' ) ) { - add_action( "load-$hook", array( &$this, '_install_with_current_user' ) ); - } else if ( fs_request_is_action( $this->_slug . '_activate_new' ) ) { - add_action( "load-$hook", array( &$this, '_install_with_new_user' ) ); - } - } - } - - /** - * @author Leo Fajardo (leorw) - * @since 1.2.1 - * - * return string - */ - function get_top_level_menu_capability() { - global $menu; - - $top_level_menu_slug = $this->get_top_level_menu_slug(); - - foreach ( $menu as $menu_info ) { - /** - * The second element in the menu info array is the capability/role that has access to the menu and the - * third element is the menu slug. - */ - if ( $menu_info[2] === $top_level_menu_slug ) { - return $menu_info[1]; - } - } - - return 'read'; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @return string - */ - private function get_top_level_menu_slug() { - return ( $this->is_addon() ? - $this->get_parent_instance()->_menu->get_top_level_menu_slug() : - $this->_menu->get_top_level_menu_slug() ); - } - - /** - * Add default Freemius menu items. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - */ - private function add_submenu_items() { - $this->_logger->entrance(); - - if ( ! $this->is_addon() ) { - if ( ! $this->is_activation_mode() ) { - if ( $this->is_registered() ) { - // Add user account page. - $this->add_submenu_item( - __fs( 'account', $this->_slug ), - array( &$this, '_account_page_render' ), - $this->get_plugin_name() . ' – ' . __fs( 'account', $this->_slug ), - 'manage_options', - 'account', - array( &$this, '_account_page_load' ), - WP_FS__DEFAULT_PRIORITY, - $this->_menu->is_submenu_item_visible( 'account' ) - ); - } - - // Add contact page. - $this->add_submenu_item( - __fs( 'contact-us', $this->_slug ), - array( &$this, '_contact_page_render' ), - $this->get_plugin_name() . ' – ' . __fs( 'contact-us', $this->_slug ), - 'manage_options', - 'contact', - 'Freemius::_clean_admin_content_section', - WP_FS__DEFAULT_PRIORITY, - $this->_menu->is_submenu_item_visible( 'contact' ) - ); - - if ( $this->has_addons() ) { - $this->add_submenu_item( - __fs( 'add-ons', $this->_slug ), - array( &$this, '_addons_page_render' ), - $this->get_plugin_name() . ' – ' . __fs( 'add-ons', $this->_slug ), - 'manage_options', - 'addons', - array( &$this, '_addons_page_load' ), - WP_FS__LOWEST_PRIORITY - 1, - $this->_menu->is_submenu_item_visible( 'addons' ) - ); - } - - $show_pricing = ( $this->has_paid_plan() && $this->_menu->is_submenu_item_visible( 'pricing' ) ); - // If user don't have paid plans, add pricing page - // to support add-ons checkout but don't add the submenu item. - // || (isset( $_GET['page'] ) && $this->_menu->get_slug( 'pricing' ) == $_GET['page']); - - $pricing_cta_slug = 'upgrade'; - $pricing_class = 'upgrade-mode'; - if ( $show_pricing ) { - if ( $this->_admin_notices->has_sticky( 'trial_promotion' ) && - ! $this->is_paying_or_trial() - ) { - // If running a trial promotion, modify the pricing to load the trial. - $pricing_cta_slug = 'start-trial'; - $pricing_class = 'trial-mode'; - } else if ( $this->is_paying() ) { - $pricing_cta_slug = 'pricing'; - $pricing_class = ''; - } - } - - // Add upgrade/pricing page. - $this->add_submenu_item( - __fs( $pricing_cta_slug, $this->_slug ) . ' ➤', - array( &$this, '_pricing_page_render' ), - $this->get_plugin_name() . ' – ' . __fs( 'pricing', $this->_slug ), - 'manage_options', - 'pricing', - 'Freemius::_clean_admin_content_section', - WP_FS__LOWEST_PRIORITY, - $show_pricing, - $pricing_class - ); - } - } - - - if ( 0 < count( $this->_menu_items ) ) { - if ( ! $this->_menu->is_top_level() ) { - fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); - - // Append submenu items right after the plugin's submenu item. - $this->order_sub_submenu_items(); - } else { - // Append submenu items. - $this->embed_submenu_items(); - } - } - } - - /** - * Moved the actual submenu item additions to a separated function, - * in order to support sub-submenu items when the plugin's settings - * only have a submenu and not top-level menu item. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - */ - private function embed_submenu_items() { - $item_template = $this->_menu->is_top_level() ? - '<span class="fs-submenu-item %s %s %s">%s</span>' : - '<span class="fs-submenu-item fs-sub %s %s %s">%s</span>'; - - $top_level_menu_capability = $this->get_top_level_menu_capability(); - - ksort( $this->_menu_items ); - - foreach ( $this->_menu_items as $priority => $items ) { - foreach ( $items as $item ) { - $capability = ( ! empty( $item['capability'] ) ? $item['capability'] : $top_level_menu_capability ); - - $menu_item = sprintf( - $item_template, - $this->_slug, - $item['menu_slug'], - ! empty( $item['class'] ) ? $item['class'] : '', - $item['menu_title'] - ); - - $menu_slug = $this->_menu->get_slug( $item['menu_slug'] ); - - if ( ! isset( $item['url'] ) ) { - $hook = add_submenu_page( - $item['show_submenu'] ? - $this->get_top_level_menu_slug() : - null, - $item['page_title'], - $menu_item, - $capability, - $menu_slug, - $item['render_function'] - ); - - if ( false !== $item['before_render_function'] ) { - add_action( "load-$hook", $item['before_render_function'] ); - } - } else { - add_submenu_page( - $this->get_top_level_menu_slug(), - $item['page_title'], - $menu_item, - $capability, - $menu_slug, - array( $this, '' ) - ); - } - } - } - } - - /** - * Re-order the submenu items so all Freemius added new submenu items - * are added right after the plugin's settings submenu item. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - */ - private function order_sub_submenu_items() { - global $submenu; - - $menu_slug = $this->_menu->get_top_level_menu_slug(); - - /** - * Before "admin_menu" fires, WordPress will loop over the default submenus and remove pages for which the user - * does not have permissions. So in case a plugin does not have top-level menu but does have submenus under any - * of the default menus, only users that have the right role can access its sub-submenus (Account, Contact Us, - * Support Forum, etc.) since $submenu[ $menu_slug ] will be empty if the user doesn't have permission. - * - * In case a plugin does not have submenus under any of the default menus but does have submenus under the menu - * of another plugin, only users that have the right role can access its sub-submenus since we will use the - * capability needed to access the parent menu as the capability for the submenus that we will add. - */ - if ( empty( $submenu[ $menu_slug ] ) ) { - return; - } - - $top_level_menu = &$submenu[ $menu_slug ]; - - $all_submenu_items_after = array(); - - $found_submenu_item = false; - - foreach ( $top_level_menu as $submenu_id => $meta ) { - if ( $found_submenu_item ) { - // Remove all submenu items after the plugin's submenu item. - $all_submenu_items_after[] = $meta; - unset( $top_level_menu[ $submenu_id ] ); - } - - if ( $this->_menu->get_raw_slug() === $meta[2] ) { - // Found the submenu item, put all below. - $found_submenu_item = true; - continue; - } - } - - // Embed all plugin's new submenu items. - $this->embed_submenu_items(); - - // Start with specially high number to make sure it's appended. - $i = max( 10000, max( array_keys( $top_level_menu ) ) + 1 ); - foreach ( $all_submenu_items_after as $meta ) { - $top_level_menu[ $i ] = $meta; - $i ++; - } - - // Sort submenu items. - ksort( $top_level_menu ); - } - - /** - * Displays the Support Forum link when enabled. - * - * Can be filtered like so: - * - * function _fs_show_support_menu( $is_visible, $menu_id ) { - * if ( 'support' === $menu_id ) { - * return _fs->is_registered(); - * } - * return $is_visible; - * } - * _fs()->add_filter('is_submenu_visible', '_fs_show_support_menu', 10, 2); - * - */ - function _add_default_submenu_items() { - if ( ! $this->is_on() ) { - return; - } - - if ( ! $this->is_activation_mode() ) { - if ( $this->_menu->is_submenu_item_visible( 'support' ) ) { - $this->add_submenu_link_item( - $this->apply_filters( 'support_forum_submenu', __fs( 'support-forum', $this->_slug ) ), - $this->apply_filters( 'support_forum_url', 'https://wordpress.org/support/plugin/' . $this->_slug ), - 'wp-support-forum', - null, - 50 - ); - } - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param string $menu_title - * @param callable $render_function - * @param bool|string $page_title - * @param string $capability - * @param bool|string $menu_slug - * @param bool|callable $before_render_function - * @param int $priority - * @param bool $show_submenu - * @param string $class Since 1.2.1.5 can add custom classes to menu items. - */ - function add_submenu_item( - $menu_title, - $render_function, - $page_title = false, - $capability = 'manage_options', - $menu_slug = false, - $before_render_function = false, - $priority = WP_FS__DEFAULT_PRIORITY, - $show_submenu = true, - $class = '' - ) { - $this->_logger->entrance( 'Title = ' . $menu_title ); - - if ( $this->is_addon() ) { - $parent_fs = $this->get_parent_instance(); - - if ( is_object( $parent_fs ) ) { - $parent_fs->add_submenu_item( - $menu_title, - $render_function, - $page_title, - $capability, - $menu_slug, - $before_render_function, - $priority, - $show_submenu, - $class - ); - - return; - } - } - - if ( ! isset( $this->_menu_items[ $priority ] ) ) { - $this->_menu_items[ $priority ] = array(); - } - - $this->_menu_items[ $priority ][] = array( - 'page_title' => is_string( $page_title ) ? $page_title : $menu_title, - 'menu_title' => $menu_title, - 'capability' => $capability, - 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), - 'render_function' => $render_function, - 'before_render_function' => $before_render_function, - 'show_submenu' => $show_submenu, - 'class' => $class, - ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param string $menu_title - * @param string $url - * @param bool $menu_slug - * @param string $capability - * @param int $priority - * - */ - function add_submenu_link_item( - $menu_title, - $url, - $menu_slug = false, - $capability = 'read', - $priority = WP_FS__DEFAULT_PRIORITY - ) { - $this->_logger->entrance( 'Title = ' . $menu_title . '; Url = ' . $url ); - - if ( $this->is_addon() ) { - $parent_fs = $this->get_parent_instance(); - - if ( is_object( $parent_fs ) ) { - $parent_fs->add_submenu_link_item( - $menu_title, - $url, - $menu_slug, - $capability, - $priority - ); - - return; - } - } - - if ( ! isset( $this->_menu_items[ $priority ] ) ) { - $this->_menu_items[ $priority ] = array(); - } - - $this->_menu_items[ $priority ][] = array( - 'menu_title' => $menu_title, - 'capability' => $capability, - 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), - 'url' => $url, - 'page_title' => $menu_title, - 'render_function' => 'fs_dummy', - 'before_render_function' => '', - ); - } - - #endregion ------------------------------------------------------------------ - - /* Actions / Hooks / Filters - ------------------------------------------------------------------------------------------------------------------*/ - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param string $tag - * - * @return string - */ - public function get_action_tag( $tag ) { - return "fs_{$tag}_{$this->_slug}"; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $tag - * - * @return string - */ - private function get_ajax_action_tag( $tag ) { - return 'wp_ajax_' . $this->get_action_tag( $tag ); - } - - /** - * Do action, specific for the current context plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param string $tag The name of the action to be executed. - * @param mixed $arg,... Optional. Additional arguments which are passed on to the - * functions hooked to the action. Default empty. - * - * @uses do_action() - */ - function do_action( $tag, $arg = '' ) { - $this->_logger->entrance( $tag ); - - $args = func_get_args(); - - call_user_func_array( 'do_action', array_merge( - array( $this->get_action_tag( $tag ) ), - array_slice( $args, 1 ) ) - ); - } - - /** - * Add action, specific for the current context plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param string $tag - * @param callable $function_to_add - * @param int $priority - * @param int $accepted_args - * - * @uses add_action() - */ - function add_action( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { - $this->_logger->entrance( $tag ); - - add_action( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); - } - - /** - * Add AJAX action, specific for the current context plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $tag - * @param callable $function_to_add - * @param int $priority - * @param int $accepted_args - * - * @uses add_action() - * - * @return bool True if action added, false if no need to add the action since the AJAX call isn't matching. - */ - function add_ajax_action( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { - $this->_logger->entrance( $tag ); - - if ( ! $this->is_ajax_action( $tag ) ) { - return false; - } - - add_action( $this->get_ajax_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); - - $this->_logger->info( "$tag AJAX callback action added." ); - - return true; - } - - /** - * Send a JSON response back to an Ajax request. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $response - */ - function shoot_ajax_response( $response ) { - wp_send_json( $response ); - } - - /** - * Send a JSON response back to an Ajax request, indicating success. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $data Data to encode as JSON, then print and exit. - */ - function shoot_ajax_success( $data = null ) { - wp_send_json_success( $data ); - } - - /** - * Send a JSON response back to an Ajax request, indicating failure. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $error Optional error message. - */ - function shoot_ajax_failure( $error = '' ) { - $result = array( 'success' => false ); - if ( ! empty( $error ) ) { - $result['error'] = $error; - } - - wp_send_json( $result ); - } - - /** - * Apply filter, specific for the current context plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string $tag The name of the filter hook. - * @param mixed $value The value on which the filters hooked to `$tag` are applied on. - * - * @return mixed The filtered value after all hooked functions are applied to it. - * - * @uses apply_filters() - */ - function apply_filters( $tag, $value ) { - $this->_logger->entrance( $tag ); - - $args = func_get_args(); - array_unshift( $args, $this->_slug ); - - return call_user_func_array( 'fs_apply_filter', $args ); - } - - /** - * Add filter, specific for the current context plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string $tag - * @param callable $function_to_add - * @param int $priority - * @param int $accepted_args - * - * @uses add_filter() - */ - function add_filter( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { - $this->_logger->entrance( $tag ); - - add_filter( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); - } - - /** - * Check if has filter. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - * - * @param string $tag - * @param callable|bool $function_to_check Optional. The callback to check for. Default false. - * - * @return false|int - * - * @uses has_filter() - */ - function has_filter( $tag, $function_to_check = false ) { - $this->_logger->entrance( $tag ); - - return has_filter( $this->get_action_tag( $tag ), $function_to_check ); - } - - /** - * Override default i18n text phrases. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string[] string $key_value - * - * @uses fs_override_i18n() - */ - function override_i18n( $key_value ) { - fs_override_i18n( $key_value, $this->_slug ); - } - - /* Account Page - ------------------------------------------------------------------------------------------------------------------*/ - /** - * Update site information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param bool $store Flush to Database if true. - */ - private function _store_site( $store = true ) { - $this->_logger->entrance(); - - if ( empty( $this->_site->id ) ) { - $this->_logger->error( "Empty install ID, can't store site." ); - - return; - } - - $encrypted_site = clone $this->_site; - $encrypted_site->plan = $this->_encrypt_entity( $this->_site->plan ); - - $sites = self::get_all_sites(); - $sites[ $this->_slug ] = $encrypted_site; - self::$_accounts->set_option( 'sites', $sites, $store ); - } - - /** - * Update plugin's plans information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @param bool $store Flush to Database if true. - */ - private function _store_plans( $store = true ) { - $this->_logger->entrance(); - - $plans = self::get_all_plans(); - - // Copy plans. - $encrypted_plans = array(); - for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { - $encrypted_plans[] = $this->_encrypt_entity( $this->_plans[ $i ] ); - } - - $plans[ $this->_slug ] = $encrypted_plans; - self::$_accounts->set_option( 'plans', $plans, $store ); - } - - /** - * Update user's plugin licenses. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param bool $store - * @param string|bool $plugin_slug - * @param FS_Plugin_License[] $licenses - */ - private function _store_licenses( $store = true, $plugin_slug = false, $licenses = array() ) { - $this->_logger->entrance(); - - $all_licenses = self::get_all_licenses(); - - if ( ! is_string( $plugin_slug ) ) { - $plugin_slug = $this->_slug; - $licenses = $this->_licenses; - } - - if ( ! isset( $all_licenses[ $plugin_slug ] ) ) { - $all_licenses[ $plugin_slug ] = array(); - } - - $all_licenses[ $plugin_slug ][ $this->_user->id ] = $licenses; - - self::$_accounts->set_option( 'licenses', $all_licenses, $store ); - } - - /** - * Update user information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - * - * @param bool $store Flush to Database if true. - */ - private function _store_user( $store = true ) { - $this->_logger->entrance(); - - if ( empty( $this->_user->id ) ) { - $this->_logger->error( "Empty user ID, can't store user." ); - - return; - } - - $users = self::get_all_users(); - $users[ $this->_user->id ] = $this->_user; - self::$_accounts->set_option( 'users', $users, $store ); - } - - /** - * Update new updates information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param FS_Plugin_Tag|null $update - * @param bool $store Flush to Database if true. - * @param bool|number $plugin_id - */ - private function _store_update( $update, $store = true, $plugin_id = false ) { - $this->_logger->entrance(); - - if ( $update instanceof FS_Plugin_Tag ) { - $update->updated = time(); - } - - if ( ! is_numeric( $plugin_id ) ) { - $plugin_id = $this->_plugin->id; - } - - $updates = self::get_all_updates(); - $updates[ $plugin_id ] = $update; - self::$_accounts->set_option( 'updates', $updates, $store ); - } - - /** - * Update new updates information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param FS_Plugin[] $plugin_addons - * @param bool $store Flush to Database if true. - */ - private function _store_addons( $plugin_addons, $store = true ) { - $this->_logger->entrance(); - - $addons = self::get_all_addons(); - $addons[ $this->_plugin->id ] = $plugin_addons; - self::$_accounts->set_option( 'addons', $addons, $store ); - } - - /** - * Delete plugin's associated add-ons. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.8 - * - * @param bool $store - * - * @return bool - */ - private function _delete_account_addons( $store = true ) { - $all_addons = self::get_all_account_addons(); - - if ( ! isset( $all_addons[ $this->_plugin->id ] ) ) { - return false; - } - - unset( $all_addons[ $this->_plugin->id ] ); - - self::$_accounts->set_option( 'account_addons', $all_addons, $store ); - - return true; - } - - /** - * Update account add-ons list. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param FS_Plugin[] $addons - * @param bool $store Flush to Database if true. - */ - private function _store_account_addons( $addons, $store = true ) { - $this->_logger->entrance(); - - $all_addons = self::get_all_account_addons(); - $all_addons[ $this->_plugin->id ] = $addons; - self::$_accounts->set_option( 'account_addons', $all_addons, $store ); - } - - /** - * Store account params in the Database. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.1 - */ - private function _store_account() { - $this->_logger->entrance(); - - $this->_store_site( false ); - $this->_store_user( false ); - $this->_store_plans( false ); - $this->_store_licenses( false ); - - self::$_accounts->store(); - } - - /** - * Sync user's information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * @uses FS_Api - */ - private function _handle_account_user_sync() { - $this->_logger->entrance(); - - $api = $this->get_api_user_scope(); - - // Get user's information. - $user = $api->get( '/', true ); - - if ( isset( $user->id ) ) { - $this->_user->first = $user->first; - $this->_user->last = $user->last; - $this->_user->email = $user->email; - - $is_menu_item_account_visible = $this->_menu->is_submenu_item_visible( 'account' ); - - if ( $user->is_verified && - ( ! isset( $this->_user->is_verified ) || false === $this->_user->is_verified ) - ) { - $this->_user->is_verified = true; - - $this->do_action( 'account_email_verified', $user->email ); - - $this->_admin_notices->add( - __fs( 'email-verified-message', $this->_slug ), - __fs( 'right-on', $this->_slug ) . '!', - 'success', - // Make admin sticky if account menu item is invisible, - // since the page will be auto redirected to the plugin's - // main settings page, and the non-sticky message - // will disappear. - ! $is_menu_item_account_visible, - false, - 'email_verified' - ); - } - - // Flush user details to DB. - $this->_store_user(); - - $this->do_action( 'after_account_user_sync', $user ); - - /** - * If account menu item is hidden, redirect to plugin's main settings page. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @link https://github.com/Freemius/wordpress-sdk/issues/6 - */ - if ( ! $is_menu_item_account_visible ) { - fs_redirect( $this->_get_admin_page_url() ); - } - } - } - - /** - * @param bool $store - * - * @return FS_Plugin_Plan|object|false - */ - private function _enrich_site_plan( $store = true ) { - // Try to load plan from local cache. - $plan = $this->_get_plan_by_id( $this->_site->plan->id ); - - if ( false === $plan ) { - $plan = $this->_fetch_site_plan(); - } - - if ( $plan instanceof FS_Plugin_Plan ) { - $this->_update_plan( $plan, $store ); - } - - return $plan; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * @uses FS_Api - * - * @param bool $store - * - * @return FS_Plugin_Plan|object|false - */ - private function _enrich_site_trial_plan( $store = true ) { - // Try to load plan from local cache. - $trial_plan = $this->_get_plan_by_id( $this->_site->trial_plan_id ); - - if ( false === $trial_plan ) { - $trial_plan = $this->_fetch_site_plan( $this->_site->trial_plan_id ); - } - - if ( $trial_plan instanceof FS_Plugin_Plan ) { - $this->_storage->store( 'trial_plan', $trial_plan, $store ); - } - - return $trial_plan; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * @uses FS_Api - * - * @param number|bool $license_id - * - * @return FS_Subscription|object|bool - */ - private function _fetch_site_license_subscription( $license_id = false ) { - $this->_logger->entrance(); - $api = $this->get_api_site_scope(); - - if ( ! is_numeric( $license_id ) ) { - $license_id = $this->_license->id; - } - - $result = $api->get( "/licenses/{$license_id}/subscriptions.json", true ); - - return ! isset( $result->error ) ? - ( ( is_array( $result->subscriptions ) && 0 < count( $result->subscriptions ) ) ? - new FS_Subscription( $result->subscriptions[0] ) : - false - ) : - $result; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * @uses FS_Api - * - * @param number|bool $plan_id - * - * @return FS_Plugin_Plan|object - */ - private function _fetch_site_plan( $plan_id = false ) { - $this->_logger->entrance(); - $api = $this->get_api_site_scope(); - - if ( ! is_numeric( $plan_id ) ) { - $plan_id = $this->_site->plan->id; - } - - $plan = $api->get( "/plans/{$plan_id}.json", true ); - - return ! isset( $plan->error ) ? new FS_Plugin_Plan( $plan ) : $plan; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * @uses FS_Api - * - * @return FS_Plugin_Plan[]|object - */ - private function _fetch_plugin_plans() { - $this->_logger->entrance(); - $api = $this->get_api_site_scope(); - - $result = $api->get( '/plans.json', true ); - - if ( $this->is_api_result_object( $result, 'plans' ) && is_array( $result->plans ) ) { - for ( $i = 0, $len = count( $result->plans ); $i < $len; $i ++ ) { - $result->plans[ $i ] = new FS_Plugin_Plan( $result->plans[ $i ] ); - } - - $result = $result->plans; - } - - return $result; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * @uses FS_Api - * - * @param number|bool $plugin_id - * @param number|bool $site_license_id - * - * @return FS_Plugin_License[]|object - */ - private function _fetch_licenses( $plugin_id = false, $site_license_id = false ) { - $this->_logger->entrance(); - - $api = $this->get_api_user_scope(); - - if ( ! is_numeric( $plugin_id ) ) { - $plugin_id = $this->_plugin->id; - } - - $result = $api->get( "/plugins/{$plugin_id}/licenses.json", true ); - - $is_site_license_synced = false; - - $api_errors = array(); - - if ( $this->is_api_result_object( $result, 'licenses' ) && - is_array( $result->licenses ) - ) { - for ( $i = 0, $len = count( $result->licenses ); $i < $len; $i ++ ) { - $result->licenses[ $i ] = new FS_Plugin_License( $result->licenses[ $i ] ); - - if ( ( ! $is_site_license_synced ) && is_numeric( $site_license_id ) ) { - $is_site_license_synced = ( $site_license_id == $result->licenses[ $i ]->id ); - } - } - - $result = $result->licenses; - } else { - $api_errors[] = $result; - $result = array(); - } - - if ( ! $is_site_license_synced ) { - $api = $this->get_api_site_scope(); - - if ( is_numeric( $site_license_id ) ) { - // Try to retrieve a foreign license that is linked to the install. - $api_result = $api->call( '/licenses.json' ); - - if ( $this->is_api_result_object( $api_result, 'licenses' ) && - is_array( $api_result->licenses ) - ) { - $licenses = $api_result->licenses; - - if ( ! empty( $licenses ) ) { - $result[] = new FS_Plugin_License( $licenses[0] ); - } - } else { - $api_errors[] = $api_result; - } - } else if ( is_object( $this->_license ) ) { - // Fetch foreign license by ID and license key. - $license = $api->get( "/licenses/{$this->_license->id}.json?license_key=" . - urlencode( $this->_license->secret_key ) ); - - if ( $this->is_api_result_entity( $license ) ) { - $result[] = new FS_Plugin_License( $license ); - } else { - $api_errors[] = $license; - } - } - } - - if ( is_array( $result ) && 0 < count( $result ) ) { - // If found at least one license, return license collection even if there are errors. - return $result; - } - - if ( ! empty( $api_errors ) ) { - // If found any errors and no licenses, return first error. - return $api_errors[0]; - } - - // Fallback to empty licenses list. - return $result; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - * @uses FS_Api - * - * @param number|bool $plugin_id - * - * @return FS_Payment[]|object - */ - function _fetch_payments( $plugin_id = false ) { - $this->_logger->entrance(); - - $api = $this->get_api_user_scope(); - - if ( ! is_numeric( $plugin_id ) ) { - $plugin_id = $this->_plugin->id; - } - - $result = $api->get( "/plugins/{$plugin_id}/payments.json", true ); - - if ( ! isset( $result->error ) ) { - for ( $i = 0, $len = count( $result->payments ); $i < $len; $i ++ ) { - $result->payments[ $i ] = new FS_Payment( $result->payments[ $i ] ); - } - $result = $result->payments; - } - - return $result; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * @uses FS_Api - * - * @return \FS_Billing|mixed - */ - function _fetch_billing() { - require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-billing.php'; - - $billing = $this->get_api_user_scope()->call( 'billing.json' ); - - if ( $this->is_api_result_entity( $billing ) ) { - $billing = new FS_Billing( $billing ); - } - - return $billing; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param FS_Plugin_Plan $plan - * @param bool $store - */ - private function _update_plan( $plan, $store = false ) { - $this->_logger->entrance(); - - $this->_site->plan = $plan; - $this->_store_site( $store ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param FS_Plugin_License[] $licenses - * @param string|bool $plugin_slug - */ - private function _update_licenses( $licenses, $plugin_slug = false ) { - $this->_logger->entrance(); - - if ( is_array( $licenses ) ) { - for ( $i = 0, $len = count( $licenses ); $i < $len; $i ++ ) { - $licenses[ $i ]->updated = time(); - } - } - - if ( ! is_string( $plugin_slug ) ) { - $this->_licenses = $licenses; - } - - $this->_store_licenses( true, $plugin_slug, $licenses ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool|number $plugin_id - * @param bool $flush Since 1.1.7.3 - * - * @return object|false New plugin tag info if exist. - */ - private function _fetch_newer_version( $plugin_id = false, $flush = true ) { - $latest_tag = $this->_fetch_latest_version( $plugin_id, $flush ); - - if ( ! is_object( $latest_tag ) ) { - return false; - } - - // Check if version is actually newer. - $has_new_version = - // If it's an non-installed add-on then always return latest. - ( $this->_is_addon_id( $plugin_id ) && ! $this->is_addon_activated( $plugin_id ) ) || - // Compare versions. - version_compare( $this->get_plugin_version(), $latest_tag->version, '<' ); - - $this->_logger->departure( $has_new_version ? 'Found newer plugin version ' . $latest_tag->version : 'No new version' ); - - return $has_new_version ? $latest_tag : false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param bool|number $plugin_id - * @param bool $flush Since 1.1.7.3 - * - * @return bool|FS_Plugin_Tag - */ - function get_update( $plugin_id = false, $flush = true ) { - $this->_logger->entrance(); - - if ( ! is_numeric( $plugin_id ) ) { - $plugin_id = $this->_plugin->id; - } - - $this->_check_updates( true, $plugin_id, $flush ); - $updates = $this->get_all_updates(); - - return isset( $updates[ $plugin_id ] ) && is_object( $updates[ $plugin_id ] ) ? $updates[ $plugin_id ] : false; - } - - /** - * Check if site assigned with active license. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @deprecated Please use has_active_valid_license() instead because license can be cancelled. - */ - function has_active_license() { - return ( - is_object( $this->_license ) && - is_numeric( $this->_license->id ) && - ! $this->_license->is_expired() - ); - } - - /** - * Check if site assigned with active & valid (not expired) license. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - */ - function has_active_valid_license() { - return ( - is_object( $this->_license ) && - is_numeric( $this->_license->id ) && - $this->_license->is_active() && - $this->_license->is_valid() - ); - } - - /** - * Check if site assigned with license with enabled features. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function has_features_enabled_license() { - return ( - is_object( $this->_license ) && - is_numeric( $this->_license->id ) && - $this->_license->is_features_enabled() - ); - } - - /** - * Check if user is a trial or have feature enabled license. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @return bool - */ - function can_use_premium_code() { - return $this->is_trial() || $this->has_features_enabled_license(); - } - - /** - * Sync site's plan. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @uses FS_Api - * - * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by - * the admin. - */ - private function _sync_license( $background = false ) { - $this->_logger->entrance(); - - $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); - - $is_addon_sync = ( ! $this->_plugin->is_addon() && $plugin_id != $this->get_id() ); - - if ( $is_addon_sync ) { - $this->_sync_addon_license( $plugin_id, $background ); - } else { - $this->_sync_plugin_license( $background ); - } - - $this->do_action( 'after_account_plan_sync', $this->_site->plan->name ); - } - - /** - * Sync plugin's add-on license. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * @uses FS_Api - * - * @param number $addon_id - * @param bool $background - */ - private function _sync_addon_license( $addon_id, $background ) { - $this->_logger->entrance(); - - if ( $this->is_addon_activated( $addon_id ) ) { - // If already installed, use add-on sync. - $fs_addon = self::get_instance_by_id( $addon_id ); - $fs_addon->_sync_license( $background ); - - return; - } - - // Validate add-on exists. - $addon = $this->get_addon( $addon_id ); - - if ( ! is_object( $addon ) ) { - return; - } - - // Add add-on into account add-ons. - $account_addons = $this->get_account_addons(); - if ( ! is_array( $account_addons ) ) { - $account_addons = array(); - } - $account_addons[] = $addon->id; - $account_addons = array_unique( $account_addons ); - $this->_store_account_addons( $account_addons ); - - // Load add-on licenses. - $licenses = $this->_fetch_licenses( $addon->id ); - - // Sync add-on licenses. - if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { - $this->_update_licenses( $licenses, $addon->slug ); - - if ( ! $this->is_addon_installed( $addon->slug ) && FS_License_Manager::has_premium_license( $licenses ) ) { - $plans_result = $this->get_api_site_or_plugin_scope()->get( "/addons/{$addon_id}/plans.json" ); - - if ( ! isset( $plans_result->error ) ) { - $plans = array(); - foreach ( $plans_result->plans as $plan ) { - $plans[] = new FS_Plugin_Plan( $plan ); - } - - $this->_admin_notices->add_sticky( - FS_Plan_Manager::instance()->has_free_plan( $plans ) ? - sprintf( - __fs( 'addon-successfully-upgraded-message', $this->_slug ), - $addon->title - ) . ' ' . $this->_get_latest_download_link( - __fs( 'download-latest-version', $this->_slug ), - $addon_id - ) - : - sprintf( - __fs( 'addon-successfully-purchased-message', $this->_slug ), - $addon->title - ) . ' ' . $this->_get_latest_download_link( - __fs( 'download-latest-version', $this->_slug ), - $addon_id - ), - 'addon_plan_upgraded_' . $addon->slug, - __fs( 'yee-haw', $this->_slug ) . '!' - ); - } - } - } - } - - /** - * Sync site's plugin plan. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * @uses FS_Api - * - * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by - * the admin. - */ - private function _sync_plugin_license( $background = false ) { - $this->_logger->entrance(); - - /** - * Sync site info. - * - * @todo This line will execute install sync on a daily basis, even if running the free version (for opted-in users). The reason we want to keep it that way is for cases when the user was a paying customer, then there was a failure in subscription payment, and then after some time the payment was successful. This could be heavily optimized. For example, we can skip the $flush if the current install was never associated with a paid version. - */ - $site = $this->send_install_update( array(), true ); - - $plan_change = 'none'; - - if ( ! $this->is_api_result_entity( $site ) ) { - // Show API messages only if not background sync or if paying customer. - if ( ! $background || $this->is_paying() ) { - // Try to ping API to see if not blocked. - if ( ! FS_Api::test() ) { - /** - * Failed to ping API - blocked! - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 Only show message related to one of the Freemius powered plugins. Once it will be resolved it will fix the issue for all plugins anyways. There's no point to scare users with multiple error messages. - */ - $api = $this->get_api_site_scope(); - - if ( ! self::$_global_admin_notices->has_sticky( 'api_blocked' ) ) { - self::$_global_admin_notices->add( - sprintf( - __fs( 'server-blocking-access', $this->_slug ), - $this->get_plugin_name(), - '<a href="' . $api->get_url() . '" target="_blank">' . $api->get_url() . '</a>' - ) . '<br> ' . __fs( 'server-error-message', $this->_slug ) . var_export( $site->error, true ), - __fs( 'oops', $this->_slug ) . '...', - 'error', - $background, - false, - 'api_blocked' - ); - } - } else { - // Authentication params are broken. - $this->_admin_notices->add( - __fs( 'wrong-authentication-param-message', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - } - } - - // No reason to continue with license sync while there are API issues. - return; - } - - // Remove sticky API connectivity message. - self::$_global_admin_notices->remove_sticky( 'api_blocked' ); - - $site = new FS_Site( $site ); - - // Sync plans. - $this->_sync_plans(); - - if ( ! $this->has_paid_plan() ) { - $this->_site = $site; - $this->_enrich_site_plan( true ); - $this->_store_site(); - } else { - /** - * Sync licenses. Pass the site's license ID so that the foreign licenses will be fetched if the license - * associated with that ID is not included in the user's licenses collection. - */ - $this->_sync_licenses( $site->license_id ); - - // Check if plan / license changed. - if ( ! FS_Entity::equals( $site->plan, $this->_site->plan ) || - // Check if trial started. - $site->trial_plan_id != $this->_site->trial_plan_id || - $site->trial_ends != $this->_site->trial_ends || - // Check if license changed. - $site->license_id != $this->_site->license_id - ) { - if ( $site->is_trial() && ( ! $this->_site->is_trial() || $site->trial_ends != $this->_site->trial_ends ) ) { - // New trial started. - $this->_site = $site; - $plan_change = 'trial_started'; - - // Store trial plan information. - $this->_enrich_site_trial_plan( true ); - - // For trial with subscription use-case. - $new_license = is_null( $site->license_id ) ? null : $this->_get_license_by_id( $site->license_id ); - - if ( is_object( $new_license ) && $new_license->is_valid() ) { - $this->_site = $site; - $this->_update_site_license( $new_license ); - $this->_store_licenses(); - $this->_enrich_site_plan( true ); - - $this->_sync_site_subscription( $this->_license ); - } - } else if ( $this->_site->is_trial() && ! $site->is_trial() && ! is_numeric( $site->license_id ) ) { - // Was in trial, but now trial expired and no license ID. - // New trial started. - $this->_site = $site; - $plan_change = 'trial_expired'; - - // Clear trial plan information. - $this->_storage->trial_plan = null; - - } else { - $is_free = $this->is_free_plan(); - - // Make sure license exist and not expired. - $new_license = is_null( $site->license_id ) ? - null : - $this->_get_license_by_id( $site->license_id ); - - if ( $is_free && is_null( $new_license ) && $this->has_any_license() && $this->_license->is_cancelled ) { - // License cancelled. - $this->_site = $site; - $this->_update_site_license( $new_license ); - $this->_store_licenses(); - $this->_enrich_site_plan( true ); - - $plan_change = 'cancelled'; - } else if ( $is_free && ( ( ! is_object( $new_license ) || $new_license->is_expired() ) ) ) { - // The license is expired, so ignore upgrade method. - } else { - // License changed. - $this->_site = $site; - $this->_update_site_license( $new_license ); - $this->_store_licenses(); - $this->_enrich_site_plan( true ); - - $plan_change = $is_free ? - 'upgraded' : - ( is_object( $new_license ) ? - 'changed' : - 'downgraded' ); - } - } - - // Store updated site info. - $this->_store_site(); - } else { - if ( is_object( $this->_license ) && $this->_license->is_expired() ) { - if ( ! $this->has_features_enabled_license() ) { - $this->_deactivate_license(); - $plan_change = 'downgraded'; - } else { - $plan_change = 'expired'; - } - } - - if ( is_numeric( $site->license_id ) && is_object( $this->_license ) ) { - $this->_sync_site_subscription( $this->_license ); - } - } - } - - if ( $this->has_paid_plan() ) { - switch ( $plan_change ) { - case 'none': - if ( ! $background && is_admin() ) { - $plan = $this->is_trial() ? - $this->_storage->trial_plan : - $this->_site->plan; - - $this->_admin_notices->add( - sprintf( - __fs( 'plan-did-not-change-message', $this->_slug ), - '<i><b>' . $plan->title . ( $this->is_trial() ? ' ' . __fs( 'trial', $this->_slug ) : '' ) . '</b></i>' - ) . ' ' . sprintf( - '<a href="%s">%s</a>', - $this->contact_url( - 'bug', - sprintf( __fs( 'plan-did-not-change-email-message', $this->_slug ), - strtoupper( $plan->name ) - ) - ), - __fs( 'contact-us-here', $this->_slug ) - ), - __fs( 'hmm', $this->_slug ) . '...' - ); - } - break; - case 'upgraded': - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'plan-upgraded-message', $this->_slug ), - '<i>' . $this->get_plugin_name() . '</i>' - ) . $this->get_complete_upgrade_instructions(), - 'plan_upgraded', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - - $this->_admin_notices->remove_sticky( array( - 'trial_started', - 'trial_promotion', - 'trial_expired', - 'activation_complete', - ) ); - break; - case 'changed': - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'plan-changed-to-x-message', $this->_slug ), - $this->_site->plan->title - ), - 'plan_changed' - ); - - $this->_admin_notices->remove_sticky( array( - 'trial_started', - 'trial_promotion', - 'trial_expired', - 'activation_complete', - ) ); - break; - case 'downgraded': - $this->_admin_notices->add_sticky( - sprintf( __fs( 'license-expired-blocking-message', $this->_slug ) ), - 'license_expired', - __fs( 'hmm', $this->_slug ) . '...' - ); - $this->_admin_notices->remove_sticky( 'plan_upgraded' ); - break; - case 'cancelled': - $this->_admin_notices->add( - __fs( 'license-cancelled', $this->_slug ) . ' ' . - sprintf( - '<a href="%s">%s</a>', - $this->contact_url( 'bug' ), - __fs( 'contact-us-here', $this->_slug ) - ), - __fs( 'hmm', $this->_slug ) . '...', - 'error' - ); - $this->_admin_notices->remove_sticky( 'plan_upgraded' ); - break; - case 'expired': - $this->_admin_notices->add_sticky( - sprintf( __fs( 'license-expired-non-blocking-message', $this->_slug ), $this->_site->plan->title ), - 'license_expired', - __fs( 'hmm', $this->_slug ) . '...' - ); - $this->_admin_notices->remove_sticky( 'plan_upgraded' ); - break; - case 'trial_started': - $this->_admin_notices->add_sticky( - sprintf( - __fs( 'trial-started-message', $this->_slug ), - '<i>' . $this->get_plugin_name() . '</i>' - ) . $this->get_complete_upgrade_instructions( $this->_storage->trial_plan->title ), - 'trial_started', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - - $this->_admin_notices->remove_sticky( array( - 'trial_promotion', - ) ); - break; - case 'trial_expired': - $this->_admin_notices->add_sticky( - __fs( 'trial-expired-message', $this->_slug ), - 'trial_expired', - __fs( 'hmm', $this->_slug ) . '...' - ); - $this->_admin_notices->remove_sticky( array( - 'trial_started', - 'trial_promotion', - 'plan_upgraded', - ) ); - break; - } - } - - if ( 'none' !== $plan_change ) { - $this->do_action( 'after_license_change', $plan_change, $this->_site->plan ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param bool $background - */ - protected function _activate_license( $background = false ) { - $this->_logger->entrance(); - - $license_id = fs_request_get( 'license_id' ); - - if ( FS_Plugin_License::is_valid_id( $license_id ) && $license_id == $this->_site->license_id ) { - // License is already activated. - return; - } - - $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ? - $this->_get_license_by_id( $license_id ) : - $this->_get_available_premium_license(); - - if ( ! is_object( $premium_license ) ) { - return; - } - - /** - * If the premium license is already associated with the install, just - * update the license reference (activation is not required). - * - * @since 1.1.9 - */ - if ( $premium_license->id == $this->_site->license_id ) { - // License is already activated. - $this->_update_site_license( $premium_license ); - $this->_enrich_site_plan( false ); - $this->_store_account(); - - return; - } - - if ( $this->_site->user_id != $premium_license->user_id ) { - $api_request_params = array( 'license_key' => $premium_license->secret_key ); - } else { - $api_request_params = array(); - } - - $api = $this->get_api_site_scope(); - $license = $api->call( "/licenses/{$premium_license->id}.json", 'put', $api_request_params ); - - if ( ! $this->is_api_result_entity( $license ) ) { - if ( ! $background ) { - $this->_admin_notices->add( sprintf( - '%s %s', - __fs( 'license-activation-failed-message', $this->_slug ), - ( is_object( $license ) && isset( $license->error ) ? - $license->error->message : - sprintf( '%s<br><code>%s</code>', - __fs( 'server-error-message', $this->_slug ), - var_export( $license, true ) - ) - ) - ), - __fs( 'hmm', $this->_slug ) . '...', - 'error' - ); - } - - return; - } - - $premium_license = new FS_Plugin_License( $license ); - - // Updated site plan. - $site = $this->get_api_site_scope()->get( '/', true ); - if ( $this->is_api_result_entity( $site ) ) { - $this->_site = new FS_Site( $site ); - } - $this->_update_site_license( $premium_license ); - $this->_enrich_site_plan( false ); - - $this->_store_account(); - - if ( ! $background ) { - $this->_admin_notices->add_sticky( - __fs( 'license-activated-message', $this->_slug ) . - $this->get_complete_upgrade_instructions(), - 'license_activated', - __fs( 'yee-haw', $this->_slug ) . '!' - ); - } - - $this->_admin_notices->remove_sticky( array( - 'trial_promotion', - 'license_expired', - ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param bool $show_notice - */ - protected function _deactivate_license( $show_notice = true ) { - $this->_logger->entrance(); - - if ( ! is_object( $this->_license ) ) { - $this->_admin_notices->add( - sprintf( __fs( 'no-active-license-message', $this->_slug ), $this->_site->plan->title ), - __fs( 'hmm', $this->_slug ) . '...' - ); - - return; - } - - $api = $this->get_api_site_scope(); - $license = $api->call( "/licenses/{$this->_site->license_id}.json", 'delete' ); - - if ( isset( $license->error ) ) { - $this->_admin_notices->add( - __fs( 'license-deactivation-failed-message', $this->_slug ) . '<br> ' . - __fs( 'server-error-message', $this->_slug ) . ' ' . var_export( $license->error, true ), - __fs( 'hmm', $this->_slug ) . '...', - 'error' - ); - - return; - } - - // Update license cache. - for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { - if ( $license->id == $this->_licenses[ $i ]->id ) { - $this->_licenses[ $i ] = new FS_Plugin_License( $license ); - } - } - - // Updated site plan to default. - $this->_sync_plans(); - $this->_site->plan->id = $this->_plans[0]->id; - // Unlink license from site. - $this->_update_site_license( null ); - $this->_enrich_site_plan( false ); - - $this->_store_account(); - - if ( $show_notice ) { - $this->_admin_notices->add( - sprintf( __fs( 'license-deactivation-message', $this->_slug ), $this->_site->plan->title ), - __fs( 'ok', $this->_slug ) - ); - } - - $this->_admin_notices->remove_sticky( array( - 'plan_upgraded', - 'license_activated', - ) ); - } - - /** - * Site plan downgrade. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @uses FS_Api - */ - private function _downgrade_site() { - $this->_logger->entrance(); - - $api = $this->get_api_site_scope(); - $site = $api->call( 'downgrade.json', 'put' ); - - $plan_downgraded = false; - $plan = false; - if ( $this->is_api_result_entity( $site ) ) { - $prev_plan_id = $this->_site->plan->id; - - // Update new site plan id. - $this->_site->plan->id = $site->plan_id; - - $plan = $this->_enrich_site_plan(); - $subscription = $this->_sync_site_subscription( $this->_license ); - - // Plan downgraded if plan was changed or subscription was cancelled. - $plan_downgraded = ( $plan instanceof FS_Plugin_Plan && $prev_plan_id != $plan->id ) || - ( is_object( $subscription ) && ! isset( $subscription->error ) && ! $subscription->is_active() ); - } else { - // handle different error cases. - - } - - if ( $plan_downgraded ) { - // Remove previous sticky message about upgrade (if exist). - $this->_admin_notices->remove_sticky( 'plan_upgraded' ); - - $this->_admin_notices->add( - sprintf( __fs( 'plan-x-downgraded-message', $this->_slug ), - $plan->title, - human_time_diff( time(), strtotime( $this->_license->expiration ) ) - ) - ); - - // Store site updates. - $this->_store_site(); - } else { - $this->_admin_notices->add( - __fs( 'plan-downgraded-failure-message', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.8.1 - * - * @param bool|string $plan_name - * - * @return bool If trial was successfully started. - */ - function start_trial( $plan_name = false ) { - $this->_logger->entrance(); - - if ( $this->is_trial() ) { - // Already in trial mode. - $this->_admin_notices->add( - __fs( 'in-trial-mode', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - - if ( $this->_site->is_trial_utilized() ) { - // Trial was already utilized. - $this->_admin_notices->add( - __fs( 'trial-utilized', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - - if ( false !== $plan_name ) { - $plan = $this->get_plan_by_name( $plan_name ); - - if ( false === $plan ) { - // Plan doesn't exist. - $this->_admin_notices->add( - sprintf( __fs( 'trial-plan-x-not-exist', $this->_slug ), $plan_name ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - - if ( ! $plan->has_trial() ) { - // Plan doesn't exist. - $this->_admin_notices->add( - sprintf( __fs( 'plan-x-no-trial', $this->_slug ), $plan_name ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - } else { - if ( ! $this->has_trial_plan() ) { - // None of the plans have a trial. - $this->_admin_notices->add( - __fs( 'no-trials', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - - $plans_with_trial = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); - - $plan = $plans_with_trial[0]; - } - - $api = $this->get_api_site_scope(); - $plan = $api->call( "plans/{$plan->id}/trials.json", 'post' ); - - if ( ! $this->is_api_result_entity( $plan ) ) { - // Some API error while trying to start the trial. - $this->_admin_notices->add( - __fs( 'unexpected-api-error', $this->_slug ) . ' ' . var_export( $plan, true ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return false; - } - - // Sync license. - $this->_sync_license(); - - return $this->is_trial(); - } - - /** - * Cancel site trial. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @uses FS_Api - */ - private function _cancel_trial() { - $this->_logger->entrance(); - - if ( ! $this->is_trial() ) { - $this->_admin_notices->add( - __fs( 'trial-cancel-no-trial-message', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - - return; - } - - $api = $this->get_api_site_scope(); - $site = $api->call( 'trials.json', 'delete' ); - - $trial_cancelled = false; - - if ( $this->is_api_result_entity( $site ) ) { - $prev_trial_ends = $this->_site->trial_ends; - - if ( $this->is_paid_trial() ) { - $this->_license->expiration = $site->trial_ends; - $this->_license->is_cancelled = true; - $this->_update_site_license( $this->_license ); - $this->_store_licenses(); - - // Clear subscription reference. - $this->_sync_site_subscription( null ); - } - - // Update site info. - $this->_site = new FS_Site( $site ); - $this->_enrich_site_plan(); - - $trial_cancelled = ( $prev_trial_ends != $site->trial_ends ); - } else { - // handle different error cases. - - } - - if ( $trial_cancelled ) { - // Remove previous sticky messages about upgrade or trial (if exist). - $this->_admin_notices->remove_sticky( array( - 'trial_started', - 'trial_promotion', - 'plan_upgraded', - ) ); - - // Store site updates. - $this->_store_site(); - - if ( ! $this->is_addon() || - ! $this->deactivate_premium_only_addon_without_license( true ) - ) { - $this->_admin_notices->add( - sprintf( __fs( 'trial-cancel-message', $this->_slug ), $this->_storage->trial_plan->title ) - ); - } - - // Clear trial plan information. - unset( $this->_storage->trial_plan ); - } else { - $this->_admin_notices->add( - __fs( 'trial-cancel-failure-message', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool|number $plugin_id - * - * @return bool - */ - private function _is_addon_id( $plugin_id ) { - return is_numeric( $plugin_id ) && ( $this->get_id() != $plugin_id ); - } - - /** - * Check if user eligible to download premium version updates. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - private function _can_download_premium() { - return $this->has_active_valid_license() || - ( $this->is_trial() && ! $this->get_trial_plan()->is_free() ); - } - - /** - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool|number $addon_id - * @param string $type "json" or "zip" - * - * @return string - */ - private function _get_latest_version_endpoint( $addon_id = false, $type = 'json' ) { - - $is_addon = $this->_is_addon_id( $addon_id ); - - $is_premium = null; - if ( ! $is_addon ) { - $is_premium = $this->_can_download_premium(); - } else if ( $this->is_addon_activated( $addon_id ) ) { - $is_premium = self::get_instance_by_id( $addon_id )->_can_download_premium(); - } - - return // If add-on, then append add-on ID. - ( $is_addon ? "/addons/$addon_id" : '' ) . - '/updates/latest.' . $type . - // If add-on and not yet activated, try to fetch based on server licensing. - ( is_bool( $is_premium ) ? '?is_premium=' . json_encode( $is_premium ) : '' ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool|number $addon_id - * @param bool $flush Since 1.1.7.3 - * - * @return object|false Plugin latest tag info. - */ - function _fetch_latest_version( $addon_id = false, $flush = true ) { - $this->_logger->entrance(); - - /** - * @since 1.1.7.3 Check for plugin updates from Freemius only if opted-in. - * @since 1.1.7.4 Also check updates for add-ons. - */ - if ( ! $this->is_registered() && - ! $this->_is_addon_id( $addon_id ) - ) { - return false; - } - - $tag = $this->get_api_site_or_plugin_scope()->get( - $this->_get_latest_version_endpoint( $addon_id, 'json' ), - $flush - ); - - $latest_version = ( is_object( $tag ) && isset( $tag->version ) ) ? $tag->version : 'couldn\'t get'; - - $this->_logger->departure( 'Latest version ' . $latest_version ); - - return ( is_object( $tag ) && isset( $tag->version ) ) ? $tag : false; - } - - #---------------------------------------------------------------------------------- - #region Download Plugin - #---------------------------------------------------------------------------------- - - /** - * Download latest plugin version, based on plan. - * - * Not like _download_latest(), this will redirect the page - * to secure download url to prevent dual download (from FS to WP server, - * and then from WP server to the client / browser). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param bool|number $plugin_id - * - * @uses FS_Api - * @uses wp_redirect() - */ - private function _download_latest_directly( $plugin_id = false ) { - $this->_logger->entrance(); - - wp_redirect( $this->_get_latest_download_api_url( $plugin_id ) ); - } - - /** - * Get latest plugin FS API download URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param bool|number $plugin_id - * - * @return string - */ - private function _get_latest_download_api_url( $plugin_id = false ) { - $this->_logger->entrance(); - - return $this->get_api_site_scope()->get_signed_url( - $this->_get_latest_version_endpoint( $plugin_id, 'zip' ) - ); - } - - /** - * Get payment invoice URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - * - * @param bool|number $payment_id - * - * @return string - */ - function _get_invoice_api_url( $payment_id = false ) { - $this->_logger->entrance(); - - return $this->get_api_user_scope()->get_signed_url( - "/payments/{$payment_id}/invoice.pdf" - ); - } - - /** - * Get latest plugin download link. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string $label - * @param bool|number $plugin_id - * - * @return string - */ - private function _get_latest_download_link( $label, $plugin_id = false ) { - return sprintf( - '<a target="_blank" href="%s">%s</a>', - $this->_get_latest_download_local_url( $plugin_id ), - $label - ); - } - - /** - * Get latest plugin download local URL. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param bool|number $plugin_id - * - * @return string - */ - function _get_latest_download_local_url( $plugin_id = false ) { - // Add timestamp to protect from caching. - $params = array( 'ts' => WP_FS__SCRIPT_START_TIME ); - - if ( ! empty( $plugin_id ) ) { - $params['plugin_id'] = $plugin_id; - } - - return $this->get_account_url( 'download_latest', $params ); - } - - #endregion Download Plugin ------------------------------------------------------------------ - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @uses FS_Api - * - * @param bool $background Hints the method if it's a background updates check. If false, it means that - * was initiated by the admin. - * @param bool|number $plugin_id - * @param bool $flush Since 1.1.7.3 - */ - private function _check_updates( $background = false, $plugin_id = false, $flush = true ) { - $this->_logger->entrance(); - - // Check if there's a newer version for download. - $new_version = $this->_fetch_newer_version( $plugin_id, $flush ); - - $update = null; - if ( is_object( $new_version ) ) { - $update = new FS_Plugin_Tag( $new_version ); - - if ( ! $background ) { - $this->_admin_notices->add( - sprintf( - __fs( 'version-x-released', $this->_slug ) . ' ' . __fs( 'please-download-x', $this->_slug ), - $update->version, - sprintf( - '<a href="%s" target="_blank">%s</a>', - $this->get_account_url( 'download_latest' ), - sprintf( __fs( 'latest-x-version', $this->_slug ), $this->_site->plan->title ) - ) - ), - __fs( 'new', $this->_slug ) . '!' - ); - } - } else if ( false === $new_version && ! $background ) { - $this->_admin_notices->add( - __fs( 'you-have-latest', $this->_slug ), - __fs( 'you-are-good', $this->_slug ) - ); - } - - $this->_store_update( $update, true, $plugin_id ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool $flush Since 1.1.7.3 add 24 hour cache by default. - * - * @return FS_Plugin[] - * - * @uses FS_Api - */ - private function _sync_addons( $flush = false ) { - $this->_logger->entrance(); - - $api = $this->get_api_site_or_plugin_scope(); - - /** - * @since 1.2.1 - * - * If there's a cached version of the add-ons and not asking - * for a flush, just use the currently stored add-ons. - */ - if ( ! $flush && $api->is_cached( '/addons.json?enriched=true' ) ) { - $addons = self::get_all_addons(); - - return $addons[ $this->_plugin->id ]; - } - - $result = $api->get( '/addons.json?enriched=true', $flush ); - - $addons = array(); - if ( $this->is_api_result_object( $result, 'plugins' ) && - is_array( $result->plugins ) - ) { - for ( $i = 0, $len = count( $result->plugins ); $i < $len; $i ++ ) { - $addons[ $i ] = new FS_Plugin( $result->plugins[ $i ] ); - } - - $this->_store_addons( $addons, true ); - } - - return $addons; - } - - /** - * Handle user email update. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * @uses FS_Api - * - * @param string $new_email - * - * @return object - */ - private function _update_email( $new_email ) { - $this->_logger->entrance(); - - - $api = $this->get_api_user_scope(); - $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,email,is_verified", 'put', array( - 'email' => $new_email, - 'after_email_confirm_url' => $this->_get_admin_page_url( - 'account', - array( 'fs_action' => 'sync_user' ) - ), - ) ); - - if ( ! isset( $user->error ) ) { - $this->_user->email = $user->email; - $this->_user->is_verified = $user->is_verified; - $this->_store_user(); - } else { - // handle different error cases. - - } - - return $user; - } - - #---------------------------------------------------------------------------------- - #region API Error Handling - #---------------------------------------------------------------------------------- - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * - * @param mixed $result - * - * @return bool Is API result contains an error. - */ - private function is_api_error( $result ) { - return FS_Api::is_api_error( $result ); - } - - /** - * Checks if given API result is a non-empty and not an error object. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $result - * @param string|null $required_property Optional property we want to verify that is set. - * - * @return bool - */ - function is_api_result_object( $result, $required_property = null ) { - return FS_Api::is_api_result_object( $result, $required_property ); - } - - /** - * Checks if given API result is a non-empty entity object with non-empty ID. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $result - * - * @return bool - */ - private function is_api_result_entity( $result ) { - return FS_Api::is_api_result_entity( $result ); - } - - #endregion - - /** - * Make sure a given argument is an array of a specific type. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $array - * @param string $class - * - * @return bool - */ - private function is_array_instanceof( $array, $class ) { - return ( is_array( $array ) && ( empty( $array ) || $array[0] instanceof $class ) ); - } - - /** - * Start install ownership change. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * @uses FS_Api - * - * @param string $candidate_email - * - * @return bool Is ownership change successfully initiated. - */ - private function init_change_owner( $candidate_email ) { - $this->_logger->entrance(); - - $api = $this->get_api_site_scope(); - $result = $api->call( "/users/{$this->_user->id}.json", 'put', array( - 'email' => $candidate_email, - 'after_confirm_url' => $this->_get_admin_page_url( - 'account', - array( 'fs_action' => 'change_owner' ) - ), - ) ); - - return ! $this->is_api_error( $result ); - } - - /** - * Handle install ownership change. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * @uses FS_Api - * - * @return bool Was ownership change successfully complete. - */ - private function complete_change_owner() { - $this->_logger->entrance(); - - $site_result = $this->get_api_site_scope( true )->get(); - $site = new FS_Site( $site_result ); - $this->_site = $site; - - $user = new FS_User(); - $user->id = fs_request_get( 'user_id' ); - - // Validate install's user and given user. - if ( $user->id != $this->_site->user_id ) { - return false; - } - - $user->public_key = fs_request_get( 'user_public_key' ); - $user->secret_key = fs_request_get( 'user_secret_key' ); - - // Fetch new user information. - $this->_user = $user; - $user_result = $this->get_api_user_scope( true )->get(); - $user = new FS_User( $user_result ); - $this->_user = $user; - - $this->_set_account( $user, $site ); - - return true; - } - - /** - * Handle user name update. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * @uses FS_Api - * - * @return object - */ - private function update_user_name() { - $this->_logger->entrance(); - $name = fs_request_get( 'fs_user_name_' . $this->_slug, '' ); - - $api = $this->get_api_user_scope(); - $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,first,last", 'put', array( - 'name' => $name, - ) ); - - if ( ! isset( $user->error ) ) { - $this->_user->first = $user->first; - $this->_user->last = $user->last; - $this->_store_user(); - } else { - // handle different error cases. - - } - - return $user; - } - - /** - * Verify user email. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * @uses FS_Api - */ - private function verify_email() { - $this->_handle_account_user_sync(); - - if ( $this->_user->is_verified() ) { - return; - } - - $api = $this->get_api_site_scope(); - $result = $api->call( "/users/{$this->_user->id}/verify.json", 'put', array( - 'after_email_confirm_url' => $this->_get_admin_page_url( - 'account', - array( 'fs_action' => 'sync_user' ) - ) - ) ); - - if ( ! isset( $result->error ) ) { - $this->_admin_notices->add( sprintf( - __fs( 'verification-email-sent-message', $this->_slug ), - sprintf( '<a href="mailto:%1s">%2s</a>', esc_url( $this->_user->email ), $this->_user->email ) - ) ); - } else { - // handle different error cases. - - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.2 - * - * @param array $params - * - * @return string - */ - private function get_activation_url( $params = array() ) { - return $this->apply_filters( 'connect_url', $this->_get_admin_page_url( '', $params ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param array $params - * - * @return string - */ - function get_reconnect_url( $params = array() ) { - $params['fs_action'] = 'reset_anonymous_mode'; - $params['fs_slug'] = $this->_slug; - - return $this->apply_filters( 'connect_url', $this->_get_admin_page_url( '', $params ) ); - } - - /** - * Get the URL of the page that should be loaded after the user connect or skip in the opt-in screen. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param string $filter Filter name. - * - * @return string - */ - function get_after_activation_url( $filter ) { - $first_time_path = $this->_menu->get_first_time_path(); - - return $this->apply_filters( - $filter, - empty( $first_time_path ) ? - $this->_get_admin_page_url() : - $first_time_path - ); - } - - /** - * Handle account page updates / edits / actions. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - */ - private function _handle_account_edits() { - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); - $action = fs_get_action(); - - switch ( $action ) { - case 'delete_account': - check_admin_referer( $action ); - - if ( $plugin_id == $this->get_id() ) { - $this->delete_account_event(); - - // Clear user and site. - $this->_site = null; - $this->_user = null; - - fs_redirect( $this->get_activation_url() ); - } else { - if ( $this->is_addon_activated( $plugin_id ) ) { - $fs_addon = self::get_instance_by_id( $plugin_id ); - $fs_addon->delete_account_event(); - - fs_redirect( $this->_get_admin_page_url( 'account' ) ); - } - } - - return; - - case 'downgrade_account': - check_admin_referer( $action ); - - if ( $plugin_id == $this->get_id() ) { - $this->_downgrade_site(); - } else if ( $this->is_addon_activated( $plugin_id ) ) { - $fs_addon = self::get_instance_by_id( $plugin_id ); - $fs_addon->_downgrade_site(); - } - - return; - - case 'activate_license': - check_admin_referer( $action ); - - if ( $plugin_id == $this->get_id() ) { - $this->_activate_license(); - } else { - if ( $this->is_addon_activated( $plugin_id ) ) { - $fs_addon = self::get_instance_by_id( $plugin_id ); - $fs_addon->_activate_license(); - } - } - - return; - - case 'deactivate_license': - check_admin_referer( $action ); - - if ( $plugin_id == $this->get_id() ) { - $this->_deactivate_license(); - } else { - if ( $this->is_addon_activated( $plugin_id ) ) { - $fs_addon = self::get_instance_by_id( $plugin_id ); - $fs_addon->_deactivate_license(); - } - } - - return; - - case 'check_updates': - check_admin_referer( $action ); - $this->_check_updates(); - - return; - - case 'change_owner': - $state = fs_request_get( 'state', 'init' ); - switch ( $state ) { - case 'init': - $candidate_email = fs_request_get( 'candidate_email', '' ); - - if ( $this->init_change_owner( $candidate_email ) ) { - $this->_admin_notices->add( sprintf( __fs( 'change-owner-request-sent-x', $this->_slug ), '<b>' . $this->_user->email . '</b>' ) ); - } - break; - case 'owner_confirmed': - $candidate_email = fs_request_get( 'candidate_email', '' ); - - $this->_admin_notices->add( sprintf( __fs( 'change-owner-request_owner-confirmed', $this->_slug ), '<b>' . $candidate_email . '</b>' ) ); - break; - case 'candidate_confirmed': - if ( $this->complete_change_owner() ) { - $this->_admin_notices->add_sticky( - sprintf( __fs( 'change-owner-request_candidate-confirmed', $this->_slug ), '<b>' . $this->_user->email . '</b>' ), - 'ownership_changed', - __fs( 'congrats', $this->_slug ) . '!' - ); - } else { - // @todo Handle failed ownership change message. - } - break; - } - - return; - - case 'update_email': - check_admin_referer( 'update_email' ); - - $new_email = fs_request_get( 'fs_email_' . $this->_slug, '' ); - $result = $this->_update_email( $new_email ); - - if ( isset( $result->error ) ) { - switch ( $result->error->code ) { - case 'user_exist': - $this->_admin_notices->add( - __fs( 'user-exist-message', $this->_slug ) . ' ' . - sprintf( __fs( 'user-exist-message_ownership', $this->_slug ), '<b>' . $new_email . '</b>' ) . - sprintf( - '<a style="margin-left: 10px;" href="%s"><button class="button button-primary">%s ➜</button></a>', - $this->get_account_url( 'change_owner', array( - 'state' => 'init', - 'candidate_email' => $new_email - ) ), - __fs( 'change-ownership', $this->_slug ) - ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - break; - } - } else { - $this->_admin_notices->add( __fs( 'email-updated-message', $this->_slug ) ); - } - - return; - - case 'update_user_name': - check_admin_referer( 'update_user_name' ); - - $result = $this->update_user_name(); - - if ( isset( $result->error ) ) { - $this->_admin_notices->add( - __fs( 'name-update-failed-message', $this->_slug ), - __fs( 'oops', $this->_slug ) . '...', - 'error' - ); - } else { - $this->_admin_notices->add( __fs( 'name-updated-message', $this->_slug ) ); - } - - return; - - #region Actions that might be called from external links (e.g. email) - - case 'cancel_trial': - if ( $plugin_id == $this->get_id() ) { - $this->_cancel_trial(); - } else { - if ( $this->is_addon_activated( $plugin_id ) ) { - $fs_addon = self::get_instance_by_id( $plugin_id ); - $fs_addon->_cancel_trial(); - } - } - - return; - - case 'verify_email': - $this->verify_email(); - - return; - - case 'sync_user': - $this->_handle_account_user_sync(); - - return; - - case $this->_slug . '_sync_license': - $this->_sync_license(); - - return; - - case 'download_latest': - $this->_download_latest_directly( $plugin_id ); - - return; - - #endregion - } - - if ( WP_FS__IS_POST_REQUEST ) { - $properties = array( 'site_secret_key', 'site_id', 'site_public_key' ); - foreach ( $properties as $p ) { - if ( 'update_' . $p === $action ) { - check_admin_referer( $action ); - - $this->_logger->log( $action ); - - $site_property = substr( $p, strlen( 'site_' ) ); - $site_property_value = fs_request_get( 'fs_' . $p . '_' . $this->_slug, '' ); - $this->get_site()->{$site_property} = $site_property_value; - - // Store account after modification. - $this->_store_site(); - - $this->do_action( 'account_property_edit', 'site', $site_property, $site_property_value ); - - $this->_admin_notices->add( sprintf( - __fs( 'x-updated', $this->_slug ), - '<b>' . str_replace( '_', ' ', $p ) . '</b>' ) ); - - return; - } - } - } - } - - /** - * Account page resources load. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - */ - function _account_page_load() { - $this->_logger->entrance(); - - $this->_logger->info( var_export( $_REQUEST, true ) ); - - fs_enqueue_local_style( 'fs_account', '/admin/account.css' ); - - if ( $this->has_addons() ) { - wp_enqueue_script( 'plugin-install' ); - add_thickbox(); - - function fs_addons_body_class( $classes ) { - $classes .= ' plugins-php'; - - return $classes; - } - - add_filter( 'admin_body_class', 'fs_addons_body_class' ); - } - - if ( $this->has_paid_plan() && - ! $this->has_any_license() && - ! $this->is_sync_executed() && - $this->is_tracking_allowed() - ) { - /** - * If no licenses found and no sync job was executed during the last 24 hours, - * just execute the sync job right away (blocking execution). - * - * @since 1.1.7.3 - */ - $this->run_manual_sync(); - } - - $this->_handle_account_edits(); - - $this->do_action( 'account_page_load_before_departure' ); - } - - /** - * Render account page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - */ - function _account_page_render() { - $this->_logger->entrance(); - - $vars = array( 'slug' => $this->_slug ); - if ( 'billing' === fs_request_get( 'tab' ) ) { - fs_require_once_template( 'billing.php', $vars ); - } else { - fs_require_once_template( 'account.php', $vars ); - } - } - - /** - * Render account connect page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - function _connect_page_render() { - $this->_logger->entrance(); - - $vars = array( 'slug' => $this->_slug ); - fs_require_once_template( 'connect.php', $vars ); - } - - /** - * Load required resources before add-ons page render. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - */ - function _addons_page_load() { - $this->_logger->entrance(); - - fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); - - wp_enqueue_script( 'plugin-install' ); - add_thickbox(); - - function fs_addons_body_class( $classes ) { - $classes .= ' plugins-php'; - - return $classes; - } - - add_filter( 'admin_body_class', 'fs_addons_body_class' ); - - if ( ! $this->is_registered() && $this->is_org_repo_compliant() ) { - $this->_admin_notices->add( - sprintf( __fs( 'addons-info-external-message', $this->_slug ), '<b>' . $this->get_plugin_name() . '</b>' ), - __fs( 'heads-up', $this->_slug ), - 'update-nag' - ); - } - } - - /** - * Render add-ons page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - */ - function _addons_page_render() { - $this->_logger->entrance(); - - $vars = array( 'slug' => $this->_slug ); - fs_require_once_template( 'add-ons.php', $vars ); - } - - /* Pricing & Upgrade - ------------------------------------------------------------------------------------------------------------------*/ - /** - * Render pricing page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - */ - function _pricing_page_render() { - $this->_logger->entrance(); - - $vars = array( 'slug' => $this->_slug ); - - if ( 'true' === fs_request_get( 'checkout', false ) ) { - fs_require_once_template( 'checkout.php', $vars ); - } else { - fs_require_once_template( 'pricing.php', $vars ); - } - } - - #---------------------------------------------------------------------------------- - #region Contact Us - #---------------------------------------------------------------------------------- - - /** - * Render contact-us page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - */ - function _contact_page_render() { - $this->_logger->entrance(); - - $vars = array( 'slug' => $this->_slug ); - fs_require_once_template( 'contact.php', $vars ); - } - - #endregion ------------------------------------------------------------------------ - - /** - * Hide all admin notices to prevent distractions. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @uses remove_all_actions() - */ - private static function _hide_admin_notices() { - remove_all_actions( 'admin_notices' ); - remove_all_actions( 'network_admin_notices' ); - remove_all_actions( 'all_admin_notices' ); - remove_all_actions( 'user_admin_notices' ); - } - - static function _clean_admin_content_section_hook() { - self::_hide_admin_notices(); - - // Hide footer. - echo '<style>#wpfooter { display: none !important; }</style>'; - } - - /** - * Attach to admin_head hook to hide all admin notices. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - */ - static function _clean_admin_content_section() { - add_action( 'admin_head', 'Freemius::_clean_admin_content_section_hook' ); - } - - /* CSS & JavaScript - ------------------------------------------------------------------------------------------------------------------*/ - /* function _enqueue_script($handle, $src) { - $url = plugins_url( substr( WP_FS__DIR_JS, strlen( $this->_plugin_dir_path ) ) . '/assets/js/' . $src ); - - $this->_logger->entrance( 'script = ' . $url ); - - wp_enqueue_script( $handle, $url ); - }*/ - - /* SDK - ------------------------------------------------------------------------------------------------------------------*/ - private $_user_api; - - /** - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @param bool $flush - * - * @return FS_Api - */ - function get_api_user_scope( $flush = false ) { - if ( ! isset( $this->_user_api ) || $flush ) { - $this->_user_api = FS_Api::instance( - $this->_slug, - 'user', - $this->_user->id, - $this->_user->public_key, - ! $this->is_live(), - $this->_user->secret_key - ); - } - - return $this->_user_api; - } - - private $_site_api; - - /** - * - * @author Vova Feldman (@svovaf) - * @since 1.0.2 - * - * @param bool $flush - * - * @return FS_Api - */ - function get_api_site_scope( $flush = false ) { - if ( ! isset( $this->_site_api ) || $flush ) { - $this->_site_api = FS_Api::instance( - $this->_slug, - 'install', - $this->_site->id, - $this->_site->public_key, - ! $this->is_live(), - $this->_site->secret_key - ); - } - - return $this->_site_api; - } - - private $_plugin_api; - - /** - * Get plugin public API scope. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return FS_Api - */ - function get_api_plugin_scope() { - if ( ! isset( $this->_plugin_api ) ) { - $this->_plugin_api = FS_Api::instance( - $this->_slug, - 'plugin', - $this->_plugin->id, - $this->_plugin->public_key, - ! $this->is_live() - ); - } - - return $this->_plugin_api; - } - - /** - * Get site API scope object (fallback to public plugin scope when not registered). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @return FS_Api - */ - function get_api_site_or_plugin_scope() { - return $this->is_registered() ? - $this->get_api_site_scope() : - $this->get_api_plugin_scope(); - } - - /** - * Show trial promotional notice (if any trial exist). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param $plans - */ - function _check_for_trial_plans( $plans ) { - $this->_storage->has_trial_plan = FS_Plan_Manager::instance()->has_trial_plan( $plans ); - } - - /** - * During trial promotion the "upgrade" submenu item turns to - * "start trial" to encourage the trial. Since we want to keep - * the same menu item handler and there's no robust way to - * add new arguments to the menu item link's querystring, - * use JavaScript to find the menu item and update the href of - * the link. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - */ - function _fix_start_trial_menu_item_url() { - $template_args = array( 'slug' => $this->_slug ); - fs_require_template( 'add-trial-to-pricing.php', $template_args ); - } - - /** - * Show trial promotional notice (if any trial exist). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool If trial notice added. - */ - function _add_trial_notice() { - if ( ! current_user_can( 'activate_plugins' ) ) { - return false; - } - - if ( ! $this->is_user_in_admin() ) { - return false; - } - - // Check if trial message is already shown. - if ( $this->_admin_notices->has_sticky( 'trial_promotion' ) ) { - add_action( 'admin_footer', array( &$this, '_fix_start_trial_menu_item_url' ) ); - - $this->_menu->add_counter_to_menu_item( 1, 'fs-trial' ); - - return false; - } - - if ( $this->is_premium() && ! WP_FS__DEV_MODE ) { - // Don't show trial if running the premium code, unless running in DEV mode. - return false; - } - - if ( ! $this->has_trial_plan() ) { - // No plans with trial. - return false; - } - - if ( ! $this->apply_filters( 'show_trial', true ) ) { - // Developer explicitly asked not to show the trial promo. - return false; - } - - if ( $this->is_registered() ) { - // Check if trial already utilized. - if ( $this->_site->is_trial_utilized() ) { - return false; - } - - if ( $this->is_paying_or_trial() ) { - // Don't show trial if paying or already in trial. - return false; - } - } - - if ( $this->is_activation_mode() || $this->is_pending_activation() ) { - // If not yet opted-in/skipped, or pending activation, don't show trial. - return false; - } - - $last_time_trial_promotion_shown = $this->_storage->get( 'trial_promotion_shown', false ); - $was_promotion_shown_before = ( false !== $last_time_trial_promotion_shown ); - - // Show promotion if never shown before and 24 hours after initial activation with FS. - if ( ! $was_promotion_shown_before && - $this->_storage->install_timestamp > ( time() - WP_FS__TIME_24_HOURS_IN_SEC ) - ) { - return false; - } - - // OR if promotion was shown before, try showing it every 30 days. - if ( $was_promotion_shown_before && - 30 * WP_FS__TIME_24_HOURS_IN_SEC > time() - $last_time_trial_promotion_shown - ) { - return false; - } - - $trial_period = $this->_trial_days; - $require_payment = $this->_is_trial_require_payment; - $trial_url = $this->get_trial_url(); - $plans_string = strtolower( __fs( 'awesome', $this->_slug ) ); - - if ( $this->is_registered() ) { - // If opted-in, override trial with up to date data from API. - $trial_plans = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); - $trial_plans_count = count( $trial_plans ); - - if ( 0 === $trial_plans_count ) { - // If there's no plans with a trial just exit. - return false; - } - - /** - * @var FS_Plugin_Plan $paid_plan - */ - $paid_plan = $trial_plans[0]; - $require_payment = $paid_plan->is_require_subscription; - $trial_period = $paid_plan->trial_period; - - $total_paid_plans = count( $this->_plans ) - ( FS_Plan_Manager::instance()->has_free_plan( $this->_plans ) ? 1 : 0 ); - - if ( $total_paid_plans !== $trial_plans_count ) { - // Not all paid plans have a trial - generate a string of those that have it. - for ( $i = 0; $i < $trial_plans_count; $i ++ ) { - $plans_string .= sprintf( - '<a href="%s">%s</a>', - $trial_url, - $trial_plans[ $i ]->title - ); - - if ( $i < $trial_plans_count - 2 ) { - $plans_string .= ', '; - } else if ( $i == $trial_plans_count - 2 ) { - $plans_string .= ' and '; - } - } - } - } - - $message = sprintf( - __fs( 'hey', $this->_slug ) . '! ' . __fs( 'trial-x-promotion-message', $this->_slug ), - sprintf( '<b>%s</b>', $this->get_plugin_name() ), - $plans_string, - $trial_period - ); - - // "No Credit-Card Required" or "No Commitment for N Days". - $cc_string = $require_payment ? - sprintf( __fs( 'no-commitment-for-x-days', $this->_slug ), $trial_period ) : - __fs( 'no-cc-required', $this->_slug ) . '!'; - - - // Start trial button. - $button = ' ' . sprintf( - '<a style="margin-left: 10px; vertical-align: super;" href="%s"><button class="button button-primary">%s ➜</button></a>', - $trial_url, - __fs( 'start-free-trial', $this->_slug ) - ); - - $this->_admin_notices->add_sticky( - $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string} {$button}" ), - 'trial_promotion', - '', - 'promotion' - ); - - $this->_storage->trial_promotion_shown = WP_FS__SCRIPT_START_TIME; - - return true; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - */ - function _enqueue_common_css() { - if ( $this->has_paid_plan() && ! $this->is_paying() ) { - // Add basic CSS for admin-notices and menu-item colors. - fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); - } - } - - /* Action Links - ------------------------------------------------------------------------------------------------------------------*/ - private $_action_links_hooked = false; - private $_action_links = array(); - - /** - * Hook to plugin action links filter. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - */ - private function hook_plugin_action_links() { - $this->_logger->entrance(); - - $this->_action_links_hooked = true; - - $this->_logger->log( 'Adding action links hooks.' ); - - // Add action link to settings page. - add_filter( 'plugin_action_links_' . $this->_plugin_basename, array( - &$this, - '_modify_plugin_action_links_hook' - ), WP_FS__DEFAULT_PRIORITY, 2 ); - add_filter( 'network_admin_plugin_action_links_' . $this->_plugin_basename, array( - &$this, - '_modify_plugin_action_links_hook' - ), WP_FS__DEFAULT_PRIORITY, 2 ); - } - - /** - * Add plugin action link. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @param $label - * @param $url - * @param bool $external - * @param int $priority - * @param bool $key - */ - function add_plugin_action_link( $label, $url, $external = false, $priority = WP_FS__DEFAULT_PRIORITY, $key = false ) { - $this->_logger->entrance(); - - if ( ! isset( $this->_action_links[ $priority ] ) ) { - $this->_action_links[ $priority ] = array(); - } - - if ( false === $key ) { - $key = preg_replace( "/[^A-Za-z0-9 ]/", '', strtolower( $label ) ); - } - - $this->_action_links[ $priority ][] = array( - 'label' => $label, - 'href' => $url, - 'key' => $key, - 'external' => $external - ); - } - - /** - * Adds Upgrade and Add-Ons links to the main Plugins page link actions collection. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - */ - function _add_upgrade_action_link() { - $this->_logger->entrance(); - - if ( $this->is_registered() ) { - if ( ! $this->is_paying() && $this->has_paid_plan() ) { - $this->add_plugin_action_link( - __fs( 'upgrade', $this->_slug ), - $this->get_upgrade_url(), - false, - 7, - 'upgrade' - ); - } - - if ( $this->has_addons() ) { - $this->add_plugin_action_link( - __fs( 'add-ons', $this->_slug ), - $this->_get_admin_page_url( 'addons' ), - false, - 9, - 'addons' - ); - } - } - } - - /** - * Adds "Activate License" or "Change License" link to the main Plugins page link actions collection. - * - * @author Leo Fajardo (@leorw) - * @since 1.1.9 - */ - function _add_license_action_link() { - $this->_logger->entrance(); - - if ( $this->is_free_plan() && $this->is_addon() ) { - return; - } - - if ( ! $this->is_ajax() ) { - // Inject license activation dialog UI and client side code. - add_action( 'admin_footer', array( &$this, '_add_license_activation_dialog_box' ) ); - } - - $link_text = __fs( - $this->is_free_plan() ? 'activate-license' : 'change-license', - $this->_slug - ); - - $this->add_plugin_action_link( - $link_text, - '#', - false, - 11, - ( 'activate-license ' . $this->_slug ) - ); - } - - /** - * Adds "Opt in" or "Opt out" link to the main "Plugins" page link actions collection. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.1.5 - */ - function _add_tracking_links() { - if ( ! current_user_can( 'activate_plugins' ) ) { - return; - } - - $this->_logger->entrance(); - - if ( ! $this->is_enable_anonymous() ) { - // Don't allow to opt-out if anonymous mode is disabled. - return; - } - - if ( ! $this->is_free_plan() ) { - // Don't allow to opt-out if running in paid plan. - return; - } - - if ( $this->add_ajax_action( 'stop_tracking', array( &$this, '_stop_tracking_callback' ) ) ) { - return; - } - - if ( $this->add_ajax_action( 'allow_tracking', array( &$this, '_allow_tracking_callback' ) ) ) { - return; - } - - if ( fs_request_is_action_secure( $this->_slug . '_reconnect' ) ) { - if ( ! $this->is_registered() && $this->is_anonymous() ) { - $this->connect_again(); - - return; - } - } - - $url = '#'; - - if ( $this->is_registered() ) { - if ( $this->is_tracking_allowed() ) { - $link_text_id = 'opt-out'; - } else { - $link_text_id = 'opt-in'; - } - - add_action( 'admin_footer', array( &$this, '_add_optout_dialog' ) ); - } else { - $link_text_id = 'opt-in'; - - $params = ! $this->is_anonymous() ? - array() : - array( - 'nonce' => wp_create_nonce( $this->_slug . '_reconnect' ), - 'fs_action' => ( $this->_slug . '_reconnect' ), - ); - - $url = $this->get_activation_url( $params ); - } - - $this->add_plugin_action_link( - __fs( $link_text_id, $this->_slug ), - $url, - false, - 13, - "opt-in-or-opt-out {$this->_slug}" - ); - } - - /** - * Get the URL of the page that should be loaded right after the plugin activation. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.4 - * - * @return string - */ - function get_after_plugin_activation_redirect_url() { - $url = false; - $plugin_fs = false; - - if ( ! $this->is_addon() ) { - $first_time_path = $this->_menu->get_first_time_path(); - $plugin_fs = $this; - $url = $plugin_fs->is_activation_mode() ? - $plugin_fs->get_activation_url() : - ( empty( $first_time_path ) ? - $this->_get_admin_page_url() : - $first_time_path ); - } else { - if ( $this->is_parent_plugin_installed() ) { - $plugin_fs = self::get_parent_instance(); - } - - if ( is_object( $plugin_fs ) ) { - if ( ! $plugin_fs->is_registered() ) { - // Forward to parent plugin connect when parent not registered. - $url = $plugin_fs->get_activation_url(); - } else { - // Forward to account page. - $url = $plugin_fs->_get_admin_page_url( 'account' ); - } - } - } - - return $url; - } - - /** - * Forward page to activation page. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - */ - function _redirect_on_activation_hook() { - $url = $this->get_after_plugin_activation_redirect_url(); - - if ( is_string( $url ) ) { - fs_redirect( $url ); - } - } - - /** - * Modify plugin's page action links collection. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @param array $links - * @param $file - * - * @return array - */ - function _modify_plugin_action_links_hook( $links, $file ) { - $this->_logger->entrance(); - - $passed_deactivate = false; - $deactivate_link = ''; - $before_deactivate = array(); - $after_deactivate = array(); - foreach ( $links as $key => $link ) { - if ( 'deactivate' === $key ) { - $deactivate_link = $link; - $passed_deactivate = true; - continue; - } - - if ( ! $passed_deactivate ) { - $before_deactivate[ $key ] = $link; - } else { - $after_deactivate[ $key ] = $link; - } - } - - ksort( $this->_action_links ); - - foreach ( $this->_action_links as $new_links ) { - foreach ( $new_links as $link ) { - $before_deactivate[ $link['key'] ] = '<a href="' . $link['href'] . '"' . ( $link['external'] ? ' target="_blank"' : '' ) . '>' . $link['label'] . '</a>'; - } - } - - if ( ! empty( $deactivate_link ) ) { - if ( ! $this->is_paying_or_trial() || $this->is_premium() ) { - /* - * This HTML element is used to identify the correct plugin when attaching an event to its Deactivate link. - * - * If user is paying or in trial and have the free version installed, - * assume that the deactivation is for the upgrade process, so this is not needed. - */ - $deactivate_link .= '<i class="fs-slug" data-slug="' . $this->_slug . '"></i>'; - } - - // Append deactivation link. - $before_deactivate['deactivate'] = $deactivate_link; - } - - return array_merge( $before_deactivate, $after_deactivate ); - } - - /** - * Adds admin message. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $message - * @param string $title - * @param string $type - */ - function add_admin_message( $message, $title = '', $type = 'success' ) { - $this->_admin_notices->add( $message, $title, $type ); - } - - /** - * Adds sticky admin message. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.0 - * - * @param string $message - * @param string $id - * @param string $title - * @param string $type - */ - function add_sticky_admin_message( $message, $id, $title = '', $type = 'success' ) { - $this->_admin_notices->add_sticky( $message, $id, $title, $type ); - } - - /** - * Helper function that returns the final steps for the upgrade completion. - * - * If the module is already running the premium code, returns an empty string. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $plan_title - * - * @return string - */ - private function get_complete_upgrade_instructions( $plan_title = '' ) { - if ( $this->is_premium() ) { - return ''; - } - - if ( empty( $plan_title ) ) { - $plan_title = $this->_site->plan->title; - } - - // @since 1.2.1.5 The free version is auto deactivated. - $deactivation_step = version_compare( $this->version, '1.2.1.5', '<' ) ? - ( '<li>' . __fs( 'deactivate-free-version', $this->_slug ) . '.</li>' ) : - ''; - - return sprintf( - ' %s: <ol><li>%s.</li>%s<li>%s (<a href="%s" target="_blank">%s</a>).</li></ol>', - __fs( 'follow-steps-to-complete-upgrade', $this->_slug ), - $this->_get_latest_download_link( sprintf( - __fs( 'download-latest-x-version', $this->_slug ), - $plan_title - ) ), - $deactivation_step, - __fs( 'upload-and-activate', $this->_slug ), - '//bit.ly/upload-wp-plugin', - __fs( 'howto-upload-activate', $this->_slug ) - ); - } - - /* Plugin Auto-Updates (@since 1.0.4) - ------------------------------------------------------------------------------------------------------------------*/ - /** - * @var string[] - */ - private static $_auto_updated_plugins; - - /** - * @todo TEST IF IT WORKS!!! - * - * Include plugins for automatic updates based on stored settings. - * - * @see http://wordpress.stackexchange.com/questions/131394/how-do-i-exclude-plugins-from-getting-automatically-updated/131404#131404 - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool $update Whether to update (not used for plugins) - * @param object $item The plugin's info - * - * @return bool - */ - static function _include_plugins_in_auto_update( $update, $item ) { - // Before version 3.8.2 the $item was the file name of the plugin, - // while in 3.8.2 statistics were added (https://core.trac.wordpress.org/changeset/27905). - $by_slug = ( (int) str_replace( '.', '', get_bloginfo( 'version' ) ) >= 382 ); - - if ( ! isset( self::$_auto_updated_plugins ) ) { - $plugins = self::$_accounts->get_option( 'plugins', array() ); - - $identifiers = array(); - foreach ( $plugins as $p ) { - /** - * @var FS_Plugin $p - */ - if ( isset( $p->auto_update ) && $p->auto_update ) { - $identifiers[] = ( $by_slug ? $p->slug : plugin_basename( $p->file ) ); - } - } - - self::$_auto_updated_plugins = $identifiers; - } - - if ( in_array( $by_slug ? $item->slug : $item, self::$_auto_updated_plugins ) ) { - return true; - } - - // Pass update decision to next filters - return $update; - } - - #---------------------------------------------------------------------------------- - #region Versioning - #---------------------------------------------------------------------------------- - - /** - * Check if Freemius in SDK upgrade mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_sdk_upgrade_mode() { - return isset( $this->_storage->sdk_upgrade_mode ) ? - $this->_storage->sdk_upgrade_mode : - false; - } - - /** - * Turn SDK upgrade mode off. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function set_sdk_upgrade_complete() { - $this->_storage->sdk_upgrade_mode = false; - } - - /** - * Check if plugin upgrade mode. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_plugin_upgrade_mode() { - return isset( $this->_storage->plugin_upgrade_mode ) ? - $this->_storage->plugin_upgrade_mode : - false; - } - - /** - * Turn plugin upgrade mode off. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function set_plugin_upgrade_complete() { - $this->_storage->plugin_upgrade_mode = false; - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Permissions - #---------------------------------------------------------------------------------- - - /** - * Check if specific permission requested. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $permission - * - * @return bool - */ - function is_permission_requested( $permission ) { - return isset( $this->_permissions[ $permission ] ) && ( true === $this->_permissions[ $permission ] ); - } - - #endregion - - #---------------------------------------------------------------------------------- - #region Marketing - #---------------------------------------------------------------------------------- - - /** - * Check if current user purchased any other plugins before. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function has_purchased_before() { - // TODO: Implement has_purchased_before() method. - throw new Exception( 'not implemented' ); - } - - /** - * Check if current user classified as an agency. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_agency() { - // TODO: Implement is_agency() method. - throw new Exception( 'not implemented' ); - } - - /** - * Check if current user classified as a developer. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_developer() { - // TODO: Implement is_developer() method. - throw new Exception( 'not implemented' ); - } - - /** - * Check if current user classified as a business. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_business() { - // TODO: Implement is_business() method. - throw new Exception( 'not implemented' ); - } - - #endregion - } +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + // "final class" + class Freemius extends Freemius_Abstract { + /** + * SDK Version + * + * @var string + */ + public $version = WP_FS__SDK_VERSION; + + #region Plugin Info + + /** + * @since 1.0.1 + * + * @var string + */ + private $_slug; + + /** + * @since 1.0.0 + * + * @var string + */ + private $_plugin_basename; + /** + * @since 1.0.0 + * + * @var string + */ + private $_free_plugin_basename; + /** + * @since 1.0.0 + * + * @var string + */ + private $_plugin_dir_path; + /** + * @since 1.0.0 + * + * @var string + */ + private $_plugin_dir_name; + /** + * @since 1.0.0 + * + * @var string + */ + private $_plugin_main_file_path; + /** + * @var string[] + */ + private $_plugin_data; + /** + * @since 1.0.9 + * + * @var string + */ + private $_plugin_name; + /** + * @since 1.2.2 + * + * @var string + */ + private $_module_type; + + #endregion Plugin Info + + /** + * @since 1.0.9 + * + * @var bool If false, don't turn Freemius on. + */ + private $_is_on; + + /** + * @since 1.1.3 + * + * @var bool If false, don't turn Freemius on. + */ + private $_is_anonymous; + + /** + * @since 1.0.9 + * @var bool If false, issues with connectivity to Freemius API. + */ + private $_has_api_connection; + + /** + * @since 1.0.9 + * @since 2.0.0 Default to true since we need the property during the instance construction, prior to the dynamic_init() execution. + * @var bool Hints the SDK if plugin can support anonymous mode (if skip connect is visible). + */ + private $_enable_anonymous = true; + + /** + * @since 1.1.7.5 + * @var bool Hints the SDK if plugin should run in anonymous mode (only adds feedback form). + */ + private $_anonymous_mode; + + /** + * @since 1.1.9 + * @var bool Hints the SDK if plugin have any free plans. + */ + private $_is_premium_only; + + /** + * @since 1.2.1.6 + * @var bool Hints the SDK if plugin have premium code version at all. + */ + private $_has_premium_version; + + /** + * @since 1.2.1.6 + * @var bool Hints the SDK if plugin should ignore pending mode by simulating a skip. + */ + private $_ignore_pending_mode; + + /** + * @since 1.0.8 + * @var bool Hints the SDK if the plugin has any paid plans. + */ + private $_has_paid_plans; + + /** + * @since 1.2.1.5 + * @var int Hints the SDK if the plugin offers a trial period. If negative, no trial, if zero - has a trial but + * without a specified period, if positive - the number of trial days. + */ + private $_trial_days = - 1; + + /** + * @since 1.2.1.5 + * @var bool Hints the SDK if the trial requires a payment method or not. + */ + private $_is_trial_require_payment = false; + + /** + * @since 1.0.7 + * @var bool Hints the SDK if the plugin is WordPress.org compliant. + */ + private $_is_org_compliant; + + /** + * @since 1.0.7 + * @var bool Hints the SDK if the plugin is has add-ons. + */ + private $_has_addons; + + /** + * @since 1.1.6 + * @var string[]bool. + */ + private $_permissions; + + /** + * @var FS_Storage + */ + private $_storage; + + /** + * @since 1.2.2.7 + * @var FS_Cache_Manager + */ + private $_cache; + + /** + * @since 1.0.0 + * + * @var FS_Logger + */ + private $_logger; + /** + * @since 1.0.4 + * + * @var FS_Plugin + */ + private $_plugin = false; + /** + * @since 1.0.4 + * + * @var FS_Plugin|false + */ + private $_parent_plugin = false; + /** + * @since 1.1.1 + * + * @var Freemius + */ + private $_parent = false; + /** + * @since 1.0.1 + * + * @var FS_User + */ + private $_user = false; + /** + * @since 1.0.1 + * + * @var FS_Site + */ + private $_site = false; + /** + * @since 1.0.1 + * + * @var FS_Plugin_License + */ + private $_license; + /** + * @since 1.0.2 + * + * @var FS_Plugin_Plan[] + */ + private $_plans = false; + /** + * @var FS_Plugin_License[] + * @since 1.0.5 + */ + private $_licenses = false; + + /** + * @since 1.0.1 + * + * @var FS_Admin_Menu_Manager + */ + private $_menu; + + /** + * @var FS_Admin_Notices + */ + private $_admin_notices; + + /** + * @since 1.1.6 + * + * @var FS_Admin_Notices + */ + private static $_global_admin_notices; + + /** + * @var FS_Logger + * @since 1.0.0 + */ + private static $_static_logger; + + /** + * @var FS_Options + * @since 1.0.2 + */ + private static $_accounts; + + /** + * @since 1.2.2 + * + * @var number + */ + private $_module_id; + + /** + * @var Freemius[] + */ + private static $_instances = array(); + + /** + * @since 1.2.3 + * + * @var FS_Affiliate + */ + private $affiliate = null; + + /** + * @since 1.2.3 + * + * @var FS_AffiliateTerms + */ + private $plugin_affiliate_terms = null; + + /** + * @since 1.2.3 + * + * @var FS_AffiliateTerms + */ + private $custom_affiliate_terms = null; + + /** + * @since 2.0.0 + * + * @var bool + */ + private $_is_multisite_integrated; + + /** + * @since 2.0.0 + * + * @var bool True if the current request is for a network admin screen and the plugin is network active. + */ + private $_is_network_active; + + /** + * @since 2.0.0 + * + * @var int|null The original blog ID the plugin was loaded with. + */ + private $_blog_id = null; + + /** + * @since 2.0.0 + * + * @var int|null The current execution context. When true, run on network context. When int, run on the specified blog context. + */ + private $_context_is_network_or_blog_id = null; + + /** + * @since 2.0.0 + * + * @var string + */ + private $_dynamically_added_top_level_page_hook_name = ''; + + #region Uninstall Reasons IDs + + const REASON_NO_LONGER_NEEDED = 1; + const REASON_FOUND_A_BETTER_PLUGIN = 2; + const REASON_NEEDED_FOR_A_SHORT_PERIOD = 3; + const REASON_BROKE_MY_SITE = 4; + const REASON_SUDDENLY_STOPPED_WORKING = 5; + const REASON_CANT_PAY_ANYMORE = 6; + const REASON_OTHER = 7; + const REASON_DIDNT_WORK = 8; + const REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION = 9; + const REASON_COULDNT_MAKE_IT_WORK = 10; + const REASON_GREAT_BUT_NEED_SPECIFIC_FEATURE = 11; + const REASON_NOT_WORKING = 12; + const REASON_NOT_WHAT_I_WAS_LOOKING_FOR = 13; + const REASON_DIDNT_WORK_AS_EXPECTED = 14; + const REASON_TEMPORARY_DEACTIVATION = 15; + + #endregion + + /* Ctor +------------------------------------------------------------------------------------------------------------------*/ + + /** + * Main singleton instance. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @param number $module_id + * @param string|bool $slug + * @param bool $is_init Since 1.2.1 Is initiation sequence. + */ + private function __construct( $module_id, $slug = false, $is_init = false ) { + if ( $is_init && is_numeric( $module_id ) && is_string( $slug ) ) { + $this->store_id_slug_type_path_map( $module_id, $slug ); + } + + $this->_module_id = $module_id; + $this->_slug = $this->get_slug(); + $this->_module_type = $this->get_module_type(); + + $this->_blog_id = is_multisite() ? get_current_blog_id() : null; + + $this->_storage = FS_Storage::instance( $this->_module_type, $this->_slug ); + + $this->_cache = FS_Cache_Manager::get_manager( WP_FS___OPTION_PREFIX . "cache_{$module_id}" ); + + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->get_unique_affix(), WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + $this->_plugin_main_file_path = $this->_find_caller_plugin_file( $is_init ); + $this->_plugin_dir_path = plugin_dir_path( $this->_plugin_main_file_path ); + $this->_plugin_basename = $this->get_plugin_basename(); + $this->_free_plugin_basename = str_replace( '-premium/', '/', $this->_plugin_basename ); + + $this->_is_multisite_integrated = ( + defined( "WP_FS__PRODUCT_{$module_id}_MULTISITE" ) && + ( true === constant( "WP_FS__PRODUCT_{$module_id}_MULTISITE" ) ) + ); + + $this->_is_network_active = ( + is_multisite() && + $this->_is_multisite_integrated && + // Themes are always network activated, but the ACTUAL activation is per site. + $this->is_plugin() && + ( is_plugin_active_for_network( $this->_plugin_basename ) || + // Plugin network level activation or uninstall. + is_plugin_inactive( $this->_plugin_basename ) ) + ); + + $this->_storage->set_network_active( + $this->_is_network_active, + $this->is_delegated_connection() + ); + + #region Migration + + if ( is_multisite() ) { + /** + * If the install_timestamp exists on the site level but doesn't exist on the + * network level storage, it means that we need to process the storage with migration. + * + * The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data, install_timestamp will be already set in the network level storage. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + if ( false === $this->_storage->get( 'install_timestamp', false, true ) && + false !== $this->_storage->get( 'install_timestamp', false, false ) + ) { + // Initiate storage migration. + $this->_storage->migrate_to_network(); + + // Migrate module cache to network level storage. + $this->_cache->migrate_to_network(); + } + } + + #endregion + + $base_name_split = explode( '/', $this->_plugin_basename ); + $this->_plugin_dir_name = $base_name_split[0]; + + if ( $this->_logger->is_on() ) { + $this->_logger->info( 'plugin_main_file_path = ' . $this->_plugin_main_file_path ); + $this->_logger->info( 'plugin_dir_path = ' . $this->_plugin_dir_path ); + $this->_logger->info( 'plugin_basename = ' . $this->_plugin_basename ); + $this->_logger->info( 'free_plugin_basename = ' . $this->_free_plugin_basename ); + $this->_logger->info( 'plugin_dir_name = ' . $this->_plugin_dir_name ); + } + + // Remember link between file to slug. + $this->store_file_slug_map(); + + // Store plugin's initial install timestamp. + if ( ! isset( $this->_storage->install_timestamp ) ) { + $this->_storage->install_timestamp = WP_FS__SCRIPT_START_TIME; + } + + if ( ! is_object( $this->_plugin ) ) { + $this->_plugin = FS_Plugin_Manager::instance( $this->_module_id )->get(); + } + + $this->_admin_notices = FS_Admin_Notices::instance( + $this->_slug . ( $this->is_theme() ? ':theme' : '' ), + /** + * Ensure that the admin notice will always have a title by using the stored plugin title if available and + * retrieving the title via the "get_plugin_name" method if there is no stored plugin title available. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + ( is_object( $this->_plugin ) ? $this->_plugin->title : $this->get_plugin_name() ), + $this->get_unique_affix() + ); + + if ( 'true' === fs_request_get( 'fs_clear_api_cache' ) || + 'true' === fs_request_is_action( 'restart_freemius' ) + ) { + FS_Api::clear_cache(); + $this->_cache->clear(); + } + + $this->_register_hooks(); + + /** + * Starting from version 2.0.0, `FS_Site` entities no longer have the `plan` property and have `plan_id` + * instead. This should be called before calling `_load_account()`, otherwise, `$this->_site` will not be + * loaded in `_load_account` for versions of SDK starting from 2.0.0. + * + * @author Leo Fajardo (@leorw) + */ + self::migrate_install_plan_to_plan_id( $this->_storage ); + + $this->_load_account(); + + $this->_version_updates_handler(); + } + + /** + * Checks whether this module has a settings menu. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool + */ + function has_settings_menu() { + return ( $this->_is_network_active && fs_is_network_admin() ) ? + $this->_menu->has_network_menu() : + $this->_menu->has_menu(); + } + + /** + * Check if the context module is free wp.org theme. + * + * This method is helpful because: + * 1. wp.org themes are limited to a single submenu item, + * and sub-submenu items are most likely not allowed (never verified). + * 2. wp.org themes are not allowed to redirect the user + * after the theme activation, therefore, the agreed UX + * is showing the opt-in as a modal dialog box after + * activation (approved by @otto42, @emiluzelac, @greenshady, @grapplerulrich). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + function is_free_wp_org_theme() { + return ( + $this->is_theme() && + $this->is_org_repo_compliant() && + ! $this->is_premium() + ); + } + + /** + * Checks whether this a submenu item is visible. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.6 + * @since 1.2.2.7 Even if the menu item was specified to be hidden, when it is the context page, then show the submenu item so the user will have the right context page. + * + * @param string $slug + * @param bool $ignore_free_wp_org_theme_context This is used to decide if the associated tab should be shown + * or hidden. + * + * @return bool + */ + function is_submenu_item_visible( $slug, $ignore_free_wp_org_theme_context = false ) { + if ( $this->is_admin_page( $slug ) ) { + /** + * It is the current context page, so show the submenu item + * so the user will have the right context page, even if it + * was set to hidden. + */ + return true; + } + + if ( ! $this->has_settings_menu() ) { + // No menu settings at all. + return false; + } + + if ( ! $ignore_free_wp_org_theme_context && $this->is_free_wp_org_theme() ) { + /** + * wp.org themes are limited to a single submenu item, and + * sub-submenu items are most likely not allowed (never verified). + */ + return false; + } + + return $this->_menu->is_submenu_item_visible( $slug ); + } + + /** + * Check if a Freemius page should be accessible via the UI. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param string $slug + * + * @return bool + */ + function is_page_visible( $slug ) { + if ( $this->is_admin_page( $slug ) ) { + return true; + } + + return $this->_menu->is_submenu_item_visible( $slug, true, true ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + private function _version_updates_handler() { + if ( ! isset( $this->_storage->sdk_version ) || $this->_storage->sdk_version != $this->version ) { + // Freemius version upgrade mode. + $this->_storage->sdk_last_version = $this->_storage->sdk_version; + $this->_storage->sdk_version = $this->version; + + if ( empty( $this->_storage->sdk_last_version ) || + version_compare( $this->_storage->sdk_last_version, $this->version, '<' ) + ) { + $this->_storage->sdk_upgrade_mode = true; + $this->_storage->sdk_downgrade_mode = false; + } else { + $this->_storage->sdk_downgrade_mode = true; + $this->_storage->sdk_upgrade_mode = false; + + } + + $this->do_action( 'sdk_version_update', $this->_storage->sdk_last_version, $this->version ); + } + + $plugin_version = $this->get_plugin_version(); + if ( ! isset( $this->_storage->plugin_version ) || $this->_storage->plugin_version != $plugin_version ) { + // Plugin version upgrade mode. + $this->_storage->plugin_last_version = $this->_storage->plugin_version; + $this->_storage->plugin_version = $plugin_version; + + if ( empty( $this->_storage->plugin_last_version ) || + version_compare( $this->_storage->plugin_last_version, $plugin_version, '<' ) + ) { + $this->_storage->plugin_upgrade_mode = true; + $this->_storage->plugin_downgrade_mode = false; + } else { + $this->_storage->plugin_downgrade_mode = true; + $this->_storage->plugin_upgrade_mode = false; + } + + if ( ! empty( $this->_storage->plugin_last_version ) ) { + // Different version of the plugin was installed before, therefore it's an update. + $this->_storage->is_plugin_new_install = false; + } + + $this->do_action( 'plugin_version_update', $this->_storage->plugin_last_version, $plugin_version ); + } + } + + #-------------------------------------------------------------------------------- + #region Data Migration on SDK Update + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.5 + * + * @param string $sdk_prev_version + * @param string $sdk_version + */ + function _sdk_version_update( $sdk_prev_version, $sdk_version ) { + /** + * @since 1.1.7.3 Fixed unwanted connectivity test cleanup. + */ + if ( empty( $sdk_prev_version ) ) { + return; + } + + if ( version_compare( $sdk_prev_version, '2.1.0', '<' ) && + version_compare( $sdk_version, '2.1.0', '>=' ) + ) { + $this->_storage->handle_gdpr_admin_notice = true; + } + + if ( version_compare( $sdk_prev_version, '2.0.0', '<' ) && + version_compare( $sdk_version, '2.0.0', '>=' ) + ) { + $this->migrate_to_subscriptions_collection(); + + $this->consolidate_licenses(); + + // Clear trial_plan since it's now loaded from the plans collection when needed. + $this->_storage->remove( 'trial_plan', true, false ); + } + + if ( version_compare( $sdk_prev_version, '1.2.3', '<' ) && + version_compare( $sdk_version, '1.2.3', '>=' ) + ) { + /** + * Starting from version 1.2.3, paths are stored as relative paths and not absolute paths; so when upgrading to 1.2.3, make paths relative. + * + * @author Leo Fajardo (@leorw) + */ + $this->make_paths_relative(); + } + + if ( version_compare( $sdk_prev_version, '1.1.5', '<' ) && + version_compare( $sdk_version, '1.1.5', '>=' ) + ) { + // On version 1.1.5 merged connectivity and is_on data. + if ( isset( $this->_storage->connectivity_test ) ) { + if ( ! isset( $this->_storage->is_on ) ) { + unset( $this->_storage->connectivity_test ); + } else { + $connectivity_data = $this->_storage->connectivity_test; + $connectivity_data['is_active'] = $this->_storage->is_on['is_active']; + $connectivity_data['timestamp'] = $this->_storage->is_on['timestamp']; + + // Override. + $this->_storage->connectivity_test = $connectivity_data; + + // Remove previous structure. + unset( $this->_storage->is_on ); + } + + } + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param \FS_Storage $storage + * @param bool|int|null $blog_id + */ + private static function migrate_install_plan_to_plan_id( FS_Storage $storage, $blog_id = null ) { + if ( empty( $storage->sdk_version ) ) { + // New installation of the plugin, no need to upgrade. + return; + } + + if ( ! version_compare( $storage->sdk_version, '2.0.0', '<' ) ) { + // Previous version is >= 2.0.0, so no need to migrate. + return; + } + + // Alias. + $module_type = $storage->get_module_type(); + $module_slug = $storage->get_module_slug(); + + $installs = self::get_all_sites( $module_type, $blog_id ); + $install = isset( $installs[ $module_slug ] ) ? $installs[ $module_slug ] : null; + + if ( ! is_object( $install ) ) { + return; + } + + if ( isset( $install->plan ) && is_object( $install->plan ) ) { + if ( isset( $install->plan->id ) && ! empty( $install->plan->id ) ) { + $install->plan_id = self::_decrypt( $install->plan->id ); + } + + unset( $install->plan ); + + $installs[ $module_slug ] = clone $install; + + self::set_account_option_by_module( + $module_type, + 'sites', + $installs, + true, + $blog_id + ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + private function migrate_to_subscriptions_collection() { + if ( ! is_object( $this->_site ) ) { + return; + } + + if ( isset( $this->_storage->subscription ) && is_object( $this->_storage->subscription ) ) { + $this->_storage->subscriptions = array( $this->_storage->subscription ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + private function consolidate_licenses() { + $plugin_licenses = self::get_account_option( 'licenses', WP_FS__MODULE_TYPE_PLUGIN ); + if ( isset( $plugin_licenses[ $this->_slug ] ) ) { + $plugin_licenses = $plugin_licenses[ $this->_slug ]; + } else { + $plugin_licenses = array(); + } + + $theme_licenses = self::get_account_option( 'licenses', WP_FS__MODULE_TYPE_THEME ); + if ( isset( $theme_licenses[ $this->_slug ] ) ) { + $theme_licenses = $theme_licenses[ $this->_slug ]; + } else { + $theme_licenses = array(); + } + + if ( empty( $plugin_licenses ) && empty( $theme_licenses ) ) { + return; + } + + $all_licenses = array(); + $user_id_license_ids_map = array(); + + foreach ( $plugin_licenses as $user_id => $user_licenses ) { + if ( is_array( $user_licenses ) ) { + if ( ! isset( $user_license_ids[ $user_id ] ) ) { + $user_id_license_ids_map[ $user_id ] = array(); + } + + foreach ( $user_licenses as $user_license ) { + $all_licenses[] = $user_license; + $user_id_license_ids_map[ $user_id ][] = $user_license->id; + } + } + } + + foreach ( $theme_licenses as $user_id => $user_licenses ) { + if ( is_array( $user_licenses ) ) { + if ( ! isset( $user_license_ids[ $user_id ] ) ) { + $user_id_license_ids_map[ $user_id ] = array(); + } + + foreach ( $user_licenses as $user_license ) { + $all_licenses[] = $user_license; + $user_id_license_ids_map[ $user_id ][] = $user_license->id; + } + } + } + + self::store_user_id_license_ids_map( + $user_id_license_ids_map, + $this->_module_id + ); + + $this->_store_licenses( true, $this->_module_id, $all_licenses ); + } + + /** + * Makes paths relative. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + */ + private function make_paths_relative() { + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); + + if ( isset( $id_slug_type_path_map[ $this->_module_id ]['path'] ) ) { + $id_slug_type_path_map[ $this->_module_id ]['path'] = $this->get_relative_path( $id_slug_type_path_map[ $this->_module_id ]['path'] ); + + self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true ); + } + + if ( isset( $this->_storage->plugin_main_file ) ) { + $plugin_main_file = $this->_storage->plugin_main_file; + + if ( isset( $plugin_main_file->path ) ) { + $this->_storage->plugin_main_file->path = $this->get_relative_path( $this->_storage->plugin_main_file->path ); + } else if ( isset( $plugin_main_file->prev_path ) ) { + $this->_storage->plugin_main_file->prev_path = $this->get_relative_path( $this->_storage->plugin_main_file->prev_path ); + } + } + + // Remove invalid path that is still associated with the current slug if there's any. + $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); + foreach ( $file_slug_map as $plugin_basename => $slug ) { + if ( $slug === $this->_slug && + $plugin_basename !== $this->_plugin_basename && + ! file_exists( $this->get_absolute_path( $plugin_basename ) ) + ) { + unset( $file_slug_map[ $plugin_basename ] ); + self::$_accounts->set_option( 'file_slug_map', $file_slug_map, true ); + + break; + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param string $plugin_prev_version + * @param string $plugin_version + */ + function _after_version_update( $plugin_prev_version, $plugin_version ) { + if ( $this->is_theme() ) { + // Expire the cache of the previous tabs since the theme may + // have setting updates. + $this->_cache->expire( 'tabs' ); + $this->_cache->expire( 'tabs_stylesheets' ); + } + } + + /** + * A special migration logic for the $_accounts, executed for all the plugins in the system: + * - Moves some data to the network level storage. + * - If the plugin's connection was skipped for all sites, set the plugin as if it was network skipped. + * - If the plugin's connection was ignored for all sites, don't do anything in terms of the network connection. + * - If the plugin was connected to all sites by the same super-admin, set the plugin as if was network opted-in for all sites. + * - If there's at least one site that was connected by a super-admin, find the "main super-admin" (the one that installed the majority of the plugin installs) and set the plugin as if was network activated with the main super-admin, set all the sites that were skipped or opted-in with a different user to delegated mode. Then, prompt the currently logged super-admin to choose what to do with the ignored sites. + * - If there are any sites in the network which the connection decision was not yet taken for, set this plugin into network activation mode so a super-admin can choose what to do with the rest of the sites. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private static function migrate_accounts_to_network() { + $sites = self::get_sites(); + $sites_count = count( $sites ); + $connection_status = array(); + $plugin_slugs = array(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + self::$_accounts->migrate_to_network( $blog_id ); + + /** + * Build a list of all Freemius powered plugins slugs. + */ + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array(), $blog_id ); + foreach ( $id_slug_type_path_map as $module_id => $data ) { + if ( WP_FS__MODULE_TYPE_PLUGIN === $data['type'] ) { + $plugin_slugs[ $data['slug'] ] = true; + } + } + + $installs = self::get_account_option( 'sites', WP_FS__MODULE_TYPE_PLUGIN, $blog_id ); + + if ( is_array( $installs ) ) { + foreach ( $installs as $slug => $install ) { + if ( ! isset( $connection_status[ $slug ] ) ) { + $connection_status[ $slug ] = array(); + } + + if ( is_object( $install ) && + FS_Site::is_valid_id( $install->id ) && + FS_User::is_valid_id( $install->user_id ) + ) { + $connection_status[ $slug ][ $blog_id ] = $install->user_id; + } + } + } + } + + foreach ( $plugin_slugs as $slug => $true ) { + if ( ! isset( $connection_status[ $slug ] ) ) { + $connection_status[ $slug ] = array(); + } + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + if ( isset( $connection_status[ $slug ][ $blog_id ] ) ) { + continue; + } + + $storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $slug ); + + $is_anonymous = $storage->get( 'is_anonymous', null, $blog_id ); + + if ( ! is_null( $is_anonymous ) ) { + // Since 1.1.3 is_anonymous is an array. + if ( is_array( $is_anonymous ) && isset( $is_anonymous['is'] ) ) { + $is_anonymous = $is_anonymous['is']; + } + + if ( is_bool( $is_anonymous ) && true === $is_anonymous ) { + $connection_status[ $slug ][ $blog_id ] = 'skipped'; + } + } + + if ( ! isset( $connection_status[ $slug ][ $blog_id ] ) ) { + $connection_status[ $slug ][ $blog_id ] = 'ignored'; + } + } + } + + $super_admins = array(); + + foreach ( $connection_status as $slug => $blogs_status ) { + $skips = 0; + $ignores = 0; + $connections = 0; + $opted_in_users = array(); + $opted_in_super_admins = array(); + + $storage = FS_Storage::instance( WP_FS__MODULE_TYPE_PLUGIN, $slug ); + + foreach ( $blogs_status as $blog_id => $status_or_user_id ) { + if ( 'skipped' === $status_or_user_id ) { + $skips ++; + } else if ( 'ignored' === $status_or_user_id ) { + $ignores ++; + } else if ( FS_User::is_valid_id( $status_or_user_id ) ) { + $connections ++; + + if ( ! isset( $opted_in_users[ $status_or_user_id ] ) ) { + $opted_in_users[ $status_or_user_id ] = array(); + } + + $opted_in_users[ $status_or_user_id ][] = $blog_id; + + if ( isset( $super_admins[ $status_or_user_id ] ) || + self::is_super_admin( $status_or_user_id ) + ) { + // Cache super-admin data. + $super_admins[ $status_or_user_id ] = true; + + // Remember opted-in super-admins for the plugin. + $opted_in_super_admins[ $status_or_user_id ] = true; + } + } + } + + $main_super_admin_user_id = null; + $all_migrated = false; + if ( $sites_count == $skips ) { + // All sites were skipped -> network skip by copying the anonymous mode from any of the sites. + $storage->is_anonymous_ms = $storage->is_anonymous; + + $all_migrated = true; + } else if ( $sites_count == $ignores ) { + // Don't do anything, still in activation mode. + + $all_migrated = true; + } else if ( 0 < count( $opted_in_super_admins ) ) { + // Find the super-admin with the majority of installs. + $max_installs_by_super_admin = 0; + foreach ( $opted_in_super_admins as $user_id => $true ) { + $installs_count = count( $opted_in_users[ $user_id ] ); + + if ( $installs_count > $max_installs_by_super_admin ) { + $max_installs_by_super_admin = $installs_count; + $main_super_admin_user_id = $user_id; + } + } + + if ( $sites_count == $connections && 1 == count( $opted_in_super_admins ) ) { + // Super-admin opted-in for all sites in the network. + $storage->is_network_connected = true; + + $all_migrated = true; + } + + // Store network user. + $storage->network_user_id = $main_super_admin_user_id; + + $storage->network_install_blog_id = ( $sites_count == $connections ) ? + // Since all sites are opted-in, associating with the main site. + get_current_blog_id() : + // Associating with the 1st found opted-in site. + $opted_in_users[ $main_super_admin_user_id ][0]; + + /** + * Make sure we migrate the plan ID of the network install, otherwise, if after the migration + * the 1st page that will be loaded is the network level WP Admin and $storage->network_install_blog_id + * is different than the main site of the network, the $this->_site will not be set since the plan_id + * will be empty. + */ + $storage->migrate_to_network(); + self::migrate_install_plan_to_plan_id( $storage, $storage->network_install_blog_id ); + } else { + // At least one opt-in. All the opt-in were created by a non-super-admin. + if ( 0 == $ignores ) { + // All sites were opted-in or skipped, all by non-super-admin. So delegate all. + $storage->store( 'is_delegated_connection', true, true ); + + $all_migrated = true; + } + } + + if ( ! $all_migrated ) { + /** + * Delegate all sites that were: + * 1) Opted-in by a user that is NOT the main-super-admin. + * 2) Skipped and non of the sites was opted-in by a super-admin. If any site was opted-in by a super-admin, there will be a main-super-admin, and we consider the skip as if it was done by that user. + */ + foreach ( $blogs_status as $blog_id => $status_or_user_id ) { + if ( $status_or_user_id == $main_super_admin_user_id ) { + continue; + } + + if ( FS_User::is_valid_id( $status_or_user_id ) || + ( 'skipped' === $status_or_user_id && is_null( $main_super_admin_user_id ) ) + ) { + $storage->store( 'is_delegated_connection', true, $blog_id ); + } + } + } + + + if ( ( $connections + $skips > 0 ) ) { + if ( $ignores > 0 ) { + /** + * If admin already opted-in or skipped in any of the network sites, and also + * have sites which the connection decision was not yet taken, set this plugin + * into network activation mode so the super-admin can choose what to do with + * the rest of the sites. + */ + self::set_network_upgrade_mode( $storage ); + } + } + } + } + + /** + * Set a module into network upgrade mode. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_Storage $storage + * + * @return bool + */ + private static function set_network_upgrade_mode( FS_Storage $storage ) { + return $storage->is_network_activation = true; + } + + /** + * Will return true after upgrading to the SDK with the network level integration, + * when the super-admin involvement is required regarding the rest of the sites. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function is_network_upgrade_mode() { + return $this->_storage->get( 'is_network_activation' ); + } + + /** + * Clear flag after the upgrade mode completion. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool True if network activation was on and now completed. + */ + private function network_upgrade_mode_completed() { + if ( fs_is_network_admin() && $this->is_network_upgrade_mode() ) { + $this->_storage->remove( 'is_network_activation' ); + + return true; + } + + return false; + } + + #endregion + + /** + * This action is connected to the 'plugins_loaded' hook and helps to determine + * if this is a new plugin installation or a plugin update. + * + * There are 3 different use-cases: + * 1) New plugin installation right with Freemius: + * 1.1 _activate_plugin_event_hook() will be executed first + * 1.2 Since $this->_storage->is_plugin_new_install is not set, + * and $this->_storage->plugin_last_version is not set, + * $this->_storage->is_plugin_new_install will be set to TRUE. + * 1.3 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will + * be already set to TRUE. + * + * 2) Plugin update, didn't have Freemius before, and now have the SDK: + * 2.1 _activate_plugin_event_hook() will not be executed, because + * the activation hook do NOT fires on updates since WP 3.1. + * 2.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install will + * be empty, therefore, it will be set to FALSE. + * + * 3) Plugin update, had Freemius in prev version as well: + * 3.1 _version_updates_handler() will be executed 1st, since FS was installed + * before, $this->_storage->plugin_last_version will NOT be empty, + * therefore, $this->_storage->is_plugin_new_install will be set to FALSE. + * 3.2 When _plugins_loaded() will be executed, $this->_storage->is_plugin_new_install is + * already set, therefore, it will not be modified. + * + * Use-case #3 is backward compatible, #3.1 will be executed since 1.0.9. + * + * NOTE: + * The only fallback of this mechanism is if an admin updates a plugin based on use-case #2, + * and then, the next immediate PageView is the plugin's main settings page, it will not + * show the opt-in right away. The reason it will happen is because Freemius execution + * will be turned off till the plugin is fully loaded at least once + * (till $this->_storage->was_plugin_loaded is TRUE). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + * + */ + function _plugins_loaded() { + // Update flag that plugin was loaded with Freemius at least once. + $this->_storage->was_plugin_loaded = true; + + /** + * Bug fix - only set to false when it's a plugin, due to the + * execution sequence of the theme hooks and our methods, if + * this will be set for themes, Freemius will always assume + * it's a theme update. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.2 + */ + if ( $this->is_plugin() && + ! isset( $this->_storage->is_plugin_new_install ) + ) { + $this->_storage->is_plugin_new_install = false; + } + } + + /** + * Add special parameter to WP admin AJAX calls so when we + * process AJAX calls we can identify its source properly. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + static function _enrich_ajax_url() { + $admin_param = is_network_admin() ? + '_fs_network_admin' : + '_fs_blog_admin'; + ?> + <script type="text/javascript"> + (function ($) { + $(document).ajaxSend(function (event, jqxhr, settings) { + if (settings.url && + -1 < settings.url.indexOf('admin-ajax.php') && + ! ( settings.url.indexOf( '<?php echo $admin_param ?>' ) > 0 ) + ) { + if (settings.url.indexOf('?') > 0) { + settings.url += '&'; + } else { + settings.url += '?'; + } + + settings.url += '<?php echo $admin_param ?>=true'; + + } + }); + })(jQuery); + </script> + <?php + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + private function _register_hooks() { + $this->_logger->entrance(); + + if ( is_admin() ) { + add_action( 'plugins_loaded', array( &$this, '_hook_action_links_and_register_account_hooks' ) ); + + if ( $this->is_plugin() ) { + $plugin_dir = dirname( $this->_plugin_dir_path ) . '/'; + + /** + * @since 1.2.2 + * + * Hook to both free and premium version activations to support + * auto deactivation on the other version activation. + */ + register_activation_hook( + $plugin_dir . $this->_free_plugin_basename, + array( &$this, '_activate_plugin_event_hook' ) + ); + + register_activation_hook( + $plugin_dir . $this->premium_plugin_basename(), + array( &$this, '_activate_plugin_event_hook' ) + ); + } else { + add_action( 'after_switch_theme', array( &$this, '_activate_theme_event_hook' ), 10, 2 ); + + /** + * Include the required hooks to capture the theme settings' page tabs + * and cache them. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + if ( ! $this->_cache->has_valid( 'tabs' ) ) { + add_action( 'admin_footer', array( &$this, '_tabs_capture' ) ); + // Add license activation AJAX callback. + $this->add_ajax_action( 'store_tabs', array( &$this, '_store_tabs_ajax_action' ) ); + + add_action( 'admin_enqueue_scripts', array( &$this, '_store_tabs_styles' ), 9999999 ); + } + + add_action( + 'admin_footer', + array( &$this, '_add_freemius_tabs' ), + /** + * The tabs JS code must be executed after the tabs capture logic (_tabs_capture()). + * That's why the priority is 11 while the tabs capture logic is added + * with priority 10. + * + * @author Vova Feldman (@svovaf) + */ + 11 + ); + + add_action( 'admin_footer', array( &$this, '_style_premium_theme' ) ); + } + + /** + * Part of the mechanism to identify new plugin install vs. plugin update. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + */ + if ( empty( $this->_storage->was_plugin_loaded ) ) { + /** + * During the plugin activation (not theme), 'plugins_loaded' will be already executed + * when the logic gets here since the activation logic first add the activate plugins, + * then triggers 'plugins_loaded', and only then include the code of the plugin that + * is activated. Which means that _plugins_loaded() will NOT be executed during the + * plugin activation, and that IS intentional. + * + * @author Vova Feldman (@svovaf) + */ + if ( $this->is_plugin() && $this->is_activation_mode( false ) ) { + add_action( 'plugins_loaded', array( &$this, '_plugins_loaded' ) ); + } else { + // If was activated before, then it was already loaded before. + $this->_plugins_loaded(); + } + } + + if ( ! self::is_ajax() ) { + if ( ! $this->is_addon() ) { + add_action( 'init', array( &$this, '_add_default_submenu_items' ), WP_FS__LOWEST_PRIORITY ); + } + } + + if ( $this->_storage->handle_gdpr_admin_notice ) { + add_action( 'init', array( &$this, '_maybe_show_gdpr_admin_notice' ) ); + } + + add_action( 'init', array( &$this, '_maybe_add_gdpr_optin_ajax_handler') ); + } + + if ( $this->is_plugin() ) { + if ( $this->_is_network_active ) { + add_action( 'wpmu_new_blog', array( $this, '_after_new_blog_callback' ), 10, 6 ); + } + + register_deactivation_hook( $this->_plugin_main_file_path, array( &$this, '_deactivate_plugin_hook' ) ); + } + + if ( is_multisite() ) { + add_action( 'deactivate_blog', array( &$this, '_after_site_deactivated_callback' ) ); + add_action( 'archive_blog', array( &$this, '_after_site_deactivated_callback' ) ); + add_action( 'make_spam_blog', array( &$this, '_after_site_deactivated_callback' ) ); + add_action( 'deleted_blog', array( &$this, '_after_site_deleted_callback' ), 10, 2 ); + + add_action( 'activate_blog', array( &$this, '_after_site_reactivated_callback' ) ); + add_action( 'unarchive_blog', array( &$this, '_after_site_reactivated_callback' ) ); + add_action( 'make_ham_blog', array( &$this, '_after_site_reactivated_callback' ) ); + } + + if ( $this->is_theme() && + self::is_customizer() && + $this->apply_filters( 'show_customizer_upsell', true ) + ) { + // Register customizer upsell. + add_action( 'customize_register', array( &$this, '_customizer_register' ) ); + } + + add_action( 'admin_init', array( &$this, '_redirect_on_clicked_menu_link' ), WP_FS__LOWEST_PRIORITY ); + + if ( $this->is_theme() ) { + add_action( 'admin_init', array( &$this, '_add_tracking_links' ) ); + } + + add_action( 'admin_init', array( &$this, '_add_license_activation' ) ); + add_action( 'admin_init', array( &$this, '_add_premium_version_upgrade_selection' ) ); + + $this->add_ajax_action( 'update_billing', array( &$this, '_update_billing_ajax_action' ) ); + $this->add_ajax_action( 'start_trial', array( &$this, '_start_trial_ajax_action' ) ); + + if ( $this->_is_network_active && fs_is_network_admin() ) { + $this->add_ajax_action( 'network_activate', array( &$this, '_network_activate_ajax_action' ) ); + } + + $this->add_ajax_action( 'install_premium_version', array( + &$this, + '_install_premium_version_ajax_action' + ) ); + + $this->add_ajax_action( 'submit_affiliate_application', array( &$this, '_submit_affiliate_application' ) ); + + $this->add_action( 'after_plans_sync', array( &$this, '_check_for_trial_plans' ) ); + + $this->add_action( 'sdk_version_update', array( &$this, '_sdk_version_update' ), WP_FS__DEFAULT_PRIORITY, 2 ); + + $this->add_action( + 'plugin_version_update', + array( &$this, '_after_version_update' ), + WP_FS__DEFAULT_PRIORITY, + 2 + ); + $this->add_filter( 'after_code_type_change', array( &$this, '_after_code_type_change' ) ); + + add_action( 'admin_init', array( &$this, '_add_trial_notice' ) ); + add_action( 'admin_init', array( &$this, '_add_affiliate_program_notice' ) ); + add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_common_css' ) ); + + /** + * Handle request to reset anonymous mode for `get_reconnect_url()`. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + */ + if ( fs_request_is_action( 'reset_anonymous_mode' ) && + $this->get_unique_affix() === fs_request_get( 'fs_unique_affix' ) + ) { + add_action( 'admin_init', array( &$this, 'connect_again' ) ); + } + } + + /** + * Keeping the uninstall hook registered for free or premium plugin version may result to a fatal error that + * could happen when a user tries to uninstall either version while one of them is still active. Uninstalling a + * plugin will trigger inclusion of the free or premium version and if one of them is active during the + * uninstallation, a fatal error may occur in case the plugin's class or functions are already defined. + * + * @author Leo Fajardo (@leorw) + * + * @since 1.2.0 + */ + private function unregister_uninstall_hook() { + $uninstallable_plugins = (array) get_option( 'uninstall_plugins' ); + unset( $uninstallable_plugins[ $this->_free_plugin_basename ] ); + unset( $uninstallable_plugins[ $this->premium_plugin_basename() ] ); + + update_option( 'uninstall_plugins', $uninstallable_plugins ); + } + + /** + * @since 1.2.0 Invalidate module's main file cache, otherwise, FS_Plugin_Updater will not fetch updates. + */ + private function clear_module_main_file_cache() { + if ( ! isset( $this->_storage->plugin_main_file ) || + empty( $this->_storage->plugin_main_file->path ) + ) { + return; + } + + $plugin_main_file = clone $this->_storage->plugin_main_file; + + // Store cached path (2nd layer cache). + $plugin_main_file->prev_path = $plugin_main_file->path; + + // Clear cached path. + unset( $plugin_main_file->path ); + + $this->_storage->plugin_main_file = $plugin_main_file; + + /** + * Clear global cached path. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map' ); + unset( $id_slug_type_path_map[ $this->_module_id ]['path'] ); + self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + function _hook_action_links_and_register_account_hooks() { + add_action( 'admin_init', array( &$this, '_add_tracking_links' ) ); + + if ( self::is_plugins_page() && $this->is_plugin() ) { + $this->hook_plugin_action_links(); + } + + $this->_register_account_hooks(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + private function _register_account_hooks() { + if ( ! is_admin() ) { + return; + } + + /** + * Always show the deactivation feedback form since we added + * automatic free version deactivation upon premium code activation. + * + * @since 1.2.1.6 + */ + $this->add_ajax_action( + 'submit_uninstall_reason', + array( &$this, '_submit_uninstall_reason_action' ) + ); + + if ( ! $this->is_addon() || $this->is_parent_plugin_installed() ) { + if ( ( $this->is_plugin() && self::is_plugins_page() ) || + ( $this->is_theme() && self::is_themes_page() ) + ) { + add_action( 'admin_footer', array( &$this, '_add_deactivation_feedback_dialog_box' ) ); + } + } + } + + /** + * Leverage backtrace to find caller plugin file path. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool $is_init Is initiation sequence. + * + * @return string + */ + private function _find_caller_plugin_file( $is_init = false ) { + // Try to load the cached value of the file path. + if ( isset( $this->_storage->plugin_main_file ) ) { + $plugin_main_file = $this->_storage->plugin_main_file; + if ( isset( $plugin_main_file->path ) ) { + $absolute_path = $this->get_absolute_path( $plugin_main_file->path ); + if ( file_exists( $absolute_path ) ) { + return $absolute_path; + } + } + } + + /** + * @since 1.2.1 + * + * `clear_module_main_file_cache()` is clearing the plugin's cached path on + * deactivation. Therefore, if any plugin/theme was initiating `Freemius` + * with that plugin's slug, it was overriding the empty plugin path with a wrong path. + * + * So, we've added a special mechanism with a 2nd layer of cache that uses `prev_path` + * when the class instantiator isn't the module. + */ + if ( ! $is_init ) { + // Fetch prev path cache. + if ( isset( $this->_storage->plugin_main_file ) && + isset( $this->_storage->plugin_main_file->prev_path ) + ) { + $absolute_path = $this->get_absolute_path( $this->_storage->plugin_main_file->prev_path ); + if ( file_exists( $absolute_path ) ) { + return $absolute_path; + } + } + + wp_die( + $this->get_text_inline( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.', 'failed-finding-main-path' ) . + " Module: {$this->_slug}; SDK: " . WP_FS__SDK_VERSION . ";", + $this->get_text_inline( 'Error', 'error' ), + array( 'back_link' => true ) + ); + } + + /** + * @since 1.2.1 + * + * Only the original instantiator that calls dynamic_init can modify the module's path. + */ + // Find caller module. + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); + $this->_storage->plugin_main_file = (object) array( + 'path' => $id_slug_type_path_map[ $this->_module_id ]['path'], + ); + + return $this->get_absolute_path( $id_slug_type_path_map[ $this->_module_id ]['path'] ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @param string $path + * + * @return string + */ + private function get_relative_path( $path ) { + $module_root_dir = $this->get_module_root_dir_path(); + if ( 0 === strpos( $path, $module_root_dir ) ) { + $path = substr( $path, strlen( $module_root_dir ) ); + } + + return $path; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @param string $path + * @param string|bool $module_type + * + * @return string + */ + private function get_absolute_path( $path, $module_type = false ) { + $module_root_dir = $this->get_module_root_dir_path( $module_type ); + if ( 0 !== strpos( $path, $module_root_dir ) ) { + $path = fs_normalize_path( $module_root_dir . $path ); + } + + return $path; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @param string|bool $module_type + * + * @return string + */ + private function get_module_root_dir_path( $module_type = false ) { + $is_plugin = empty( $module_type ) ? + $this->is_plugin() : + ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ); + + return fs_normalize_path( trailingslashit( $is_plugin ? + WP_PLUGIN_DIR : + get_theme_root() ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param number $module_id + * @param string $slug + * + * @since 1.2.2 + */ + private function store_id_slug_type_path_map( $module_id, $slug ) { + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); + + $store_option = false; + + if ( ! isset( $id_slug_type_path_map[ $module_id ] ) ) { + $id_slug_type_path_map[ $module_id ] = array( + 'slug' => $slug + ); + + $store_option = true; + } + + if ( ! isset( $id_slug_type_path_map[ $module_id ]['path'] ) || + /** + * This verification is for cases when suddenly the same module + * is installed but with a different folder name. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + */ + ! file_exists( $this->get_absolute_path( + $id_slug_type_path_map[ $module_id ]['path'], + $id_slug_type_path_map[ $module_id ]['type'] + ) ) + ) { + $caller_main_file_and_type = $this->get_caller_main_file_and_type(); + + $id_slug_type_path_map[ $module_id ]['type'] = $caller_main_file_and_type->module_type; + $id_slug_type_path_map[ $module_id ]['path'] = $caller_main_file_and_type->path; + + $store_option = true; + } + + if ( $store_option ) { + self::$_accounts->set_option( 'id_slug_type_path_map', $id_slug_type_path_map, true ); + } + } + + /** + * Identifies the caller type: plugin or theme. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.3 Find the earliest module in the call stack that calls to the SDK. This fix is for cases when + * add-ons are relying on loading the SDK from the parent module, and also allows themes including the + * SDK an internal file instead of directly from functions.php. + * @since 1.2.1.7 Knows how to handle cases when an add-on includes the parent module logic. + */ + private function get_caller_main_file_and_type() { + self::require_plugin_essentials(); + + $all_plugins = get_plugins(); + $all_plugins_paths = array(); + + // Get active plugin's main files real full names (might be symlinks). + foreach ( $all_plugins as $relative_path => &$data ) { + if ( false === strpos( fs_normalize_path( $relative_path ), '/' ) ) { + /** + * Ignore plugins that don't have a folder (e.g. Hello Dolly) since they + * can't really include the SDK. + * + * @author Vova Feldman + * @since 1.2.1.7 + */ + continue; + } + + $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ); + } + + $caller_file_candidate = false; + $caller_map = array(); + $module_type = WP_FS__MODULE_TYPE_PLUGIN; + $themes_dir = fs_normalize_path( get_theme_root() ); + + for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) { + if ( empty( $bt[ $i ]['file'] ) ) { + continue; + } + + if ( $i > 1 && ! empty( $bt[ $i - 1 ]['file'] ) && $bt[ $i ]['file'] === $bt[ $i - 1 ]['file'] ) { + // If file same as the prev file in the stack, skip it. + continue; + } + + if ( ! empty( $bt[ $i ]['function'] ) && in_array( $bt[ $i ]['function'], array( + 'do_action', + 'apply_filter', + // The string split is stupid, but otherwise, theme check + // throws info notices. + 'requir' . 'e_once', + 'requir' . 'e', + 'includ' . 'e_once', + 'includ' . 'e' + ) ) + ) { + // Ignore call stack hooks and files inclusion. + continue; + } + + $caller_file_path = fs_normalize_path( $bt[ $i ]['file'] ); + + if ( 'functions.php' === basename( $caller_file_path ) ) { + /** + * 1. Assumes that theme's starting execution file is functions.php. + * 2. This complex logic fixes symlink issues (e.g. with Vargant). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.5 + */ + + if ( $caller_file_path == fs_normalize_path( realpath( trailingslashit( $themes_dir ) . basename( dirname( $caller_file_path ) ) . '/' . basename( $caller_file_path ) ) ) ) { + $module_type = WP_FS__MODULE_TYPE_THEME; + + /** + * Relative path of the theme, e.g.: + * `my-theme/functions.php` + * + * @author Leo Fajardo (@leorw) + */ + $caller_file_candidate = basename( dirname( $caller_file_path ) ) . + '/' . + basename( $caller_file_path ); + + continue; + } + } + + $caller_file_hash = md5( $caller_file_path ); + + if ( ! isset( $caller_map[ $caller_file_hash ] ) ) { + foreach ( $all_plugins_paths as $plugin_path ) { + if ( false !== strpos( $caller_file_path, fs_normalize_path( dirname( $plugin_path ) . '/' ) ) ) { + $caller_map[ $caller_file_hash ] = fs_normalize_path( $plugin_path ); + break; + } + } + } + + if ( isset( $caller_map[ $caller_file_hash ] ) ) { + $module_type = WP_FS__MODULE_TYPE_PLUGIN; + $caller_file_candidate = plugin_basename( $caller_map[ $caller_file_hash ] ); + } + } + + return (object) array( + 'module_type' => $module_type, + 'path' => $caller_file_candidate + ); + } + + #---------------------------------------------------------------------------------- + #region Deactivation Feedback Form + #---------------------------------------------------------------------------------- + + /** + * Displays a confirmation and feedback dialog box when the user clicks on the "Deactivate" link on the plugins + * page. + * + * @author Vova Feldman (@svovaf) + * @author Leo Fajardo (@leorw) + * @since 1.1.2 + */ + function _add_deactivation_feedback_dialog_box() { + /* Check the type of user: + * 1. Long-term (long-term) + * 2. Non-registered and non-anonymous short-term (non-registered-and-non-anonymous-short-term). + * 3. Short-term (short-term) + */ + $is_long_term_user = true; + + // Check if the site is at least 2 days old. + $time_installed = $this->_storage->install_timestamp; + + // Difference in seconds. + $date_diff = time() - $time_installed; + + // Convert seconds to days. + $date_diff_days = floor( $date_diff / ( 60 * 60 * 24 ) ); + + if ( $date_diff_days < 2 ) { + $is_long_term_user = false; + } + + $is_long_term_user = $this->apply_filters( 'is_long_term_user', $is_long_term_user ); + + if ( $is_long_term_user ) { + $user_type = 'long-term'; + } else { + if ( ! $this->is_registered() && ! $this->is_anonymous() ) { + $user_type = 'non-registered-and-non-anonymous-short-term'; + } else { + $user_type = 'short-term'; + } + } + + $uninstall_reasons = $this->_get_uninstall_reasons( $user_type ); + + // Load the HTML template for the deactivation feedback dialog box. + $vars = array( + 'reasons' => $uninstall_reasons, + 'id' => $this->_module_id + ); + + /** + * @todo Deactivation form core functions should be loaded only once! Otherwise, when there are multiple Freemius powered plugins the same code is loaded multiple times. The only thing that should be loaded differently is the various deactivation reasons object based on the state of the plugin. + */ + fs_require_template( 'forms/deactivation/form.php', $vars ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.1.2 + * + * @param string $user_type + * + * @return array The uninstall reasons for the specified user type. + */ + function _get_uninstall_reasons( $user_type = 'long-term' ) { + $module_type = $this->_module_type; + + $internal_message_template_var = array( + 'id' => $this->_module_id + ); + + $plan = $this->get_plan(); + + if ( $this->is_registered() && is_object( $plan ) && $plan->has_technical_support() ) { + $contact_support_template = fs_get_template( 'forms/deactivation/contact.php', $internal_message_template_var ); + } else { + $contact_support_template = ''; + } + + $reason_found_better_plugin = array( + 'id' => self::REASON_FOUND_A_BETTER_PLUGIN, + 'text' => sprintf( $this->get_text_inline( 'I found a better %s', 'reason-found-a-better-plugin' ), $module_type ), + 'input_type' => 'textfield', + 'input_placeholder' => sprintf( $this->get_text_inline( "What's the %s's name?", 'placeholder-plugin-name' ), $module_type ), + ); + + $reason_temporary_deactivation = array( + 'id' => self::REASON_TEMPORARY_DEACTIVATION, + 'text' => sprintf( + $this->get_text_inline( "It's a temporary %s. I'm just debugging an issue.", 'reason-temporary-x' ), + strtolower( $this->is_plugin() ? + $this->get_text_inline( 'Deactivation', 'deactivation' ) : + $this->get_text_inline( 'Theme Switch', 'theme-switch' ) + ) + ), + 'input_type' => '', + 'input_placeholder' => '' + ); + + $reason_other = array( + 'id' => self::REASON_OTHER, + 'text' => $this->get_text_inline( 'Other', 'reason-other' ), + 'input_type' => 'textfield', + 'input_placeholder' => '' + ); + + $long_term_user_reasons = array( + array( + 'id' => self::REASON_NO_LONGER_NEEDED, + 'text' => sprintf( $this->get_text_inline( 'I no longer need the %s', 'reason-no-longer-needed' ), $module_type ), + 'input_type' => '', + 'input_placeholder' => '' + ), + $reason_found_better_plugin, + array( + 'id' => self::REASON_NEEDED_FOR_A_SHORT_PERIOD, + 'text' => sprintf( $this->get_text_inline( 'I only needed the %s for a short period', 'reason-needed-for-a-short-period' ), $module_type ), + 'input_type' => '', + 'input_placeholder' => '' + ), + array( + 'id' => self::REASON_BROKE_MY_SITE, + 'text' => sprintf( $this->get_text_inline( 'The %s broke my site', 'reason-broke-my-site' ), $module_type ), + 'input_type' => '', + 'input_placeholder' => '', + 'internal_message' => $contact_support_template + ), + array( + 'id' => self::REASON_SUDDENLY_STOPPED_WORKING, + 'text' => sprintf( $this->get_text_inline( 'The %s suddenly stopped working', 'reason-suddenly-stopped-working' ), $module_type ), + 'input_type' => '', + 'input_placeholder' => '', + 'internal_message' => $contact_support_template + ) + ); + + if ( $this->is_paying() ) { + $long_term_user_reasons[] = array( + 'id' => self::REASON_CANT_PAY_ANYMORE, + 'text' => $this->get_text_inline( "I can't pay for it anymore", 'reason-cant-pay-anymore' ), + 'input_type' => 'textfield', + 'input_placeholder' => $this->get_text_inline( 'What price would you feel comfortable paying?', 'placeholder-comfortable-price' ) + ); + } + + $reason_dont_share_info = array( + 'id' => self::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION, + 'text' => $this->get_text_inline( "I don't like to share my information with you", 'reason-dont-like-to-share-my-information' ), + 'input_type' => '', + 'input_placeholder' => '' + ); + + /** + * If the current user has selected the "don't share data" reason in the deactivation feedback modal, inform the + * user by showing additional message that he doesn't have to share data and can just choose to skip the opt-in + * (the Skip button is included in the message to show). This message will only be shown if anonymous mode is + * enabled and the user's account is currently not in pending activation state (similar to the way the Skip + * button in the opt-in form is shown/hidden). + */ + if ( $this->is_enable_anonymous() && ! $this->is_pending_activation() ) { + $reason_dont_share_info['internal_message'] = fs_get_template( 'forms/deactivation/retry-skip.php', $internal_message_template_var ); + } + + $uninstall_reasons = array( + 'long-term' => $long_term_user_reasons, + 'non-registered-and-non-anonymous-short-term' => array( + array( + 'id' => self::REASON_DIDNT_WORK, + 'text' => sprintf( $this->get_text_inline( "The %s didn't work", 'reason-didnt-work' ), $module_type ), + 'input_type' => '', + 'input_placeholder' => '' + ), + $reason_dont_share_info, + $reason_found_better_plugin + ), + 'short-term' => array( + array( + 'id' => self::REASON_COULDNT_MAKE_IT_WORK, + 'text' => $this->get_text_inline( "I couldn't understand how to make it work", 'reason-couldnt-make-it-work' ), + 'input_type' => '', + 'input_placeholder' => '', + 'internal_message' => $contact_support_template + ), + $reason_found_better_plugin, + array( + 'id' => self::REASON_GREAT_BUT_NEED_SPECIFIC_FEATURE, + 'text' => sprintf( $this->get_text_inline( "The %s is great, but I need specific feature that you don't support", 'reason-great-but-need-specific-feature' ), $module_type ), + 'input_type' => 'textarea', + 'input_placeholder' => $this->get_text_inline( 'What feature?', 'placeholder-feature' ) + ), + array( + 'id' => self::REASON_NOT_WORKING, + 'text' => sprintf( $this->get_text_inline( 'The %s is not working', 'reason-not-working' ), $module_type ), + 'input_type' => 'textarea', + 'input_placeholder' => $this->get_text_inline( "Kindly share what didn't work so we can fix it for future users...", 'placeholder-share-what-didnt-work' ) + ), + array( + 'id' => self::REASON_NOT_WHAT_I_WAS_LOOKING_FOR, + 'text' => $this->get_text_inline( "It's not what I was looking for", 'reason-not-what-i-was-looking-for' ), + 'input_type' => 'textarea', + 'input_placeholder' => $this->get_text_inline( "What you've been looking for?", 'placeholder-what-youve-been-looking-for' ) + ), + array( + 'id' => self::REASON_DIDNT_WORK_AS_EXPECTED, + 'text' => sprintf( $this->get_text_inline( "The %s didn't work as expected", 'reason-didnt-work-as-expected' ), $module_type ), + 'input_type' => 'textarea', + 'input_placeholder' => $this->get_text_inline( 'What did you expect?', 'placeholder-what-did-you-expect' ) + ) + ) + ); + + // Randomize the reasons for the current user type. + shuffle( $uninstall_reasons[ $user_type ] ); + + // Keep the following reasons as the last items in the list. + $uninstall_reasons[ $user_type ][] = $reason_temporary_deactivation; + $uninstall_reasons[ $user_type ][] = $reason_other; + + $uninstall_reasons = $this->apply_filters( 'uninstall_reasons', $uninstall_reasons ); + + return $uninstall_reasons[ $user_type ]; + } + + /** + * Called after the user has submitted his reason for deactivating the plugin. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.2 + */ + function _submit_uninstall_reason_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'submit_uninstall_reason' ); + + $reason_id = fs_request_get( 'reason_id' ); + + // Check if the given reason ID is an unsigned integer. + if ( ! ctype_digit( $reason_id ) ) { + exit; + } + + $reason_info = trim( fs_request_get( 'reason_info', '' ) ); + if ( ! empty( $reason_info ) ) { + $reason_info = substr( $reason_info, 0, 128 ); + } + + $reason = (object) array( + 'id' => $reason_id, + 'info' => $reason_info, + 'is_anonymous' => fs_request_get_bool( 'is_anonymous' ) + ); + + $this->_storage->store( 'uninstall_reason', $reason ); + + /** + * If the module type is "theme", trigger the uninstall event here (on theme deactivation) since themes do + * not support uninstall hook. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( $this->is_theme() ) { + if ( $this->is_premium() && ! $this->has_active_valid_license() ) { + FS_Plugin_Updater::instance( $this )->delete_update_data(); + } + + $this->_uninstall_plugin_event( false ); + $this->remove_sdk_reference(); + } + + // Print '1' for successful operation. + echo 1; + exit; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + */ + function _delete_theme_update_data_action() { + FS_Plugin_Updater::instance( $this )->delete_update_data(); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Instance + #---------------------------------------------------------------------------------- + + /** + * Main singleton instance. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @param number $module_id + * @param string|bool $slug + * @param bool $is_init Is initiation sequence. + * + * @return Freemius|false + */ + static function instance( $module_id, $slug = false, $is_init = false ) { + if ( empty( $module_id ) ) { + return false; + } + + /** + * Load the essential static data prior to initiating FS_Plugin_Manager since there's an essential MS network migration logic that needs to be executed prior to the initiation. + */ + self::_load_required_static(); + + if ( ! is_numeric( $module_id ) ) { + if ( ! $is_init && true === $slug ) { + $is_init = true; + } + + $slug = $module_id; + + $module = FS_Plugin_Manager::instance( $slug )->get(); + + if ( is_object( $module ) ) { + $module_id = $module->id; + } + } + + $key = 'm_' . $module_id; + + if ( ! isset( self::$_instances[ $key ] ) ) { + self::$_instances[ $key ] = new Freemius( $module_id, $slug, $is_init ); + } + + return self::$_instances[ $key ]; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number $addon_id + * + * @return bool + */ + private static function has_instance( $addon_id ) { + return isset( self::$_instances[ 'm_' . $addon_id ] ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @param string|number $id_or_slug + * + * @return number|false + */ + private static function get_module_id( $id_or_slug ) { + if ( is_numeric( $id_or_slug ) ) { + return $id_or_slug; + } + + foreach ( self::$_instances as $instance ) { + if ( $instance->is_plugin() && ( $id_or_slug === $instance->get_slug() ) ) { + return $instance->get_id(); + } + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number $id + * + * @return false|Freemius + */ + static function get_instance_by_id( $id ) { + return isset ( self::$_instances[ 'm_' . $id ] ) ? + self::$_instances[ 'm_' . $id ] : + false; + } + + /** + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param $plugin_file + * + * @return false|Freemius + */ + static function get_instance_by_file( $plugin_file ) { + $slug = self::find_slug_by_basename( $plugin_file ); + + return ( false !== $slug ) ? + self::instance( self::get_module_id( $slug ) ) : + false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return false|Freemius + */ + function get_parent_instance() { + return self::get_instance_by_id( $this->_plugin->parent_plugin_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string|number $id_or_slug + * + * @return false|Freemius + */ + function get_addon_instance( $id_or_slug ) { + $addon_id = self::get_module_id( $id_or_slug ); + + return self::instance( $addon_id ); + } + + #endregion ------------------------------------------------------------------ + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function is_parent_plugin_installed() { + $is_active = self::has_instance( $this->_plugin->parent_plugin_id ); + + if ( $is_active ) { + return true; + } + + /** + * Parent module might be a theme. If that's the case, the add-on's FS + * instance will be loaded prior to the theme's FS instance, therefore, + * we need to check if it's active with a "look ahead". + * + * @author Vova Feldman + * @since 1.2.2.3 + */ + global $fs_active_plugins; + if ( is_object( $fs_active_plugins ) && is_array( $fs_active_plugins->plugins ) ) { + $active_theme = wp_get_theme(); + + foreach ( $fs_active_plugins->plugins as $sdk => $module ) { + if ( WP_FS__MODULE_TYPE_THEME === $module->type ) { + if ( $module->plugin_path == $active_theme->get_stylesheet() ) { + // Parent module is a theme and it's currently active. + return true; + } + } + } + } + + return false; + } + + /** + * Check if add-on parent plugin in activation mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function is_parent_in_activation() { + $parent_fs = $this->get_parent_instance(); + if ( ! is_object( $parent_fs ) ) { + return false; + } + + return ( $parent_fs->is_activation_mode() ); + } + + /** + * Is plugin in activation mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param bool $and_on + * + * @return bool + */ + function is_activation_mode( $and_on = true ) { + return fs_is_network_admin() ? + $this->is_network_activation_mode( $and_on ) : + $this->is_site_activation_mode( $and_on ); + } + + /** + * Is plugin in activation mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param bool $and_on + * + * @return bool + */ + function is_site_activation_mode( $and_on = true ) { + return ( + ( $this->is_on() || ! $and_on ) && + ( ! $this->is_registered() || + ( $this->is_only_premium() && ! $this->has_features_enabled_license() ) ) && + ( ! $this->is_enable_anonymous() || + ( ! $this->is_anonymous() && ! $this->is_pending_activation() ) ) + ); + } + + /** + * Checks if the SDK in network activation mode. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param bool $and_on + * + * @return bool + */ + private function is_network_activation_mode( $and_on = true ) { + if ( ! $this->_is_network_active ) { + // Not network activated. + return false; + } + + if ( $this->is_network_upgrade_mode() ) { + // Special flag to enforce network activation mode to decide what to do with the sites that are not yet opted-in nor skipped. + return true; + } + + if ( ! $this->is_site_activation_mode( $and_on ) ) { + // Whether the context is single site or the network, if the plugin is no longer in activation mode then it is not in network activation mode as well. + return false; + } + + if ( $this->is_network_delegated_connection() ) { + // Super-admin delegated the connection to the site admins -> not activation mode. + return false; + } + + if ( $this->is_network_anonymous() ) { + // Super-admin skipped the connection network wide -> not activation mode. + return false; + } + + if ( $this->is_network_registered() ) { + // Super-admin connected at least one site -> not activation mode. + return false; + } + + return true; + } + + /** + * Check if current page is the opt-in/pending-activation page. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @return bool + */ + function is_activation_page() { + if ( $this->_menu->is_main_settings_page() ) { + return true; + } + + if ( ! $this->is_activation_mode() ) { + return false; + } + + // Check if current page is matching the activation page. + return $this->is_matching_url( $this->get_activation_url() ); + } + + /** + * Check if URL path's are matching and that all querystring + * arguments of the $sub_url exist in the $url with the same values. + * + * WARNING: + * 1. This method doesn't check if the sub/domain are matching. + * 2. Ignore case sensitivity. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $sub_url + * @param string $url If argument is not set, check if the sub_url matching the current's page URL. + * + * @return bool + */ + private function is_matching_url( $sub_url, $url = '' ) { + if ( empty( $url ) ) { + $url = $_SERVER['REQUEST_URI']; + } + + $url = strtolower( $url ); + $sub_url = strtolower( $sub_url ); + + if ( parse_url( $sub_url, PHP_URL_PATH ) !== parse_url( $url, PHP_URL_PATH ) ) { + // Different path - DO NOT OVERRIDE PAGE. + return false; + } + + $url_params = array(); + parse_str( parse_url( $url, PHP_URL_QUERY ), $url_params ); + + $sub_url_params = array(); + parse_str( parse_url( $sub_url, PHP_URL_QUERY ), $sub_url_params ); + + foreach ( $sub_url_params as $key => $val ) { + if ( ! isset( $url_params[ $key ] ) || $val != $url_params[ $key ] ) { + // Not matching query string - DO NOT OVERRIDE PAGE. + return false; + } + } + + return true; + } + + /** + * Get the basenames of all active plugins for specific blog. Including network activated plugins. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return string[] + */ + private static function get_active_plugins_basenames( $blog_id = 0 ) { + if ( is_multisite() && $blog_id > 0 ) { + $active_basenames = get_blog_option( $blog_id, 'active_plugins' ); + } else { + $active_basenames = get_option( 'active_plugins' ); + } + + if ( is_multisite() ) { + $network_active_basenames = get_site_option( 'active_sitewide_plugins' ); + + if ( is_array( $network_active_basenames ) && ! empty( $network_active_basenames ) ) { + $active_basenames = array_merge( $active_basenames, $network_active_basenames ); + } + } + + return $active_basenames; + } + + /** + * Get collection of all active plugins. Including network activated plugins. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param int $blog_id Since 2.0.0 + * + * @return array[string]array + */ + private static function get_active_plugins( $blog_id = 0 ) { + self::require_plugin_essentials(); + + $active_plugin = array(); + $all_plugins = get_plugins(); + $active_plugins_basenames = self::get_active_plugins_basenames( $blog_id ); + + foreach ( $active_plugins_basenames as $plugin_basename ) { + $active_plugin[ $plugin_basename ] = $all_plugins[ $plugin_basename ]; + } + + return $active_plugin; + } + + /** + * Get collection of all site active plugins for a specified blog. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return array[string]array + */ + private static function get_site_active_plugins( $blog_id = 0 ) { + $active_basenames = ( is_multisite() && $blog_id > 0 ) ? + get_blog_option( $blog_id, 'active_plugins' ) : + get_option( 'active_plugins' ); + + $active = array(); + foreach ( $active_basenames as $basename ) { + $active[ $basename ] = array( + 'is_active' => true, + 'Version' => '1.0', // Dummy version. + 'slug' => self::get_plugin_slug( $basename ), + ); + } + + return $active; + } + + /** + * Get collection of all plugins with their activation status for a specified blog. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8 + * + * @param int $blog_id Since 2.0.0 + * + * @return array Key is the plugin file path and the value is an array of the plugin data. + */ + private static function get_all_plugins( $blog_id = 0 ) { + self::require_plugin_essentials(); + + $all_plugins = get_plugins(); + + $active_plugins_basenames = self::get_active_plugins_basenames( $blog_id ); + + foreach ( $all_plugins as $basename => &$data ) { + // By default set to inactive (next foreach update the active plugins). + $data['is_active'] = false; + // Enrich with plugin slug. + $data['slug'] = self::get_plugin_slug( $basename ); + } + + // Flag active plugins. + foreach ( $active_plugins_basenames as $basename ) { + if ( isset( $all_plugins[ $basename ] ) ) { + $all_plugins[ $basename ]['is_active'] = true; + } + } + + return $all_plugins; + } + + /** + * Get collection of all plugins and if they are network level activated. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return array Key is the plugin basename and the value is an array of the plugin data. + */ + private static function get_network_plugins() { + self::require_plugin_essentials(); + + $all_plugins = get_plugins(); + + $network_active_basenames = is_multisite() ? + get_site_option( 'active_sitewide_plugins' ) : + array(); + + foreach ( $all_plugins as $basename => &$data ) { + // By default set to inactive (next foreach update the active plugins). + $data['is_active'] = false; + // Enrich with plugin slug. + $data['slug'] = self::get_plugin_slug( $basename ); + } + + // Flag active plugins. + foreach ( $network_active_basenames as $basename ) { + if ( isset( $all_plugins[ $basename ] ) ) { + $all_plugins[ $basename ]['is_active'] = true; + } + } + + return $all_plugins; + } + + /** + * Cached result of get_site_transient( 'update_plugins' ) + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8 + * + * @var object + */ + private static $_plugins_info; + + /** + * Helper function to get specified plugin's slug. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8 + * + * @param $basename + * + * @return string + */ + private static function get_plugin_slug( $basename ) { + if ( ! isset( self::$_plugins_info ) ) { + self::$_plugins_info = get_site_transient( 'update_plugins' ); + } + + $slug = ''; + + if ( is_object( self::$_plugins_info ) ) { + if ( isset( self::$_plugins_info->no_update ) && + isset( self::$_plugins_info->no_update[ $basename ] ) && + ! empty( self::$_plugins_info->no_update[ $basename ]->slug ) + ) { + $slug = self::$_plugins_info->no_update[ $basename ]->slug; + } else if ( isset( self::$_plugins_info->response ) && + isset( self::$_plugins_info->response[ $basename ] ) && + ! empty( self::$_plugins_info->response[ $basename ]->slug ) + ) { + $slug = self::$_plugins_info->response[ $basename ]->slug; + } + } + + if ( empty( $slug ) ) { + // Try to find slug from FS data. + $slug = self::find_slug_by_basename( $basename ); + } + + if ( empty( $slug ) ) { + // Fallback to plugin's folder name. + $slug = dirname( $basename ); + } + + return $slug; + } + + private static $_statics_loaded = false; + + /** + * Load static resources. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + */ + private static function _load_required_static() { + if ( self::$_statics_loaded ) { + return; + } + + self::$_static_logger = FS_Logger::get_logger( WP_FS__SLUG, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + self::$_static_logger->entrance(); + + self::$_accounts = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); + + if ( is_multisite() ) { + $has_skipped_migration = ( + // 'id_slug_type_path_map' - was never stored on older versions, therefore, not exists on the site level. + null === self::$_accounts->get_option( 'id_slug_type_path_map', null, false ) && + // 'file_slug_map' stored on the site level, so it was running an SDK version before it was integrated with MS-network. + null !== self::$_accounts->get_option( 'file_slug_map', null, false ) + ); + + /** + * If the file_slug_map exists on the site level but doesn't exist on the + * network level storage, it means that we need to process the storage with migration. + * + * The code in this `if` scope will only be executed once and only for the first site that will execute it because once we migrate the storage data, file_slug_map will be already set in the network level storage. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + if ( + ( $has_skipped_migration && true !== self::$_accounts->get_option( 'ms_migration_complete', false, true ) ) || + ( null === self::$_accounts->get_option( 'file_slug_map', null, true ) && + null !== self::$_accounts->get_option( 'file_slug_map', null, false ) ) + ) { + self::migrate_options_to_network(); + } + } + + self::$_global_admin_notices = FS_Admin_Notices::instance( 'global' ); + + if ( ! WP_FS__DEMO_MODE ) { + add_action( ( fs_is_network_admin() ? 'network_' : '' ) . 'admin_menu', array( + 'Freemius', + '_add_debug_section' + ) ); + } + + add_action( "wp_ajax_fs_toggle_debug_mode", array( 'Freemius', '_toggle_debug_mode' ) ); + + self::add_ajax_action_static( 'get_debug_log', array( 'Freemius', '_get_debug_log' ) ); + + self::add_ajax_action_static( 'get_db_option', array( 'Freemius', '_get_db_option' ) ); + + self::add_ajax_action_static( 'set_db_option', array( 'Freemius', '_set_db_option' ) ); + + if ( 0 == did_action( 'plugins_loaded' ) ) { + add_action( 'plugins_loaded', array( 'Freemius', '_load_textdomain' ), 1 ); + } + + add_action( 'admin_footer', array( 'Freemius', '_enrich_ajax_url' ) ); + + self::$_statics_loaded = true; + } + + /** + * @author Leo Fajardo (@leorw) + * + * @since 2.1.3 + */ + private static function migrate_options_to_network() { + self::migrate_accounts_to_network(); + + // Migrate API options from site level to network level. + $api_network_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true ); + $api_network_options->migrate_to_network(); + + // Migrate API cache to network level storage. + FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME )->migrate_to_network(); + + self::$_accounts->set_option( 'ms_migration_complete', true, true ); + } + + #---------------------------------------------------------------------------------- + #region Localization + #---------------------------------------------------------------------------------- + + /** + * Load framework's text domain. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + */ + static function _load_textdomain() { + if ( ! is_admin() ) { + return; + } + + global $fs_active_plugins; + + // Works both for plugins and themes. + load_plugin_textdomain( + 'freemius', + false, + $fs_active_plugins->newest->sdk_path . '/languages/' + ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Debugging + #---------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.8 + */ + static function _add_debug_section() { + if ( ! is_super_admin() ) { + // Add debug page only for super-admins. + return; + } + + self::$_static_logger->entrance(); + + $title = sprintf( '%s [v.%s]', fs_text_inline( 'Freemius Debug' ), WP_FS__SDK_VERSION ); + + if ( WP_FS__DEV_MODE ) { + // Add top-level debug menu item. + $hook = FS_Admin_Menu_Manager::add_page( + $title, + $title, + 'manage_options', + 'freemius', + array( 'Freemius', '_debug_page_render' ) + ); + } else { + // Add hidden debug page. + $hook = FS_Admin_Menu_Manager::add_subpage( + null, + $title, + $title, + 'manage_options', + 'freemius', + array( 'Freemius', '_debug_page_render' ) + ); + } + + if ( ! empty( $hook ) ) { + add_action( "load-$hook", array( 'Freemius', '_debug_page_actions' ) ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + static function _toggle_debug_mode() { + $is_on = fs_request_get( 'is_on', false, 'post' ); + + if ( fs_request_is_post() && in_array( $is_on, array( 0, 1 ) ) ) { + update_option( 'fs_debug_mode', $is_on ); + + // Turn on/off storage logging. + FS_Logger::_set_storage_logging( ( 1 == $is_on ) ); + } + + exit; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + */ + static function _get_debug_log() { + $logs = FS_Logger::load_db_logs( + fs_request_get( 'filters', false, 'post' ), + ! empty( $_POST['limit'] ) && is_numeric( $_POST['limit'] ) ? $_POST['limit'] : 200, + ! empty( $_POST['offset'] ) && is_numeric( $_POST['offset'] ) ? $_POST['offset'] : 0 + ); + + self::shoot_ajax_success( $logs ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + static function _get_db_option() { + $option_name = fs_request_get( 'option_name' ); + + $value = get_option( $option_name ); + + $result = array( + 'name' => $option_name, + ); + + if ( false !== $value ) { + if ( ! is_string( $value ) ) { + $value = json_encode( $value ); + } + + $result['value'] = $value; + } + + self::shoot_ajax_success( $result ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + static function _set_db_option() { + $option_name = fs_request_get( 'option_name' ); + $option_value = fs_request_get( 'option_value' ); + + if ( ! empty( $option_value ) ) { + update_option( $option_name, $option_value ); + } + + self::shoot_ajax_success(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.8 + */ + static function _debug_page_actions() { + self::_clean_admin_content_section(); + + if ( fs_request_is_action( 'restart_freemius' ) ) { + check_admin_referer( 'restart_freemius' ); + + if ( ! is_multisite() ) { + // Clear accounts data. + self::$_accounts->clear( null, true ); + } else { + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + self::$_accounts->clear( $blog_id, true ); + } + + // Clear network level storage. + self::$_accounts->clear( true, true ); + } + + // Clear SDK reference cache. + delete_option( 'fs_active_plugins' ); + } else if ( fs_request_is_action( 'clear_updates_data' ) ) { + check_admin_referer( 'clear_updates_data' ); + + if ( ! is_multisite() ) { + set_site_transient( 'update_plugins', null ); + set_site_transient( 'update_themes', null ); + } else { + $current_blog_id = get_current_blog_id(); + + $sites = self::get_sites(); + foreach ( $sites as $site ) { + switch_to_blog( self::get_site_blog_id( $site ) ); + + set_site_transient( 'update_plugins', null ); + set_site_transient( 'update_themes', null ); + } + + switch_to_blog( $current_blog_id ); + } + } else if ( fs_request_is_action( 'simulate_trial' ) ) { + check_admin_referer( 'simulate_trial' ); + + $fs = freemius( fs_request_get( 'module_id' ) ); + + // Update SDK install to at least 24 hours before. + $fs->_storage->install_timestamp = ( time() - WP_FS__TIME_24_HOURS_IN_SEC ); + // Unset the trial shown timestamp. + unset( $fs->_storage->trial_promotion_shown ); + } else if ( fs_request_is_action( 'simulate_network_upgrade' ) ) { + check_admin_referer( 'simulate_network_upgrade' ); + + $fs = freemius( fs_request_get( 'module_id' ) ); + + self::set_network_upgrade_mode( $fs->_storage ); + } else if ( fs_request_is_action( 'delete_install' ) ) { + check_admin_referer( 'delete_install' ); + + self::_delete_site_by_slug( + fs_request_get( 'slug' ), + fs_request_get( 'module_type' ), + true, + fs_request_get( 'blog_id', null ) + ); + } else if ( fs_request_is_action( 'delete_user' ) ) { + check_admin_referer( 'delete_user' ); + + self::delete_user( fs_request_get( 'user_id' ) ); + } else if ( fs_request_is_action( 'download_logs' ) ) { + check_admin_referer( 'download_logs' ); + + $download_url = FS_Logger::download_db_logs( + fs_request_get( 'filters', false, 'post' ) + ); + + if ( false === $download_url ) { + wp_die( 'Oops... there was an error while generating the logs download file. Please try again and if it doesn\'t work contact support@freemius.com.' ); + } + + fs_redirect( $download_url ); + } else if ( fs_request_is_action( 'migrate_options_to_network' ) ) { + check_admin_referer( 'migrate_options_to_network' ); + + self::migrate_options_to_network(); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.8 + */ + static function _debug_page_render() { + self::$_static_logger->entrance(); + + if ( ! is_multisite() ) { + $all_plugins_installs = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN ); + $all_themes_installs = self::get_all_sites( WP_FS__MODULE_TYPE_THEME ); + } else { + $sites = self::get_sites(); + + $all_plugins_installs = array(); + $all_themes_installs = array(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + $plugins_installs = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN, $blog_id ); + + foreach ( $plugins_installs as $slug => $install ) { + if ( ! isset( $all_plugins_installs[ $slug ] ) ) { + $all_plugins_installs[ $slug ] = array(); + } + + $install->blog_id = $blog_id; + + $all_plugins_installs[ $slug ][] = $install; + } + + $themes_installs = self::get_all_sites( WP_FS__MODULE_TYPE_THEME, $blog_id ); + + foreach ( $themes_installs as $slug => $install ) { + if ( ! isset( $all_themes_installs[ $slug ] ) ) { + $all_themes_installs[ $slug ] = array(); + } + + $install->blog_id = $blog_id; + + $all_themes_installs[ $slug ][] = $install; + } + } + } + + $licenses_by_module_type = self::get_all_licenses_by_module_type(); + + $vars = array( + 'plugin_sites' => $all_plugins_installs, + 'theme_sites' => $all_themes_installs, + 'users' => self::get_all_users(), + 'addons' => self::get_all_addons(), + 'account_addons' => self::get_all_account_addons(), + 'plugin_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_PLUGIN ], + 'theme_licenses' => $licenses_by_module_type[ WP_FS__MODULE_TYPE_THEME ] + ); + + fs_enqueue_local_style( 'fs_debug', '/admin/debug.css' ); + fs_require_once_template( 'debug.php', $vars ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Connectivity Issues + #---------------------------------------------------------------------------------- + + /** + * Check if Freemius should be turned on for the current plugin install. + * + * Note: + * $this->_is_on is updated in has_api_connectivity() + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_on() { + self::$_static_logger->entrance(); + + if ( isset( $this->_is_on ) ) { + return $this->_is_on; + } + + // If already installed or pending then sure it's on :) + if ( $this->is_registered() || $this->is_pending_activation() ) { + $this->_is_on = true; + + return true; + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param bool $flush_if_no_connectivity + * + * @return bool + */ + private function should_run_connectivity_test( $flush_if_no_connectivity = false ) { + if ( ! isset( $this->_storage->connectivity_test ) ) { + // Connectivity test was never executed, or cache was cleared. + return true; + } + + if ( WP_FS__PING_API_ON_IP_OR_HOST_CHANGES ) { + if ( WP_FS__IS_HTTP_REQUEST ) { + if ( $_SERVER['HTTP_HOST'] != $this->_storage->connectivity_test['host'] ) { + // Domain changed. + return true; + } + + if ( WP_FS__REMOTE_ADDR != $this->_storage->connectivity_test['server_ip'] ) { + // Server IP changed. + return true; + } + } + } + + if ( $this->_storage->connectivity_test['is_connected'] && + $this->_storage->connectivity_test['is_active'] + ) { + // API connected and Freemius is active - no need to run connectivity check. + return false; + } + + if ( $flush_if_no_connectivity ) { + /** + * If explicitly asked to flush when no connectivity - do it only + * if at least 10 sec passed from the last API connectivity test. + */ + return ( isset( $this->_storage->connectivity_test['timestamp'] ) && + ( WP_FS__SCRIPT_START_TIME - $this->_storage->connectivity_test['timestamp'] ) > 10 ); + } + + /** + * @since 1.1.7 Don't check for connectivity on plugin downgrade. + */ + $version = $this->get_plugin_version(); + if ( version_compare( $version, $this->_storage->connectivity_test['version'], '>' ) ) { + // If it's a plugin version upgrade and Freemius is off or no connectivity, run connectivity test. + return true; + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param int|null $blog_id Since 2.0.0. + * @param bool $is_gdpr_test Since 2.0.2. Perform only the GDPR test. + * + * @return object|false + */ + private function ping( $blog_id = null, $is_gdpr_test = false ) { + if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY ) { + return false; + } + + $version = $this->get_plugin_version(); + + $is_update = $this->apply_filters( 'is_plugin_update', $this->is_plugin_update() ); + + return $this->get_api_plugin_scope()->ping( + $this->get_anonymous_id( $blog_id ), + array( + 'is_update' => json_encode( $is_update ), + 'version' => $version, + 'sdk' => $this->version, + 'is_admin' => json_encode( is_admin() ), + 'is_ajax' => json_encode( self::is_ajax() ), + 'is_cron' => json_encode( self::is_cron() ), + 'is_gdpr_test' => $is_gdpr_test, + 'is_http' => json_encode( WP_FS__IS_HTTP_REQUEST ), + ) + ); + } + + /** + * Check if there's any connectivity issue to Freemius API. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param bool $flush_if_no_connectivity + * + * @return bool + */ + function has_api_connectivity( $flush_if_no_connectivity = false ) { + $this->_logger->entrance(); + + if ( isset( $this->_has_api_connection ) && ( $this->_has_api_connection || ! $flush_if_no_connectivity ) ) { + return $this->_has_api_connection; + } + + if ( WP_FS__SIMULATE_NO_API_CONNECTIVITY && + isset( $this->_storage->connectivity_test ) && + true === $this->_storage->connectivity_test['is_connected'] + ) { + unset( $this->_storage->connectivity_test ); + } + + if ( ! $this->should_run_connectivity_test( $flush_if_no_connectivity ) ) { + $this->_has_api_connection = $this->_storage->connectivity_test['is_connected']; + /** + * @since 1.1.6 During dev mode, if there's connectivity - turn Freemius on regardless the configuration. + * + * @since 1.2.1.5 If the user running the premium version then ignore the 'is_active' flag and turn Freemius on to enable license key activation. + */ + $this->_is_on = $this->_storage->connectivity_test['is_active'] || + $this->is_premium() || + ( WP_FS__DEV_MODE && $this->_has_api_connection && ! WP_FS__SIMULATE_FREEMIUS_OFF ); + + return $this->_has_api_connection; + } + + $pong = $this->ping(); + $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); + + if ( ! $is_connected ) { + // API failure. + $this->_add_connectivity_issue_message( $pong ); + } + + if ( $is_connected ) { + FS_GDPR_Manager::instance()->store_is_required( $pong->is_gdpr_required ); + } + + $this->store_connectivity_info( $pong, $is_connected ); + + return $this->_has_api_connection; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param object $pong + * @param bool $is_connected + */ + private function store_connectivity_info( $pong, $is_connected ) { + $this->_logger->entrance(); + + $version = $this->get_plugin_version(); + + if ( ! $is_connected || WP_FS__SIMULATE_FREEMIUS_OFF ) { + $is_active = false; + } else { + $is_active = ( isset( $pong->is_active ) && true == $pong->is_active ); + } + + $is_active = $this->apply_filters( + 'is_on', + $is_active, + $this->is_plugin_update(), + $version + ); + + $this->_storage->connectivity_test = array( + 'is_connected' => $is_connected, + 'host' => $_SERVER['HTTP_HOST'], + 'server_ip' => WP_FS__REMOTE_ADDR, + 'is_active' => $is_active, + 'timestamp' => WP_FS__SCRIPT_START_TIME, + // Last version with connectivity attempt. + 'version' => $version, + ); + + $this->_has_api_connection = $is_connected; + $this->_is_on = $is_active || ( WP_FS__DEV_MODE && $is_connected && ! WP_FS__SIMULATE_FREEMIUS_OFF ); + } + + /** + * Force turning Freemius on. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8.1 + * + * @return bool TRUE if successfully turned on. + */ + private function turn_on() { + $this->_logger->entrance(); + + if ( $this->is_on() || ! isset( $this->_storage->connectivity_test['is_active'] ) ) { + return false; + } + + $updated_connectivity = $this->_storage->connectivity_test; + $updated_connectivity['is_active'] = true; + $updated_connectivity['timestamp'] = WP_FS__SCRIPT_START_TIME; + $this->_storage->connectivity_test = $updated_connectivity; + + $this->_is_on = true; + + return true; + } + + /** + * Anonymous and unique site identifier (Hash). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.0 + * + * @param null|int $blog_id Since 2.0.0 + * + * @return string + */ + function get_anonymous_id( $blog_id = null ) { + $unique_id = self::$_accounts->get_option( 'unique_id', null, $blog_id ); + + if ( empty( $unique_id ) || ! is_string( $unique_id ) ) { + $key = fs_strip_url_protocol( get_site_url( $blog_id ) ); + + $secure_auth = SECURE_AUTH_KEY; + if ( empty( $secure_auth ) || false !== strpos( $secure_auth, ' ' ) ) { + // Protect against default auth key. + $secure_auth = md5( microtime() ); + } + + /** + * Base the unique identifier on the WP secure authentication key. Which + * turns the key into a secret anonymous identifier. This will help us + * to avoid duplicate installs generation on the backend upon opt-in. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + */ + $unique_id = md5( $key . $secure_auth ); + + self::$_accounts->set_option( 'unique_id', $unique_id, true, $blog_id ); + } + + $this->_logger->departure( $unique_id ); + + return $unique_id; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @return \WP_User + */ + static function _get_current_wp_user() { + self::require_pluggable_essentials(); + self::wp_cookie_constants(); + + return wp_get_current_user(); + } + + /** + * Define cookie constants which are required by Freemius::_get_current_wp_user() since + * it uses wp_get_current_user() which needs the cookie constants set. When a plugin + * is network activated the cookie constants are only configured after the network + * plugins activation, therefore, if we don't define those constants WP will throw + * PHP warnings/notices. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.1 + */ + private static function wp_cookie_constants() { + if ( defined( 'LOGGED_IN_COOKIE' ) && + ( defined( 'AUTH_COOKIE' ) || defined( 'SECURE_AUTH_COOKIE' ) ) + ) { + return; + } + + /** + * Used to guarantee unique hash cookies + * + * @since 1.5.0 + */ + if ( ! defined( 'COOKIEHASH' ) ) { + $siteurl = get_site_option( 'siteurl' ); + if ( $siteurl ) { + define( 'COOKIEHASH', md5( $siteurl ) ); + } else { + define( 'COOKIEHASH', '' ); + } + } + + if ( ! defined( 'LOGGED_IN_COOKIE' ) ) { + define( 'LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH ); + } + + /** + * @since 2.5.0 + */ + if ( ! defined( 'AUTH_COOKIE' ) ) { + define( 'AUTH_COOKIE', 'wordpress_' . COOKIEHASH ); + } + + /** + * @since 2.6.0 + */ + if ( ! defined( 'SECURE_AUTH_COOKIE' ) ) { + define( 'SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return int + */ + static function get_current_wp_user_id() { + $wp_user = self::_get_current_wp_user(); + + return $wp_user->ID; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $email + * + * @return bool + */ + static function is_valid_email( $email ) { + if ( false === filter_var( $email, FILTER_VALIDATE_EMAIL ) ) { + return false; + } + + $parts = explode( '@', $email ); + + if ( 2 !== count( $parts ) || empty( $parts[1] ) ) { + return false; + } + + $blacklist = array( + 'admin.', + 'webmaster.', + 'localhost.', + 'dev.', + 'development.', + 'test.', + 'stage.', + 'staging.', + ); + + // Make sure domain is not one of the blacklisted. + foreach ( $blacklist as $invalid ) { + if ( 0 === strpos( $parts[1], $invalid ) ) { + return false; + } + } + + // Get the UTF encoded domain name. + $domain = idn_to_ascii( $parts[1] ) . '.'; + + return ( checkdnsrr( $domain, 'MX' ) || checkdnsrr( $domain, 'A' ) ); + } + + /** + * Generate API connectivity issue message. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param mixed $api_result + * @param bool $is_first_failure + */ + function _add_connectivity_issue_message( $api_result, $is_first_failure = true ) { + if ( ! $this->is_premium() && $this->_enable_anonymous ) { + // Don't add message if it's the free version and can run anonymously. + return; + } + + if ( ! function_exists( 'wp_nonce_url' ) ) { + require_once ABSPATH . 'wp-includes/functions.php'; + } + + $current_user = self::_get_current_wp_user(); +// $admin_email = get_option( 'admin_email' ); + $admin_email = $current_user->user_email; + + // Aliases. + $deactivate_plugin_title = $this->esc_html_inline( 'That\'s exhausting, please deactivate', 'deactivate-plugin-title' ); + $deactivate_plugin_desc = $this->esc_html_inline( 'We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future.', 'deactivate-plugin-desc' ); + $install_previous_title = $this->esc_html_inline( 'Let\'s try your previous version', 'install-previous-title' ); + $install_previous_desc = $this->esc_html_inline( 'Uninstall this version and install the previous one.', 'install-previous-desc' ); + $fix_issue_title = $this->esc_html_inline( 'Yes - I\'m giving you a chance to fix it', 'fix-issue-title' ); + $fix_issue_desc = $this->esc_html_inline( 'We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update.', 'fix-issue-desc' ); + /* translators: %s: product title (e.g. "Awesome Plugin" requires an access to...) */ + $x_requires_access_to_api = $this->esc_html_inline( '%s requires an access to our API.', 'x-requires-access-to-api' ); + $sysadmin_title = $this->esc_html_inline( 'I\'m a system administrator', 'sysadmin-title' ); + $happy_to_resolve_issue_asap = $this->esc_html_inline( 'We are sure it\'s an issue on our side and more than happy to resolve it for you ASAP if you give us a chance.', 'happy-to-resolve-issue-asap' ); + + $message = false; + if ( is_object( $api_result ) && + isset( $api_result->error ) && + isset( $api_result->error->code ) + ) { + switch ( $api_result->error->code ) { + case 'curl_missing': + $missing_methods = ''; + if ( is_array( $api_result->missing_methods ) && + ! empty( $api_result->missing_methods ) + ) { + foreach ( $api_result->missing_methods as $m ) { + if ( 'curl_version' === $m ) { + continue; + } + + if ( ! empty( $missing_methods ) ) { + $missing_methods .= ', '; + } + + $missing_methods .= sprintf( '<code>%s</code>', $m ); + } + + if ( ! empty( $missing_methods ) ) { + $missing_methods = sprintf( + '<br><br><b>%s</b> %s', + $this->esc_html_inline( 'Disabled method(s):', 'curl-disabled-methods' ), + $missing_methods + ); + } + } + + $message = sprintf( + $x_requires_access_to_api . ' ' . + $this->esc_html_inline( 'We use PHP cURL library for the API calls, which is a very common library and usually installed and activated out of the box. Unfortunately, cURL is not activated (or disabled) on your server.', 'curl-missing-message' ) . ' ' . + $missing_methods . + ' %s', + '<b>' . $this->get_plugin_name() . '</b>', + sprintf( + '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', + sprintf( + '<a class="fs-resolve" data-type="curl" href="#"><b>%s</b></a>%s', + $this->get_text_inline( 'I don\'t know what is cURL or how to install it, help me!', 'curl-missing-no-clue-title' ), + ' - ' . sprintf( + $this->get_text_inline( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.', 'curl-missing-no-clue-desc' ), + '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' + ) + ), + sprintf( + '<b>%s</b> - %s', + $sysadmin_title, + esc_html( sprintf( $this->get_text_inline( 'Great, please install cURL and enable it in your php.ini file. In addition, search for the \'disable_functions\' directive in your php.ini file and remove any disabled methods starting with \'curl_\'. To make sure it was successfully activated, use \'phpinfo()\'. Once activated, deactivate the %s and reactivate it back again.', 'curl-missing-sysadmin-desc' ), $this->get_module_label( true ) ) ) + ), + sprintf( + '<a href="%s"><b>%s</b></a> - %s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=all&paged=1&s=', 'deactivate-plugin_' . $this->_plugin_basename ), + $deactivate_plugin_title, + $deactivate_plugin_desc + ) + ) + ); + break; + case 'cloudflare_ddos_protection': + $message = sprintf( + $x_requires_access_to_api . ' ' . + $this->esc_html_inline( 'From unknown reason, CloudFlare, the firewall we use, blocks the connection.', 'cloudflare-blocks-connection-message' ) . ' ' . + $happy_to_resolve_issue_asap . + ' %s', + '<b>' . $this->get_plugin_name() . '</b>', + sprintf( + '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', + sprintf( + '<a class="fs-resolve" data-type="cloudflare" href="#"><b>%s</b></a>%s', + $fix_issue_title, + ' - ' . sprintf( + $fix_issue_desc, + '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' + ) + ), + sprintf( + '<a href="%s" target="_blank"><b>%s</b></a> - %s', + sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ), + $install_previous_title, + $install_previous_desc + ), + sprintf( + '<a href="%s"><b>%s</b></a> - %s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=all&paged=1&s=' . '', 'deactivate-plugin_' . $this->_plugin_basename ), + $deactivate_plugin_title, + $deactivate_plugin_desc + ) + ) + ); + break; + case 'squid_cache_block': + $message = sprintf( + $x_requires_access_to_api . ' ' . + $this->esc_html_inline( 'It looks like your server is using Squid ACL (access control lists), which blocks the connection.', 'squid-blocks-connection-message' ) . + ' %s', + '<b>' . $this->get_plugin_name() . '</b>', + sprintf( + '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', + sprintf( + '<a class="fs-resolve" data-type="squid" href="#"><b>%s</b></a> - %s', + $this->esc_html_inline( 'I don\'t know what is Squid or ACL, help me!', 'squid-no-clue-title' ), + sprintf( + $this->esc_html_inline( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.', 'squid-no-clue-desc' ), + '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' + ) + ), + sprintf( + '<b>%s</b> - %s', + $sysadmin_title, + sprintf( + $this->esc_html_inline( 'Great, please whitelist the following domains: %s. Once you are done, deactivate the %s and activate it again.', 'squid-sysadmin-desc' ), + // We use a filter since the plugin might require additional API connectivity. + '<b>' . implode( ', ', $this->apply_filters( 'api_domains', array( + 'api.freemius.com', + 'wp.freemius.com' + ) ) ) . '</b>', + $this->_module_type + ) + ), + sprintf( + '<a href="%s"><b>%s</b></a> - %s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=all&paged=1&s=', 'deactivate-plugin_' . $this->_plugin_basename ), + $deactivate_plugin_title, + $deactivate_plugin_desc + ) + ) + ); + break; +// default: +// $message = $this->get_text_inline( 'connectivity-test-fails-message' ); +// break; + } + } + + $message_id = 'failed_connect_api'; + $type = 'error'; + + $connectivity_test_fails_message = $this->esc_html_inline( 'From unknown reason, the API connectivity test failed.', 'connectivity-test-fails-message' ); + + if ( false === $message ) { + if ( $is_first_failure ) { + // First attempt failed. + $message = sprintf( + $x_requires_access_to_api . ' ' . + $connectivity_test_fails_message . ' ' . + $this->esc_html_inline( 'It\'s probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?', 'connectivity-test-maybe-temporary' ) . '<br><br>' . + '%s', + '<b>' . $this->get_plugin_name() . '</b>', + sprintf( + '<div id="fs_firewall_issue_options">%s %s</div>', + sprintf( + '<a class="button button-primary fs-resolve" data-type="retry_ping" href="#">%s</a>', + $this->get_text_inline( 'Yes - do your thing', 'yes-do-your-thing' ) + ), + sprintf( + '<a href="%s" class="button">%s</a>', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=all&paged=1&s=', 'deactivate-plugin_' . $this->_plugin_basename ), + $this->get_text_inline( 'No - just deactivate', 'no-deactivate' ) + ) + ) + ); + + $message_id = 'failed_connect_api_first'; + $type = 'promotion'; + } else { + // Second connectivity attempt failed. + $message = sprintf( + $x_requires_access_to_api . ' ' . + $connectivity_test_fails_message . ' ' . + $happy_to_resolve_issue_asap . + ' %s', + '<b>' . $this->get_plugin_name() . '</b>', + sprintf( + '<ol id="fs_firewall_issue_options"><li>%s</li><li>%s</li><li>%s</li></ol>', + sprintf( + '<a class="fs-resolve" data-type="general" href="#"><b>%s</b></a>%s', + $fix_issue_title, + ' - ' . sprintf( + $fix_issue_desc, + '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' + ) + ), + sprintf( + '<a href="%s" target="_blank"><b>%s</b></a> - %s', + sprintf( 'https://wordpress.org/plugins/%s/download/', $this->_slug ), + $install_previous_title, + $install_previous_desc + ), + sprintf( + '<a href="%s"><b>%s</b></a> - %s', + wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $this->_plugin_basename . '&plugin_status=all&paged=1&s=', 'deactivate-plugin_' . $this->_plugin_basename ), + $deactivate_plugin_title, + $deactivate_plugin_desc + ) + ) + ); + } + } + + $this->_admin_notices->add_sticky( + $message, + $message_id, + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + $type + ); + } + + /** + * Handle user request to resolve connectivity issue. + * This method will send an email to Freemius API technical staff for resolution. + * The email will contain server's info and installed plugins (might be caching issue). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function _email_about_firewall_issue() { + $this->_admin_notices->remove_sticky( 'failed_connect_api' ); + + $pong = $this->ping(); + + $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); + + if ( $is_connected ) { + FS_GDPR_Manager::instance()->store_is_required( $pong->is_gdpr_required ); + + $this->store_connectivity_info( $pong, $is_connected ); + + echo $this->get_after_plugin_activation_redirect_url(); + exit; + } + + $current_user = self::_get_current_wp_user(); + $admin_email = $current_user->user_email; + + $error_type = fs_request_get( 'error_type', 'general' ); + + switch ( $error_type ) { + case 'squid': + $title = 'Squid ACL Blocking Issue'; + break; + case 'cloudflare': + $title = 'CloudFlare Blocking Issue'; + break; + default: + $title = 'API Connectivity Issue'; + break; + } + + $custom_email_sections = array(); + + // Add 'API Error' custom email section. + $custom_email_sections['api_error'] = array( + 'title' => 'API Error', + 'rows' => array( + 'ping' => array( + 'API Error', + is_string( $pong ) ? htmlentities( $pong ) : json_encode( $pong ) + ), + ) + ); + + // Send email with technical details to resolve API connectivity issues. + $this->send_email( + 'api@freemius.com', // recipient + $title . ' [' . $this->get_plugin_name() . ']', // subject + $custom_email_sections, + array( "Reply-To: $admin_email <$admin_email>" ) // headers + ); + + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.', 'fix-request-sent-message' ), + '<a href="mailto:' . $admin_email . '">' . $admin_email . '</a>' + ), + 'server_details_sent' + ); + + // Action was taken, tell that API connectivity troubleshooting should be off now. + + echo "1"; + exit; + } + + /** + * Handle connectivity test retry approved by the user. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + */ + function _retry_connectivity_test() { + $this->_admin_notices->remove_sticky( 'failed_connect_api_first' ); + + $pong = $this->ping(); + + $is_connected = $this->get_api_plugin_scope()->is_valid_ping( $pong ); + + if ( $is_connected ) { + FS_GDPR_Manager::instance()->store_is_required( $pong->is_gdpr_required ); + + $this->store_connectivity_info( $pong, $is_connected ); + + echo $this->get_after_plugin_activation_redirect_url(); + } else { + // Add connectivity issue message after 2nd failed attempt. + $this->_add_connectivity_issue_message( $pong, false ); + + echo "1"; + } + + exit; + } + + static function _add_firewall_issues_javascript() { + $params = array(); + fs_require_once_template( 'firewall-issues-js.php', $params ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Email + #---------------------------------------------------------------------------------- + + /** + * Generates and sends an HTML email with customizable sections. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.2 + * + * @param string $to_address + * @param string $subject + * @param array $sections + * @param array $headers + * + * @return bool Whether the email contents were sent successfully. + */ + private function send_email( + $to_address, + $subject, + $sections = array(), + $headers = array() + ) { + $default_sections = $this->get_email_sections(); + + // Insert new sections or replace the default email sections. + if ( is_array( $sections ) && ! empty( $sections ) ) { + foreach ( $sections as $section_id => $custom_section ) { + if ( ! isset( $default_sections[ $section_id ] ) ) { + // If the section does not exist, add it. + $default_sections[ $section_id ] = $custom_section; + } else { + // If the section already exists, override it. + $current_section = $default_sections[ $section_id ]; + + // Replace the current section's title if a custom section title exists. + if ( isset( $custom_section['title'] ) ) { + $current_section['title'] = $custom_section['title']; + } + + // Insert new rows under the current section or replace the default rows. + if ( isset( $custom_section['rows'] ) && is_array( $custom_section['rows'] ) && ! empty( $custom_section['rows'] ) ) { + foreach ( $custom_section['rows'] as $row_id => $row ) { + $current_section['rows'][ $row_id ] = $row; + } + } + + $default_sections[ $section_id ] = $current_section; + } + } + } + + $vars = array( 'sections' => $default_sections ); + $message = fs_get_template( 'email.php', $vars ); + + // Set the type of email to HTML. + $headers[] = 'Content-type: text/html; charset=UTF-8'; + + $header_string = implode( "\r\n", $headers ); + + return wp_mail( + $to_address, + $subject, + $message, + $header_string + ); + } + + /** + * Generates the data for the sections of the email content. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.2 + * + * @return array + */ + private function get_email_sections() { + // Retrieve the current user's information so that we can get the user's email, first name, and last name below. + $current_user = self::_get_current_wp_user(); + + // Retrieve the cURL version information so that we can get the version number below. + $curl_version_information = curl_version(); + + $active_plugin = self::get_active_plugins(); + + // Generate the list of active plugins separated by new line. + $active_plugin_string = ''; + foreach ( $active_plugin as $plugin ) { + $active_plugin_string .= sprintf( + '<a href="%s">%s</a> [v%s]<br>', + $plugin['PluginURI'], + $plugin['Name'], + $plugin['Version'] + ); + } + + $server_ip = WP_FS__REMOTE_ADDR; + + // Add PHP info for deeper investigation. + ob_start(); + phpinfo(); + $php_info = ob_get_clean(); + + $api_domain = substr( FS_API__ADDRESS, strpos( FS_API__ADDRESS, ':' ) + 3 ); + + // Generate the default email sections. + $sections = array( + 'sdk' => array( + 'title' => 'SDK', + 'rows' => array( + 'fs_version' => array( 'FS Version', $this->version ), + 'curl_version' => array( 'cURL Version', $curl_version_information['version'] ) + ) + ), + 'plugin' => array( + 'title' => ucfirst( $this->get_module_type() ), + 'rows' => array( + 'name' => array( 'Name', $this->get_plugin_name() ), + 'version' => array( 'Version', $this->get_plugin_version() ) + ) + ), + 'api' => array( + 'title' => 'API Subdomain', + 'rows' => array( + 'dns' => array( + 'DNS_CNAME', + function_exists( 'dns_get_record' ) ? + var_export( dns_get_record( $api_domain, DNS_CNAME ), true ) : + 'dns_get_record() disabled/blocked' + ), + 'ip' => array( + 'IP', + function_exists( 'gethostbyname' ) ? + gethostbyname( $api_domain ) : + 'gethostbyname() disabled/blocked' + ), + ), + ), + 'site' => array( + 'title' => 'Site', + 'rows' => array( + 'unique_id' => array( 'Unique ID', $this->get_anonymous_id() ), + 'address' => array( 'Address', site_url() ), + 'host' => array( + 'HTTP_HOST', + ( ! empty( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : '' ) + ), + 'hosting' => array( + 'Hosting Company' => fs_request_has( 'hosting_company' ) ? + fs_request_get( 'hosting_company' ) : + 'Unknown', + ), + 'server_addr' => array( + 'SERVER_ADDR', + '<a href="http://www.projecthoneypot.org/ip_' . $server_ip . '">' . $server_ip . '</a>' + ) + ) + ), + 'user' => array( + 'title' => 'User', + 'rows' => array( + 'email' => array( 'Email', $current_user->user_email ), + 'first' => array( 'First', $current_user->user_firstname ), + 'last' => array( 'Last', $current_user->user_lastname ) + ) + ), + 'plugins' => array( + 'title' => 'Plugins', + 'rows' => array( + 'active_plugins' => array( 'Active Plugins', $active_plugin_string ) + ) + ), + 'php_info' => array( + 'title' => 'PHP Info', + 'rows' => array( + 'info' => array( $php_info ) + ), + ) + ); + + // Allow the sections to be modified by other code. + $sections = $this->apply_filters( 'email_template_sections', $sections ); + + return $sections; + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Initialization + #---------------------------------------------------------------------------------- + + /** + * Init plugin's Freemius instance. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param number $id + * @param string $public_key + * @param bool $is_live + * @param bool $is_premium + */ + function init( $id, $public_key, $is_live = true, $is_premium = true ) { + $this->_logger->entrance(); + + $this->dynamic_init( array( + 'id' => $id, + 'public_key' => $public_key, + 'is_live' => $is_live, + 'is_premium' => $is_premium, + ) ); + } + + /** + * Dynamic initiator, originally created to support initiation + * with parent_id for add-ons. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param array $plugin_info + * + * @throws Freemius_Exception + */ + function dynamic_init( array $plugin_info ) { + $this->_logger->entrance(); + + $this->parse_settings( $plugin_info ); + + if ( is_admin() && $this->is_theme() && $this->is_premium() && ! $this->has_active_valid_license() ) { + $this->add_ajax_action( + 'delete_theme_update_data', + array( &$this, '_delete_theme_update_data_action' ) + ); + } + + if ( ! self::is_ajax() ) { + if ( ! $this->is_addon() || $this->is_only_premium() ) { + add_action( + ( $this->_is_network_active && fs_is_network_admin() ? 'network_' : '' ) . 'admin_menu', + array( &$this, '_prepare_admin_menu' ), + WP_FS__LOWEST_PRIORITY + ); + } + } + + if ( $this->should_stop_execution() ) { + return; + } + + if ( ! $this->is_registered() ) { + if ( $this->is_anonymous() ) { + // If user skipped, no need to test connectivity. + $this->_has_api_connection = true; + $this->_is_on = true; + } else { + if ( ! $this->has_api_connectivity() ) { + if ( $this->_admin_notices->has_sticky( 'failed_connect_api_first' ) || + $this->_admin_notices->has_sticky( 'failed_connect_api' ) + ) { + if ( ! $this->_enable_anonymous || $this->is_premium() ) { + // If anonymous mode is disabled, add firewall admin-notice message. + add_action( 'admin_footer', array( 'Freemius', '_add_firewall_issues_javascript' ) ); + + $ajax_action_suffix = $this->_slug . ( $this->is_theme() ? ':theme' : '' ); + add_action( "wp_ajax_fs_resolve_firewall_issues_{$ajax_action_suffix}", array( + &$this, + '_email_about_firewall_issue' + ) ); + + add_action( "wp_ajax_fs_retry_connectivity_test_{$ajax_action_suffix}", array( + &$this, + '_retry_connectivity_test' + ) ); + + /** + * Currently the admin notice manager relies on the module's type and slug. The new AJAX actions manager uses module IDs, hence, consider to replace the if block above with the commented code below after adjusting the admin notices manager to work with module IDs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + /*$this->add_ajax_action( 'resolve_firewall_issues', array( + &$this, + '_email_about_firewall_issue' + ) ); + + $this->add_ajax_action( 'retry_connectivity_test', array( + &$this, + '_retry_connectivity_test' + ) );*/ + } + } + + return; + } else { + $this->_admin_notices->remove_sticky( array( + 'failed_connect_api_first', + 'failed_connect_api', + ) ); + + if ( $this->_anonymous_mode ) { + // Simulate anonymous mode. + $this->_is_anonymous = true; + } + } + } + } + + /** + * This should be executed even if Freemius is off for the core module, + * otherwise, the add-ons dialogbox won't work properly. This is esepcially + * relevant when the developer decided to turn FS off for existing users. + * + * @author Vova Feldman (@svovaf) + */ + if ( $this->is_user_in_admin() && + ! $this->is_addon() && + $this->has_addons() && + 'plugin-information' === fs_request_get( 'tab', false ) && + $this->get_id() == fs_request_get( 'parent_plugin_id', false ) + ) { + require_once WP_FS__DIR_INCLUDES . '/fs-plugin-info-dialog.php'; + + new FS_Plugin_Info_Dialog( $this ); + } + + // Check if Freemius is on for the current plugin. + // This MUST be executed after all the plugin variables has been loaded. + if ( ! $this->is_registered() && ! $this->is_on() ) { + return; + } + + if ( $this->has_api_connectivity() ) { + if ( self::is_cron() ) { + $this->hook_callback_to_sync_cron(); + } else if ( $this->is_user_in_admin() ) { + /** + * Schedule daily data sync cron if: + * + * 1. User opted-in (for tracking). + * 2. If skipped, but later upgraded (opted-in via upgrade). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + */ + if ( $this->is_registered() ) { + if ( ! $this->is_sync_cron_on() && $this->is_tracking_allowed() ) { + $this->schedule_sync_cron(); + } + } + + /** + * Check if requested for manual blocking background sync. + */ + if ( fs_request_has( 'background_sync' ) ) { + $this->run_manual_sync(); + } + } + } + + if ( $this->is_registered() ) { + $this->hook_callback_to_install_sync(); + } + + if ( $this->is_addon() ) { + if ( $this->is_parent_plugin_installed() ) { + // Link to parent FS. + $this->_parent = self::get_instance_by_id( $this->_plugin->parent_plugin_id ); + + // Get parent plugin reference. + $this->_parent_plugin = $this->_parent->get_plugin(); + } + } + + if ( $this->is_user_in_admin() ) { + if ( $this->is_addon() ) { + if ( ! $this->is_parent_plugin_installed() ) { + $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); + + if ( isset( $plugin_info['parent'] ) ) { + $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); + } + + $this->_admin_notices->add( + ( ! empty( $parent_name ) ? + sprintf( $this->get_text_x_inline( '%s cannot run without %s.', 'addonX cannot run without pluginY', 'addon-x-cannot-run-without-y' ), $this->get_plugin_name(), $parent_name ) : + sprintf( $this->get_text_x_inline( '%s cannot run without the plugin.', 'addonX cannot run...', 'addon-x-cannot-run-without-parent' ), $this->get_plugin_name() ) + ), + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + + return; + } else { + if ( $this->_parent->is_registered() && ! $this->is_registered() ) { + // If parent plugin activated, automatically install add-on for the user. + $this->_activate_addon_account( $this->_parent ); + } else if ( ! $this->_parent->is_registered() && $this->is_registered() ) { + // If add-on activated and parent not, automatically install parent for the user. + $this->activate_parent_account( $this->_parent ); + } + + // @todo This should be only executed on activation. It should be migrated to register_activation_hook() together with other activation related logic. + if ( $this->is_premium() ) { + // Remove add-on download admin-notice. + $this->_parent->_admin_notices->remove_sticky( array( + 'addon_plan_upgraded_' . $this->_slug, + 'no_addon_license_' . $this->_slug, + ) ); + } + +// $this->deactivate_premium_only_addon_without_license(); + } + } + + add_action( 'admin_init', array( &$this, '_admin_init_action' ) ); + +// if ( $this->is_registered() || +// $this->is_anonymous() || +// $this->is_pending_activation() +// ) { +// $this->_init_admin(); +// } + } + + /** + * Should be called outside `$this->is_user_in_admin()` scope + * because the updater has some logic that needs to be executed + * during AJAX calls. + * + * Currently we need to hook to the `http_request_host_is_external` filter. + * In the future, there might be additional logic added. + * + * @author Vova Feldman + * @since 1.2.1.6 + */ + if ( $this->is_premium() && $this->has_release_on_freemius() ) { + FS_Plugin_Updater::instance( $this ); + } + + $this->do_action( 'initiated' ); + + if ( $this->_storage->prev_is_premium !== $this->_plugin->is_premium ) { + if ( isset( $this->_storage->prev_is_premium ) ) { + $this->apply_filters( + 'after_code_type_change', + // New code type. + $this->_plugin->is_premium + ); + } else { + // Set for code type for the first time. + $this->_storage->prev_is_premium = $this->_plugin->is_premium; + } + } + + if ( ! $this->is_addon() ) { + if ( $this->is_registered() ) { + // Fix for upgrade from versions < 1.0.9. + if ( ! isset( $this->_storage->activation_timestamp ) ) { + $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; + } + + $this->do_action( 'after_init_plugin_registered' ); + } else if ( $this->is_anonymous() ) { + $this->do_action( 'after_init_plugin_anonymous' ); + } else if ( $this->is_pending_activation() ) { + $this->do_action( 'after_init_plugin_pending_activations' ); + } + } else { + if ( $this->is_registered() ) { + $this->do_action( 'after_init_addon_registered' ); + } else if ( $this->is_anonymous() ) { + $this->do_action( 'after_init_addon_anonymous' ); + } else if ( $this->is_pending_activation() ) { + $this->do_action( 'after_init_addon_pending_activations' ); + } + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.2.1.5 + */ + function _stop_tracking_callback() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'stop_tracking' ); + + $result = $this->stop_tracking( fs_is_network_admin() ); + + if ( true === $result ) { + self::shoot_ajax_success(); + } + + $this->_logger->api_error( $result ); + + self::shoot_ajax_failure( + sprintf( $this->get_text_inline( 'Unexpected API error. Please contact the %s\'s author with the following error.', 'unexpected-api-error' ), $this->_module_type ) . + ( $this->is_api_error( $result ) && isset( $result->error ) ? + $result->error->message : + var_export( $result, true ) ) + ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + */ + function _allow_tracking_callback() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'allow_tracking' ); + + $result = $this->allow_tracking( fs_is_network_admin() ); + + if ( true === $result ) { + self::shoot_ajax_success(); + } + + $this->_logger->api_error( $result ); + + self::shoot_ajax_failure( + sprintf( $this->get_text_inline( 'Unexpected API error. Please contact the %s\'s author with the following error.', 'unexpected-api-error' ), $this->_module_type ) . + ( $this->is_api_error( $result ) && isset( $result->error ) ? + $result->error->message : + var_export( $result, true ) ) + ); + } + + /** + * Opt-out from usage tracking. + * + * Note: This will not delete the account information but will stop all tracking. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-out. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @return bool|object + */ + function stop_site_tracking() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + // User never opted-in. + return false; + } + + if ( $this->is_tracking_prohibited() ) { + // Already disconnected. + return true; + } + + // Send update to FS. + $result = $this->get_api_site_scope()->call( '/?fields=is_disconnected', 'put', array( + 'is_disconnected' => true + ) ); + + if ( ! $this->is_api_result_entity( $result ) || + ! isset( $result->is_disconnected ) || + ! $result->is_disconnected + ) { + $this->_logger->api_error( $result ); + + return $result; + } + + $this->_site->is_disconnected = $result->is_disconnected; + $this->_store_site(); + + $this->clear_sync_cron(); + + // Successfully disconnected. + return true; + } + + /** + * Opt-out network from usage tracking. + * + * Note: This will not delete the account information but will stop all tracking. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-out. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @return bool|object + */ + function stop_network_tracking() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + // User never opted-in. + return false; + } + + $install_id_2_blog_id = array(); + $installs_map = $this->get_blog_install_map(); + + $opt_out_all = true; + + $params = array(); + foreach ( $installs_map as $blog_id => $install ) { + if ( $install->is_tracking_prohibited() ) { + // Already opted-out. + continue; + } + + if ( $this->is_site_delegated_connection( $blog_id ) ) { + // Opt-out only from non-delegated installs. + $opt_out_all = false; + continue; + } + + $params[] = array( 'id' => $install->id ); + + $install_id_2_blog_id[ $install->id ] = $blog_id; + } + + if ( empty( $install_id_2_blog_id ) ) { + return true; + } + + $params[] = array( 'is_disconnected' => true ); + + // Send update to FS. + $result = $this->get_current_or_network_user_api_scope()->call( "/plugins/{$this->_module_id}/installs.json", 'put', $params ); + + if ( ! $this->is_api_result_object( $result, 'installs' ) ) { + $this->_logger->api_error( $result ); + + return $result; + } + + foreach ( $result->installs as $r_install ) { + $blog_id = $install_id_2_blog_id[ $r_install->id ]; + $install = $installs_map[ $blog_id ]; + $install->is_disconnected = $r_install->is_disconnected; + $this->_store_site( true, $blog_id, $install ); + } + + $this->clear_sync_cron( $opt_out_all ); + + // Successfully disconnected. + return true; + } + + /** + * Opt-out from usage tracking. + * + * Note: This will not delete the account information but will stop all tracking. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-out. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @param bool $is_network_action + * + * @return bool|object + */ + function stop_tracking( $is_network_action = false ) { + $this->_logger->entrance(); + + return $is_network_action ? + $this->stop_network_tracking() : + $this->stop_site_tracking(); + } + + /** + * Opt-in back into usage tracking. + * + * Note: This will only work if the user opted-in previously. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-in back to usage tracking. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @return bool|object + */ + function allow_site_tracking() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + // User never opted-in. + return false; + } + + if ( $this->is_tracking_allowed() ) { + // Tracking already allowed. + return true; + } + + $result = $this->get_api_site_scope()->call( '/?is_disconnected', 'put', array( + 'is_disconnected' => false + ) ); + + if ( ! $this->is_api_result_entity( $result ) || + ! isset( $result->is_disconnected ) || + $result->is_disconnected + ) { + $this->_logger->api_error( $result ); + + return $result; + } + + $this->_site->is_disconnected = $result->is_disconnected; + $this->_store_site(); + + $this->schedule_sync_cron(); + + // Successfully reconnected. + return true; + } + + /** + * Opt-in network back into usage tracking. + * + * Note: This will only work if the user opted-in previously. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-in back to usage tracking. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @return bool|object + */ + function allow_network_tracking() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + // User never opted-in. + return false; + } + + $install_id_2_blog_id = array(); + $installs_map = $this->get_blog_install_map(); + + $params = array(); + foreach ( $installs_map as $blog_id => $install ) { + if ( $install->is_tracking_allowed() ) { + continue; + } + + $params[] = array( 'id' => $install->id ); + + $install_id_2_blog_id[ $install->id ] = $blog_id; + } + + if ( empty( $install_id_2_blog_id ) ) { + return true; + } + + $params[] = array( 'is_disconnected' => false ); + + // Send update to FS. + $result = $this->get_current_or_network_user_api_scope()->call( "/plugins/{$this->_module_id}/installs.json", 'put', $params ); + + + if ( ! $this->is_api_result_object( $result, 'installs' ) ) { + $this->_logger->api_error( $result ); + + return $result; + } + + foreach ( $result->installs as $r_install ) { + $blog_id = $install_id_2_blog_id[ $r_install->id ]; + $install = $installs_map[ $blog_id ]; + $install->is_disconnected = $r_install->is_disconnected; + $this->_store_site( true, $blog_id, $install ); + } + + $this->schedule_sync_cron(); + + // Successfully reconnected. + return true; + } + + /** + * Opt-in back into usage tracking. + * + * Note: This will only work if the user opted-in previously. + * + * Returns: + * 1. FALSE - If the user never opted-in. + * 2. TRUE - If successfully opted-in back to usage tracking. + * 3. object - API result on failure. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @param bool $is_network_action + * + * @return bool|object + */ + function allow_tracking( $is_network_action = false ) { + $this->_logger->entrance(); + + return $is_network_action ? + $this->allow_network_tracking() : + $this->allow_site_tracking(); + } + + /** + * If user opted-in and later disabled usage-tracking, + * re-allow tracking for licensing and updates. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @param bool $is_context_single_site + */ + private function reconnect_locally( $is_context_single_site = false ) { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return; + } + + if ( ! fs_is_network_admin() || $is_context_single_site ) { + if ( $this->is_tracking_prohibited() ) { + $this->_site->is_disconnected = false; + $this->_store_site(); + } + } else { + $installs_map = $this->get_blog_install_map(); + foreach ( $installs_map as $blog_id => $install ) { + /** + * @var FS_Site $install + */ + if ( $install->is_tracking_prohibited() ) { + $install->is_disconnected = false; + $this->_store_site( true, $blog_id, $install ); + } + } + } + } + + /** + * Parse plugin's settings (as defined by the plugin dev). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param array $plugin_info + * + * @throws \Freemius_Exception + */ + private function parse_settings( &$plugin_info ) { + $this->_logger->entrance(); + + $id = $this->get_numeric_option( $plugin_info, 'id', false ); + $public_key = $this->get_option( $plugin_info, 'public_key', false ); + $secret_key = $this->get_option( $plugin_info, 'secret_key', null ); + $parent_id = $this->get_numeric_option( $plugin_info, 'parent_id', null ); + $parent_name = $this->get_option( $plugin_info, 'parent_name', null ); + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.9 Try to pull secret key from external config. + */ + if ( is_null( $secret_key ) && defined( "WP_FS__{$this->_slug}_SECRET_KEY" ) ) { + $secret_key = constant( "WP_FS__{$this->_slug}_SECRET_KEY" ); + } + + if ( isset( $plugin_info['parent'] ) ) { + $parent_id = $this->get_numeric_option( $plugin_info['parent'], 'id', null ); +// $parent_slug = $this->get_option( $plugin_info['parent'], 'slug', null ); +// $parent_public_key = $this->get_option( $plugin_info['parent'], 'public_key', null ); +// $parent_name = $this->get_option( $plugin_info['parent'], 'name', null ); + } + + if ( false === $id ) { + throw new Freemius_Exception( array( + 'error' => array( + 'type' => 'ParameterNotSet', + 'message' => 'Plugin id parameter is not set.', + 'code' => 'plugin_id_not_set', + 'http' => 500, + ) + ) ); + } + if ( false === $public_key ) { + throw new Freemius_Exception( array( + 'error' => array( + 'type' => 'ParameterNotSet', + 'message' => 'Plugin public_key parameter is not set.', + 'code' => 'plugin_public_key_not_set', + 'http' => 500, + ) + ) ); + } + + $plugin = ( $this->_plugin instanceof FS_Plugin ) ? + $this->_plugin : + new FS_Plugin(); + + $plugin->update( array( + 'id' => $id, + 'type' => $this->get_option( $plugin_info, 'type', $this->_module_type ), + 'public_key' => $public_key, + 'slug' => $this->_slug, + 'parent_plugin_id' => $parent_id, + 'version' => $this->get_plugin_version(), + 'title' => $this->get_plugin_name(), + 'file' => $this->_plugin_basename, + 'is_premium' => $this->get_bool_option( $plugin_info, 'is_premium', true ), + 'is_live' => $this->get_bool_option( $plugin_info, 'is_live', true ), + 'affiliate_moderation' => $this->get_option( $plugin_info, 'has_affiliation' ), + ) ); + + if ( $plugin->is_updated() ) { + // Update plugin details. + $this->_plugin = FS_Plugin_Manager::instance( $this->_module_id )->store( $plugin ); + } + // Set the secret key after storing the plugin, we don't want to store the key in the storage. + $this->_plugin->secret_key = $secret_key; + + if ( ! isset( $plugin_info['menu'] ) ) { + $plugin_info['menu'] = array(); + + if ( ! empty( $this->_storage->sdk_last_version ) && + version_compare( $this->_storage->sdk_last_version, '1.1.2', '<=' ) + ) { + // Backward compatibility to 1.1.2 + $plugin_info['menu']['slug'] = isset( $plugin_info['menu_slug'] ) ? + $plugin_info['menu_slug'] : + $this->_slug; + } + } + + $this->_menu = FS_Admin_Menu_Manager::instance( + $this->_module_id, + $this->_module_type, + $this->get_unique_affix() + ); + + $this->_menu->init( $plugin_info['menu'], $this->is_addon() ); + + $this->_has_addons = $this->get_bool_option( $plugin_info, 'has_addons', false ); + $this->_has_paid_plans = $this->get_bool_option( $plugin_info, 'has_paid_plans', true ); + $this->_has_premium_version = $this->get_bool_option( $plugin_info, 'has_premium_version', $this->_has_paid_plans ); + $this->_ignore_pending_mode = $this->get_bool_option( $plugin_info, 'ignore_pending_mode', false ); + $this->_is_org_compliant = $this->get_bool_option( $plugin_info, 'is_org_compliant', true ); + $this->_is_premium_only = $this->get_bool_option( $plugin_info, 'is_premium_only', false ); + if ( $this->_is_premium_only ) { + // If premium only plugin, disable anonymous mode. + $this->_enable_anonymous = false; + $this->_anonymous_mode = false; + } else { + $this->_enable_anonymous = $this->get_bool_option( $plugin_info, 'enable_anonymous', true ); + $this->_anonymous_mode = $this->get_bool_option( $plugin_info, 'anonymous_mode', false ); + } + $this->_permissions = $this->get_option( $plugin_info, 'permissions', array() ); + + if ( ! empty( $plugin_info['trial'] ) ) { + $this->_trial_days = $this->get_numeric_option( + $plugin_info['trial'], + 'days', + // Default to 0 - trial without days specification. + 0 + ); + + $this->_is_trial_require_payment = $this->get_bool_option( $plugin_info['trial'], 'is_require_payment', false ); + } + } + + /** + * @param string[] $options + * @param string $key + * @param mixed $default + * + * @return bool + */ + private function get_option( &$options, $key, $default = false ) { + return ! empty( $options[ $key ] ) ? $options[ $key ] : $default; + } + + private function get_bool_option( &$options, $key, $default = false ) { + return isset( $options[ $key ] ) && is_bool( $options[ $key ] ) ? $options[ $key ] : $default; + } + + private function get_numeric_option( &$options, $key, $default = false ) { + return isset( $options[ $key ] ) && is_numeric( $options[ $key ] ) ? $options[ $key ] : $default; + } + + /** + * Gate keeper. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return bool + */ + private function should_stop_execution() { + if ( empty( $this->_storage->was_plugin_loaded ) ) { + /** + * Don't execute Freemius until plugin was fully loaded at least once, + * to give the opportunity for the activation hook to run before pinging + * the API for connectivity test. This logic is relevant for the + * identification of new plugin install vs. plugin update. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + */ + return true; + } + + if ( $this->is_activation_mode() ) { + if ( ! is_admin() ) { + /** + * If in activation mode, don't execute Freemius outside of the + * admin dashboard. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + return true; + } + + if ( ! WP_FS__IS_HTTP_REQUEST ) { + /** + * If in activation and executed without HTTP context (e.g. CLI, Cronjob), + * then don't start Freemius. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6.3 + * + * @link https://wordpress.org/support/topic/errors-in-the-freemius-class-when-running-in-wordpress-in-cli + */ + return true; + } + + if ( self::is_cron() ) { + /** + * If in activation mode, don't execute Freemius during wp crons + * (wp crons have HTTP context - called as HTTP request). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + return true; + } + + if ( self::is_ajax() && + ! $this->_admin_notices->has_sticky( 'failed_connect_api_first' ) && + ! $this->_admin_notices->has_sticky( 'failed_connect_api' ) + ) { + /** + * During activation, if running in AJAX mode, unless there's a sticky + * connectivity issue notice, don't run Freemius. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + return true; + } + } + + return false; + } + + /** + * Triggered after code type has changed. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9.1 + */ + function _after_code_type_change() { + $this->_logger->entrance(); + + if ( $this->is_theme() ) { + // Expire the cache of the previous tabs since the theme may + // have setting updates after code type has changed. + $this->_cache->expire( 'tabs' ); + $this->_cache->expire( 'tabs_stylesheets' ); + } + + if ( $this->is_registered() ) { + if ( ! $this->is_addon() ) { + add_action( + is_admin() ? 'admin_init' : 'init', + array( &$this, '_plugin_code_type_changed' ) + ); + } + + if ( $this->is_premium() ) { + // Purge cached payments after switching to the premium version. + // @todo This logic doesn't handle purging the cache for serviceware module upgrade. + $this->get_api_user_scope()->purge_cache( "/plugins/{$this->_module_id}/payments.json?include_addons=true" ); + } + } + } + + /** + * Handles plugin's code type change (free <--> premium). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function _plugin_code_type_changed() { + $this->_logger->entrance(); + + if ( $this->is_premium() ) { + $this->reconnect_locally(); + + // Activated premium code. + $this->do_action( 'after_premium_version_activation' ); + + // Remove all sticky messages related to download of the premium version. + $this->_admin_notices->remove_sticky( array( + 'trial_started', + 'plan_upgraded', + 'plan_changed', + 'license_activated', + ) ); + + $notice = ''; + if ( ! $this->is_only_premium() ) { + $notice = sprintf( $this->get_text_inline( 'Premium %s version was successfully activated.', 'premium-activated-message' ), $this->_module_type ); + } + + $license_notice = $this->get_license_network_activation_notice(); + if ( ! empty( $license_notice ) ) { + $notice .= ' ' . $license_notice; + } + + if ( ! empty( $notice ) ) { + $this->_admin_notices->add_sticky( + trim( $notice ), + 'premium_activated', + $this->get_text_x_inline( 'W00t', + 'Used to express elation, enthusiasm, or triumph (especially in electronic communication).', 'woot' ) . '!' + ); + } + } else { + // Remove sticky message related to premium code activation. + $this->_admin_notices->remove_sticky( 'premium_activated' ); + + // Activated free code (after had the premium before). + $this->do_action( 'after_free_version_reactivation' ); + + if ( $this->is_paying() && ! $this->is_premium() ) { + $this->_admin_notices->add_sticky( + sprintf( + /* translators: %s: License type (e.g. you have a professional license) */ + $this->get_text_inline( 'You have a %s license.', 'you-have-x-license' ), + $this->get_plan_title() + ) . $this->get_complete_upgrade_instructions(), + 'plan_upgraded', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + } + } + + // Schedule code type changes event. + $this->schedule_install_sync(); + + /** + * Unregister the uninstall hook for the other version of the plugin (with different code type) to avoid + * triggering a fatal error when uninstalling that plugin. For example, after deactivating the "free" version + * of a specific plugin, its uninstall hook should be unregistered after the "premium" version has been + * activated. If we don't do that, a fatal error will occur when we try to uninstall the "free" version since + * the main file of the "free" version will be loaded first before calling the hooked callback. Since the + * free and premium versions are almost identical (same class or have same functions), a fatal error like + * "Cannot redeclare class MyClass" or "Cannot redeclare my_function()" will occur. + */ + $this->unregister_uninstall_hook(); + + $this->clear_module_main_file_cache(); + + // Update is_premium of latest version. + $this->_storage->prev_is_premium = $this->_plugin->is_premium; + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Add-ons + #---------------------------------------------------------------------------------- + + /** + * Check if add-on installed and activated on site. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string|number $id_or_slug + * @param bool|null $is_premium Since 1.2.1.7 can check for specified add-on version. + * + * @return bool + */ + function is_addon_activated( $id_or_slug, $is_premium = null ) { + $this->_logger->entrance(); + + $addon_id = self::get_module_id( $id_or_slug ); + $is_activated = self::has_instance( $addon_id ); + + if ( ! $is_activated ) { + return false; + } + + if ( is_bool( $is_premium ) ) { + // Check if the specified code version is activate. + $addon = $this->get_addon_instance( $addon_id ); + $is_activated = ( $is_premium === $addon->is_premium() ); + } + + return $is_activated; + } + + /** + * Check if add-on was connected to install + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param string|number $id_or_slug + * + * @return bool + */ + function is_addon_connected( $id_or_slug ) { + $this->_logger->entrance(); + + $sites = self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN ); + + $addon_id = self::get_module_id( $id_or_slug ); + $addon = $this->get_addon( $addon_id ); + $slug = $addon->slug; + if ( ! isset( $sites[ $slug ] ) ) { + return false; + } + + $site = $sites[ $slug ]; + + $plugin = FS_Plugin_Manager::instance( $addon_id )->get(); + + if ( $plugin->parent_plugin_id != $this->_plugin->id ) { + // The given slug do NOT belong to any of the plugin's add-ons. + return false; + } + + return ( is_object( $site ) && + is_numeric( $site->id ) && + is_numeric( $site->user_id ) && + FS_Plugin_Plan::is_valid_id( $site->plan_id ) + ); + } + + /** + * Determines if add-on installed. + * + * NOTE: This is a heuristic and only works if the folder/file named as the slug. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string|number $id_or_slug + * + * @return bool + */ + function is_addon_installed( $id_or_slug ) { + $this->_logger->entrance(); + + $addon_id = self::get_module_id( $id_or_slug ); + + return file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this->get_addon_basename( $addon_id ) ) ); + } + + /** + * Get add-on basename. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string|number $id_or_slug + * + * @return string + */ + function get_addon_basename( $id_or_slug ) { + $addon_id = self::get_module_id( $id_or_slug ); + + if ( $this->is_addon_activated( $addon_id ) ) { + return self::instance( $addon_id )->get_plugin_basename(); + } + + $addon = $this->get_addon( $addon_id ); + $premium_basename = "{$addon->slug}-premium/{$addon->slug}.php"; + + if ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $premium_basename ) ) ) { + return $premium_basename; + } + + $all_plugins = $this->get_all_plugins(); + + foreach ( $all_plugins as $basename => &$data ) { + if ( $addon->slug === $data['slug'] || + $addon->slug . '-premium' === $data['slug'] + ) { + return $basename; + } + } + + $free_basename = "{$addon->slug}/{$addon->slug}.php"; + + return $free_basename; + } + + /** + * Get installed add-ons instances. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return Freemius[] + */ + function get_installed_addons() { + $installed_addons = array(); + foreach ( self::$_instances as $instance ) { + if ( $instance->is_addon() && is_object( $instance->_parent_plugin ) ) { + if ( $this->_plugin->id == $instance->_parent_plugin->id ) { + $installed_addons[] = $instance; + } + } + } + + return $installed_addons; + } + + /** + * Check if any add-ons of the plugin are installed. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.1 + * + * @return bool + */ + function has_installed_addons() { + if ( ! $this->has_addons() ) { + return false; + } + + foreach ( self::$_instances as $instance ) { + if ( $instance->is_addon() && is_object( $instance->_parent_plugin ) ) { + if ( $this->_plugin->id == $instance->_parent_plugin->id ) { + return true; + } + } + } + + return false; + } + + /** + * Tell Freemius that the current plugin is an add-on. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number $parent_plugin_id The parent plugin ID + */ + function init_addon( $parent_plugin_id ) { + $this->_plugin->parent_plugin_id = $parent_plugin_id; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function is_addon() { + return isset( $this->_plugin->parent_plugin_id ) && is_numeric( $this->_plugin->parent_plugin_id ); + } + + /** + * Deactivate add-on if it's premium only and the user does't have a valid license. + * + * @param bool $is_after_trial_cancel + * + * @return bool If add-on was deactivated. + */ + private function deactivate_premium_only_addon_without_license( $is_after_trial_cancel = false ) { + if ( ! $this->has_free_plan() && + ! $this->has_features_enabled_license() && + ! $this->_has_premium_license() + ) { + if ( $this->is_registered() ) { + // IF wrapper is turned off because activation_timestamp is currently only stored for plugins (not addons). + // if (empty($this->_storage->activation_timestamp) || + // (WP_FS__SCRIPT_START_TIME - $this->_storage->activation_timestamp) > 30 + // ) { + /** + * @todo When it's first fail, there's no reason to try and re-sync because the licenses were just synced after initial activation. + * + * Retry syncing the user add-on licenses. + */ + // Sync licenses. + $this->_sync_licenses(); + // } + + // Try to activate premium license. + $this->_activate_license( true ); + } + + if ( ! $this->has_free_plan() && + ! $this->has_features_enabled_license() && + ! $this->_has_premium_license() + ) { + // @todo Check if deactivate plugins also call the deactivation hook. + + $this->_parent->_admin_notices->add_sticky( + sprintf( + ( $is_after_trial_cancel ? + $this->_parent->get_text_inline( + '%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you\'ll have to purchase a license.', + 'addon-trial-cancelled-message' + ) : + $this->_parent->get_text_inline( + '%s is a premium only add-on. You have to purchase a license first before activating the plugin.', + 'addon-no-license-message' + ) + ), + '<b>' . $this->_plugin->title . '</b>' + ) . ' ' . sprintf( + '<a href="%s" aria-label="%s" class="button button-primary" style="margin-left: 10px; vertical-align: middle;">%s ➜</a>', + $this->_parent->addon_url( $this->_slug ), + esc_attr( sprintf( $this->_parent->get_text_inline( 'More information about %s', 'more-information-about-x' ), $this->_plugin->title ) ), + $this->_parent->get_text_inline( 'Purchase License', 'purchase-license' ) + ), + 'no_addon_license_' . $this->_slug, + ( $is_after_trial_cancel ? '' : $this->_parent->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...' ), + ( $is_after_trial_cancel ? 'success' : 'error' ) + ); + + deactivate_plugins( array( $this->_plugin_basename ), true ); + + return true; + } + } + + return false; + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Sandbox + #---------------------------------------------------------------------------------- + + /** + * Set Freemius into sandbox mode for debugging. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $secret_key + */ + function init_sandbox( $secret_key ) { + $this->_plugin->secret_key = $secret_key; + + // Update plugin details. + FS_Plugin_Manager::instance( $this->_module_id )->update( $this->_plugin, true ); + } + + /** + * Check if running payments in sandbox mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return bool + */ + function is_payments_sandbox() { + return ( ! $this->is_live() ) || isset( $this->_plugin->secret_key ); + } + + #endregion + + /** + * Check if running test vs. live plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return bool + */ + function is_live() { + return $this->_plugin->is_live; + } + + /** + * Check if super-admin skipped connection for all sites in the network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function is_network_anonymous() { + if ( ! $this->_is_network_active ) { + return false; + } + + $is_anonymous_ms = $this->_storage->get( 'is_anonymous_ms' ); + + if ( empty( $is_anonymous_ms ) ) { + return false; + } + + return $is_anonymous_ms['is']; + } + + /** + * Check if super-admin opted-in for all sites in the network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function is_network_connected() { + if ( ! $this->_is_network_active ) { + return false; + } + + return $this->_storage->get( 'is_network_connected' ); + } + + /** + * Check if the user skipped connecting the account with Freemius. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function is_anonymous() { + if ( ! isset( $this->_is_anonymous ) ) { + if ( $this->is_network_anonymous() ) { + $this->_is_anonymous = true; + } else { + if ( ! isset( $this->_storage->is_anonymous ) ) { + // Not skipped. + $this->_is_anonymous = false; + } else if ( is_bool( $this->_storage->is_anonymous ) ) { + // For back compatibility, since the variable was boolean before. + $this->_is_anonymous = $this->_storage->is_anonymous; + + // Upgrade stored data format to 1.1.3 format. + $this->set_anonymous_mode( $this->_storage->is_anonymous ); + } else { + // Version 1.1.3 and later. + $this->_is_anonymous = $this->_storage->is_anonymous['is']; + } + } + } + + return $this->_is_anonymous; + } + + /** + * Check if the user skipped the connection of a specified site. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return bool + */ + function is_anonymous_site( $blog_id = 0 ) { + if ( $this->is_network_anonymous() ) { + return true; + } + + $is_anonymous = $this->_storage->get( 'is_anonymous', false, $blog_id ); + + if ( empty( $is_anonymous ) ) { + return false; + } + + return $is_anonymous['is']; + } + + /** + * Check if user connected his account and install pending email activation. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function is_pending_activation() { + return $this->_storage->get( 'is_pending_activation', false ); + } + + /** + * Check if plugin must be WordPress.org compliant. + * + * @since 1.0.7 + * + * @return bool + */ + function is_org_repo_compliant() { + return $this->_is_org_compliant; + } + + #-------------------------------------------------------------------------------- + #region WP Cron Common + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * + * @return object + */ + private function get_cron_data( $name ) { + $this->_logger->entrance( $name ); + + /** + * @var object $cron_data + */ + return $this->_storage->get( "{$name}_cron", null ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + */ + private function clear_cron_data( $name ) { + $this->_logger->entrance( $name ); + + $this->_storage->remove( "{$name}_cron" ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param int $cron_blog_id The cron executing blog ID. + */ + private function set_cron_data( $name, $cron_blog_id = 0 ) { + $this->_logger->entrance( $name ); + + $this->_storage->store( "{$name}_cron", (object) array( + 'version' => $this->get_plugin_version(), + 'blog_id' => $cron_blog_id, + 'sdk_version' => $this->version, + 'timestamp' => WP_FS__SCRIPT_START_TIME, + 'on' => true, + ) ); + } + + /** + * Get the cron's executing blog ID. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * + * @return int + */ + private function get_cron_blog_id( $name ) { + $this->_logger->entrance( $name ); + + /** + * @var object $cron_data + */ + $cron_data = $this->get_cron_data( $name ); + + return ( is_object( $cron_data ) && is_numeric( $cron_data->blog_id ) ) ? + $cron_data->blog_id : + 0; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * + * @return bool + */ + private function is_cron_on( $name ) { + $this->_logger->entrance( $name ); + + /** + * @var object $cron_data + */ + $cron_data = $this->get_cron_data( $name ); + + return ( ! is_null( $cron_data ) && true === $cron_data->on ); + } + + /** + * Unix timestamp for previous cron execution or false if never executed. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * + * @return int|false + */ + private function cron_last_execution( $name ) { + $this->_logger->entrance( $name ); + + return $this->_storage->get( "{$name}_timestamp" ); + } + + /** + * Set cron execution time to now. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + */ + private function set_cron_execution_timestamp( $name ) { + $this->_logger->entrance( $name ); + + $this->_storage->store( "{$name}_timestamp", time() ); + } + + /** + * Check if cron was executed in the last $period of seconds. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param int $period In seconds + * + * @return bool + */ + private function is_cron_executed( $name, $period = WP_FS__TIME_24_HOURS_IN_SEC ) { + $this->_logger->entrance( $name ); + + $last_execution = $this->set_cron_execution_timestamp( $name ); + + if ( ! is_numeric( $last_execution ) ) { + return false; + } + + return ( $last_execution > ( WP_FS__SCRIPT_START_TIME - $period ) ); + } + + /** + * WP Cron is executed on a site level. When running in a multisite network environment + * with the network integration activated, for optimization reasons, we are consolidating + * the installs data sync cron to be executed only from a single site. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $except_blog_id Target any except the excluded blog ID. + * + * @return int + */ + private function get_cron_target_blog_id( $except_blog_id = 0 ) { + if ( ! is_multisite() ) { + return 0; + } + + if ( $this->_is_network_active && + is_numeric( $this->_storage->network_install_blog_id ) && + $except_blog_id != $this->_storage->network_install_blog_id && + self::is_site_active( $this->_storage->network_install_blog_id ) + ) { + // Try to run cron from the main network blog. + $install = $this->get_install_by_blog_id( $this->_storage->network_install_blog_id ); + + if ( is_object( $install ) && + ( $this->is_premium() || $install->is_tracking_allowed() ) + ) { + return $this->_storage->network_install_blog_id; + } + } + + // Get first opted-in blog ID with active tracking. + $installs = $this->get_blog_install_map(); + foreach ( $installs as $blog_id => $install ) { + if ( $except_blog_id != $blog_id && + self::is_site_active( $blog_id ) && + ( $this->is_premium() || $install->is_tracking_allowed() ) + ) { + return $blog_id; + } + } + + return 0; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param string $action_tag Callback action tag. + * @param bool $is_network_clear If set to TRUE, clear sync cron even if there are installs that are still connected. + */ + private function clear_cron( $name, $action_tag = '', $is_network_clear = false ) { + $this->_logger->entrance( $name ); + + if ( ! $this->is_cron_on( $name ) ) { + return; + } + + $clear_cron = true; + if ( ! $is_network_clear && $this->_is_network_active ) { + $installs = $this->get_blog_install_map(); + + foreach ( $installs as $blog_id => $install ) { + /** + * @var FS_Site $install + */ + if ( $install->is_tracking_allowed() ) { + $clear_cron = false; + break; + } + } + } + + if ( ! $clear_cron ) { + return; + } + + /** + * @var object $cron_data + */ + $cron_data = $this->get_cron_data( $name ); + + $cron_blog_id = is_object( $cron_data ) && isset( $cron_data->blog_id ) ? + $cron_data->blog_id : + 0; + + $this->clear_cron_data( $name ); + + if ( 0 < $cron_blog_id ) { + switch_to_blog( $cron_blog_id ); + } + + if ( empty( $action_tag ) ) { + $action_tag = $name; + } + + wp_clear_scheduled_hook( $this->get_action_tag( $action_tag ) ); + + if ( 0 < $cron_blog_id ) { + restore_current_blog(); + } + } + + /** + * Unix timestamp for next cron execution or false if not scheduled. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param string $action_tag Callback action tag. + * + * @return int|false + */ + private function get_next_scheduled_cron( $name, $action_tag = '' ) { + $this->_logger->entrance( $name ); + + if ( ! $this->is_cron_on( $name ) ) { + return false; + } + + /** + * @var object $cron_data + */ + $cron_data = $this->get_cron_data( $name ); + + $cron_blog_id = is_object( $cron_data ) && isset( $cron_data->blog_id ) ? + $cron_data->blog_id : + 0; + + if ( 0 < $cron_blog_id ) { + switch_to_blog( $cron_blog_id ); + } + + if ( empty( $action_tag ) ) { + $action_tag = $name; + } + + $next_scheduled = wp_next_scheduled( $this->get_action_tag( $action_tag ) ); + + if ( 0 < $cron_blog_id ) { + restore_current_blog(); + } + + return $next_scheduled; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param string $action_tag Callback action tag. + * @param string $recurrence 'single' or 'daily'. + * @param int $start_at Defaults to now. + * @param bool $randomize_start If true, schedule first job randomly during the next 12 hours. Otherwise, schedule job to start right away. + * @param int $except_blog_id Target any except the excluded blog ID. + */ + private function schedule_cron( + $name, + $action_tag = '', + $recurrence = 'single', + $start_at = WP_FS__SCRIPT_START_TIME, + $randomize_start = true, + $except_blog_id = 0 + ) { + $this->_logger->entrance( $name ); + + $this->clear_cron( $name, $action_tag, true ); + + $cron_blog_id = $this->get_cron_target_blog_id( $except_blog_id ); + + if ( is_multisite() && 0 == $cron_blog_id ) { + // Don't schedule cron since couldn't find a target blog. + return; + } + + if ( 0 < $cron_blog_id ) { + switch_to_blog( $cron_blog_id ); + } + + if ( 'daily' === $recurrence ) { + if ( $randomize_start ) { + // Schedule first sync with a random 12 hour time range from now. + $start_at += rand( 0, ( WP_FS__TIME_24_HOURS_IN_SEC / 2 ) ); + } + + // Schedule daily WP cron. + wp_schedule_event( + $start_at, + 'daily', + $this->get_action_tag( $action_tag ) + ); + } else if ( 'single' === $recurrence ) { + // Schedule single cron. + wp_schedule_single_event( + $start_at, + $this->get_action_tag( $action_tag ) + ); + } + + $this->set_cron_data( $name, $cron_blog_id ); + + if ( 0 < $cron_blog_id ) { + restore_current_blog(); + } + } + + /** + * Consolidated cron execution for performance optimization. The max number of API requests is based on the number of unique opted-in users. + * that doesn't halt page loading. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $name Cron name. + * @param callable $callable The function that should be executed. + */ + private function execute_cron( $name, $callable ) { + $this->_logger->entrance( $name ); + + // Store the last time data sync was executed. + $this->set_cron_execution_timestamp( $name ); + + // Check if API is temporary down. + if ( FS_Api::is_temporary_down() ) { + return; + } + + // @todo Add logic that identifies API latency, and reschedule the next background sync randomly between 8-16 hours. + + $users_2_blog_ids = array(); + + if ( ! is_multisite() ) { + // Add dummy blog. + $users_2_blog_ids[0] = array( 0 ); + } else { + $installs = $this->get_blog_install_map(); + foreach ( $installs as $blog_id => $install ) { + if ( $this->is_premium() || $install->is_tracking_allowed() ) { + if ( ! isset( $users_2_blog_ids[ $install->user_id ] ) ) { + $users_2_blog_ids[ $install->user_id ] = array(); + } + + $users_2_blog_ids[ $install->user_id ][] = $blog_id; + } + } + } + + foreach ( $users_2_blog_ids as $user_id => $blog_ids ) { + if ( 0 < $blog_ids[0] ) { + $this->switch_to_blog( $blog_ids[0] ); + } + + call_user_func_array( $callable, array( $blog_ids ) ); + + foreach ( $blog_ids as $blog_id ) { + $this->do_action( "after_{$name}_cron", $blog_id ); + } + } + + if ( is_multisite() ) { + $this->do_action( "after_{$name}_cron_multisite" ); + } + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Daily Sync Cron + #---------------------------------------------------------------------------------- + + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + private function is_sync_cron_scheduled() { + return $this->is_cron_on( 'sync' ); + } + + /** + * Get the sync cron's executing blog ID. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return int + */ + private function get_sync_cron_blog_id() { + return $this->get_cron_blog_id( 'sync' ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + private function run_manual_sync() { + self::require_pluggable_essentials(); + + if ( ! $this->is_user_admin() ) { + return; + } + + // Run manual sync. + $this->_sync_cron(); + + // Reschedule next cron to run 24 hours from now (performance optimization). + $this->schedule_sync_cron( time() + WP_FS__TIME_24_HOURS_IN_SEC, false ); + } + + /** + * Data sync cron job. Replaces the background sync non blocking HTTP request + * that doesn't halt page loading. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * @since 2.0.0 Consolidate all the data sync into the same cron for performance optimization. The max number of API requests is based on the number of unique opted-in users. + */ + function _sync_cron() { + $this->_logger->entrance(); + + $this->execute_cron( 'sync', array( &$this, '_sync_cron_method' ) ); + } + + /** + * The actual data sync cron logic. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int[] $blog_ids + */ + function _sync_cron_method( array $blog_ids ) { + if ( $this->is_registered() ) { + if ( $this->has_paid_plan() ) { + // Initiate background plan sync. + $this->_sync_license( true ); + + if ( $this->is_paying() ) { + // Check for premium plugin updates. + $this->check_updates( true ); + } + } else { + // Sync install(s) (only if something changed locally). + if ( 1 < count( $blog_ids ) ) { + $this->sync_installs(); + } else { + $this->sync_install(); + } + } + } + } + + /** + * Check if sync was executed in the last $period of seconds. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param int $period In seconds + * + * @return bool + */ + private function is_sync_executed( $period = WP_FS__TIME_24_HOURS_IN_SEC ) { + return $this->is_cron_executed( 'sync', $period ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return bool + */ + private function is_sync_cron_on() { + return $this->is_cron_on( 'sync' ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param int $start_at Defaults to now. + * @param bool $randomize_start If true, schedule first job randomly during the next 12 hours. Otherwise, schedule job to start right away. + * @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor. + */ + private function schedule_sync_cron( + $start_at = WP_FS__SCRIPT_START_TIME, + $randomize_start = true, + $except_blog_id = 0 + ) { + $this->schedule_cron( + 'sync', + 'data_sync', + 'daily', + $start_at, + $randomize_start, + $except_blog_id + ); + } + + /** + * Add the actual sync function to the cron job hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + private function hook_callback_to_sync_cron() { + $this->add_action( 'data_sync', array( &$this, '_sync_cron' ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param bool $is_network_clear Since 2.0.0 If set to TRUE, clear sync cron even if there are installs that are still connected. + */ + private function clear_sync_cron( $is_network_clear = false ) { + $this->_logger->entrance(); + + $this->clear_cron( 'sync', 'data_sync', $is_network_clear ); + } + + /** + * Unix timestamp for next sync cron execution or false if not scheduled. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return int|false + */ + function next_sync_cron() { + return $this->get_next_scheduled_cron( 'sync', 'data_sync' ); + } + + /** + * Unix timestamp for previous sync cron execution or false if never executed. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return int|false + */ + function last_sync_cron() { + return $this->cron_last_execution( 'sync' ); + } + + #endregion Daily Sync Cron ------------------------------------------------------------------ + + #---------------------------------------------------------------------------------- + #region Async Install Sync + #---------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return bool + */ + private function is_install_sync_scheduled() { + return $this->is_cron_on( 'install_sync' ); + } + + /** + * Get the sync cron's executing blog ID. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return int + */ + private function get_install_sync_cron_blog_id() { + return $this->get_cron_blog_id( 'install_sync' ); + } + + /** + * Instead of running blocking install sync event, execute non blocking scheduled wp-cron. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param int $except_blog_id Since 2.0.0 when running in a multisite network environment, the cron execution is consolidated. This param allows excluding excluded specified blog ID from being the cron executor. + */ + private function schedule_install_sync( $except_blog_id = 0 ) { + $this->schedule_cron( 'install_sync', 'install_sync', 'single', WP_FS__SCRIPT_START_TIME, false, $except_blog_id ); + } + + /** + * Unix timestamp for previous install sync cron execution or false if never executed. + * + * @todo There's some very strange bug that $this->_storage->install_sync_timestamp value is not being updated. But for sure the sync event is working. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return int|false + */ + function last_install_sync() { + return $this->cron_last_execution( 'install_sync' ); + } + + /** + * Unix timestamp for next install sync cron execution or false if not scheduled. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return int|false + */ + function next_install_sync() { + return $this->get_next_scheduled_cron( 'install_sync', 'install_sync' ); + } + + /** + * Add the actual install sync function to the cron job hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + */ + private function hook_callback_to_install_sync() { + $this->add_action( 'install_sync', array( &$this, '_run_sync_install' ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param bool $is_network_clear Since 2.0.0 If set to TRUE, clear sync cron even if there are installs that are still connected. + */ + private function clear_install_sync_cron( $is_network_clear = false ) { + $this->_logger->entrance(); + + $this->clear_cron( 'install_sync', 'install_sync', $is_network_clear ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * @since 2.0.0 Consolidate all the data sync into the same cron for performance optimization. The max number of API requests is based on the number of unique opted-in users. + */ + public function _run_sync_install() { + $this->_logger->entrance(); + + $this->execute_cron( 'sync', array( &$this, '_sync_install_cron_method' ) ); + } + + /** + * The actual install(s) sync cron logic. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int[] $blog_ids + */ + function _sync_install_cron_method( array $blog_ids ) { + if ( $this->is_registered() ) { + if ( 1 < count( $blog_ids ) ) { + $this->sync_installs( array(), true ); + } else { + $this->sync_install( array(), true ); + } + } + } + + #endregion Async Install Sync ------------------------------------------------------------------ + + /** + * Show a notice that activation is currently pending. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param bool|string $email + * @param bool $is_pending_trial Since 1.2.1.5 + */ + function _add_pending_activation_notice( $email = false, $is_pending_trial = false ) { + if ( ! is_string( $email ) ) { + $current_user = self::_get_current_wp_user(); + $email = $current_user->user_email; + } + + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s.', 'pending-activation-message' ), + '<b>' . $this->get_plugin_name() . '</b>', + '<b>' . $email . '</b>', + ( $is_pending_trial ? + $this->get_text_inline( 'start the trial', 'start-the-trial' ) : + $this->get_text_inline( 'complete the install', 'complete-the-install' ) ) + ), + 'activation_pending', + 'Thanks!' + ); + } + + /** + * Check if currently in plugin activation. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + * + * @return bool + */ + function is_plugin_activation() { + $result = get_transient( "fs_{$this->_module_type}_{$this->_slug}_activated" ); + + return !empty($result); + } + + /** + * + * NOTE: admin_menu action executed before admin_init. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + function _admin_init_action() { + /** + * Automatically redirect to connect/activation page after plugin activation. + * + * @since 1.1.7 Do NOT redirect to opt-in when running in network admin mode. + */ + if ( $this->is_plugin_activation() ) { + delete_transient( "fs_{$this->_module_type}_{$this->_slug}_activated" ); + + if ( isset( $_GET['activate-multi'] ) ) { + /** + * Don't redirect if activating multiple plugins at once (bulk activation). + */ + } else { + $this->_redirect_on_activation_hook(); + return; + } + } + + if ( fs_request_is_action( $this->get_unique_affix() . '_skip_activation' ) ) { + check_admin_referer( $this->get_unique_affix() . '_skip_activation' ); + + $this->skip_connection( null, fs_is_network_admin() ); + + fs_redirect( $this->get_after_activation_url( 'after_skip_url' ) ); + } + + if ( $this->is_network_activation_mode() && + fs_request_is_action( $this->get_unique_affix() . '_delegate_activation' ) + ) { + check_admin_referer( $this->get_unique_affix() . '_delegate_activation' ); + + $this->delegate_connection(); + + fs_redirect( $this->get_after_activation_url( 'after_delegation_url' ) ); + } + + $this->_add_upgrade_action_link(); + + if ( ! $this->is_addon() && + ! ( ! $this->_is_network_active && fs_is_network_admin() ) && + ( + // Not registered nor anonymous. + ( ! $this->is_registered() && ! $this->is_anonymous() ) || + // OR, network level and in network upgrade mode. + ( fs_is_network_admin() && $this->_is_network_active && $this->is_network_upgrade_mode() ) + ) + ) { + if ( ! $this->is_pending_activation() ) { + if ( ! $this->_menu->is_main_settings_page() ) { + /** + * If a user visits any other admin page before activating the premium-only theme with a valid + * license, reactivate the previous theme. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( $this->is_theme() + && $this->is_only_premium() + && ! $this->has_settings_menu() + && ! isset( $_REQUEST['fs_action'] ) + && $this->can_activate_previous_theme() + ) { + $this->activate_previous_theme(); + + return; + } + + if ( ! fs_is_network_admin() && + $this->is_network_activation_mode() && + ! $this->is_delegated_connection() + ) { + return; + } + + if ( $this->is_plugin_new_install() || $this->is_only_premium() ) { + if ( ! $this->_anonymous_mode ) { + // Show notice for new plugin installations. + $this->_admin_notices->add( + sprintf( + $this->get_text_inline( 'You are just one step away - %s', 'you-are-step-away' ), + sprintf( '<b><a href="%s">%s</a></b>', + $this->get_activation_url( array(), ! $this->is_delegated_connection() ), + sprintf( $this->get_text_x_inline( 'Complete "%s" Activation Now', + '%s - plugin name. As complete "PluginX" activation now', 'activate-x-now' ), $this->get_plugin_name() ) + ) + ), + '', + 'update-nag' + ); + } + } else { + if ( $this->should_add_sticky_optin_notice() ) { + $this->add_sticky_optin_admin_notice(); + } + + if ( $this->has_filter( 'optin_pointer_element' ) ) { + // Don't show admin nag if plugin update. + wp_enqueue_script( 'wp-pointer' ); + wp_enqueue_style( 'wp-pointer' ); + + $this->_enqueue_connect_essentials(); + + add_action( 'admin_print_footer_scripts', array( + $this, + '_add_connect_pointer_script' + ) ); + } + } + } + } + + if ( $this->is_theme() && + $this->_menu->is_main_settings_page() + ) { + $this->_show_theme_activation_optin_dialog(); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + private function should_add_sticky_optin_notice() { + if ( fs_is_network_admin() ) { + if ( ! $this->_is_network_active ) { + return false; + } + + if ( ! $this->is_network_activation_mode() ) { + return false; + } + + return ! isset( $this->_storage->sticky_optin_added_ms ); + } + + if ( ! $this->is_activation_mode() ) { + return false; + } + + // If running from a blog admin and delegated the connection. + return ! isset( $this->_storage->sticky_optin_added ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + private function add_sticky_optin_admin_notice() { + if ( ! $this->_is_network_active || ! fs_is_network_admin() ) { + $this->_storage->sticky_optin_added = true; + } else { + $this->_storage->sticky_optin_added_ms = true; + } + + // Show notice for new plugin installations. + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'We made a few tweaks to the %s, %s', 'few-plugin-tweaks' ), + $this->_module_type, + sprintf( '<b><a href="%s">%s</a></b>', + $this->get_activation_url(), + sprintf( $this->get_text_inline( 'Opt in to make "%s" Better!', 'optin-x-now' ), $this->get_plugin_name() ) + ) + ), + 'connect_account', + '', + 'update-nag' + ); + } + + /** + * Enqueue connect requires scripts and styles. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + */ + function _enqueue_connect_essentials() { + wp_enqueue_script( 'jquery' ); + wp_enqueue_script( 'json2' ); + + fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); + fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); + + fs_enqueue_local_style( 'fs_connect', '/admin/connect.css' ); + } + + /** + * Add connect / opt-in pointer. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + */ + function _add_connect_pointer_script() { + $vars = array( 'id' => $this->_module_id ); + $pointer_content = fs_get_template( 'connect.php', $vars ); + ?> + <script type="text/javascript">// <![CDATA[ + jQuery(document).ready(function ($) { + if ('undefined' !== typeof(jQuery().pointer)) { + + var element = <?php echo $this->apply_filters( 'optin_pointer_element', '$("#non_existing_element");' ) ?>; + + if (element.length > 0) { + var optin = $(element).pointer($.extend(true, {}, { + content : <?php echo json_encode( $pointer_content ) ?>, + position : { + edge : 'left', + align: 'center' + }, + buttons : function () { + // Don't show pointer buttons. + return ''; + }, + pointerWidth: 482 + }, <?php echo $this->apply_filters( 'optin_pointer_options_json', '{}' ) ?>)); + + <?php + echo $this->apply_filters( 'optin_pointer_execute', " + + optin.pointer('open'); + + // Tag the opt-in pointer with custom class. + $('.wp-pointer #fs_connect') + .parents('.wp-pointer.wp-pointer-top') + .addClass('fs-opt-in-pointer'); + + ", 'element', 'optin' ) ?> + } + } + }); + // ]]></script> + <?php + } + + /** + * Return current page's URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return string + */ + function current_page_url() { + $url = 'http'; + + if ( isset( $_SERVER["HTTPS"] ) ) { + if ( $_SERVER["HTTPS"] == "on" ) { + $url .= "s"; + } + } + $url .= "://"; + if ( $_SERVER["SERVER_PORT"] != "80" ) { + $url .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"]; + } else { + $url .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]; + } + + return esc_url( $url ); + } + + /** + * Check if the current page is the plugin's main admin settings page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function _is_plugin_page() { + return fs_is_plugin_page( $this->_menu->get_raw_slug() ) || + fs_is_plugin_page( $this->_slug ); + } + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + /** + * Delete site install from Database. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param bool $store + * @param int|null $blog_id Since 2.0.0 + * + * @return false|int The install ID if deleted. Otherwise, FALSE (when install not exist). + */ + function _delete_site( $store = true, $blog_id = null ) { + return self::_delete_site_by_slug( $this->_slug, $this->_module_type, $store, $blog_id ); + } + + /** + * Delete site install from Database. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param string $slug + * @param string $module_type + * @param bool $store + * @param int|null $blog_id Since 2.0.0 + * + * @return false|int The install ID if deleted. Otherwise, FALSE (when install not exist). + */ + static function _delete_site_by_slug( $slug, $module_type, $store = true, $blog_id = null ) { + $sites = self::get_all_sites( $module_type, $blog_id ); + + $install_id = false; + + if ( isset( $sites[ $slug ] ) ) { + if ( is_object( $sites[ $slug ] ) ) { + $install_id = $sites[ $slug ]->id; + } + + unset( $sites[ $slug ] ); + + self::set_account_option_by_module( $module_type, 'sites', $sites, $store, $blog_id ); + } + + return $install_id; + } + + /** + * Delete user. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * @param bool $store + * + * @return false|int The user ID if deleted. Otherwise, FALSE (when install not exist). + */ + private static function delete_user( $user_id, $store = true ) { + $users = self::get_all_users(); + + if ( ! is_array( $users ) || ! isset( $users[ $user_id ] ) ) { + return false; + } + + unset( $users[ $user_id ] ); + + self::$_accounts->set_option( 'users', $users, $store ); + + return $user_id; + } + + /** + * Delete plugin's plans information. + * + * @param bool $store Flush to Database if true. + * @param bool $keep_associated_plans If set to false, delete all plans, even if a plan is associated with an install. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + private function _delete_plans( $store = true, $keep_associated_plans = true ) { + $this->_logger->entrance(); + + $plans = self::get_all_plans( $this->_module_type ); + + $plans_to_keep = array(); + + if ( $keep_associated_plans ) { + $plans_ids_to_keep = $this->get_plans_ids_associated_with_installs(); + foreach ( $plans_ids_to_keep as $plan_id ) { + $plan = self::_get_plan_by_id( $plan_id ); + if ( is_object( $plan ) ) { + $plans_to_keep[] = $plan; + } + } + } + + if ( ! empty( $plans_to_keep ) ) { + $plans[ $this->_slug ] = $plans_to_keep; + } else { + unset( $plans[ $this->_slug ] ); + } + + $this->set_account_option( 'plans', $plans, $store ); + } + + /** + * Delete all plugin licenses. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param bool $store + */ + private function _delete_licenses( $store = true ) { + $this->_logger->entrance(); + + $all_licenses = self::get_all_licenses(); + + unset( $all_licenses[ $this->_module_id ] ); + + self::$_accounts->set_option( 'all_licenses', $all_licenses, $store ); + } + + /** + * Check if Freemius was added on new plugin installation. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.5 + * + * @return bool + */ + function is_plugin_new_install() { + return isset( $this->_storage->is_plugin_new_install ) && + $this->_storage->is_plugin_new_install; + } + + /** + * Check if it's the first plugin release that is running Freemius. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @return bool + */ + function is_first_freemius_powered_version() { + return empty( $this->_storage->plugin_last_version ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool|string + */ + private function get_previous_theme_slug() { + return isset( $this->_storage->previous_theme ) ? + $this->_storage->previous_theme : + false; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return string + */ + private function can_activate_previous_theme() { + $slug = $this->get_previous_theme_slug(); + if ( false !== $slug && current_user_can( 'switch_themes' ) ) { + $theme_instance = wp_get_theme( $slug ); + + return $theme_instance->exists(); + } + + return false; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + private function activate_previous_theme() { + switch_theme( $this->get_previous_theme_slug() ); + unset( $this->_storage->previous_theme ); + + global $pagenow; + if ( 'themes.php' === $pagenow ) { + /** + * Refresh the active theme information. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + fs_redirect( $this->admin_url( $pagenow ) ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return string + */ + function get_previous_theme_activation_url() { + if ( ! $this->can_activate_previous_theme() ) { + return ''; + } + + /** + * Activation URL + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + return wp_nonce_url( + $this->admin_url( 'themes.php?action=activate&stylesheet=' . urlencode( $this->get_previous_theme_slug() ) ), + 'switch-theme_' . $this->get_previous_theme_slug() + ); + } + + /** + * Saves the slug of the previous theme if it still exists so that it can be used by the logic in the opt-in + * form that decides whether to add a close button to the opt-in dialog or not. So after a premium-only theme is + * activated, the close button will appear and will reactivate the previous theme if clicked. If the previous + * theme doesn't exist, then there will be no close button. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @param string $slug_or_name Old theme's slug or name. + * @param bool|WP_Theme $old_theme WP_Theme instance of the old theme if it still exists. + */ + function _activate_theme_event_hook( $slug_or_name, $old_theme = false ) { + $this->_storage->previous_theme = ( false !== $old_theme ) ? + $old_theme->get_stylesheet() : + $slug_or_name; + + $this->_activate_plugin_event_hook(); + } + + /** + * Plugin activated hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @uses FS_Api + */ + function _activate_plugin_event_hook() { + $this->_logger->entrance( 'slug = ' . $this->_slug ); + + if ( ! $this->is_user_admin() ) { + return; + } + + $this->unregister_uninstall_hook(); + + // Clear API cache on activation. + FS_Api::clear_cache(); + + $is_premium_version_activation = ( current_filter() !== ( 'activate_' . $this->_free_plugin_basename ) ); + + $this->_logger->info( 'Activating ' . ( $is_premium_version_activation ? 'premium' : 'free' ) . ' plugin version.' ); + + // 1. If running in the activation of the FREE module, get the basename of the PREMIUM. + // 2. If running in the activation of the PREMIUM module, get the basename of the FREE. + $other_version_basename = $is_premium_version_activation ? + $this->_free_plugin_basename : + $this->premium_plugin_basename(); + + if ( ! $this->_is_network_active ) { + /** + * During the activation, the plugin isn't yet active, therefore, + * _is_network_active will be set to false even if it's a network level + * activation. So we need to fix that by looking at the is_network_admin() value. + * + * @author Vova Feldman + */ + $this->_is_network_active = ( + $this->_is_multisite_integrated && + // Themes are always network activated, but the ACTUAL activation is per site. + $this->is_plugin() && + fs_is_network_admin() + ); + } + + /** + * If the other module version is activate, deactivate it. + * + * is_plugin_active() checks if the plugin active on the site or the network level + * and deactivate_plugins() deactivates the plugin whether its activated on the site + * or network level. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( is_plugin_active( $other_version_basename ) ) { + deactivate_plugins( $other_version_basename ); + } + + if ( $this->is_registered() ) { + if ( $is_premium_version_activation ) { + $this->reconnect_locally(); + } + + + // Schedule re-activation event and sync. +// $this->sync_install( array(), true ); + $this->schedule_install_sync(); + + // If activating the premium module version, add an admin notice to congratulate for an upgrade completion. + if ( $is_premium_version_activation ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'The upgrade of %s was successfully completed.', 'successful-version-upgrade-message' ), sprintf( '<b>%s</b>', $this->_plugin->title ) ), + $this->get_text_x_inline( 'W00t', + 'Used to express elation, enthusiasm, or triumph (especially in electronic communication).', 'woot' ) . '!' + ); + } + } else if ( $this->is_anonymous() ) { + if ( isset( $this->_storage->is_anonymous_ms ) && $this->_storage->is_anonymous_ms['is'] ) { + $plugin_version = $this->_storage->is_anonymous_ms['version']; + $network = true; + } else { + $plugin_version = $this->_storage->is_anonymous['version']; + $network = false; + } + + /** + * Reset "skipped" click cache on the following: + * 1. Freemius DEV mode. + * 2. WordPress DEBUG mode. + * 3. If a plugin and the user skipped the exact same version before. + * + * @since 1.2.2.7 Ulrich Pogson (@grapplerulrich) asked to not reset the SKIPPED flag if the exact same THEME version was activated before unless the developer is running with WP_DEBUG on, or Freemius debug mode on (WP_FS__DEV_MODE). + * + * @todo 4. If explicitly asked to retry after every activation. + */ + if ( WP_FS__DEV_MODE || + ( + ( $this->is_plugin() || ( defined( 'WP_DEBUG' ) && WP_DEBUG ) ) && + $this->get_plugin_version() == $plugin_version + ) + ) { + $this->reset_anonymous_mode( $network ); + } + } + + if ( ! isset( $this->_storage->is_plugin_new_install ) ) { + /** + * If no previous version of plugin's version exist, it means that it's either + * the first time that the plugin installed on the site, or the plugin was installed + * before but didn't have Freemius integrated. + * + * Since register_activation_hook() do NOT fires on updates since 3.1, and only fires + * on manual activation via the dashboard, is_plugin_activation() is TRUE + * only after immediate activation. + * + * @since 1.1.4 + * @link https://make.wordpress.org/core/2010/10/27/plugin-activation-hooks-no-longer-fire-for-updates/ + */ + $this->_storage->is_plugin_new_install = empty( $this->_storage->plugin_last_version ); + } + + if ( ! $this->_anonymous_mode && + $this->has_api_connectivity( WP_FS__DEV_MODE ) && + ! $this->_isAutoInstall + ) { + // Store hint that the plugin was just activated to enable auto-redirection to settings. + set_transient( "fs_{$this->_module_type}_{$this->_slug}_activated", true, 60 ); + } + + /** + * Activation hook is executed after the plugin's main file is loaded, therefore, + * after the plugin was loaded. The logic is located at activate_plugin() + * ./wp-admin/includes/plugin.php. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + */ + $this->_storage->was_plugin_loaded = true; + } + + /** + * Delete account. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param bool $check_user Enforce checking if user have plugins activation privileges. + */ + function delete_account_event( $check_user = true ) { + $this->_logger->entrance( 'slug = ' . $this->_slug ); + + if ( $check_user && ! $this->is_user_admin() ) { + return; + } + + $this->do_action( 'before_account_delete' ); + + // Clear all admin notices. + $this->_admin_notices->clear_all_sticky( false ); + + $this->_delete_site( false ); + + $delete_network_common_data = true; + + if ( $this->_is_network_active ) { + $installs = $this->get_blog_install_map(); + + // Don't delete common network data unless no other installs left. + $delete_network_common_data = empty( $installs ); + } + + if ( $delete_network_common_data ) { + $this->_delete_plans( false ); + + $this->_delete_licenses( false ); + + // Delete add-ons related to plugin's account. + $this->_delete_account_addons( false ); + } + + // @todo Delete plans and licenses of add-ons. + + self::$_accounts->store(); + + /** + * IMPORTANT: + * Clear crons must be executed before clearing all storage. + * Otherwise, the cron will not be cleared. + */ + if ( $delete_network_common_data ) { + $this->clear_sync_cron(); + } + + $this->clear_install_sync_cron(); + + // Clear all storage data. + $this->_storage->clear_all( true, array( + 'connectivity_test', + 'is_on', + ), false ); + + // Send delete event. + $this->get_api_site_scope()->call( '/', 'delete' ); + + $this->do_action( 'after_account_delete' ); + } + + /** + * Delete network level account. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param bool $check_user Enforce checking if user have plugins activation privileges. + */ + function delete_network_account_event( $check_user = true ) { + $this->_logger->entrance( 'slug = ' . $this->_slug ); + + if ( $check_user && ! $this->is_user_admin() ) { + return; + } + + $this->do_action( 'before_network_account_delete' ); + + // Clear all admin notices. + $this->_admin_notices->clear_all_sticky(); + + $this->_delete_plans( false, false ); + + $this->_delete_licenses( false ); + + // Delete add-ons related to plugin's account. + $this->_delete_account_addons( false ); + + // @todo Delete plans and licenses of add-ons. + + self::$_accounts->store( true ); + + /** + * IMPORTANT: + * Clear crons must be executed before clearing all storage. + * Otherwise, the cron will not be cleared. + */ + $this->clear_sync_cron( true ); + $this->clear_install_sync_cron( true ); + + $sites = self::get_sites(); + + $install_ids = array(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + $install_id = $this->_delete_site( true, $blog_id ); + + // Clear all storage data. + $this->_storage->clear_all( true, array( 'connectivity_test' ), $blog_id ); + + if ( FS_Site::is_valid_id( $install_id ) ) { + $install_ids[] = $install_id; + } + + switch_to_blog( $blog_id ); + + $this->do_action( 'after_account_delete' ); + + restore_current_blog(); + } + + $this->_storage->clear_all( true, array( + 'connectivity_test', + 'is_on', + ), true ); + + // Send delete event. + if ( ! empty( $install_ids ) ) { + $result = $this->get_current_or_network_user_api_scope()->call( "/plugins/{$this->_module_id}/installs.json?ids=" . implode( ',', $install_ids ), 'delete' ); + } + + $this->do_action( 'after_network_account_delete' ); + } + + /** + * Plugin deactivation hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + */ + function _deactivate_plugin_hook() { + $this->_logger->entrance( 'slug = ' . $this->_slug ); + + if ( ! $this->is_user_admin() ) { + return; + } + + $is_network_deactivation = fs_is_network_admin(); + $storage_keys_for_removal = array(); + + $this->_admin_notices->clear_all_sticky(); + + $storage_keys_for_removal[] = 'sticky_optin_added'; + if ( isset( $this->_storage->sticky_optin_added ) ) { + unset( $this->_storage->sticky_optin_added ); + } + + if ( ! isset( $this->_storage->is_plugin_new_install ) ) { + // Remember that plugin was already installed. + $this->_storage->is_plugin_new_install = false; + } + + // Hook to plugin uninstall. + register_uninstall_hook( $this->_plugin_main_file_path, array( 'Freemius', '_uninstall_plugin_hook' ) ); + + $this->clear_module_main_file_cache(); + $this->clear_sync_cron( $this->_is_network_active ); + $this->clear_install_sync_cron(); + + if ( $this->is_registered() ) { + if ( $this->is_premium() && ! $this->has_active_valid_license() ) { + FS_Plugin_Updater::instance( $this )->delete_update_data(); + } + + if ( $is_network_deactivation ) { + // Send deactivation event. + $this->sync_installs( array( + 'is_active' => false, + ) ); + } else { + // Send deactivation event. + $this->sync_install( array( + 'is_active' => false, + ) ); + } + } else { + if ( ! $this->has_api_connectivity() ) { + // Reset connectivity test cache. + unset( $this->_storage->connectivity_test ); + + $storage_keys_for_removal[] = 'connectivity_test'; + } + } + + if ( $is_network_deactivation ) { + if ( isset( $this->_storage->sticky_optin_added_ms ) ) { + unset( $this->_storage->sticky_optin_added_ms ); + } + + if ( ! empty( $storage_keys_for_removal ) ) { + $sites = self::get_sites(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + foreach ( $storage_keys_for_removal as $key ) { + $this->_storage->remove( $key, false, $blog_id ); + } + + $this->_storage->save( $blog_id ); + } + } + } + + // Clear API cache on deactivation. + FS_Api::clear_cache(); + + $this->remove_sdk_reference(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + */ + private function remove_sdk_reference() { + global $fs_active_plugins; + + foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { + if ( $this->_plugin_basename == $data->plugin_path ) { + unset( $fs_active_plugins->plugins[ $sdk_path ] ); + break; + } + } + + fs_fallback_to_newest_active_sdk(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param bool $is_anonymous + * @param bool|int $network_or_blog_id Since 2.0.0 + */ + private function set_anonymous_mode( $is_anonymous = true, $network_or_blog_id = 0 ) { + // Store information regarding skip to try and opt-in the user + // again in the future. + $skip_info = array( + 'is' => $is_anonymous, + 'timestamp' => WP_FS__SCRIPT_START_TIME, + 'version' => $this->get_plugin_version(), + ); + + if ( true === $network_or_blog_id ) { + $this->_storage->is_anonymous_ms = $skip_info; + } else { + $this->_storage->store( 'is_anonymous', $skip_info, $network_or_blog_id ); + } + + $this->network_upgrade_mode_completed(); + + // Update anonymous mode cache. + $this->_is_anonymous = $is_anonymous; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id Site ID. + * @param int $user_id User ID. + * @param string $domain Site domain. + * @param string $path Site path. + * @param int $network_id Network ID. Only relevant on multi-network installations. + * @param array $meta Metadata. Used to set initial site options. + * + * @uses Freemius::is_license_network_active() to check if the context license was network activated by the super-admin. + * @uses Freemius::is_network_connected() to check if the super-admin network opted-in. + * @uses Freemius::is_network_anonymous() to check if the super-admin network skipped. + * @uses Freemius::is_network_delegated_connection() to check if the super-admin network delegated the connection to the site admins. + */ + function _after_new_blog_callback( $blog_id, $user_id, $domain, $path, $network_id, $meta ) { + $this->_logger->entrance(); + + if ( $this->is_premium() && + $this->is_network_connected() && + is_object( $this->_license ) && + $this->_license->can_activate( FS_Site::is_localhost_by_address( $domain ) ) && + $this->is_license_network_active( $blog_id ) + ) { + /** + * Running the premium version, the license was network activated, and the license can also be activated on the current site -> so try to opt-in with the license key. + */ + $current_blog_id = get_current_blog_id(); + $license = clone $this->_license; + + $this->switch_to_blog( $blog_id ); + + // Opt-in with network user. + $this->install_with_user( + $this->get_network_user(), + $license->secret_key, + false, + false, + false + ); + + if ( is_object( $this->_site ) ) { + if ( $this->_site->license_id == $license->id ) { + /** + * If the license was activated successfully, sync the license data from the remote server. + */ + $this->_license = $license; + $this->sync_site_license(); + } + } + + $this->switch_to_blog( $current_blog_id ); + + if ( is_object( $this->_site ) ) { + // Already connected (with or without a license), so no need to continue. + return; + } + } + + if ( $this->is_network_anonymous() ) { + /** + * Opt-in was network skipped so automatically skip the opt-in for the new site. + */ + $this->skip_site_connection( $blog_id ); + } else if ( $this->is_network_delegated_connection() ) { + /** + * Opt-in was network delegated so automatically delegate the opt-in for the new site's admin. + */ + $this->delegate_site_connection( $blog_id ); + } else if ( $this->is_network_connected() ) { + /** + * Opt-in was network activated so automatically opt-in with the network user and new site admin. + */ + $current_blog_id = get_current_blog_id(); + + $this->switch_to_blog( $blog_id ); + + // Opt-in with network user. + $this->install_with_user( + $this->get_network_user(), + false, + false, + false, + false + ); + + $this->switch_to_blog( $current_blog_id ); + } else { + /** + * If the super-admin mixed different options (connect, skip, delegated): + * a) If at least one site connection was delegated, then automatically delegate connection. + * b) Otherwise, it means that at least one site was skipped and at least one site was connected. For a simplified UX in the initial release of the multisite network integration, skip the connection for the newly created site. If the super-admin will want to opt-in they can still do that from the network level Account page. + */ + $has_delegated_site = false; + + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + if ( $this->is_site_delegated_connection( $blog_id ) ) { + $has_delegated_site = true; + break; + } + } + + if ( $has_delegated_site ) { + $this->delegate_site_connection( $blog_id ); + } else { + $this->skip_site_connection( $blog_id ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param bool|int $network_or_blog_id Since 2.0.0. + */ + private function reset_anonymous_mode( $network_or_blog_id = 0 ) { + if ( true === $network_or_blog_id ) { + unset( $this->_storage->is_anonymous_ms ); + } else { + $this->_storage->remove( 'is_anonymous', true, $network_or_blog_id ); + } + + /** + * Ensure that this field is also "false", otherwise, if the current module's type is "theme" and the module + * has no menus, the opt-in popup will not be shown immediately (in this case, the user will have to click + * on the admin notice that contains the opt-in link in order to trigger the opt-in popup). + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( ! $this->_is_network_active || + 0 === $network_or_blog_id || + get_current_blog_id() == $network_or_blog_id || + ( true === $network_or_blog_id && fs_is_network_admin() ) + ) { + unset( $this->_is_anonymous ); + } + } + + /** + * Clears the anonymous mode and redirects to the opt-in screen. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + */ + function connect_again() { + if ( ! $this->is_anonymous() ) { + return; + } + + $this->reset_anonymous_mode( fs_is_network_admin() ); + + fs_redirect( $this->get_activation_url() ); + } + + /** + * Skip account connect, and set anonymous mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * + * @param array|null $sites Since 2.0.0. Specific sites. + * @param bool $skip_all_network Since 2.0.0. If true, skip connection for all sites. + */ + function skip_connection( $sites = null, $skip_all_network = false ) { + $this->_logger->entrance(); + + $this->_admin_notices->remove_sticky( 'connect_account' ); + + if ( $skip_all_network ) { + $this->set_anonymous_mode( true, true ); + } + + if ( ! $skip_all_network && empty( $sites ) ) { + $this->skip_site_connection(); + } else { + $uids = array(); + + if ( $skip_all_network ) { + $this->set_anonymous_mode( true, true ); + + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $this->skip_site_connection( $blog_id, false ); + $uids[] = $this->get_anonymous_id( $blog_id ); + } + } else if ( ! empty( $sites ) ) { + foreach ( $sites as $site ) { + $uids[] = $site['uid']; + $this->skip_site_connection( $site['blog_id'], false ); + } + } + + // Send anonymous skip event. + // No user identified info nor any tracking will be sent after the user skips the opt-in. + $this->get_api_plugin_scope()->call( 'skip.json', 'put', array( + 'uids' => $uids, + ) ); + } + + $this->network_upgrade_mode_completed(); + } + + /** + * Skip connection for specific site in the network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int|null $blog_id + * @param bool $send_skip + */ + private function skip_site_connection( $blog_id = null, $send_skip = true ) { + $this->_logger->entrance(); + + $this->_admin_notices->remove_sticky( 'connect_account', $blog_id ); + + $this->set_anonymous_mode( true, $blog_id ); + + if ( $send_skip ) { + $this->get_api_plugin_scope()->call( 'skip.json', 'put', array( + 'uids' => array( $this->get_anonymous_id( $blog_id ) ), + ) ); + } + } + + /** + * Plugin version update hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + */ + private function update_plugin_version_event() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return; + } + + $this->schedule_install_sync(); +// $this->sync_install( array(), true ); + } + + /** + * Generate an MD5 signature of a plugins collection. + * This helper methods used to identify changes in a plugins collection. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param array [string]array $plugins + * + * @return string + */ + private function get_plugins_thumbprint( $plugins ) { + ksort( $plugins ); + + $thumbprint = ''; + foreach ( $plugins as $basename => $data ) { + $thumbprint .= $data['slug'] . ',' . + $data['Version'] . ',' . + ( $data['is_active'] ? '1' : '0' ) . ';'; + } + + return md5( $thumbprint ); + } + + /** + * Return a list of modified plugins since the last sync. + * + * Note: + * There's no point to store a plugins counter since even if the number of + * plugins didn't change, we still need to check if the versions are all the + * same and the activity state is similar. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8 + * + * @return array|false + */ + private function get_plugins_data_for_api() { + // Alias. + $site_active_plugins_option_name = 'active_plugins'; + $network_plugins_option_name = 'all_plugins'; + + /** + * Collection of all site level active plugins. + */ + $site_active_plugins_cache = self::$_accounts->get_option( $site_active_plugins_option_name ); + + if ( ! is_object( $site_active_plugins_cache ) ) { + $site_active_plugins_cache = (object) array( + 'timestamp' => '', + 'md5' => '', + 'plugins' => array(), + ); + } + + $time = time(); + + if ( ! empty( $site_active_plugins_cache->timestamp ) && + ( $time - $site_active_plugins_cache->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC + ) { + // Don't send plugin updates if last update was in the past 5 min. + return false; + } + + // Write timestamp to lock the logic. + $site_active_plugins_cache->timestamp = $time; + self::$_accounts->set_option( $site_active_plugins_option_name, $site_active_plugins_cache, true ); + + // Reload options from DB. + self::$_accounts->load( true ); + $site_active_plugins_cache = self::$_accounts->get_option( $site_active_plugins_option_name ); + + if ( $time != $site_active_plugins_cache->timestamp ) { + // If timestamp is different, then another thread captured the lock. + return false; + } + + /** + * Collection of all plugins (network level). + */ + $network_plugins_cache = self::$_accounts->get_option( $network_plugins_option_name ); + + if ( ! is_object( $network_plugins_cache ) ) { + $network_plugins_cache = (object) array( + 'timestamp' => '', + 'md5' => '', + 'plugins' => array(), + ); + } + + // Check if there's a change in plugins. + $network_plugins = self::get_network_plugins(); + $site_active_plugins = self::get_site_active_plugins(); + + $network_plugins_thumbprint = $this->get_plugins_thumbprint( $network_plugins ); + $site_active_plugins_thumbprint = $this->get_plugins_thumbprint( $site_active_plugins ); + + // Check if plugins status changed (version or active/inactive). + $network_plugins_changed = ( $network_plugins_cache->md5 !== $network_plugins_thumbprint ); + $site_active_plugins_changed = ( $site_active_plugins_cache->md5 !== $site_active_plugins_thumbprint ); + + if ( ! $network_plugins_changed && + ! $site_active_plugins_changed + ) { + // No changes. + return array(); + } + + $plugins_update_data = array(); + + foreach ( $network_plugins_cache->plugins as $basename => $data ) { + if ( ! isset( $network_plugins[ $basename ] ) ) { + // Plugin uninstalled. + $uninstalled_plugin_data = $data; + $uninstalled_plugin_data['is_active'] = false; + $uninstalled_plugin_data['is_uninstalled'] = true; + $plugins_update_data[] = $uninstalled_plugin_data; + + unset( $network_plugins[ $basename ] ); + + unset( $network_plugins_cache->plugins[ $basename ] ); + unset( $site_active_plugins_cache->plugins[ $basename ] ); + + continue; + } + + $was_active = $data['is_active'] || + ( isset( $site_active_plugins_cache->plugins[ $basename ] ) && + true === $site_active_plugins_cache->plugins[ $basename ]['is_active'] ); + $is_active = $network_plugins[ $basename ]['is_active'] || + ( isset( $site_active_plugins[ $basename ] ) && + $site_active_plugins[ $basename ]['is_active'] ); + + if ( ! isset( $site_active_plugins_cache->plugins[ $basename ] ) && + isset( $site_active_plugins[ $basename ] ) + ) { + // Plugin was site level activated. + $site_active_plugins_cache->plugins[ $basename ] = $network_plugins[ $basename ]; + $site_active_plugins_cache->plugins[ $basename ]['is_active'] = true; + } else if ( isset( $site_active_plugins_cache->plugins[ $basename ] ) && + ! isset( $site_active_plugins[ $basename ] ) + ) { + // Plugin was site level deactivated. + unset( $site_active_plugins_cache->plugins[ $basename ] ); + } + + $prev_version = $data['version']; + $current_version = $network_plugins[ $basename ]['Version']; + + if ( $was_active !== $is_active || $prev_version !== $current_version ) { + // Plugin activated or deactivated, or version changed. + + if ( $was_active !== $is_active ) { + if ( $data['is_active'] != $network_plugins[ $basename ]['is_active'] ) { + $network_plugins_cache->plugins[ $basename ]['is_active'] = $data['is_active']; + } + } + + if ( $prev_version !== $current_version ) { + $network_plugins_cache->plugins[ $basename ]['Version'] = $current_version; + } + + $updated_plugin_data = $data; + $updated_plugin_data['is_active'] = $is_active; + $updated_plugin_data['version'] = $current_version; + $updated_plugin_data['title'] = $network_plugins[ $basename ]['Name']; + $plugins_update_data[] = $updated_plugin_data; + } + } + + // Find new plugins that weren't yet seen before. + foreach ( $network_plugins as $basename => $data ) { + if ( ! isset( $network_plugins_cache->plugins[ $basename ] ) ) { + // New plugin. + $new_plugin = array( + 'slug' => $data['slug'], + 'version' => $data['Version'], + 'title' => $data['Name'], + 'is_active' => $data['is_active'], + 'is_uninstalled' => false, + ); + + $plugins_update_data[] = $new_plugin; + $network_plugins_cache->plugins[ $basename ] = $new_plugin; + + if ( isset( $site_active_plugins[ $basename ] ) ) { + $site_active_plugins_cache->plugins[ $basename ] = $new_plugin; + $site_active_plugins_cache->plugins[ $basename ]['is_active'] = true; + } + } + } + + $site_active_plugins_cache->md5 = $site_active_plugins_thumbprint; + $site_active_plugins_cache->timestamp = $time; + self::$_accounts->set_option( $site_active_plugins_option_name, $site_active_plugins_cache, true ); + + $network_plugins_cache->md5 = $network_plugins_thumbprint; + $network_plugins_cache->timestamp = $time; + self::$_accounts->set_option( $network_plugins_option_name, $network_plugins_cache, true ); + + return $plugins_update_data; + } + + /** + * Return a list of modified themes since the last sync. + * + * Note: + * There's no point to store a themes counter since even if the number of + * themes didn't change, we still need to check if the versions are all the + * same and the activity state is similar. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8 + * + * @return array|false + */ + private function get_themes_data_for_api() { + // Alias. + $option_name = 'all_themes'; + + $all_cached_themes = self::$_accounts->get_option( $option_name ); + + if ( ! is_object( $all_cached_themes ) ) { + $all_cached_themes = (object) array( + 'timestamp' => '', + 'md5' => '', + 'themes' => array(), + ); + } + + $time = time(); + + if ( ! empty( $all_cached_themes->timestamp ) && + ( $time - $all_cached_themes->timestamp ) < WP_FS__TIME_5_MIN_IN_SEC + ) { + // Don't send theme updates if last update was in the past 5 min. + return false; + } + + // Write timestamp to lock the logic. + $all_cached_themes->timestamp = $time; + self::$_accounts->set_option( $option_name, $all_cached_themes, true ); + + // Reload options from DB. + self::$_accounts->load( true ); + $all_cached_themes = self::$_accounts->get_option( $option_name ); + + if ( $time != $all_cached_themes->timestamp ) { + // If timestamp is different, then another thread captured the lock. + return false; + } + + // Get active theme. + $active_theme = wp_get_theme(); + $active_theme_stylesheet = $active_theme->get_stylesheet(); + + // Check if there's a change in themes. + $all_themes = wp_get_themes(); + + // Check if themes changed. + ksort( $all_themes ); + + $themes_signature = ''; + foreach ( $all_themes as $slug => $data ) { + $is_active = ( $slug === $active_theme_stylesheet ); + $themes_signature .= $slug . ',' . + $data->version . ',' . + ( $is_active ? '1' : '0' ) . ';'; + } + + // Check if themes status changed (version or active/inactive). + $themes_changed = ( $all_cached_themes->md5 !== md5( $themes_signature ) ); + + $themes_update_data = array(); + + if ( $themes_changed ) { + // Change in themes, report changes. + + // Update existing themes info. + foreach ( $all_cached_themes->themes as $slug => $data ) { + $is_active = ( $slug === $active_theme_stylesheet ); + + if ( ! isset( $all_themes[ $slug ] ) ) { + // Plugin uninstalled. + $uninstalled_theme_data = $data; + $uninstalled_theme_data['is_active'] = false; + $uninstalled_theme_data['is_uninstalled'] = true; + $themes_update_data[] = $uninstalled_theme_data; + + unset( $all_themes[ $slug ] ); + unset( $all_cached_themes->themes[ $slug ] ); + } else if ( $data['is_active'] !== $is_active || + $data['version'] !== $all_themes[ $slug ]->version + ) { + // Plugin activated or deactivated, or version changed. + + $all_cached_themes->themes[ $slug ]['is_active'] = $is_active; + $all_cached_themes->themes[ $slug ]['version'] = $all_themes[ $slug ]->version; + + $themes_update_data[] = $all_cached_themes->themes[ $slug ]; + } + } + + // Find new themes that weren't yet seen before. + foreach ( $all_themes as $slug => $data ) { + if ( ! isset( $all_cached_themes->themes[ $slug ] ) ) { + $is_active = ( $slug === $active_theme_stylesheet ); + + // New plugin. + $new_plugin = array( + 'slug' => $slug, + 'version' => $data->version, + 'title' => $data->name, + 'is_active' => $is_active, + 'is_uninstalled' => false, + ); + + $themes_update_data[] = $new_plugin; + $all_cached_themes->themes[ $slug ] = $new_plugin; + } + } + + $all_cached_themes->md5 = md5( $themes_signature ); + $all_cached_themes->timestamp = time(); + self::$_accounts->set_option( $option_name, $all_cached_themes, true ); + } + + return $themes_update_data; + } + + /** + * Get site data for API install request. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.2 + * + * @param string[] string $override + * @param bool $include_plugins Since 1.1.8 by default include plugin changes. + * @param bool $include_themes Since 1.1.8 by default include plugin changes. + * + * @return array + */ + private function get_install_data_for_api( + array $override, + $include_plugins = true, + $include_themes = true + ) { + /** + * @since 1.1.8 Also send plugin updates. + */ + if ( $include_plugins && ! isset( $override['plugins'] ) ) { + $plugins = $this->get_plugins_data_for_api(); + if ( ! empty( $plugins ) ) { + $override['plugins'] = $plugins; + } + } + /** + * @since 1.1.8 Also send themes updates. + */ + if ( $include_themes && ! isset( $override['themes'] ) ) { + $themes = $this->get_themes_data_for_api(); + if ( ! empty( $themes ) ) { + $override['themes'] = $themes; + } + } + + return array_merge( array( + 'version' => $this->get_plugin_version(), + 'is_premium' => $this->is_premium(), + 'language' => get_bloginfo( 'language' ), + 'charset' => get_bloginfo( 'charset' ), + 'platform_version' => get_bloginfo( 'version' ), + 'sdk_version' => $this->version, + 'programming_language_version' => phpversion(), + 'title' => get_bloginfo( 'name' ), + 'url' => get_site_url(), + // Special params. + 'is_active' => true, + 'is_disconnected' => $this->is_tracking_prohibited(), + 'is_uninstalled' => false, + ), $override ); + } + + /** + * Update installs details. + * + * @todo V1 of multiste network support doesn't support plugin and theme data sending. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string[] string $override + * @param bool $only_diff + * @param bool $include_plugins Since 1.1.8 by default include plugin changes. + * @param bool $include_themes Since 1.1.8 by default include plugin changes. + * + * @return array + */ + private function get_installs_data_for_api( + array $override, + $only_diff = false, + $include_plugins = true, + $include_themes = true + ) { + /** + * @since 1.1.8 Also send plugin updates. + */ +// if ( $include_plugins && ! isset( $override['plugins'] ) ) { +// $plugins = $this->get_plugins_data_for_api(); +// if ( ! empty( $plugins ) ) { +// $override['plugins'] = $plugins; +// } +// } + /** + * @since 1.1.8 Also send themes updates. + */ +// if ( $include_themes && ! isset( $override['themes'] ) ) { +// $themes = $this->get_themes_data_for_api(); +// if ( ! empty( $themes ) ) { +// $override['themes'] = $themes; +// } +// } + + // Common properties. + $common = array_merge( array( + 'version' => $this->get_plugin_version(), + 'is_premium' => $this->is_premium(), + 'sdk_version' => $this->version, + 'programming_language_version' => phpversion(), + 'platform_version' => get_bloginfo( 'version' ), + ), $override ); + + + $is_common_diff_for_any_site = false; + $common_diff_union = array(); + + $installs_data = array(); + + $sites = self::get_sites(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( is_object( $install ) ) { + if ( $install->user_id != $this->_user->id ) { + // Install belongs to a different owner. + continue; + } + + if ( ! $this->is_premium() && $install->is_tracking_prohibited() ) { + // Don't send updates regarding opted-out installs. + continue; + } + + $install_data = $this->get_site_info( $site ); + + $uid = $install_data['uid']; + + unset( $install_data['blog_id'] ); + unset( $install_data['uid'] ); + + $install_data['is_disconnected'] = $install->is_disconnected; + $install_data['is_active'] = $this->is_active_for_site( $blog_id ); + $install_data['is_uninstalled'] = $install->is_uninstalled; + + $common_diff = null; + $is_common_diff = false; + if ( $only_diff ) { + $install_data = $this->get_install_diff_for_api( $install_data, $install, $override ); + $common_diff = $this->get_install_diff_for_api( $common, $install, $override ); + + $is_common_diff = ! empty( $common_diff ); + + if ( $is_common_diff ) { + foreach ( $common_diff as $k => $v ) { + if ( ! isset( $common_diff_union[ $k ] ) ) { + $common_diff_union[ $k ] = $v; + } + } + } + + $is_common_diff_for_any_site = $is_common_diff_for_any_site || $is_common_diff; + } + + if ( ! empty( $install_data ) || $is_common_diff ) { + // Add install ID and site unique ID. + $install_data['id'] = $install->id; + $install_data['uid'] = $uid; + + $installs_data[] = $install_data; + } + } + } + + restore_current_blog(); + + if ( 0 < count( $installs_data ) && ( $is_common_diff_for_any_site || ! $only_diff ) ) { + if ( ! $only_diff ) { + $installs_data[] = $common; + } else if ( ! empty( $common_diff_union ) ) { + $installs_data[] = $common_diff_union; + } + } + + foreach ( $installs_data as &$data ) { + $data = (object) $data; + } + + return $installs_data; + } + + /** + * Compare site actual data to the stored install data and return the differences for an API data sync. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param array $site + * @param FS_Site $install + * @param string[] string $override + * + * @return array + */ + private function get_install_diff_for_api( $site, $install, $override = array() ) { + $diff = array(); + $special = array(); + $special_override = false; + + foreach ( $site as $p => $v ) { + if ( property_exists( $install, $p ) ) { + if ( ( is_bool( $install->{$p} ) || ! empty( $install->{$p} ) ) && + $install->{$p} != $v + ) { + $install->{$p} = $v; + $diff[ $p ] = $v; + } + } else { + $special[ $p ] = $v; + + if ( isset( $override[ $p ] ) || + 'plugins' === $p || + 'themes' === $p + ) { + $special_override = true; + } + } + } + + if ( $special_override || 0 < count( $diff ) ) { + // Add special params only if has at least one + // standard param, or if explicitly requested to + // override a special param or a param which is not exist + // in the install object. + $diff = array_merge( $diff, $special ); + } + + return $diff; + } + + /** + * Update install only if changed. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string[] string $override + * @param bool $flush + * + * @return false|object|string + */ + private function send_install_update( $override = array(), $flush = false ) { + $this->_logger->entrance(); + + $check_properties = $this->get_install_data_for_api( $override ); + + if ( $flush ) { + $params = $check_properties; + } else { + $params = $this->get_install_diff_for_api( $check_properties, $this->_site, $override ); + } + + if ( 0 < count( $params ) ) { + if ( ! is_multisite() ) { + // Update last install sync timestamp. + $this->set_cron_execution_timestamp( 'install_sync' ); + } + + $params['uid'] = $this->get_anonymous_id(); + + // Send updated values to FS. + $site = $this->get_api_site_scope()->call( '/', 'put', $params ); + + if ( $this->is_api_result_entity( $site ) ) { + if ( ! is_multisite() ) { + // I successfully sent install update, clear scheduled sync if exist. + $this->clear_install_sync_cron(); + } + } + + return $site; + } + + return false; + } + + /** + * Update installs only if changed. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string[] string $override + * @param bool $flush + * + * @return false|object|string + */ + private function send_installs_update( $override = array(), $flush = false ) { + $this->_logger->entrance(); + + $installs_data = $this->get_installs_data_for_api( $override, ! $flush ); + + if ( empty( $installs_data ) ) { + return false; + } + + // Update last install sync timestamp. + $this->set_cron_execution_timestamp( 'install_sync' ); + + // Send updated values to FS. + $result = $this->get_api_user_scope()->call( "/plugins/{$this->_plugin->id}/installs.json", 'put', $installs_data ); + + if ( $this->is_api_result_object( $result, 'installs' ) ) { + // I successfully sent installs update, clear scheduled sync if exist. + $this->clear_install_sync_cron(); + } + + return $result; + } + + /** + * Update install only if changed. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string[] string $override + * @param bool $flush + */ + private function sync_install( $override = array(), $flush = false ) { + $this->_logger->entrance(); + + $site = $this->send_install_update( $override, $flush ); + + if ( false === $site ) { + // No sync required. + return; + } + + if ( ! $this->is_api_result_entity( $site ) ) { + // Failed to sync, don't update locally. + return; + } + + $this->_site = new FS_Site( $site ); + + $this->_store_site( true ); + } + + /** + * Update install only if changed. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string[] string $override + * @param bool $flush + */ + private function sync_installs( $override = array(), $flush = false ) { + $this->_logger->entrance(); + + $result = $this->send_installs_update( $override, $flush ); + + if ( false === $result ) { + // No sync required. + return; + } + + if ( ! $this->is_api_result_object( $result, 'installs' ) ) { + // Failed to sync, don't update locally. + return; + } + + $address_to_blog_map = $this->get_address_to_blog_map(); + + foreach ( $result->installs as $install ) { + $this->_site = new FS_Site( $install ); + + $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); + $blog_id = $address_to_blog_map[ $address ]; + + $this->_store_site( true, $blog_id ); + } + } + + /** + * Track install's custom event. + * + * IMPORTANT: + * Custom event tracking is currently only supported for specific clients. + * If you are not one of them, please don't use this method. If you will, + * the API will simply ignore your request based on the plugin ID. + * + * Need custom tracking for your plugin or theme? + * If you are interested in custom event tracking please contact yo@freemius.com + * for further details. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @param string $name Event name. + * @param array $properties Associative key/value array with primitive values only + * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. + * @param bool $once If true, event will be tracked only once. IMPORTANT: Still trigger the API call. + * + * @return object|false Event data or FALSE on failure. + * + * @throws \Freemius_InvalidArgumentException + */ + public function track_event( $name, $properties = array(), $process_at = false, $once = false ) { + $this->_logger->entrance( http_build_query( array( 'name' => $name, 'once' => $once ) ) ); + + if ( ! $this->is_registered() ) { + return false; + } + + $event = array( 'type' => $name ); + + if ( is_numeric( $process_at ) && $process_at > time() ) { + $event['process_at'] = $process_at; + } + + if ( $once ) { + $event['once'] = true; + } + + if ( ! empty( $properties ) ) { + // Verify associative array values are primitive. + foreach ( $properties as $k => $v ) { + if ( ! is_scalar( $v ) ) { + throw new Freemius_InvalidArgumentException( 'The $properties argument must be an associative key/value array with primitive values only.' ); + } + } + + $event['properties'] = $properties; + } + + $result = $this->get_api_site_scope()->call( 'events.json', 'post', $event ); + + return $this->is_api_error( $result ) ? + false : + $result; + } + + /** + * Track install's custom event only once, but it still triggers the API call. + * + * IMPORTANT: + * Custom event tracking is currently only supported for specific clients. + * If you are not one of them, please don't use this method. If you will, + * the API will simply ignore your request based on the plugin ID. + * + * Need custom tracking for your plugin or theme? + * If you are interested in custom event tracking please contact yo@freemius.com + * for further details. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @param string $name Event name. + * @param array $properties Associative key/value array with primitive values only + * @param bool $process_at A valid future date-time in the following format Y-m-d H:i:s. + * + * @return object|false Event data or FALSE on failure. + * + * @throws \Freemius_InvalidArgumentException + * + * @user Freemius::track_event() + */ + public function track_event_once( $name, $properties = array(), $process_at = false ) { + return $this->track_event( $name, $properties, $process_at, true ); + } + + /** + * Plugin uninstall hook. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param bool $check_user Enforce checking if user have plugins activation privileges. + */ + function _uninstall_plugin_event( $check_user = true ) { + $this->_logger->entrance( 'slug = ' . $this->_slug ); + + if ( $check_user && ! current_user_can( 'activate_plugins' ) ) { + return; + } + + $params = array(); + $uninstall_reason = null; + if ( isset( $this->_storage->uninstall_reason ) ) { + $uninstall_reason = $this->_storage->uninstall_reason; + $params['reason_id'] = $uninstall_reason->id; + $params['reason_info'] = $uninstall_reason->info; + } + + if ( ! $this->is_registered() ) { + // Send anonymous uninstall event only if user submitted a feedback. + if ( isset( $uninstall_reason ) ) { + if ( isset( $uninstall_reason->is_anonymous ) && ! $uninstall_reason->is_anonymous ) { + $this->opt_in( false, false, false, false, true ); + } else { + $params['uid'] = $this->get_anonymous_id(); + $this->get_api_plugin_scope()->call( 'uninstall.json', 'put', $params ); + } + } + } else { + $params = array_merge( $params, array( + 'is_active' => false, + 'is_uninstalled' => true, + ) ); + + if ( $this->_is_network_active ) { + // Send uninstall event. + $this->send_installs_update( $params ); + } else { + // Send uninstall event. + $this->send_install_update( $params ); + } + } + + // @todo Decide if we want to delete plugin information from db. + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * + * @return string + */ + function premium_plugin_basename() { + return "{$this->_slug}-premium/" . basename( $this->_free_plugin_basename ); + } + + /** + * Uninstall plugin hook. Called only when connected his account with Freemius for active sites tracking. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + */ + public static function _uninstall_plugin_hook() { + self::_load_required_static(); + + self::$_static_logger->entrance(); + + if ( ! current_user_can( 'activate_plugins' ) ) { + return; + } + + $plugin_file = substr( current_filter(), strlen( 'uninstall_' ) ); + + self::$_static_logger->info( 'plugin = ' . $plugin_file ); + + define( 'WP_FS__UNINSTALL_MODE', true ); + + $fs = self::get_instance_by_file( $plugin_file ); + + if ( is_object( $fs ) ) { + self::require_plugin_essentials(); + + if ( is_plugin_active( $fs->_free_plugin_basename ) || + is_plugin_active( $fs->premium_plugin_basename() ) + ) { + // Deleting Free or Premium plugin version while the other version still installed. + return; + } + + $fs->_uninstall_plugin_event(); + + $fs->do_action( 'after_uninstall' ); + } + } + + #---------------------------------------------------------------------------------- + #region Plugin Information + #---------------------------------------------------------------------------------- + + /** + * Load WordPress core plugin.php essential module. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + */ + private static function require_plugin_essentials() { + if ( ! function_exists( 'get_plugins' ) ) { + self::$_static_logger->log( 'Including wp-admin/includes/plugin.php...' ); + + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + } + + /** + * Load WordPress core pluggable.php module. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.2 + */ + private static function require_pluggable_essentials() { + if ( ! function_exists( 'wp_get_current_user' ) ) { + require_once ABSPATH . 'wp-includes/pluggable.php'; + } + } + + /** + * Return plugin data. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @return array + */ + function get_plugin_data() { + if ( ! isset( $this->_plugin_data ) ) { + self::require_plugin_essentials(); + + if ( $this->is_plugin() ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.0 When using get_plugin_data() do NOT translate plugin data. + * + * @link https://github.com/Freemius/wordpress-sdk/issues/77 + */ + $plugin_data = get_plugin_data( + $this->_plugin_main_file_path, + false, + false + ); + } else { + $theme_data = wp_get_theme(); + + if ( $this->_plugin_basename !== $theme_data->get_stylesheet() && is_child_theme() ) { + $parent_theme = $theme_data->parent(); + + if ( ( $parent_theme instanceof WP_Theme ) && $this->_plugin_basename === $parent_theme->get_stylesheet() ) { + $theme_data = $parent_theme; + } + } + + $plugin_data = array( + 'Name' => $theme_data->get( 'Name' ), + 'Version' => $theme_data->get( 'Version' ), + 'Author' => $theme_data->get( 'Author' ), + 'Description' => $theme_data->get( 'Description' ), + 'PluginURI' => $theme_data->get( 'ThemeURI' ), + ); + } + + $this->_plugin_data = $plugin_data; + } + + return $this->_plugin_data; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * @since 1.2.2.5 If slug not set load slug by module ID. + * + * @return string Plugin slug. + */ + function get_slug() { + if ( ! isset( $this->_slug ) ) { + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); + $this->_slug = $id_slug_type_path_map[ $this->_module_id ]['slug']; + } + + return $this->_slug; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @return string Plugin slug. + */ + function get_target_folder_name() { + return $this->_slug . ( $this->can_use_premium_code() ? '-premium' : '' ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @return number Plugin ID. + */ + function get_id() { + return $this->_plugin->id; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @return string Freemius SDK version + */ + function get_sdk_version() { + return $this->version; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @return number Parent plugin ID (if parent exist). + */ + function get_parent_id() { + return $this->is_addon() ? + $this->get_parent_instance()->get_id() : + $this->_plugin->id; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @return string Plugin public key. + */ + function get_public_key() { + return $this->_plugin->public_key; + } + + /** + * Will be available only on sandbox mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return mixed Plugin secret key. + */ + function get_secret_key() { + return $this->_plugin->secret_key; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * + * @return bool + */ + function has_secret_key() { + return ! empty( $this->_plugin->secret_key ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return string + */ + function get_plugin_name() { + $this->_logger->entrance(); + + if ( ! isset( $this->_plugin_name ) ) { + $plugin_data = $this->get_plugin_data(); + + // Get name. + $this->_plugin_name = $plugin_data['Name']; + + // Check if plugin name contains "(Premium)" suffix and remove it. + $suffix = ' (premium)'; + $suffix_len = strlen( $suffix ); + + if ( strlen( $plugin_data['Name'] ) > $suffix_len && + $suffix === substr( strtolower( $plugin_data['Name'] ), - $suffix_len ) + ) { + $this->_plugin_name = substr( $plugin_data['Name'], 0, - $suffix_len ); + } + + $this->_logger->departure( 'Name = ' . $this->_plugin_name ); + } + + return $this->_plugin_name; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @return string + */ + function get_plugin_version() { + $this->_logger->entrance(); + + $plugin_data = $this->get_plugin_data(); + + $this->_logger->departure( 'Version = ' . $plugin_data['Version'] ); + + return $this->apply_filters( 'plugin_version', $plugin_data['Version'] ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @return string + */ + function get_plugin_title() { + $this->_logger->entrance(); + + $title = $this->_plugin->title; + + return $this->apply_filters( 'plugin_title', $title ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param bool $lowercase + * + * @return string + */ + function get_module_label( $lowercase = false ) { + $label = $this->is_addon() ? + $this->get_text_inline( 'Add-On', 'addon' ) : + ( $this->is_plugin() ? + $this->get_text_inline( 'Plugin', 'plugin' ) : + $this->get_text_inline( 'Theme', 'theme' ) ); + + if ( $lowercase ) { + $label = strtolower( $label ); + } + + return $label; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return string + */ + function get_plugin_basename() { + if ( ! isset( $this->_plugin_basename ) ) { + if ( $this->is_plugin() ) { + $this->_plugin_basename = plugin_basename( $this->_plugin_main_file_path ); + } else { + $this->_plugin_basename = basename( dirname( $this->_plugin_main_file_path ) ); + } + } + + return $this->_plugin_basename; + } + + function get_plugin_folder_name() { + $this->_logger->entrance(); + + $plugin_folder = $this->_plugin_basename; + + while ( '.' !== dirname( $plugin_folder ) ) { + $plugin_folder = dirname( $plugin_folder ); + } + + $this->_logger->departure( 'Folder Name = ' . $plugin_folder ); + + return $plugin_folder; + } + + #endregion ------------------------------------------------------------------ + + /* Account + ------------------------------------------------------------------------------------------------------------------*/ + + /** + * Find plugin's slug by plugin's basename. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $plugin_base_name + * + * @return false|string + */ + private static function find_slug_by_basename( $plugin_base_name ) { + $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); + + if ( ! array( $file_slug_map ) || ! isset( $file_slug_map[ $plugin_base_name ] ) ) { + return false; + } + + return $file_slug_map[ $plugin_base_name ]; + } + + /** + * Store the map between the plugin's basename to the slug. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + private function store_file_slug_map() { + $file_slug_map = self::$_accounts->get_option( 'file_slug_map', array() ); + + if ( ! array( $file_slug_map ) ) { + $file_slug_map = array(); + } + + if ( ! isset( $file_slug_map[ $this->_plugin_basename ] ) || + $file_slug_map[ $this->_plugin_basename ] !== $this->_slug + ) { + $file_slug_map[ $this->_plugin_basename ] = $this->_slug; + self::$_accounts->set_option( 'file_slug_map', $file_slug_map, true ); + } + } + + /** + * @return array[number]FS_User + */ + static function get_all_users() { + $users = self::$_accounts->get_option( 'users', array() ); + + if ( ! is_array( $users ) ) { + $users = array(); + } + + return $users; + } + + /** + * @param string $module_type + * @param null|int $blog_id Since 2.0.0 + * + * @return array[string]FS_Site + */ + private static function get_all_sites( + $module_type = WP_FS__MODULE_TYPE_PLUGIN, + $blog_id = null + ) { + $sites = self::get_account_option( 'sites', $module_type, $blog_id ); + + if ( ! is_array( $sites ) ) { + $sites = array(); + } + + return $sites; + } + + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.2.2 + * + * @param string $option_name + * @param string $module_type + * @param null|int $network_level_or_blog_id Since 2.0.0 + * + * @return mixed + */ + private static function get_account_option( $option_name, $module_type = null, $network_level_or_blog_id = null ) { + if ( ! is_null( $module_type ) && WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) { + $option_name = $module_type . '_' . $option_name; + } + + return self::$_accounts->get_option( $option_name, array(), $network_level_or_blog_id ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.2.2 + * + * @param string $option_name + * @param mixed $option_value + * @param bool $store + * @param null|int $network_level_or_blog_id Since 2.0.0 + */ + private function set_account_option( $option_name, $option_value, $store, $network_level_or_blog_id = null ) { + self::set_account_option_by_module( + $this->_module_type, + $option_name, + $option_value, + $store, + $network_level_or_blog_id + ); + } + + /** + * @author Vova Feldman (@svovaf) + * + * @since 1.2.2.7 + * + * @param string $module_type + * @param string $option_name + * @param mixed $option_value + * @param bool $store + * @param null|int $network_level_or_blog_id Since 2.0.0 + */ + private static function set_account_option_by_module( + $module_type, + $option_name, + $option_value, + $store, + $network_level_or_blog_id = null + ) { + if ( WP_FS__MODULE_TYPE_PLUGIN != $module_type ) { + $option_name = $module_type . '_' . $option_name; + } + + self::$_accounts->set_option( $option_name, $option_value, $store, $network_level_or_blog_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number|null $module_id + * + * @return FS_Plugin_License[] + */ + private static function get_all_licenses( $module_id = null ) { + $licenses = self::get_account_option( 'all_licenses' ); + + if ( ! is_array( $licenses ) ) { + $licenses = array(); + } + + if ( is_null( $module_id ) ) { + return $licenses; + } + + $licenses = isset( $licenses[ $module_id ] ) ? + $licenses[ $module_id ] : + array(); + + return $licenses; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return array + */ + private static function get_all_licenses_by_module_type() { + $licenses = self::get_account_option( 'all_licenses' ); + + $licenses_by_module_type = array( + WP_FS__MODULE_TYPE_PLUGIN => array(), + WP_FS__MODULE_TYPE_THEME => array() + ); + + if ( ! is_array( $licenses ) ) { + return $licenses_by_module_type; + } + + foreach ( $licenses as $module_id => $module_licenses ) { + $fs = self::get_instance_by_id( $module_id ); + if ( false === $fs ) { + continue; + } + + $licenses_by_module_type[ $fs->_module_type ] = array_merge( $licenses_by_module_type[ $fs->_module_type ], $module_licenses ); + } + + return $licenses_by_module_type; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param number $module_id + * @param number|null $user_id + * + * @return array + */ + private static function get_user_id_license_ids_map( $module_id, $user_id = null ) { + $all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' ); + + if ( ! is_array( $all_modules_user_id_license_ids_map ) ) { + $all_modules_user_id_license_ids_map = array(); + } + + $user_id_license_ids_map = isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ? + $all_modules_user_id_license_ids_map[ $module_id ] : + array(); + + if ( FS_User::is_valid_id( $user_id ) ) { + $user_id_license_ids_map = isset( $user_id_license_ids_map[ $user_id ] ) ? + $user_id_license_ids_map[ $user_id ] : + array(); + } + + return $user_id_license_ids_map; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param array $new_user_id_license_ids_map + * @param number $module_id + * @param number|null $user_id + */ + private static function store_user_id_license_ids_map( $new_user_id_license_ids_map, $module_id, $user_id = null ) { + $all_modules_user_id_license_ids_map = self::get_account_option( 'user_id_license_ids_map' ); + if ( ! is_array( $all_modules_user_id_license_ids_map ) ) { + $all_modules_user_id_license_ids_map = array(); + } + + if ( ! isset( $all_modules_user_id_license_ids_map[ $module_id ] ) ) { + $all_modules_user_id_license_ids_map[ $module_id ] = array(); + } + + if ( FS_User::is_valid_id( $user_id ) ) { + $all_modules_user_id_license_ids_map[ $module_id ][ $user_id ] = $new_user_id_license_ids_map; + } else { + $all_modules_user_id_license_ids_map[ $module_id ] = $new_user_id_license_ids_map; + } + + self::$_accounts->set_option( 'user_id_license_ids_map', $all_modules_user_id_license_ids_map, true ); + } + + /** + * Get a collection of the user's linked license IDs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * + * @return number[] + */ + private function get_user_linked_license_ids( $user_id ) { + return self::get_user_id_license_ids_map( $this->_module_id, $user_id ); + } + + /** + * Override the user's linked license IDs with a new IDs collection. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * @param number[] $license_ids + */ + private function set_user_linked_license_ids( $user_id, array $license_ids ) { + self::store_user_id_license_ids_map( $license_ids, $this->_module_id, $user_id ); + } + + /** + * Link a specified license ID to a given user. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $license_id + * @param number $user_id + */ + private function link_license_2_user( $license_id, $user_id ) { + $license_ids = $this->get_user_linked_license_ids( $user_id ); + + if ( in_array( $license_id, $license_ids ) ) { + // License already linked. + return; + } + + $license_ids[] = $license_id; + + $this->set_user_linked_license_ids( $user_id, $license_ids ); + } + + /** + * @param string|bool $module_type + * + * @return FS_Plugin_Plan[] + */ + private static function get_all_plans( $module_type = false ) { + $plans = self::get_account_option( 'plans', $module_type ); + + if ( ! is_array( $plans ) ) { + $plans = array(); + } + + return $plans; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return FS_Plugin_Tag[] + */ + private static function get_all_updates() { + $updates = self::$_accounts->get_option( 'updates', array() ); + + if ( ! is_array( $updates ) ) { + $updates = array(); + } + + return $updates; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return array<number,FS_Plugin[]>|false + */ + private static function get_all_addons() { + $addons = self::$_accounts->get_option( 'addons', array() ); + + if ( ! is_array( $addons ) ) { + $addons = array(); + } + + return $addons; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return FS_Plugin[]|false + */ + private static function get_all_account_addons() { + $addons = self::$_accounts->get_option( 'account_addons', array() ); + + if ( ! is_array( $addons ) ) { + $addons = array(); + } + + return $addons; + } + + /** + * Check if user has connected his account (opted-in). + * + * Note: + * If the user opted-in and opted-out on a later stage, + * this will still return true. If you want to check if the + * user is currently opted-in, use: + * `$fs->is_registered() && $fs->is_tracking_allowed()` + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * @return bool + */ + function is_registered() { + return is_object( $this->_user ); + } + + /** + * Returns TRUE if the user opted-in and didn't disconnect (opt-out). + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + * + * @return bool + */ + function is_tracking_allowed() { + return ( is_object( $this->_site ) && $this->_site->is_tracking_allowed() ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return FS_Plugin + */ + function get_plugin() { + return $this->_plugin; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return FS_User + */ + function get_user() { + return $this->_user; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return FS_Site + */ + function get_site() { + return $this->_site; + } + + /** + * Get plugin add-ons. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @since 1.1.7.3 If not yet loaded, fetch data from the API. + * + * @param bool $flush + * + * @return FS_Plugin[]|false + */ + function get_addons( $flush = false ) { + $this->_logger->entrance(); + + if ( ! $this->_has_addons ) { + return false; + } + + $addons = $this->sync_addons( $flush ); + + return ( ! is_array( $addons ) || empty( $addons ) ) ? + false : + $addons; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return FS_Plugin[]|false + */ + function get_account_addons() { + $this->_logger->entrance(); + + $addons = self::get_all_account_addons(); + + if ( ! is_array( $addons ) || + ! isset( $addons[ $this->_plugin->id ] ) || + ! is_array( $addons[ $this->_plugin->id ] ) || + 0 === count( $addons[ $this->_plugin->id ] ) + ) { + return false; + } + + return $addons[ $this->_plugin->id ]; + } + + /** + * Check if user has any + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @return bool + */ + function has_account_addons() { + $addons = $this->get_account_addons(); + + return is_array( $addons ) && ( 0 < count( $addons ) ); + } + + + /** + * Get add-on by ID (from local data). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number $id + * + * @return FS_Plugin|false + */ + function get_addon( $id ) { + $this->_logger->entrance(); + + $addons = $this->get_addons(); + + if ( is_array( $addons ) ) { + foreach ( $addons as $addon ) { + if ( $id == $addon->id ) { + return $addon; + } + } + } + + return false; + } + + /** + * Get add-on by slug (from local data). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string $slug + * + * @param bool $flush + * + * @return FS_Plugin|false + */ + function get_addon_by_slug( $slug, $flush = false ) { + $this->_logger->entrance(); + + $addons = $this->get_addons( $flush ); + + if ( is_array( $addons ) ) { + foreach ( $addons as $addon ) { + if ( $slug === $addon->slug ) { + return $addon; + } + } + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * + * @return FS_User + */ + static function _get_user_by_id( $user_id ) { + self::$_static_logger->entrance( "user_id = {$user_id}" ); + + $users = self::get_all_users(); + + if ( is_array( $users ) ) { + if ( isset( $users[ $user_id ] ) && + $users[ $user_id ] instanceof FS_User && + $user_id == $users[ $user_id ]->id + ) { + return $users[ $user_id ]; + } + + // If user wasn't found by the key, iterate over all the users collection. + foreach ( $users as $user ) { + /** + * @var FS_User $user + */ + if ( $user_id == $user->id ) { + return $user; + } + } + } + + return null; + } + + /** + * Checks if a Freemius user_id is associated with a super-admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * + * @return bool + */ + private static function is_super_admin( $user_id ) { + $is_super_admin = false; + + $user = self::_get_user_by_id( $user_id ); + + if ( $user instanceof FS_User && ! empty( $user->email ) ) { + self::require_pluggable_essentials(); + + $wp_user = get_user_by( 'email', $user->email ); + + if ( $wp_user instanceof WP_User ) { + $super_admins = get_super_admins(); + $is_super_admin = ( is_array( $super_admins ) && in_array( $wp_user->user_login, $super_admins ) ); + } + } + + return $is_super_admin; + } + + #---------------------------------------------------------------------------------- + #region Plans & Licensing + #---------------------------------------------------------------------------------- + + /** + * Check if running premium plugin code. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return bool + */ + function is_premium() { + return $this->_plugin->is_premium; + } + + /** + * Get site's plan ID. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @return number + */ + function get_plan_id() { + return $this->_site->plan_id; + } + + /** + * Get site's plan title. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @return string + */ + function get_plan_title() { + $plan = $this->get_plan(); + + return is_object( $plan ) ? $plan->title : 'PLAN_TITLE'; + } + + /** + * Get site's plan name. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function get_plan_name() { + $plan = $this->get_plan(); + + return is_object( $plan ) ? $plan->name : 'PLAN_NAME'; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return FS_Plugin_Plan|false + */ + function get_plan() { + if ( ! is_object( $this->_site ) ) { + return false; + } + + return FS_Plugin_Plan::is_valid_id( $this->_site->plan_id ) ? + $this->_get_plan_by_id( $this->_site->plan_id ) : + false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return bool + */ + function is_trial() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() || ! is_object( $this->_site ) ) { + return false; + } + + return $this->_site->is_trial(); + } + + /** + * Check if currently in a trial with payment method (credit card or paypal). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @return bool + */ + function is_paid_trial() { + $this->_logger->entrance(); + + if ( ! $this->is_trial() ) { + return false; + } + + return $this->has_active_valid_license() && ( $this->_site->trial_plan_id == $this->_license->plan_id ); + } + + /** + * Check if trial already utilized. + * + * @since 1.0.9 + * + * @return bool + */ + function is_trial_utilized() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return false; + } + + return $this->_site->is_trial_utilized(); + } + + /** + * Get trial plan information (if in trial). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool|FS_Plugin_Plan + */ + function get_trial_plan() { + $this->_logger->entrance(); + + if ( ! $this->is_trial() ) { + return false; + } + + // Try to load plan from local cache. + $trial_plan = $this->_get_plan_by_id( $this->_site->trial_plan_id ); + + if ( ! is_object( $trial_plan ) ) { + $trial_plan = $this->_fetch_site_plan( $this->_site->trial_plan_id ); + + /** + * If managed to fetch the plan, add it to the plans collection. + */ + if ( $trial_plan instanceof FS_Plugin_Plan ) { + if ( ! is_array( $this->_plans ) ) { + $this->_plans = array(); + } + + $this->_plans[] = $trial_plan; + $this->_store_plans(); + } + } + + if ( $trial_plan instanceof FS_Plugin_Plan ) { + return $trial_plan; + } + + /** + * If for some reason failed to get the trial plan, fallback to a dummy name and title. + */ + $trial_plan = new FS_Plugin_Plan(); + $trial_plan->id = $this->_site->trial_plan_id; + $trial_plan->name = 'pro'; + $trial_plan->title = 'Pro'; + + return $trial_plan; + } + + /** + * Check if the user has an activate, non-expired license on current plugin's install. + * + * @since 1.0.9 + * + * @return bool + */ + function is_paying() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return false; + } + + if ( ! $this->has_paid_plan() ) { + return false; + } + + return ( + ! $this->is_trial() && + 'free' !== $this->get_plan_name() && + $this->has_active_valid_license() + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @return bool + */ + function is_free_plan() { + if ( ! $this->is_registered() ) { + return true; + } + + if ( ! $this->has_paid_plan() ) { + return true; + } + + return ( + 'free' === $this->get_plan_name() || + ! $this->has_features_enabled_license() + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return bool + */ + function _has_premium_license() { + $this->_logger->entrance(); + + $premium_license = $this->_get_available_premium_license(); + + return ( false !== $premium_license ); + } + + /** + * Check if user has any licenses associated with the plugin (including expired or blocking). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @return bool + */ + function has_any_license() { + return is_array( $this->_licenses ) && ( 0 < count( $this->_licenses ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool|null $is_localhost + * + * @return FS_Plugin_License|false + */ + function _get_available_premium_license( $is_localhost = null ) { + $this->_logger->entrance(); + + $licenses = $this->get_available_premium_licenses( $is_localhost ); + if ( ! empty( $licenses ) ) { + return $licenses[0]; + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool|null $is_localhost + * + * @return FS_Plugin_License[] + */ + function get_available_premium_licenses( $is_localhost = null ) { + $this->_logger->entrance(); + + $licenses = array(); + if ( ! $this->has_paid_plan() ) { + return $licenses; + } + + if ( is_array( $this->_licenses ) ) { + foreach ( $this->_licenses as $license ) { + if ( ! $license->can_activate( $is_localhost ) ) { + continue; + } + + $licenses[] = $license; + } + } + + return $licenses; + } + + /** + * Sync local plugin plans with remote server. + * + * IMPORTANT: If for some reason a site is associated with deleted plan, we'll preserve the plan's information and append it as the last plan. This means that if plan is deleted, the is_plan() method will ALWAYS return true for any given argument (it becomes the most inclusive plan). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return FS_Plugin_Plan[]|object + */ + function _sync_plans() { + $plans = $this->_fetch_plugin_plans(); + + if ( $this->is_array_instanceof( $plans, 'FS_Plugin_Plan' ) ) { + $plans_map = array(); + foreach ( $plans as $plan ) { + $plans_map[ $plan->id ] = true; + } + + $plans_ids_to_keep = $this->get_plans_ids_associated_with_installs(); + + foreach ( $plans_ids_to_keep as $plan_id ) { + if ( isset( $plans_map[ $plan_id ] ) ) { + continue; + } + + $missing_plan = self::_get_plan_by_id( $plan_id ); + + if ( is_object( $missing_plan ) ) { + $plans[] = $missing_plan; + } + } + + $this->_plans = $plans; + $this->_store_plans(); + } + + $this->do_action( 'after_plans_sync', $plans ); + + return $this->_plans; + } + + /** + * Check if specified plan exists locally. If not, fetch it and store it. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $plan_id + * + * @return \FS_Plugin_Plan|object The plan entity or the API error object on failure. + */ + private function sync_plan_if_not_exist( $plan_id ) { + $plan = self::_get_plan_by_id( $plan_id ); + + if ( is_object( $plan ) ) { + // Plan already exists. + return $plan; + } + + $plan = $this->fetch_plan_by_id( $plan_id ); + + if ( $plan instanceof FS_Plugin_Plan ) { + $this->_plans[] = $plan; + $this->_store_plans(); + + return $plan; + } + + return $plan; + } + + /** + * Check if specified license exists locally. If not, fetch it and store it. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $license_id + * @param string $license_key + * + * @return \FS_Plugin_Plan|object The plan entity or the API error object on failure. + */ + private function sync_license_if_not_exist( $license_id, $license_key ) { + $license = $this->_get_license_by_id( $license_id ); + + if ( is_object( $license ) ) { + // License already exists. + return $license; + } + + $license = $this->fetch_license_by_key( $license_id, $license_key ); + + if ( $license instanceof FS_Plugin_License ) { + $this->_licenses[] = $license; + $this->_license = $license; + $this->_store_licenses(); + + return $license; + } + + return $license; + } + + /** + * Get a collection of unique plan IDs that are associated with any installs in the network. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return number[] + */ + private function get_plans_ids_associated_with_installs() { + if ( ! $this->_is_network_active ) { + if ( ! is_object( $this->_site ) || + ! FS_Plugin_Plan::is_valid_id( $this->_site->plan_id ) + ) { + return array(); + } + + return array( $this->_site->plan_id ); + } + + $plan_ids = array(); + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( ! is_object( $install ) || + ! FS_Plugin_Plan::is_valid_id( $install->plan_id ) + ) { + continue; + } + + $plan_ids[ $install->plan_id ] = true; + } + + return array_keys( $plan_ids ); + } + + /** + * Get a collection of unique license IDs that are associated with any installs in the network. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return number[] + */ + private function get_license_ids_associated_with_installs() { + if ( ! $this->_is_network_active ) { + if ( ! is_object( $this->_site ) || + ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) + ) { + return array(); + } + + return array( $this->_site->license_id ); + } + + $license_ids = array(); + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( ! is_object( $install ) || + ! FS_Plugin_License::is_valid_id( $install->license_id ) + ) { + continue; + } + + $license_ids[ $install->license_id ] = true; + } + + return array_keys( $license_ids ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param number $id + * + * @return FS_Plugin_Plan|false + */ + function _get_plan_by_id( $id ) { + $this->_logger->entrance(); + + if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { + $this->_sync_plans(); + } + + foreach ( $this->_plans as $plan ) { + if ( $id == $plan->id ) { + return $plan; + } + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.8.1 + * + * @param string $name + * + * @return FS_Plugin_Plan|false + */ + private function get_plan_by_name( $name ) { + $this->_logger->entrance(); + + if ( ! is_array( $this->_plans ) || 0 === count( $this->_plans ) ) { + $this->_sync_plans(); + } + + foreach ( $this->_plans as $plan ) { + if ( $name == $plan->name ) { + return $plan; + } + } + + return false; + } + + /** + * Sync local licenses with remote server. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param number|bool $site_license_id + * @param number|null $blog_id + * + * @return FS_Plugin_License[]|object + */ + function _sync_licenses( $site_license_id = false, $blog_id = null ) { + $this->_logger->entrance(); + + $is_network_admin = fs_is_network_admin(); + + if ( $is_network_admin && is_null( $blog_id ) ) { + $all_licenses = self::get_all_licenses( $this->_module_id ); + } else { + $all_licenses = $this->get_user_licenses( $this->_user->id ); + } + + $foreign_licenses = array( + 'ids' => array(), + 'license_keys' => array() + ); + + $all_licenses_map = array(); + foreach ( $all_licenses as $license ) { + $all_licenses_map[ $license->id ] = true; + if ( $license->user_id == $this->_user->id || $license->id == $site_license_id ) { + continue; + } + + $foreign_licenses['ids'][] = $license->id; + $foreign_licenses['license_keys'][] = $license->secret_key; + } + + if ( empty( $foreign_licenses['ids'] ) ) { + $foreign_licenses = array(); + } + + $licenses = $this->_fetch_licenses( false, $site_license_id, $foreign_licenses, $blog_id ); + + if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { + $licenses_map = array(); + foreach ( $licenses as $license ) { + $licenses_map[ $license->id ] = true; + } + +// $license_ids_to_keep = $this->get_license_ids_associated_with_installs(); +// foreach ( $license_ids_to_keep as $license_id ) { +// if ( isset( $licenses_map[ $license_id ] ) ) { +// continue; +// } +// +// $missing_license = self::_get_license_by_id( $license_id, false ); +// if ( is_object( $missing_license ) ) { +// $licenses[] = $missing_license; +// $licenses_map[ $missing_license->id ] = true; +// } +// } + + $user_license_ids = $this->get_user_linked_license_ids( $this->_user->id ); + + foreach ( $user_license_ids as $key => $license_id ) { + if ( ! isset( $licenses_map[ $license_id ] ) ) { + // Remove access to licenses that no longer exist. + unset( $user_license_ids[ $key ] ); + } + } + + if ( ! empty( $user_license_ids ) ) { + foreach ( $licenses_map as $license_id => $value ) { + if ( ! isset( $all_licenses_map[ $license_id ] ) ) { + // Associate new licenses with the user who triggered the license syncing. + $user_license_ids[] = $license_id; + } + } + + $user_license_ids = array_unique( $user_license_ids ); + } else { + $user_license_ids = array_keys( $licenses_map ); + } + + if ( ! $is_network_admin || ! is_null( $blog_id ) ) { + $user_licenses = array(); + foreach ( $licenses as $license ) { + if ( ! in_array( $license->id, $user_license_ids ) ) { + continue; + } + + $user_licenses[] = $license; + } + + $this->_licenses = $user_licenses; + } else { + $this->_licenses = $licenses; + } + + $this->set_user_linked_license_ids( $this->_user->id, $user_license_ids ); + + $this->_store_licenses( true, $this->_module_id, $licenses ); + } + + // Update current license. + if ( is_object( $this->_license ) ) { + $this->_license = $this->_get_license_by_id( $this->_license->id ); + } + + return $this->_licenses; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param number $id + * @param bool $sync_licenses + * + * @return FS_Plugin_License|false + */ + function _get_license_by_id( $id, $sync_licenses = true ) { + $this->_logger->entrance(); + + if ( ! FS_Plugin_License::is_valid_id( $id ) ) { + return false; + } + + /** + * When running from the network level admin and opted-in from the network, + * check if the license exists in the network user licenses collection. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + if ( fs_is_network_admin() && + $this->is_network_registered() && + ( ! is_object( $this->_user ) || $this->_storage->network_user_id != $this->_user->id ) + ) { + $licenses = $this->get_user_licenses( $this->_storage->network_user_id ); + + foreach ( $licenses as $license ) { + if ( $id == $license->id ) { + return $license; + } + } + } + + if ( ! $this->has_any_license() && $sync_licenses ) { + $this->_sync_licenses( $id ); + } + + if ( is_array( $this->_licenses ) ) { + foreach ( $this->_licenses as $license ) { + if ( $id == $license->id ) { + return $license; + } + } + } + + return false; + } + + /** + * Get license by ID. Unlike _get_license_by_id(), this method only checks the local storage and return any license, whether it's associated with the current context user/install or not. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $id + * + * @return FS_Plugin_License + */ + private function get_license_by_id( $id ) { + $licenses = self::get_all_licenses( $this->_module_id ); + + if ( is_array( $licenses ) && ! empty( $licenses ) ) { + foreach ( $licenses as $license ) { + if ( $id == $license->id ) { + return $license; + } + } + } + + return null; + } + + /** + * Synchronize the site's context license by fetching the license form the API and updating the local data with it. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return \FS_Plugin_License|mixed + */ + private function sync_site_license() { + $api = $this->get_api_user_scope(); + + $result = $api->get( "/licenses/{$this->_license->id}.json?license_key=" . urlencode( $this->_license->secret_key ), true ); + + if ( ! $this->is_api_result_entity( $result ) ) { + return $result; + } + + $license = $this->_update_site_license( new FS_Plugin_License( $result ) ); + $this->_store_licenses(); + + return $license; + } + + /** + * Get all user's available licenses for the current module. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * + * @return FS_Plugin_License[] + */ + private function get_user_licenses( $user_id ) { + $all_licenses = self::get_all_licenses( $this->_module_id ); + if ( empty( $all_licenses ) ) { + return array(); + } + + $user_license_ids = $this->get_user_linked_license_ids( $user_id ); + if ( empty( $user_license_ids ) ) { + return array(); + } + + $licenses = array(); + foreach ( $all_licenses as $license ) { + if ( in_array( $license->id, $user_license_ids ) ) { + $licenses[] = $license; + } + } + + return $licenses; + } + + /** + * Checks if the context license is network activated except on the given blog ID. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $except_blog_id + * + * @return bool + */ + private function is_license_network_active( $except_blog_id = 0 ) { + $this->_logger->entrance(); + + if ( ! is_object( $this->_license ) ) { + return false; + } + + $sites = self::get_sites(); + + if ( $this->_license->total_activations() < ( count( $sites ) - 1 ) ) { + // There are more sites than the number of activations, so license cannot be network activated. + return false; + } + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + if ( $except_blog_id == $blog_id ) { + // Skip excluded blog. + continue; + } + + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( is_object( $install ) && $install->license_id != $this->_license->id ) { + return false; + } + } + + return true; + } + + /** + * Checks if license can be activated on all the network sites (opted-in or skipped) that are not yet associated with a license. If possible, try to make the activation, if not return false. + * + * Notice: On success, this method will also update the license activations counters (without updating the license in the storage). + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * @param \FS_Plugin_License $license + * + * @return bool + */ + private function try_activate_license_on_network( FS_User $user, FS_Plugin_License $license ) { + $this->_logger->entrance(); + + $result = $this->can_activate_license_on_network( $license ); + + if ( false === $result ) { + return false; + } + + $installs_without_license = $result['installs']; + if ( ! empty( $installs_without_license ) ) { + $this->activate_license_on_many_installs( $user, $license->secret_key, $installs_without_license ); + } + + $disconnected_site_ids = $result['sites']; + if ( ! empty( $disconnected_site_ids ) ) { + $this->activate_license_on_many_sites( $user, $license->secret_key, $disconnected_site_ids ); + } + + $this->link_license_2_user( $license->id, $user->id ); + + // Sync license after activations. + $license->activated += $result['production_count']; + $license->activated_local += $result['localhost_count']; + +// $this->_store_licenses() + + return true; + } + + /** + * Checks if the given license can be activated on the whole network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_Plugin_License $license + * + * @return false|array { + * @type array[int]FS_Site $installs Blog ID to install map. + * @type int[] $sites Non-connected blog IDs. + * @type int $production_count Production sites count. + * @type int $localhost_count Production sites count. + * } + */ + private function can_activate_license_on_network( FS_Plugin_License $license ) { + $sites = self::get_sites(); + + $production_count = 0; + $localhost_count = 0; + + $installs_without_license = array(); + $disconnected_site_ids = array(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( is_object( $install ) ) { + if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) { + // License already activated on the install. + continue; + } + + $url = $install->url; + + $installs_without_license[ $blog_id ] = $install; + } else { + $url = is_object( $site ) ? + $site->siteurl : + get_site_url( $blog_id ); + + $disconnected_site_ids[] = $blog_id; + } + + if ( FS_Site::is_localhost_by_address( $url ) ) { + $localhost_count ++; + } else { + $production_count ++; + } + } + + if ( ! $license->can_activate_bulk( $production_count, $localhost_count ) ) { + return false; + } + + return array( + 'installs' => $installs_without_license, + 'sites' => $disconnected_site_ids, + 'production_count' => $production_count, + 'localhost_count' => $localhost_count, + ); + } + + /** + * Activate a given license on a collection of installs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * @param string $license_key + * @param array $blog_2_install_map { + * @key int Blog ID. + * @value FS_Site Blog's associated install. + * } + * + * @return mixed|true + */ + private function activate_license_on_many_installs( + FS_User $user, + $license_key, + array $blog_2_install_map + ) { + $params = array( + array( 'license_key' => $this->apply_filters( 'license_key', $license_key ) ) + ); + + $install_2_blog_map = array(); + foreach ( $blog_2_install_map as $blog_id => $install ) { + $params[] = array( 'id' => $install->id ); + + $install_2_blog_map[ $install->id ] = $blog_id; + } + + $result = $this->get_api_user_scope_by_user( $user )->call( + "plugins/{$this->_plugin->id}/installs.json", + 'PUT', + $params + ); + + if ( ! $this->is_api_result_object( $result, 'installs' ) ) { + return $result; + } + + foreach ( $result->installs as $r_install ) { + $install = new FS_Site( $r_install ); + $install->is_disconnected = false; + + // Update install. + $this->_store_site( + true, + $install_2_blog_map[ $r_install->id ], + $install + ); + } + + return true; + } + + /** + * Activate a given license on a collection of blogs/sites that are not yet opted-in. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * @param string $license_key + * @param int[] $site_ids + * + * @return true|mixed True if successful, otherwise, the API result. + */ + private function activate_license_on_many_sites( + FS_User $user, + $license_key, + array $site_ids + ) { + $sites = array(); + foreach ( $site_ids as $site_id ) { + $sites[] = $this->get_site_info( array( 'blog_id' => $site_id ) ); + } + + // Install the plugin. + $result = $this->create_installs_with_user( + $user, + $license_key, + false, + $sites, + false, + true + ); + + if ( ! $this->is_api_result_entity( $result ) && + ! $this->is_api_result_object( $result, 'installs' ) + ) { + return $result; + } + + $installs = array(); + foreach ( $result->installs as $install ) { + $installs[] = new FS_Site( $install ); + } + + // Map site addresses to their blog IDs. + $address_to_blog_map = $this->get_address_to_blog_map(); + + $first_blog_id = null; + + foreach ( $installs as $install ) { + $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); + $blog_id = $address_to_blog_map[ $address ]; + + $this->_store_site( true, $blog_id, $install ); + + $this->reset_anonymous_mode( $blog_id ); + + if ( is_null( $first_blog_id ) ) { + $first_blog_id = $blog_id; + } + } + + if ( ! FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { + $this->_storage->network_install_blog_id = $first_blog_id; + } + + return true; + } + + /** + * Sync site's license with user licenses. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param FS_Plugin_License|null $new_license + * + * @return FS_Plugin_License|null + */ + function _update_site_license( $new_license ) { + $this->_logger->entrance(); + + $this->_license = $new_license; + + if ( ! is_object( $new_license ) ) { + $this->_site->license_id = null; + $this->_sync_site_subscription( null ); + + return $this->_license; + } + + $this->_site->license_id = $this->_license->id; + + if ( ! is_array( $this->_licenses ) ) { + $this->_licenses = array(); + } + + $is_license_found = false; + for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { + if ( $new_license->id == $this->_licenses[ $i ]->id ) { + $this->_licenses[ $i ] = $new_license; + + $is_license_found = true; + break; + } + } + + // If new license just append. + if ( ! $is_license_found ) { + $this->_licenses[] = $new_license; + } + + $this->_sync_site_subscription( $new_license ); + + return $this->_license; + } + + /** + * Sync site's subscription. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param FS_Plugin_License|null $license + * + * @return bool|\FS_Subscription + */ + private function _sync_site_subscription( $license ) { + if ( ! is_object( $license ) ) { + $this->delete_unused_subscriptions(); + + return false; + } + + // Load subscription details if not lifetime. + $subscription = $license->is_lifetime() ? + false : + $this->_fetch_site_license_subscription(); + + if ( is_object( $subscription ) && ! isset( $subscription->error ) ) { + $this->store_subscription( $subscription ); + } else { + $this->delete_unused_subscriptions(); + } + + return $subscription; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool|\FS_Plugin_License + */ + function _get_license() { + if ( ! fs_is_network_admin() || is_object( $this->_license ) ) { + return $this->_license; + } + + return $this->_get_available_premium_license(); + } + + /** + * @param number $license_id + * + * @return null|\FS_Subscription + */ + function _get_subscription( $license_id ) { + if ( ! isset( $this->_storage->subscriptions ) || + empty( $this->_storage->subscriptions ) + ) { + return null; + } + + foreach ( $this->_storage->subscriptions as $subscription ) { + if ( $subscription->license_id == $license_id ) { + return $subscription; + } + } + + return null; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param FS_Subscription $subscription + */ + function store_subscription( FS_Subscription $subscription ) { + if ( ! isset( $this->_storage->subscriptions ) ) { + $this->_storage->subscriptions = array(); + } + + if ( empty( $this->_storage->subscriptions ) || ! is_multisite() ) { + $this->_storage->subscriptions = array( $subscription ); + + return; + } + + $subscriptions = $this->_storage->subscriptions; + + $updated_subscription = false; + foreach ( $subscriptions as $key => $existing_subscription ) { + if ( $existing_subscription->id == $subscription->id ) { + $subscriptions[ $key ] = $subscription; + $updated_subscription = true; + break; + } + } + + if ( ! $updated_subscription ) { + $subscriptions[] = $subscription; + } + + $this->_storage->subscriptions = $subscriptions; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + function delete_unused_subscriptions() { + if ( ! isset( $this->_storage->subscriptions ) || + empty( $this->_storage->subscriptions ) || + // Clean up only if there are already at least 3 subscriptions. + ( count( $this->_storage->subscriptions ) < 3 ) + ) { + return; + } + + if ( ! is_multisite() ) { + // If not multisite, there should only be 1 subscription, so just clear the array. + $this->_storage->subscriptions = array(); + + return; + } + + $subscriptions_to_keep_by_license_id_map = array(); + $sites = self::get_sites(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( ! is_object( $install ) || + ! FS_Plugin_License::is_valid_id( $install->license_id ) + ) { + continue; + } + + $subscriptions_to_keep_by_license_id_map[ $install->license_id ] = true; + } + + if ( empty( $subscriptions_to_keep_by_license_id_map ) ) { + $this->_storage->subscriptions = array(); + + return; + } + + foreach ( $this->_storage->subscriptions as $key => $subscription ) { + if ( ! isset( $subscriptions_to_keep_by_license_id_map[ $subscription->license_id ] ) ) { + unset( $this->_storage->subscriptions[ $key ] ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @param string $plan Plan name + * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. + * + * @return bool + */ + function is_plan( $plan, $exact = false ) { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return false; + } + + $plan = strtolower( $plan ); + + $current_plan_name = $this->get_plan_name(); + + if ( $current_plan_name === $plan ) { + // Exact plan. + return true; + } else if ( $exact ) { + // Required exact, but plans are different. + return false; + } + + $current_plan_order = - 1; + $required_plan_order = - 1; + for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { + if ( $plan === $this->_plans[ $i ]->name ) { + $required_plan_order = $i; + } else if ( $current_plan_name === $this->_plans[ $i ]->name ) { + $current_plan_order = $i; + } + } + + return ( $current_plan_order > $required_plan_order ); + } + + /** + * Check if module has only one plan. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @return bool + */ + function is_single_plan() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() || + ! is_array( $this->_plans ) || + 0 === count( $this->_plans ) + ) { + return true; + } + + return ( 1 === count( $this->_plans ) ); + } + + /** + * Check if plan based on trial. If not in trial mode, should return false. + * + * @since 1.0.9 + * + * @param string $plan Plan name + * @param bool $exact If true, looks for exact plan. If false, also check "higher" plans. + * + * @return bool + */ + function is_trial_plan( $plan, $exact = false ) { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + return false; + } + + if ( ! $this->is_trial() ) { + return false; + } + + $trial_plan = $this->get_trial_plan(); + + if ( $trial_plan->name === $plan ) { + // Exact plan. + return true; + } else if ( $exact ) { + // Required exact, but plans are different. + return false; + } + + $current_plan_order = - 1; + $required_plan_order = - 1; + for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { + if ( $plan === $this->_plans[ $i ]->name ) { + $required_plan_order = $i; + } else if ( $trial_plan->name === $this->_plans[ $i ]->name ) { + $current_plan_order = $i; + } + } + + return ( $current_plan_order > $required_plan_order ); + } + + /** + * Check if plugin has any paid plans. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function has_paid_plan() { + return $this->_has_paid_plans || + FS_Plan_Manager::instance()->has_paid_plan( $this->_plans ); + } + + /** + * Check if plugin has any plan with a trail. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function has_trial_plan() { + /** + * @author Vova Feldman(@svovaf) + * @since 1.2.1.5 + * + * Allow setting a trial from the SDK without calling the API. + * But, if the user did opt-in, continue using the real data from the API. + */ + if ( $this->_trial_days >= 0 ) { + return true; + } + + return $this->_storage->get( 'has_trial_plan', false ); + } + + /** + * Check if plugin has any free plan, or is it premium only. + * + * Note: If no plans configured, assume plugin is free. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return bool + */ + function has_free_plan() { + return ! $this->is_only_premium(); + } + + /** + * Displays a license activation dialog box when the user clicks on the "Activate License" + * or "Change License" link on the plugins + * page. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.9 + */ + function _add_license_activation_dialog_box() { + $vars = array( + 'id' => $this->_module_id, + ); + + fs_require_template( 'forms/license-activation.php', $vars ); + fs_require_template( 'forms/resend-key.php', $vars ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + */ + function _add_premium_version_upgrade_selection_dialog_box() { + $modules_update = get_site_transient( $this->is_theme() ? 'update_themes' : 'update_plugins' ); + if ( ! isset( $modules_update->response[ $this->_plugin_basename ] ) ) { + return; + } + + $vars = array( + 'id' => $this->_module_id, + 'new_version' => is_object( $modules_update->response[ $this->_plugin_basename ] ) ? + $modules_update->response[ $this->_plugin_basename ]->new_version : + $modules_update->response[ $this->_plugin_basename ]['new_version'] + ); + + fs_require_template( 'forms/premium-versions-upgrade-metadata.php', $vars ); + fs_require_once_template( 'forms/premium-versions-upgrade-handler.php', $vars ); + } + + /** + * Displays the opt-out dialog box when the user clicks on the "Opt Out" link on the "Plugins" + * page. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + */ + function _add_optout_dialog() { + if ( $this->is_theme() ) { + $vars = null; + fs_require_once_template( '/js/jquery.content-change.php', $vars ); + } + + $vars = array( 'id' => $this->_module_id ); + fs_require_template( 'forms/optout.php', $vars ); + } + + /** + * Prepare page to include all required UI and logic for the license activation dialog. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + */ + function _add_license_activation() { + if ( ! $this->is_user_admin() ) { + // Only admins can activate a license. + return; + } + + if ( ! $this->has_paid_plan() ) { + // Module doesn't have any paid plans. + return; + } + + if ( ! $this->is_premium() ) { + // Only add license activation logic to the premium version. + return; + } + + // Add license activation link and AJAX request handler. + if ( self::is_plugins_page() ) { + /** + * @since 1.2.0 Add license action link only on plugins page. + */ + $this->_add_license_action_link(); + } + + // Add license activation AJAX callback. + $this->add_ajax_action( 'activate_license', array( &$this, '_activate_license_ajax_action' ) ); + + // Add resend license AJAX callback. + $this->add_ajax_action( 'resend_license_key', array( &$this, '_resend_license_key_ajax_action' ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + */ + function _add_premium_version_upgrade_selection() { + if ( ! $this->is_user_admin() ) { + return; + } + + if ( ! $this->is_premium() || $this->has_any_active_valid_license() ) { + // This is relevant only to the free versions and premium versions without an active license. + return; + } + + if ( self::is_updates_page() || ( $this->is_plugin() && self::is_plugins_page() ) ) { + $this->_add_premium_version_upgrade_selection_action(); + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.1.9 + * @since 2.0.0 When a super-admin that hasn't connected before is network activating a license and excluding some of the sites for the license activation, go over the unselected sites in the network and if a site is not connected, skipped, nor delegated, if it's a freemium product then just skip the connection for the site, if it's a premium only product, delegate the connection and license activation to the site admin (Vova Feldman @svovaf). + */ + function _activate_license_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'activate_license' ); + + $license_key = trim( fs_request_get( 'license_key' ) ); + + if ( empty( $license_key ) ) { + exit; + } + + $plugin_id = fs_request_get( 'module_id', '', 'post' ); + $fs = ( $plugin_id == $this->_module_id ) ? + $this : + $this->get_addon_instance( $plugin_id ); + + $error = false; + $next_page = false; + + $sites = fs_is_network_admin() ? + fs_request_get( 'sites', array(), 'post' ) : + array(); + + $blog_id = fs_request_get( 'blog_id' ); + $has_valid_blog_id = is_numeric( $blog_id ); + + if ( $fs->is_registered() ) { + if ( fs_is_network_admin() && ! $has_valid_blog_id ) { + // If no specific blog ID was provided, activate the license for all sites in the network. + $blog_2_install_map = array(); + $site_ids = array(); + + foreach ( $sites as $site ) { + if ( ! isset( $site['blog_id'] ) || ! is_numeric( $site['blog_id'] ) ) { + continue; + } + + $install = $this->get_install_by_blog_id( $site['blog_id'] ); + + if ( is_object( $install ) ) { + $blog_2_install_map[ $site['blog_id'] ] = $install; + } else { + $site_ids[] = $site['blog_id']; + } + } + + $user = $this->get_current_or_network_user(); + + if ( ! empty( $blog_2_install_map ) ) { + $result = $this->activate_license_on_many_installs( $user, $license_key, $blog_2_install_map ); + + if ( true !== $result ) { + $error = FS_Api::is_api_error_object( $result ) ? + $result->error->message : + var_export( $result, true ); + } + } + + if ( empty( $error ) && ! empty( $site_ids ) ) { + $result = $this->activate_license_on_many_sites( $user, $license_key, $site_ids ); + + if ( true !== $result ) { + $error = FS_Api::is_api_error_object( $result ) ? + $result->error->message : + var_export( $result, true ); + } + } + } else { + if ( $has_valid_blog_id ) { + /** + * If a specific blog ID was provided, activate the license only for the install that is + * associated with the given blog ID. + * + * @author Leo Fajardo (@leorw) + */ + $this->switch_to_blog( $blog_id ); + } + + $api = $fs->get_api_site_scope(); + + $params = array( + 'license_key' => $fs->apply_filters( 'license_key', $license_key ) + ); + + $install = $api->call( '/', 'put', $params ); + + if ( FS_Api::is_api_error( $install ) ) { + $error = FS_Api::is_api_error_object( $install ) ? + $install->error->message : + var_export( $install->error, true ); + } else { + $fs->reconnect_locally( $has_valid_blog_id ); + } + } + + if ( empty( $error ) ) { + $this->network_upgrade_mode_completed(); + + $fs->_sync_license( true, $has_valid_blog_id ); + + $next_page = $fs->is_addon() ? + $fs->get_parent_instance()->get_account_url() : + $fs->get_account_url(); + } + } else { + $next_page = $fs->opt_in( + false, + false, + false, + $license_key, + false, + false, + false, + fs_request_get_bool( 'is_marketing_allowed', null ), + $sites + ); + + if ( isset( $next_page->error ) ) { + $error = $next_page->error; + } else { + if ( fs_is_network_admin() ) { + /** + * Get the list of sites that were just opted-in (and license activated). + * This is an optimization for the next part below saving some DB queries. + */ + $connected_sites = array(); + foreach ( $sites as $site ) { + if ( isset( $site['blog_id'] ) && is_numeric( $site['blog_id'] ) ) { + $connected_sites[ $site['blog_id'] ] = true; + } + } + + $all_sites = self::get_sites(); + $pending_sites = array(); + + /** + * Check if there are any sites that are not connected, skipped, nor delegated. For every site that falls into that category, if the product is freemium, skip the connection. If the product is premium only, delegate the connection to the site administrator. + * + * @author Vova Feldman (@svovaf) + */ + foreach ( $all_sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + if ( isset( $connected_sites[ $blog_id ] ) ) { + // Site was just connected. + continue; + } + + if ( $this->is_installed_on_site( $blog_id ) ) { + // Site was already connected before. + continue; + } + + if ( $this->is_site_delegated_connection( $blog_id ) ) { + // Site's connection was delegated. + continue; + } + + if ( $this->is_anonymous_site( $blog_id ) ) { + // Site connection was already skipped. + continue; + } + + $pending_sites[] = self::get_site_info( $site ); + } + + if ( ! empty( $pending_sites ) ) { + if ( $this->is_freemium() ) { + $this->skip_connection( $pending_sites ); + } else { + $this->delegate_connection( $pending_sites ); + } + } + } + } + } + + $result = array( + 'success' => ( false === $error ) + ); + + if ( false !== $error ) { + $result['error'] = $error; + } else { + $result['next_page'] = $next_page; + } + + echo json_encode( $result ); + + exit; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3.1 + */ + function _network_activate_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'network_activate' ); + + $plugin_id = fs_request_get( 'module_id', '', 'post' ); + $fs = ( $plugin_id == $this->_module_id ) ? + $this : + $this->get_addon_instance( $plugin_id ); + + $error = false; + + $sites = fs_request_get( 'sites', array(), 'post' ); + if ( is_array( $sites ) && ! empty( $sites ) ) { + $sites_by_action = array( + 'allow' => array(), + 'delegate' => array(), + 'skip' => array() + ); + + foreach ( $sites as $site ) { + $sites_by_action[ $site['action'] ][] = $site; + } + + $total_sites = count( $sites ); + $total_sites_to_delegate = count( $sites_by_action['delegate'] ); + + $next_page = ''; + if ( $total_sites === $total_sites_to_delegate && + ! $this->is_network_upgrade_mode() + ) { + $this->delegate_connection(); + } else { + if ( ! empty( $sites_by_action['delegate'] ) ) { + $this->delegate_connection( $sites_by_action['delegate'] ); + } + + if ( ! empty( $sites_by_action['skip'] ) ) { + $this->skip_connection( $sites_by_action['skip'] ); + } + + if ( ! empty( $sites_by_action['allow'] ) ) { + if ( ! $fs->is_registered() || ! $this->_is_network_active ) { + $next_page = $fs->opt_in( + false, + false, + false, + false, + false, + false, + false, + fs_request_get_bool( 'is_marketing_allowed', null ), + $sites_by_action['allow'] + ); + } else { + $next_page = $fs->install_with_user( + $this->get_network_user(), + false, + false, + false, + true, + $sites_by_action['allow'] + ); + } + + if ( is_object( $next_page ) && isset( $next_page->error ) ) { + $error = $next_page->error; + } + } + } + + if ( empty( $next_page ) ) { + $next_page = $this->get_after_activation_url( 'after_network_activation_url' ); + } + } else { + $error = $this->get_text_inline( 'Invalid site details collection.', 'invalid_site_details_collection' ); + } + + $result = array( + 'success' => ( false === $error ) + ); + + if ( false !== $error ) { + $result['error'] = $error; + } else { + $result['next_page'] = $next_page; + } + + echo json_encode( $result ); + + exit; + } + + /** + * Billing update AJAX callback. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + */ + function _update_billing_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'update_billing' ); + + if ( ! $this->is_user_admin() ) { + // Only for admins. + self::shoot_ajax_failure(); + } + + $billing = fs_request_get( 'billing' ); + + $api = $this->get_api_user_scope(); + $result = $api->call( '/billing.json', 'put', array_merge( $billing, array( + 'plugin_id' => $this->get_parent_id(), + ) ) ); + + if ( ! $this->is_api_result_entity( $result ) ) { + self::shoot_ajax_failure(); + } + + // Purge cached billing. + $this->get_api_user_scope()->purge_cache( 'billing.json' ); + + self::shoot_ajax_success(); + } + + /** + * Trial start for anonymous users (AJAX callback). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + */ + function _start_trial_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'start_trial' ); + + if ( ! $this->is_user_admin() ) { + // Only for admins. + self::shoot_ajax_failure(); + } + + $trial_data = fs_request_get( 'trial' ); + + $next_page = $this->opt_in( + false, + false, + false, + false, + false, + $trial_data['plan_id'] + ); + + if ( is_object( $next_page ) && $this->is_api_error( $next_page ) ) { + self::shoot_ajax_failure( + isset( $next_page->error ) ? + $next_page->error->message : + var_export( $next_page, true ) + ); + } + + $this->shoot_ajax_success( array( + 'next_page' => $next_page, + ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.0 + */ + function _resend_license_key_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'resend_license_key' ); + + $email_address = sanitize_email( trim( fs_request_get( 'email', '', 'post' ) ) ); + + if ( empty( $email_address ) ) { + exit; + } + + $error = false; + + $api = $this->get_api_plugin_scope(); + $result = $api->call( '/licenses/resend.json', 'post', + array( + 'email' => $email_address, + 'url' => home_url(), + ) + ); + + if ( is_object( $result ) && isset( $result->error ) ) { + $error = $result->error; + + if ( in_array( $error->code, array( 'invalid_email', 'no_user' ) ) ) { + $error = $this->get_text_inline( "We couldn't find your email address in the system, are you sure it's the right address?", 'email-not-found' ); + } else if ( 'no_license' === $error->code ) { + $error = $this->get_text_inline( "We can't see any active licenses associated with that email address, are you sure it's the right address?", 'no-active-licenses' ); + } else { + $error = $error->message; + } + } + + $licenses = array( + 'success' => ( false === $error ) + ); + + if ( false !== $error ) { + $licenses['error'] = sprintf( '%s... %s', $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ), strtolower( $error ) ); + } + + echo json_encode( $licenses ); + + exit; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.8 + * + * @var string + */ + private static $_pagenow; + + /** + * Get current page or the referer if executing a WP AJAX request. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.8 + * + * @return string + */ + static function get_current_page() { + if ( ! isset( self::$_pagenow ) ) { + global $pagenow; + + self::$_pagenow = $pagenow; + + if ( self::is_ajax() && + 'admin-ajax.php' === $pagenow + ) { + $referer = fs_get_raw_referer(); + + if ( is_string( $referer ) ) { + $parts = explode( '?', $referer ); + + self::$_pagenow = basename( $parts[0] ); + } + } + } + + return self::$_pagenow; + } + + /** + * Helper method to check if user in the plugins page. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @return bool + */ + static function is_plugins_page() { + return ( 'plugins.php' === self::get_current_page() ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + * + * @return bool + */ + static function is_updates_page() { + return ( 'update-core.php' === self::get_current_page() ); + } + + /** + * Helper method to check if user in the themes page. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.6 + * + * @return bool + */ + static function is_themes_page() { + return ( 'themes.php' === self::get_current_page() ); + } + + #---------------------------------------------------------------------------------- + #region Affiliation + #---------------------------------------------------------------------------------- + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @return bool + */ + function has_affiliate_program() { + if ( ! is_object( $this->_plugin ) ) { + return false; + } + + return $this->_plugin->has_affiliate_program(); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.4 + */ + private function fetch_affiliate_terms() { + if ( ! is_object( $this->plugin_affiliate_terms ) ) { + $plugins_api = $this->get_api_plugin_scope(); + $affiliate_terms = $plugins_api->get( '/aff.json?type=affiliation', false ); + + if ( ! $this->is_api_result_entity( $affiliate_terms ) ) { + return; + } + + $this->plugin_affiliate_terms = new FS_AffiliateTerms( $affiliate_terms ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.4 + */ + private function fetch_affiliate_and_custom_terms() { + if ( ! empty( $this->_storage->affiliate_application_data ) ) { + $application_data = $this->_storage->affiliate_application_data; + $flush = ( ! isset( $application_data['status'] ) || 'pending' === $application_data['status'] ); + + $users_api = $this->get_api_user_scope(); + $result = $users_api->get( "/plugins/{$this->_plugin->id}/aff/{$this->plugin_affiliate_terms->id}/affiliates.json", $flush ); + if ( $this->is_api_result_object( $result, 'affiliates' ) ) { + if ( ! empty( $result->affiliates ) ) { + $affiliate = new FS_Affiliate( $result->affiliates[0] ); + + if ( ! isset( $application_data['status'] ) || $application_data['status'] !== $affiliate->status ) { + $application_data['status'] = $affiliate->status; + $this->_storage->affiliate_application_data = $application_data; + } + + if ( $affiliate->is_using_custom_terms ) { + $affiliate_terms = $users_api->get( "/plugins/{$this->_plugin->id}/affiliates/{$affiliate->id}/aff/{$affiliate->custom_affiliate_terms_id}.json", $flush ); + if ( $this->is_api_result_entity( $affiliate_terms ) ) { + $this->custom_affiliate_terms = new FS_AffiliateTerms( $affiliate_terms ); + } + } + + $this->affiliate = $affiliate; + } + } + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + */ + private function fetch_affiliate_and_terms() { + $this->_logger->entrance(); + + $this->fetch_affiliate_terms(); + $this->fetch_affiliate_and_custom_terms(); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @return FS_Affiliate + */ + function get_affiliate() { + return $this->affiliate; + } + + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @return FS_AffiliateTerms + */ + function get_affiliate_terms() { + return is_object( $this->custom_affiliate_terms ) ? + $this->custom_affiliate_terms : + $this->plugin_affiliate_terms; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + */ + function _submit_affiliate_application() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'submit_affiliate_application' ); + + if ( ! $this->is_user_admin() ) { + // Only for admins. + self::shoot_ajax_failure(); + } + + $affiliate = fs_request_get( 'affiliate' ); + + if ( empty( $affiliate['promotion_methods'] ) ) { + unset( $affiliate['promotion_methods'] ); + } + + if ( ! empty( $affiliate['additional_domains'] ) ) { + $affiliate['additional_domains'] = array_unique( $affiliate['additional_domains'] ); + } + + if ( ! $this->is_registered() ) { + // Opt in but don't track usage. + $next_page = $this->opt_in( + false, + false, + false, + false, + false, + false, + true + ); + + if ( is_object( $next_page ) && $this->is_api_error( $next_page ) ) { + self::shoot_ajax_failure( + isset( $next_page->error ) ? + $next_page->error->message : + var_export( $next_page, true ) + ); + } else if ( $this->is_pending_activation() ) { + self::shoot_ajax_failure( $this->get_text_inline( 'Account is pending activation.', 'account-is-pending-activation' ) ); + } + } + + $this->fetch_affiliate_terms(); + + $api = $this->get_api_user_scope(); + $result = $api->call( + ( "/plugins/{$this->_plugin->id}/aff/{$this->plugin_affiliate_terms->id}/affiliates.json" ), + 'post', + $affiliate + ); + + if ( $this->is_api_error( $result ) ) { + self::shoot_ajax_failure( + isset( $result->error ) ? + $result->error->message : + var_export( $result, true ) + ); + } else { + if ( $this->_admin_notices->has_sticky( 'affiliate_program' ) ) { + $this->_admin_notices->remove_sticky( 'affiliate_program' ); + } + + $affiliate_application_data = array( + 'status' => 'pending', + 'stats_description' => $affiliate['stats_description'], + 'promotion_method_description' => $affiliate['promotion_method_description'], + ); + + if ( ! empty( $affiliate['promotion_methods'] ) ) { + $affiliate_application_data['promotion_methods'] = $affiliate['promotion_methods']; + } + + if ( ! empty( $affiliate['domain'] ) ) { + $affiliate_application_data['domain'] = $affiliate['domain']; + } + + if ( ! empty( $affiliate['additional_domains'] ) ) { + $affiliate_application_data['additional_domains'] = $affiliate['additional_domains']; + } + + $this->_storage->affiliate_application_data = $affiliate_application_data; + } + + // Purge cached affiliate. + $api->purge_cache( 'affiliate.json' ); + + self::shoot_ajax_success( $result ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @return array|null + */ + function get_affiliate_application_data() { + if ( empty( $this->_storage->affiliate_application_data ) ) { + return null; + } + + return $this->_storage->affiliate_application_data; + } + + #endregion Affiliation ------------------------------------------------------------ + + #---------------------------------------------------------------------------------- + #region URL Generators + #---------------------------------------------------------------------------------- + + /** + * Alias to pricing_url(). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @uses pricing_url() + * + * @param string $period Billing cycle + * @param bool $is_trial + * + * @return string + */ + function get_upgrade_url( $period = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { + return $this->pricing_url( $period, $is_trial ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @uses get_upgrade_url() + * + * @return string + */ + function get_trial_url() { + return $this->get_upgrade_url( WP_FS__PERIOD_ANNUALLY, true ); + } + + /** + * Plugin's pricing URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $billing_cycle Billing cycle + * + * @param bool $is_trial + * + * @return string + */ + function pricing_url( $billing_cycle = WP_FS__PERIOD_ANNUALLY, $is_trial = false ) { + $this->_logger->entrance(); + + $params = array( + 'billing_cycle' => $billing_cycle + ); + + if ( $is_trial ) { + $params['trial'] = 'true'; + } + + if ( $this->is_addon() ) { + return $this->_parent->addon_url( $this->_slug ); + } + + return $this->_get_admin_page_url( 'pricing', $params ); + } + + /** + * Checkout page URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string $billing_cycle Billing cycle + * @param bool $is_trial + * @param array $extra (optional) Extra parameters, override other query params. + * + * @return string + */ + function checkout_url( + $billing_cycle = WP_FS__PERIOD_ANNUALLY, + $is_trial = false, + $extra = array() + ) { + $this->_logger->entrance(); + + $params = array( + 'checkout' => 'true', + 'billing_cycle' => $billing_cycle, + ); + + if ( $is_trial ) { + $params['trial'] = 'true'; + } + + /** + * Params in extra override other params. + */ + $params = array_merge( $params, $extra ); + + return $this->_get_admin_page_url( 'pricing', $params ); + } + + /** + * Add-on checkout URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param number $addon_id + * @param number $pricing_id + * @param string $billing_cycle + * @param bool $is_trial + * + * @return string + */ + function addon_checkout_url( + $addon_id, + $pricing_id, + $billing_cycle = WP_FS__PERIOD_ANNUALLY, + $is_trial = false + ) { + return $this->checkout_url( $billing_cycle, $is_trial, array( + 'plugin_id' => $addon_id, + 'pricing_id' => $pricing_id, + ) ); + } + + #endregion + + #endregion ------------------------------------------------------------------ + + /** + * Check if plugin has any add-ons. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @since 1.1.7.3 Base logic only on the parameter provided by the developer in the init function. + * + * @return bool + */ + function has_addons() { + $this->_logger->entrance(); + + return $this->_has_addons; + } + + /** + * Check if plugin can work in anonymous mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + * + * @deprecated Please use is_enable_anonymous() instead. + */ + function enable_anonymous() { + return $this->_enable_anonymous; + } + + /** + * Check if plugin can work in anonymous mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + * + * @return bool + */ + function is_enable_anonymous() { + return $this->_enable_anonymous; + } + + /** + * Check if plugin is premium only (no free plans). + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9 + * + * @return bool + */ + function is_only_premium() { + return $this->_is_premium_only; + } + + /** + * Checks if the plugin's type is "plugin". The other type is "theme". + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool + */ + function is_plugin() { + return ( WP_FS__MODULE_TYPE_PLUGIN === $this->_module_type ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return string + */ + function get_module_type() { + if ( ! isset( $this->_module_type ) ) { + $id_slug_type_path_map = self::$_accounts->get_option( 'id_slug_type_path_map', array() ); + $this->_module_type = $id_slug_type_path_map[ $this->_module_id ]['type']; + } + + return $this->_module_type; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return string + */ + function get_plugin_main_file_path() { + return $this->_plugin_main_file_path; + } + + /** + * Check if module has a premium code version. + * + * Serviceware module might be freemium without any + * premium code version, where the paid features + * are all part of the service. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @return bool + */ + function has_premium_version() { + return $this->_has_premium_version; + } + + /** + * Check if feature supported with current site's plan. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @todo IMPLEMENT + * + * @param number $feature_id + * + * @throws Exception + */ + function is_feature_supported( $feature_id ) { + throw new Exception( 'not implemented' ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @return bool Is running in SSL/HTTPS + */ + function is_ssl() { + return WP_FS__IS_HTTPS; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool Is running in AJAX call. + * + * @link http://wordpress.stackexchange.com/questions/70676/how-to-check-if-i-am-in-admin-ajax + */ + static function is_ajax() { + return ( defined( 'DOING_AJAX' ) && DOING_AJAX ); + } + + /** + * Check if it's an AJAX call targeted for the current module. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * + * @param array|string $actions Collection of AJAX actions. + * + * @return bool + */ + function is_ajax_action( $actions ) { + // Verify it's an ajax call. + if ( ! self::is_ajax() ) { + return false; + } + + // Verify the call is relevant for the plugin. + if ( $this->_module_id != fs_request_get( 'module_id' ) ) { + return false; + } + + // Verify it's one of the specified actions. + if ( is_string( $actions ) ) { + $actions = explode( ',', $actions ); + } + + if ( is_array( $actions ) && 0 < count( $actions ) ) { + $ajax_action = fs_request_get( 'action' ); + + foreach ( $actions as $action ) { + if ( $ajax_action === $this->get_action_tag( $action ) ) { + return true; + } + } + } + + return false; + } + + /** + * Check if it's an AJAX call targeted for current request. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * + * @param array|string $actions Collection of AJAX actions. + * @param number|null $module_id + * + * @return bool + */ + static function is_ajax_action_static( $actions, $module_id = null ) { + // Verify it's an ajax call. + if ( ! self::is_ajax() ) { + return false; + } + + + if ( ! empty( $module_id ) ) { + // Verify the call is relevant for the plugin. + if ( $module_id != fs_request_get( 'module_id' ) ) { + return false; + } + } + + // Verify it's one of the specified actions. + if ( is_string( $actions ) ) { + $actions = explode( ',', $actions ); + } + + if ( is_array( $actions ) && 0 < count( $actions ) ) { + $ajax_action = fs_request_get( 'action' ); + + foreach ( $actions as $action ) { + if ( $ajax_action === self::get_ajax_action_static( $action, $module_id ) ) { + return true; + } + } + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @return bool + */ + static function is_cron() { + return ( defined( 'DOING_CRON' ) && DOING_CRON ); + } + + /** + * Check if a real user is visiting the admin dashboard. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @return bool + */ + function is_user_in_admin() { + return is_admin() && ! self::is_ajax() && ! self::is_cron(); + } + + /** + * Check if a real user is in the customizer view. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + static function is_customizer() { + return is_customize_preview(); + } + + /** + * Check if running in HTTPS and if site's plan matching the specified plan. + * + * @param string $plan + * @param bool $exact + * + * @return bool + */ + function is_ssl_and_plan( $plan, $exact = false ) { + return ( $this->is_ssl() && $this->is_plan( $plan, $exact ) ); + } + + /** + * Construct plugin's settings page URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $page + * @param array $params + * @param bool|null $network + * + * @return string + */ + function _get_admin_page_url( $page = '', $params = array(), $network = null ) { + if ( is_null( $network ) ) { + $network = ( + $this->_is_network_active && + ( fs_is_network_admin() || ! $this->is_delegated_connection() ) + ); + } + + if ( 0 < count( $params ) ) { + foreach ( $params as $k => $v ) { + $params[ $k ] = urlencode( $v ); + } + } + + $page_param = $this->_menu->get_slug( $page ); + + if ( empty( $page ) && + $this->is_theme() && + // Show the opt-in as an overlay for free wp.org themes or themes without any settings page. + ( $this->is_free_wp_org_theme() || ! $this->has_settings_menu() ) + ) { + $params[ $this->get_unique_affix() . '_show_optin' ] = 'true'; + + return add_query_arg( + $params, + $this->admin_url( 'themes.php', 'admin', $network ) + ); + } + + if ( ! $this->has_settings_menu() ) { + if ( ! empty( $page ) ) { + // Module doesn't have a setting page, but since the request is for + // a specific Freemius page, use the admin.php path. + return add_query_arg( array_merge( $params, array( + 'page' => $page_param, + ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); + } else { + if ( $this->is_activation_mode() ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * If plugin doesn't have a settings page, create one for the opt-in screen. + */ + return add_query_arg( array_merge( $params, array( + 'page' => $this->_slug, + ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); + } else { + // Plugin without a settings page. + return add_query_arg( + $params, + $this->admin_url( 'plugins.php', 'admin', $network ) + ); + } + } + } + + // Module has a submenu settings page. + if ( ! $this->_menu->is_top_level() ) { + $parent_slug = $this->_menu->get_parent_slug(); + $menu_file = ( false !== strpos( $parent_slug, '.php' ) ) ? + $parent_slug : + 'admin.php'; + + return add_query_arg( array_merge( $params, array( + 'page' => $page_param, + ) ), $this->admin_url( $menu_file, 'admin', $network ) ); + } + + // Module has a top level CPT settings page. + if ( $this->_menu->is_cpt() ) { + if ( empty( $page ) && $this->is_activation_mode() ) { + return add_query_arg( array_merge( $params, array( + 'page' => $page_param + ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); + } else { + if ( ! empty( $page ) ) { + $params['page'] = $page_param; + } + + return add_query_arg( + $params, + $this->admin_url( $this->_menu->get_raw_slug(), 'admin', $network ) + ); + } + } + + // Module has a custom top level settings page. + return add_query_arg( array_merge( $params, array( + 'page' => $page_param, + ) ), $this->admin_url( 'admin.php', 'admin', $network ) ); + } + + #-------------------------------------------------------------------------------- + #region Multisite + #-------------------------------------------------------------------------------- + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return bool + */ + function is_network_active() { + return $this->_is_network_active; + } + + /** + * Delegate activation for the given sites in the network (or all sites if `null`) to site admins. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param array|null $sites + */ + private function delegate_connection( $sites = null ) { + $this->_logger->entrance(); + + $this->_admin_notices->remove_sticky( 'connect_account' ); + + if ( is_null( $sites ) ) { + // All sites delegation. + $this->_storage->store( 'is_delegated_connection', true, true, true ); + } else { + // Specified sites delegation. + foreach ( $sites as $site ) { + $this->delegate_site_connection( $site['blog_id'] ); + } + } + + $this->network_upgrade_mode_completed(); + } + + /** + * Delegate specific network site conncetion to the site admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + */ + private function delegate_site_connection( $blog_id ) { + $this->_storage->store( 'is_delegated_connection', true, $blog_id, true ); + } + + /** + * Check if super-admin delegated the connection of ALL sites to the site admins. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function is_network_delegated_connection() { + if ( ! $this->_is_network_active ) { + return false; + } + + return $this->_storage->get( 'is_delegated_connection', false, true ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return bool + */ + function is_site_delegated_connection( $blog_id = 0 ) { + if ( ! $this->_is_network_active ) { + return false; + } + + if ( 0 == $blog_id ) { + $blog_id = get_current_blog_id(); + } + + return $this->_storage->get( 'is_delegated_connection', false, $blog_id ); + } + + /** + * Check if delegated the connection. When running within the the network admin, + * and haven't specified the blog ID, checks if network level delegated. If running + * within a site admin or specified a blog ID, check if delegated the connection for + * the current context site. + * + * If executed outside the the admin, check if delegated the connection + * for the current context site OR the whole network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id If set, checks if network delegated or blog specific delegated. + * + * @return bool + */ + function is_delegated_connection( $blog_id = 0 ) { + if ( ! $this->_is_network_active ) { + return false; + } + + if ( fs_is_network_admin() && 0 == $blog_id ) { + return $this->is_network_delegated_connection(); + } + + return ( + $this->is_network_delegated_connection() || + $this->is_site_delegated_connection( $blog_id ) + ); + } + + /** + * Check if the current module is active for the site. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return bool + */ + function is_active_for_site( $blog_id ) { + if ( ! is_multisite() ) { + // Not a multisite and this code is executed, means that the plugin is active. + return true; + } + + if ( $this->is_theme() ) { + // All themes are site level activated. + return true; + } + + if ( $this->_is_network_active ) { + // Plugin was network activated so it's active. + return true; + } + + return in_array( $this->_plugin_basename, (array) get_blog_option( $blog_id, 'active_plugins', array() ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return array Active & public sites collection. + */ + static function get_sites() { + /** + * For consistency with get_blog_list() which only return active public sites. + * + * @author Vova Feldman (@svovaf) + */ + $args = array( + 'public' => 1, + 'archived' => 0, + 'mature' => 0, + 'spam' => 0, + 'deleted' => 0, + ); + + if ( function_exists( 'get_sites' ) ) { + // For WP 4.6 and above. + return get_sites( $args ); + } else if ( function_exists( 'wp_get_sites' ) ) { + // For WP 3.7 to WP 4.5. + return wp_get_sites( $args ); + } else { + // For WP 3.6 and below. + return get_blog_list( 0, 'all' ); + } + } + + /** + * Checks if a given blog is active. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param $blog_id + * + * @return bool + */ + private static function is_site_active( $blog_id ) { + global $wpdb; + + $blog_info = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d", $blog_id ) ); + + if ( ! is_object( $blog_info ) ) { + return false; + } + + return ( + true == $blog_info->public && + false == $blog_info->archived && + false == $blog_info->mature && + false == $blog_info->spam && + false == $blog_info->deleted + ); + } + + /** + * Get a mapping between the site addresses to their blog IDs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return array { + * @key string Site address without protocol with a trailing slash. + * @value int Site's blog ID. + * } + */ + private function get_address_to_blog_map() { + $sites = self::get_sites(); + + // Map site addresses to their blog IDs. + $address_to_blog_map = array(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $address = trailingslashit( fs_strip_url_protocol( get_site_url( $blog_id ) ) ); + $address_to_blog_map[ $address ] = $blog_id; + } + + return $address_to_blog_map; + } + + /** + * Get a mapping between the site addresses to their blog IDs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return array { + * @key int Site's blog ID. + * @value FS_Site Associated install. + * } + */ + function get_blog_install_map() { + $sites = self::get_sites(); + + // Map site blog ID to its install. + $install_map = array(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( is_object( $install ) ) { + $install_map[ $blog_id ] = $install; + } + } + + return $install_map; + } + + /** + * Gets a map of module IDs that the given user has opted-in to. + * + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param number $fs_user_id + * + * @return array { + * @key number $plugin_id + * @value bool Always true. + * } + */ + private static function get_user_opted_in_module_ids_map( $fs_user_id ) { + self::$_static_logger->entrance(); + + if ( ! is_multisite() ) { + $installs = array_merge( + self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN ), + self::get_all_sites( WP_FS__MODULE_TYPE_THEME ) + ); + } else { + $sites = self::get_sites(); + + $installs = array(); + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + + $installs = array_merge( + $installs, + self::get_all_sites( WP_FS__MODULE_TYPE_PLUGIN, $blog_id ), + self::get_all_sites( WP_FS__MODULE_TYPE_THEME, $blog_id ) + ); + } + } + + $module_ids_map = array(); + foreach ( $installs as $install ) { + if ( is_object( $install ) && + FS_Site::is_valid_id( $install->id ) && + FS_User::is_valid_id( $install->user_id ) && + ( $install->user_id == $fs_user_id ) + ) { + $module_ids_map[ $install->plugin_id ] = true; + } + } + + return $module_ids_map; + } + + /** + * @author Leo Fajardo (@leorw) + * + * @return null|array { + * 'install' => FS_Site Module's install, + * 'blog_id' => string The associated blog ID. + * } + */ + private function find_first_install() { + $sites = self::get_sites(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + $install = $this->get_install_by_blog_id( $blog_id ); + + if ( is_object( $install ) ) { + return array( + 'install' => $install, + 'blog_id' => $blog_id + ); + } + } + + return null; + } + + /** + * Switches the Freemius site level context to a specified blog. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * @param FS_Site $install + */ + function switch_to_blog( $blog_id, FS_Site $install = null ) { + if ( $blog_id == $this->_context_is_network_or_blog_id ) { + return; + } + + switch_to_blog( $blog_id ); + $this->_context_is_network_or_blog_id = $blog_id; + + self::$_accounts->set_site_blog_context( $blog_id ); + $this->_storage->set_site_blog_context( $blog_id ); + $this->_storage->set_network_active( true, $this->is_delegated_connection( $blog_id ) ); + + $this->_site = is_object( $install ) ? + $install : + $this->get_install_by_blog_id( $blog_id ); + + $this->_user = false; + $this->_licenses = false; + $this->_license = null; + + if ( is_object( $this->_site ) ) { + // Try to fetch user from install. + $this->_user = self::_get_user_by_id( $this->_site->user_id ); + + if ( ! is_object( $this->_user ) && + FS_User::is_valid_id( $this->_storage->prev_user_id ) + ) { + // Try to fetch previously saved user. + $this->_user = self::_get_user_by_id( $this->_storage->prev_user_id ); + + if ( ! is_object( $this->_user ) ) { + // Fallback to network's user. + $this->_user = $this->get_network_user(); + } + } + + $all_plugin_licenses = self::get_all_licenses( $this->_module_id ); + + if ( ! empty( $all_plugin_licenses ) ) { + if ( ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) ) { + $this->_license = null; + } else { + $license_found = false; + foreach ( $all_plugin_licenses as $license ) { + if ( $license->id == $this->_site->license_id ) { + // License found. + $this->_license = $license; + $license_found = true; + break; + } + } + + if ( $license_found ) { + $this->link_license_2_user( $this->_license->id, $this->_user->id ); + } + } + + $this->_licenses = $this->get_user_licenses( $this->_user->id ); + } + } + + unset( $this->_site_api ); + unset( $this->_user_api ); + } + + /** + * Restore the blog context to the blog that originally loaded the module. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function restore_current_blog() { + $this->switch_to_blog( $this->_blog_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param array|WP_Site $site + * + * @return int + */ + static function get_site_blog_id( &$site ) { + return ( $site instanceof WP_Site ) ? + $site->blog_id : + ( is_object( $site ) && isset( $site->userblog_id ) ? + $site->userblog_id : + $site['blog_id'] ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param array|WP_Site|null $site + * + * @return array + */ + function get_site_info( $site = null ) { + $this->_logger->entrance(); + + $switched = false; + + if ( is_null( $site ) ) { + $url = get_site_url(); + $name = get_bloginfo( 'name' ); + $blog_id = null; + } else { + $blog_id = self::get_site_blog_id( $site ); + + if ( get_current_blog_id() != $blog_id ) { + switch_to_blog( $blog_id ); + $switched = true; + } + + if ( $site instanceof WP_Site ) { + $url = $site->siteurl; + $name = $site->blogname; + } else { + $url = get_site_url( $blog_id ); + $name = get_bloginfo( 'name' ); + } + } + + $info = array( + 'uid' => $this->get_anonymous_id( $blog_id ), + 'url' => $url, + 'title' => $name, + 'language' => get_bloginfo( 'language' ), + 'charset' => get_bloginfo( 'charset' ), + ); + + if ( is_numeric( $blog_id ) ) { + $info['blog_id'] = $blog_id; + } + + if ( $switched ) { + restore_current_blog(); + } + + return $info; + } + + /** + * Load the module's install based on the blog ID. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int|null $blog_id + * + * @return FS_Site + */ + function get_install_by_blog_id( $blog_id = null ) { + $installs = self::get_all_sites( $this->_module_type, $blog_id ); + $install = isset( $installs[ $this->_slug ] ) ? $installs[ $this->_slug ] : null; + + if ( is_object( $install ) && + is_numeric( $install->id ) && + is_numeric( $install->user_id ) && + FS_Plugin_Plan::is_valid_id( $install->plan_id ) + ) { + // Load site. + $install = clone $install; + } + + return $install; + } + + /** + * Check if module is installed on a specified site. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int|null $blog_id + * + * @return bool + */ + function is_installed_on_site( $blog_id = null ) { + $installs = self::get_all_sites( $this->_module_type, $blog_id ); + $install = isset( $installs[ $this->_slug ] ) ? $installs[ $this->_slug ] : null; + + return ( + is_object( $install ) && + is_numeric( $install->id ) && + is_numeric( $install->user_id ) && + FS_Plugin_Plan::is_valid_id( $install->plan_id ) + ); + } + + /** + * Check if super-admin connected at least one site via the network opt-in. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function is_network_registered() { + if ( ! $this->_is_network_active ) { + return false; + } + + return FS_User::is_valid_id( $this->_storage->network_user_id ); + } + + /** + * Returns the main user associated with the network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return FS_User + */ + function get_network_user() { + if ( ! $this->_is_network_active ) { + return null; + } + + return FS_User::is_valid_id( $this->_storage->network_user_id ) ? + self::_get_user_by_id( $this->_storage->network_user_id ) : + null; + } + + /** + * Returns the current context user or the network's main user. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return FS_User + */ + function get_current_or_network_user() { + return ( $this->_user instanceof FS_User ) ? + $this->_user : + $this->get_network_user(); + } + + /** + * Returns the main install associated with the network. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return FS_Site + */ + function get_network_install() { + if ( ! $this->_is_network_active ) { + return null; + } + + return FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ? + $this->get_install_by_blog_id( $this->_storage->network_install_blog_id ) : + null; + } + + /** + * Returns the blog ID that is associated with the main install. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @return int|null + */ + function get_network_install_blog_id() { + if ( ! $this->_is_network_active ) { + return null; + } + + return FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ? + $this->_storage->network_install_blog_id : + null; + } + + /** + * Returns the current context install or the network's main install. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return FS_Site + */ + function get_current_or_network_install() { + return ( $this->_site instanceof FS_Site ) ? + $this->_site : + $this->get_network_install(); + } + + /** + * Check if executing a site level action from the network level admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return false|int If yes, return the requested blog ID. + */ + private function is_network_level_site_specific_action() { + if ( ! $this->_is_network_active ) { + return false; + } + + if ( ! fs_is_network_admin() ) { + return false; + } + + $blog_id = fs_request_get( 'blog_id', '' ); + + return is_numeric( $blog_id ) ? $blog_id : false; + } + + /** + * Check if executing an action from the network level admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + private function is_network_level_action() { + return ( $this->_is_network_active && fs_is_network_admin() ); + } + + /** + * Needs to be executed after site deactivation, archive, deletion, or flag as spam. + * The logic updates the network level user and blog, and reschedule the crons if the cron executing site matching the site that is no longer publicly active. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $context_blog_id + */ + private function update_multisite_data_after_site_deactivation( $context_blog_id = 0 ) { + $this->_logger->entrance(); + + if ( $this->_is_network_active ) { + if ( $context_blog_id == $this->_storage->network_install_blog_id ) { + $installs_map = $this->get_blog_install_map(); + + foreach ( $installs_map as $blog_id => $install ) { + /** + * @var FS_Site $install + */ + if ( $context_blog_id == $blog_id ) { + continue; + } + + if ( $install->user_id != $this->_storage->network_user_id ) { + continue; + } + + // Switch reference to a blog that is opted-in and belong to the same super-admin. + $this->_storage->network_install_blog_id = $blog_id; + break; + } + } + } + + if ( $this->is_sync_cron_scheduled() && + $context_blog_id == $this->get_sync_cron_blog_id() + ) { + $this->schedule_sync_cron( WP_FS__SCRIPT_START_TIME, true, $context_blog_id ); + } + + if ( $this->is_install_sync_scheduled() && + $context_blog_id == $this->get_install_sync_cron_blog_id() + ) { + $this->schedule_install_sync( $context_blog_id ); + } + } + + /** + * Executed after site deactivation, archive, or flag as spam. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $context_blog_id + */ + public function _after_site_deactivated_callback( $context_blog_id = 0 ) { + $this->_logger->entrance(); + + $install = $this->get_install_by_blog_id( $context_blog_id ); + + if ( ! is_object( $install ) ) { + // Site not connected. + return; + } + + $this->update_multisite_data_after_site_deactivation( $context_blog_id ); + + $current_blog_id = get_current_blog_id(); + + $this->switch_to_blog( $context_blog_id ); + + // Send deactivation event. + $this->sync_install( array( + 'is_active' => false, + ) ); + + $this->switch_to_blog( $current_blog_id ); + } + + /** + * Executed after site deletion. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $context_blog_id + * @param bool $drop True if site's database tables should be dropped. Default is false. + */ + public function _after_site_deleted_callback( $context_blog_id = 0, $drop = false ) { + $this->_logger->entrance(); + + $install = $this->get_install_by_blog_id( $context_blog_id ); + + if ( ! is_object( $install ) ) { + // Site not connected. + return; + } + + $this->update_multisite_data_after_site_deactivation( $context_blog_id ); + + $current_blog_id = get_current_blog_id(); + + $this->switch_to_blog( $context_blog_id ); + + if ( $drop ) { + // Delete install if dropping site DB. + $this->delete_account_event(); + } else { + // Send deactivation event. + $this->sync_install( array( + 'is_active' => false, + ) ); + } + + $this->switch_to_blog( $current_blog_id ); + } + + /** + * Executed after site re-activation. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $context_blog_id + */ + public function _after_site_reactivated_callback( $context_blog_id = 0 ) { + $this->_logger->entrance(); + + $install = $this->get_install_by_blog_id( $context_blog_id ); + + if ( ! is_object( $install ) ) { + // Site not connected. + return; + } + + if ( ! self::is_site_active( $context_blog_id ) ) { + // Site not yet active (can be in spam mode, archived, deleted...). + return; + } + + $current_blog_id = get_current_blog_id(); + + $this->switch_to_blog( $context_blog_id ); + + // Send re-activation event. + $this->sync_install( array( + 'is_active' => true, + ) ); + + $this->switch_to_blog( $current_blog_id ); + } + + #endregion Multisite + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $path + * @param string $scheme + * @param bool $network + * + * @return string + */ + private function admin_url( $path = '', $scheme = 'admin', $network = true ) { + return ( $this->_is_network_active && $network ) ? + network_admin_url( $path, $scheme ) : + admin_url( $path, $scheme ); + } + + /** + * Check if currently in a specified admin page. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param string $page + * + * @return bool + */ + function is_admin_page( $page ) { + return ( $this->_menu->get_slug( $page ) === fs_request_get( 'page', '', 'get' ) ); + } + + /** + * Get module's main admin setting page URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return string + */ + function main_menu_url() { + return $this->_menu->main_menu_url(); + } + + /** + * Check if currently on the theme's setting page or + * on any of the Freemius added pages (via tabs). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + function is_theme_settings_page() { + return fs_starts_with( + fs_request_get( 'page', '', 'get' ), + $this->_menu->get_slug() + ); + } + + /** + * Plugin's account page + sync license URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.9.1 + * + * @param bool|number $plugin_id + * @param bool $add_action_nonce + * @param array $params + * + * @return string + */ + function _get_sync_license_url( $plugin_id = false, $add_action_nonce = true, $params = array() ) { + if ( is_numeric( $plugin_id ) ) { + $params['plugin_id'] = $plugin_id; + } + + return $this->get_account_url( + $this->get_unique_affix() . '_sync_license', + $params, + $add_action_nonce + ); + } + + /** + * Plugin's account URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool|string $action + * @param array $params + * + * @param bool $add_action_nonce + * + * @return string + */ + function get_account_url( $action = false, $params = array(), $add_action_nonce = true ) { + if ( is_string( $action ) ) { + $params['fs_action'] = $action; + } + + self::require_pluggable_essentials(); + + return ( $add_action_nonce && is_string( $action ) ) ? + fs_nonce_url( $this->_get_admin_page_url( 'account', $params ), $action ) : + $this->_get_admin_page_url( 'account', $params ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * + * @param string $tab + * @param bool $action + * @param array $params + * @param bool $add_action_nonce + * + * @return string + * + * @uses get_account_url() + */ + function get_account_tab_url( $tab, $action = false, $params = array(), $add_action_nonce = true ) { + $params['tab'] = $tab; + + return $this->get_account_url( $action, $params, $add_action_nonce ); + } + + /** + * Plugin's account URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool|string $topic + * @param bool|string $message + * + * @return string + */ + function contact_url( $topic = false, $message = false ) { + $params = array(); + if ( is_string( $topic ) ) { + $params['topic'] = $topic; + } + if ( is_string( $message ) ) { + $params['message'] = $message; + } + + if ( $this->is_addon() ) { + $params['addon_id'] = $this->get_id(); + + return $this->get_parent_instance()->_get_admin_page_url( 'contact', $params ); + } else { + return $this->_get_admin_page_url( 'contact', $params ); + } + } + + /** + * Add-on direct info URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.0 + * + * @param string $slug + * + * @return string + */ + function addon_url( $slug ) { + return $this->_get_admin_page_url( 'addons', array( + 'slug' => $slug + ) ); + } + + /* Logger + ------------------------------------------------------------------------------------------------------------------*/ + /** + * @param string $id + * @param bool $prefix_slug + * + * @return FS_Logger + */ + function get_logger( $id = '', $prefix_slug = true ) { + return FS_Logger::get_logger( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id ); + } + + /** + * Note: This method is used externally so don't delete it. + * + * @param $id + * @param bool $load_options + * @param bool $prefix_slug + * + * @return FS_Option_Manager + */ + function get_options_manager( $id, $load_options = false, $prefix_slug = true ) { + return FS_Option_Manager::get_manager( ( $prefix_slug ? $this->_slug : '' ) . ( ( ! $prefix_slug || empty( $id ) ) ? '' : '_' ) . $id, $load_options ); + } + + /* Security + ------------------------------------------------------------------------------------------------------------------*/ + private static function _encrypt( $str ) { + if ( is_null( $str ) ) { + return null; + } + + /** + * The encrypt/decrypt functions are used to protect + * the user from messing up with some of the sensitive + * data stored for the module as a JSON in the database. + * + * I used the same suggested hack by the theme review team. + * For more details, look at the function `Base64UrlDecode()` + * in `./sdk/FreemiusBase.php`. + * + * @todo Remove this hack once the base64 error is removed from the Theme Check. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + $fn = 'base64' . '_encode'; + + return $fn( $str ); + } + + static function _decrypt( $str ) { + if ( is_null( $str ) ) { + return null; + } + + /** + * The encrypt/decrypt functions are used to protect + * the user from messing up with some of the sensitive + * data stored for the module as a JSON in the database. + * + * I used the same suggested hack by the theme review team. + * For more details, look at the function `Base64UrlDecode()` + * in `./sdk/FreemiusBase.php`. + * + * @todo Remove this hack once the base64 error is removed from the Theme Check. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + $fn = 'base64' . '_decode'; + + return $fn( $str ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param FS_Entity $entity + * + * @return FS_Entity Return an encrypted clone entity. + */ + private static function _encrypt_entity( FS_Entity $entity ) { + $clone = clone $entity; + $props = get_object_vars( $entity ); + + foreach ( $props as $key => $val ) { + $clone->{$key} = self::_encrypt( $val ); + } + + return $clone; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param FS_Entity $entity + * + * @return FS_Entity Return an decrypted clone entity. + */ + private static function decrypt_entity( FS_Entity $entity ) { + $clone = clone $entity; + $props = get_object_vars( $entity ); + + foreach ( $props as $key => $val ) { + $clone->{$key} = self::_decrypt( $val ); + } + + return $clone; + } + + /** + * Tries to activate account based on POST params. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @deprecated Not in use, outdated. + */ + function _activate_account() { + if ( $this->is_registered() ) { + // Already activated. + return; + } + + self::_clean_admin_content_section(); + + if ( fs_request_is_action( 'activate' ) && fs_request_is_post() ) { +// check_admin_referer( 'activate_' . $this->_plugin->public_key ); + + // Verify matching plugin details. + if ( $this->_plugin->id != fs_request_get( 'plugin_id' ) || $this->_slug != fs_request_get( 'plugin_slug' ) ) { + return; + } + + $user = new FS_User(); + $user->id = fs_request_get( 'user_id' ); + $user->public_key = fs_request_get( 'user_public_key' ); + $user->secret_key = fs_request_get( 'user_secret_key' ); + $user->email = fs_request_get( 'user_email' ); + $user->first = fs_request_get( 'user_first' ); + $user->last = fs_request_get( 'user_last' ); + $user->is_verified = fs_request_get_bool( 'user_is_verified' ); + + $site = new FS_Site(); + $site->id = fs_request_get( 'install_id' ); + $site->public_key = fs_request_get( 'install_public_key' ); + $site->secret_key = fs_request_get( 'install_secret_key' ); + $site->plan_id = fs_request_get( 'plan_id' ); + + $plans = array(); + $plans_data = json_decode( urldecode( fs_request_get( 'plans' ) ) ); + foreach ( $plans_data as $p ) { + $plan = new FS_Plugin_Plan( $p ); + if ( $site->plan_id == $plan->id ) { + $plan->title = fs_request_get( 'plan_title' ); + $plan->name = fs_request_get( 'plan_name' ); + } + + $plans[] = $plan; + } + + $this->_set_account( $user, $site, $plans ); + + // Reload the page with the keys. + fs_redirect( $this->_get_admin_page_url() ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param string $email + * + * @return FS_User|false + */ + static function _get_user_by_email( $email ) { + self::$_static_logger->entrance(); + + $email = trim( strtolower( $email ) ); + + $users = self::get_all_users(); + + if ( is_array( $users ) ) { + foreach ( $users as $user ) { + if ( $email === trim( strtolower( $user->email ) ) ) { + return $user; + } + } + } + + return false; + } + + #---------------------------------------------------------------------------------- + #region Account (Loading, Updates & Activation) + #---------------------------------------------------------------------------------- + + /*** + * Load account information (user + site). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + */ + private function _load_account() { + $this->_logger->entrance(); + + $this->do_action( 'before_account_load' ); + + $users = self::get_all_users(); + $plans = self::get_all_plans( $this->_module_type ); + + if ( $this->_logger->is_on() && is_admin() ) { + $this->_logger->log( 'users = ' . var_export( $users, true ) ); + $this->_logger->log( 'plans = ' . var_export( $plans, true ) ); + } + + $site = fs_is_network_admin() ? + $this->get_network_install() : + $this->get_install_by_blog_id(); + + if ( fs_is_network_admin() && + ! is_object( $site ) && + FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) + ) { + $first_install = $this->find_first_install(); + + if ( is_null( $first_install ) ) { + unset( $this->_storage->network_install_blog_id ); + } else { + $site = $first_install['install']; + $this->_storage->network_install_blog_id = $first_install['blog_id']; + } + } + + if ( is_object( $site ) && + is_numeric( $site->id ) && + is_numeric( $site->user_id ) && + FS_Plugin_Plan::is_valid_id( $site->plan_id ) + ) { + // Load site. + $this->_site = $site; + + // Load plans. + $this->_plans = $plans[ $this->_slug ]; + if ( ! is_array( $this->_plans ) || empty( $this->_plans ) ) { + $this->_sync_plans(); + } else { + for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { + if ( $this->_plans[ $i ] instanceof FS_Plugin_Plan ) { + $this->_plans[ $i ] = self::decrypt_entity( $this->_plans[ $i ] ); + } else { + unset( $this->_plans[ $i ] ); + } + } + } + } + + $user = null; + if ( fs_is_network_admin() && $this->_is_network_active ) { + $user = $this->get_network_user(); + } + + if ( is_object( $user ) ) { + $this->_user = clone $user; + } else if ( $this->_site ) { + $user = self::_get_user_by_id( $this->_site->user_id ); + + if ( ! is_object( $user ) && FS_User::is_valid_id( $this->_storage->prev_user_id ) ) { + /** + * Try to load the previous owner. This recovery is used for the following use-case: + * 1. Opt-in + * 2. Cloning site1 to site2 + * 3. Ownership switch in site1 (same applies for site2) + * 4. Install data sync on site2 + * 5. Now site2's install is associated with the new owner which does not exists locally. + */ + $user = self::_get_user_by_id( $this->_storage->prev_user_id ); + } + + if ( ! is_object( $user ) ) { + /** + * This is a special fault tolerance mechanism to handle a scenario that the user data is missing. + */ + $user = $this->fetch_user_by_install(); + } + + $this->_user = ( $user instanceof FS_User ) ? + clone $user : + null; + } + + if ( is_object( $this->_user ) ) { + // Load licenses. + $this->_licenses = $this->get_user_licenses( $this->_user->id ); + } + + if ( is_object( $this->_site ) ) { + $this->_license = $this->_get_license_by_id( $this->_site->license_id ); + + if ( $this->_site->version != $this->get_plugin_version() ) { + // If stored install version is different than current installed plugin version, + // then update plugin version event. + $this->update_plugin_version_event(); + } + } + + if ( $this->is_theme() ) { + $this->_register_account_hooks(); + } + } + + /** + * Special user recovery mechanism. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return \FS_User|mixed + */ + private function fetch_user_by_install() { + $api = $this->get_api_site_scope(); + + $uid = $this->get_anonymous_id(); + $request_path = "/users/{$this->_site->user_id}.json?uid={$uid}"; + + $result = $api->get( $request_path, false, WP_FS__TIME_10_MIN_IN_SEC ); + + if ( $this->is_api_result_entity( $result ) ) { + $user = new FS_User( $result ); + $this->_user = $user; + $this->_store_user(); + + return $user; + } + + $error_code = FS_Api::get_error_code( $result ); + + if ( in_array( $error_code, array( 'invalid_unique_id', 'user_cannot_be_recovered' ) ) ) { + /** + * Those API errors will continue coming and are not recoverable with the + * current site's data. Therefore, extend the API call's cached result to 7 days. + */ + $api->update_cache_expiration( $request_path, WP_FS__TIME_WEEK_IN_SEC ); + } + + return $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param FS_User $user + * @param FS_Site $site + * @param bool|array $plans + */ + private function _set_account( FS_User $user, FS_Site $site, $plans = false ) { + $site->user_id = $user->id; + + $this->_site = $site; + $this->_user = $user; + if ( false !== $plans ) { + $this->_plans = $plans; + } + + $this->send_install_update(); + + $this->_store_account(); + + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param array $override_with + * @param bool|int|null $network_level_or_blog_id If true, return params for network level opt-in. If integer, get params for specified blog in the network. + * + * @return array + */ + function get_opt_in_params( $override_with = array(), $network_level_or_blog_id = null ) { + $this->_logger->entrance(); + + $current_user = self::_get_current_wp_user(); + + $activation_action = $this->get_unique_affix() . '_activate_new'; + $return_url = $this->is_anonymous() ? + // If skipped already, then return to the account page. + $this->get_account_url( $activation_action, array(), false ) : + // Return to the module's main page. + $this->get_after_activation_url( 'after_connect_url', array( 'fs_action' => $activation_action ) ); + + $params = array( + 'user_firstname' => $current_user->user_firstname, + 'user_lastname' => $current_user->user_lastname, + 'user_nickname' => $current_user->user_nicename, + 'user_email' => $current_user->user_email, + 'user_ip' => WP_FS__REMOTE_ADDR, + 'plugin_slug' => $this->_slug, + 'plugin_id' => $this->get_id(), + 'plugin_public_key' => $this->get_public_key(), + 'plugin_version' => $this->get_plugin_version(), + 'return_url' => fs_nonce_url( $return_url, $activation_action ), + 'account_url' => fs_nonce_url( $this->_get_admin_page_url( + 'account', + array( 'fs_action' => 'sync_user' ) + ), 'sync_user' ), + 'platform_version' => get_bloginfo( 'version' ), + 'sdk_version' => $this->version, + 'programming_language_version' => phpversion(), + 'is_premium' => $this->is_premium(), + 'is_active' => true, + 'is_uninstalled' => false, + ); + + if ( true === $network_level_or_blog_id ) { + if ( ! isset( $override_with['sites'] ) ) { + $params['sites'] = array(); + + $sites = self::get_sites(); + + foreach ( $sites as $site ) { + $blog_id = self::get_site_blog_id( $site ); + if ( ! $this->is_site_delegated_connection( $blog_id ) && + ! $this->is_installed_on_site( $blog_id ) + ) { + $params['sites'][] = $this->get_site_info( $site ); + } + } + } + } else { + $site = is_numeric( $network_level_or_blog_id ) ? + array( 'blog_id' => $network_level_or_blog_id ) : + null; + + $site = $this->get_site_info( $site ); + + $params = array_merge( $params, array( + 'site_uid' => $site['uid'], + 'site_url' => $site['url'], + 'site_name' => $site['title'], + 'language' => $site['language'], + 'charset' => $site['charset'], + ) ); + } + + if ( $this->is_pending_activation() && + ! empty( $this->_storage->pending_license_key ) + ) { + $params['license_key'] = $this->_storage->pending_license_key; + } + + if ( WP_FS__SKIP_EMAIL_ACTIVATION && $this->has_secret_key() ) { + // Even though rand() is known for its security issues, + // the timestamp adds another layer of protection. + // It would be very hard for an attacker to get the secret key form here. + // Plus, this should never run in production since the secret should never + // be included in the production version. + $params['ts'] = WP_FS__SCRIPT_START_TIME; + $params['salt'] = md5( uniqid( rand() ) ); + $params['secure'] = md5( + $params['ts'] . + $params['salt'] . + $this->get_secret_key() + ); + } + + return array_merge( $params, $override_with ); + } + + /** + * 1. If successful opt-in or pending activation returns the next page that the user should be redirected to. + * 2. If there was an API error, return the API result. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param string|bool $email + * @param string|bool $first + * @param string|bool $last + * @param string|bool $license_key + * @param bool $is_uninstall If "true", this means that the module is currently being uninstalled. + * In this case, the user and site info will be sent to the server but no + * data will be saved to the WP installation's database. + * @param number|bool $trial_plan_id + * @param bool $is_disconnected Whether or not to opt in without tracking. + * @param null|bool $is_marketing_allowed + * @param array $sites If network-level opt-in, an array of containing details of sites. + * + * @return string|object + * @use WP_Error + */ + function opt_in( + $email = false, + $first = false, + $last = false, + $license_key = false, + $is_uninstall = false, + $trial_plan_id = false, + $is_disconnected = false, + $is_marketing_allowed = null, + $sites = array() + ) { + $this->_logger->entrance(); + + if ( false === $email ) { + $current_user = self::_get_current_wp_user(); + $email = $current_user->user_email; + } + + /** + * @since 1.2.1 If activating with license key, ignore the context-user + * since the user will be automatically loaded from the license. + */ + if ( empty( $license_key ) ) { + // Clean up pending license if opt-ing in again. + $this->_storage->remove( 'pending_license_key' ); + + if ( ! $is_uninstall ) { + $fs_user = Freemius::_get_user_by_email( $email ); + if ( is_object( $fs_user ) && ! $this->is_pending_activation() ) { + return $this->install_with_current_user( + false, + $trial_plan_id, + $sites + ); + } + } + } + + $user_info = array(); + if ( ! empty( $email ) ) { + $user_info['user_email'] = $email; + } + if ( ! empty( $first ) ) { + $user_info['user_firstname'] = $first; + } + if ( ! empty( $last ) ) { + $user_info['user_lastname'] = $last; + } + + if ( ! empty( $sites ) ) { + $is_network = true; + + $user_info['sites'] = $sites; + } else { + $is_network = false; + } + + $params = $this->get_opt_in_params( $user_info, $is_network ); + + $filtered_license_key = false; + if ( is_string( $license_key ) ) { + $filtered_license_key = $this->apply_filters( 'license_key', $license_key ); + $params['license_key'] = $filtered_license_key; + } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { + $params['trial_plan_id'] = $trial_plan_id; + } + + if ( $is_uninstall ) { + $params['uninstall_params'] = array( + 'reason_id' => $this->_storage->uninstall_reason->id, + 'reason_info' => $this->_storage->uninstall_reason->info + ); + } + + if ( isset( $params['license_key'] ) ) { + $fs_user = Freemius::_get_user_by_email( $email ); + + if ( is_object( $fs_user ) ) { + /** + * If opting in with a context license and the context WP Admin user already opted in + * before from the current site, add the user context security params to avoid the + * unnecessary email activation when the context license is owned by the same context user. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + */ + $params = array_merge( $params, FS_Security::instance()->get_context_params( + $fs_user, + false, + 'install_with_existing_user' + ) ); + } + } + + if ( is_bool( $is_marketing_allowed ) ) { + $params['is_marketing_allowed'] = $is_marketing_allowed; + } + + $params['is_disconnected'] = $is_disconnected; + $params['format'] = 'json'; + + $request = array( + 'method' => 'POST', + 'body' => $params, + 'timeout' => WP_FS__DEBUG_SDK ? 60 : 30, + ); + + $url = WP_FS__ADDRESS . '/action/service/user/install/'; + $response = self::safe_remote_post( $url, $request ); + + if ( is_wp_error( $response ) ) { + /** + * @var WP_Error $response + */ + $result = new stdClass(); + + $error_code = $response->get_error_code(); + $error_type = str_replace( ' ', '', ucwords( str_replace( '_', ' ', $error_code ) ) ); + + $result->error = (object) array( + 'type' => $error_type, + 'message' => $response->get_error_message(), + 'code' => $error_code, + 'http' => 402 + ); + + return $result; + } + + // Module is being uninstalled, don't handle the returned data. + if ( $is_uninstall ) { + return true; + } + + /** + * When json_decode() executed on PHP 5.2 with an invalid JSON, it will throw a PHP warning. Unfortunately, the new Theme Check doesn't allow PHP silencing and the theme review team isn't open to change that, therefore, instead of using `@json_decode()` we had to use the method without the `@` directive. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * @link https://themes.trac.wordpress.org/ticket/46134#comment:5 + * @link https://themes.trac.wordpress.org/ticket/46134#comment:9 + * @link https://themes.trac.wordpress.org/ticket/46134#comment:12 + * @link https://themes.trac.wordpress.org/ticket/46134#comment:14 + */ + $decoded = is_string( $response['body'] ) ? + json_decode( $response['body'] ) : + null; + + if ( empty( $decoded ) ) { + return false; + } + + if ( ! $this->is_api_result_object( $decoded ) ) { + if ( ! empty( $params['license_key'] ) ) { + // Pass the fully entered license key to the failure handler. + $params['license_key'] = $license_key; + } + + return $is_uninstall ? + $decoded : + $this->apply_filters( 'after_install_failure', $decoded, $params ); + } else if ( isset( $decoded->pending_activation ) && $decoded->pending_activation ) { + if ( $is_network ) { + $site_ids = array(); + foreach ( $sites as $site ) { + $site_ids[] = $site['blog_id']; + } + + /** + * Store the sites so that they can be installed once the user has clicked on the activation link + * in the email. + * + * @author Leo Fajardo (@leorw) + */ + $this->_storage->pending_sites_info = array( + 'blog_ids' => $site_ids, + 'license_key' => $license_key, + 'trial_plan_id' => $trial_plan_id + ); + } + + // Pending activation, add message. + return $this->set_pending_confirmation( + ( isset( $decoded->email ) ? + $decoded->email : + true ), + false, + $filtered_license_key, + ! empty( $params['trial_plan_id'] ) + ); + } else if ( isset( $decoded->install_secret_key ) ) { + return $this->install_with_new_user( + $decoded->user_id, + $decoded->user_public_key, + $decoded->user_secret_key, + ( isset( $decoded->is_marketing_allowed ) && ! is_null( $decoded->is_marketing_allowed ) ? + $decoded->is_marketing_allowed : + null ), + $decoded->install_id, + $decoded->install_public_key, + $decoded->install_secret_key, + false + ); + } else if ( is_array( $decoded->installs ) ) { + return $this->install_many_with_new_user( + $decoded->user_id, + $decoded->user_public_key, + $decoded->user_secret_key, + ( isset( $decoded->is_marketing_allowed ) && ! is_null( $decoded->is_marketing_allowed ) ? + $decoded->is_marketing_allowed : + null ), + $decoded->installs, + false + ); + } + + return $decoded; + } + + /** + * Set user and site identities. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param FS_User $user + * @param FS_Site $site + * @param bool $redirect + * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will + * redirect (or return a URL) to the account page with a special parameter to + * trigger the auto installation processes. + * + * @return string If redirect is `false`, returns the next page the user should be redirected to. + */ + function setup_account( + FS_User $user, + FS_Site $site, + $redirect = true, + $auto_install = false + ) { + return $this->setup_network_account( + $user, + array( $site ), + $redirect, + $auto_install, + false + ); + } + + /** + * Set user and site identities. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param FS_User $user + * @param FS_Site[] $installs + * @param bool $redirect + * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will redirect (or return a URL) to the account page with a special parameter to trigger the auto installation processes. + * @param bool $is_network_level_opt_in + * + * @return string If redirect is `false`, returns the next page the user should be redirected to. + */ + function setup_network_account( + FS_User $user, + array $installs, + $redirect = true, + $auto_install = false, + $is_network_level_opt_in = true + ) { + $first_install = $installs[0]; + + $this->_user = $user; + $this->_site = $first_install; + + $this->_sync_plans(); + + if ( $this->_storage->handle_gdpr_admin_notice && + $this->should_handle_gdpr_admin_notice() && + FS_GDPR_Manager::instance()->should_show_opt_in_notice() + ) { + /** + * Clear user lock after an opt-in. + */ + require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; + FS_User_Lock::instance()->unlock(); + } + + if ( 1 < count( $installs ) ) { + // Only network level opt-in can have more than one install. + $is_network_level_opt_in = true; + } +// $is_network_level_opt_in = self::is_ajax_action_static( 'network_activate', $this->_module_id ); + // If Freemius was OFF before, turn it on. + $this->turn_on(); + + if ( ! $this->_is_network_active || ! $is_network_level_opt_in ) { + $this->_set_account( $user, $first_install ); + + $this->do_action( 'after_account_connection', $user, $first_install ); + } else { + $this->_store_user(); + + // Map site addresses to their blog IDs. + $address_to_blog_map = $this->get_address_to_blog_map(); + + $first_blog_id = null; + $blog_2_install_map = array(); + foreach ( $installs as $install ) { + $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); + $blog_id = $address_to_blog_map[ $address ]; + + $this->_store_site( true, $blog_id, $install ); + + if ( is_null( $first_blog_id ) ) { + $first_blog_id = $blog_id; + } + + $blog_2_install_map[ $blog_id ] = $install; + } + + if ( ! FS_User::is_valid_id( $this->_storage->network_user_id ) || + ! is_object( self::_get_user_by_id( $this->_storage->network_user_id ) ) + ) { + // Store network user. + $this->_storage->network_user_id = $this->_user->id; + } + + if ( ! FS_Site::is_valid_id( $this->_storage->network_install_blog_id ) ) { + $this->_storage->network_install_blog_id = $first_blog_id; + } + + if ( count( $installs ) === count( $address_to_blog_map ) ) { + // Super-admin opted-in for all sites in the network. + $this->_storage->is_network_connected = true; + } + + $this->_store_licenses( false ); + + self::$_accounts->store(); + + // Don't sync the installs data on network upgrade + if ( ! $this->network_upgrade_mode_completed() ) { + $this->send_installs_update(); + } + + // Switch install context back to the first install. + $this->_site = $first_install; + + $current_blog = get_current_blog_id(); + + foreach ( $blog_2_install_map as $blog_id => $install ) { + $this->switch_to_blog( $blog_id ); + + $this->do_action( 'after_account_connection', $user, $install ); + } + + $this->switch_to_blog( $current_blog ); + + $this->do_action( 'after_network_account_connection', $user, $blog_2_install_map ); + } + + if ( is_numeric( $first_install->license_id ) ) { + $this->_license = $this->_get_license_by_id( $first_install->license_id ); + } + + $this->_admin_notices->remove_sticky( 'connect_account' ); + + if ( $this->is_pending_activation() || ! $this->has_settings_menu() ) { + // Remove pending activation sticky notice (if still exist). + $this->_admin_notices->remove_sticky( 'activation_pending' ); + + // Remove plugin from pending activation mode. + unset( $this->_storage->is_pending_activation ); + + if ( ! $this->is_paying_or_trial() ) { + $this->_admin_notices->add_sticky( + sprintf( $this->get_text_inline( '%s activation was successfully completed.', 'plugin-x-activation-message' ), '<b>' . $this->get_plugin_name() . '</b>' ), + 'activation_complete' + ); + } + } + + if ( $this->is_paying_or_trial() ) { + if ( ! $this->is_premium() || + ! $this->has_premium_version() || + ! $this->has_settings_menu() + ) { + if ( $this->is_paying() ) { + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Your account was successfully activated with the %s plan.', 'activation-with-plan-x-message' ), + $this->get_plan_title() + ) . $this->get_complete_upgrade_instructions(), + 'plan_upgraded', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + } else { + $trial_plan = $this->get_trial_plan(); + + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Your trial has been successfully started.', 'trial-started-message' ), + '<i>' . $this->get_plugin_name() . '</i>' + ) . $this->get_complete_upgrade_instructions( $trial_plan->title ), + 'trial_started', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + } + } + + $this->_admin_notices->remove_sticky( array( + 'trial_promotion', + ) ); + } + + $plugin_id = fs_request_get( 'plugin_id', false ); + + // Store activation time ONLY for plugins & themes (not add-ons). + if ( ! is_numeric( $plugin_id ) || ( $plugin_id == $this->_plugin->id ) ) { + if ( empty( $this->_storage->activation_timestamp ) ) { + $this->_storage->activation_timestamp = WP_FS__SCRIPT_START_TIME; + } + } + + $next_page = ''; + + $extra = array(); + if ( $auto_install ) { + $extra['auto_install'] = 'true'; + } + + if ( is_numeric( $plugin_id ) ) { + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.1.6 + * + * Also sync the license after an anonymous user subscribes. + */ + if ( $this->is_anonymous() || $plugin_id != $this->_plugin->id ) { + // Add-on was installed - sync license right after install. + $next_page = $this->_get_sync_license_url( $plugin_id, true, $extra ); + } + } else { + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.9 If site installed with a valid license, sync license. + */ + if ( $this->is_paying() ) { + $this->_sync_plugin_license( + true, + // Installs data is already synced in the beginning of this method directly or via _set_account(). + false + ); + } + + // Reload the page with the keys. + $next_page = $this->is_anonymous() ? + // If user previously skipped, redirect to account page. + $this->get_account_url( false, $extra ) : + $this->get_after_activation_url( 'after_connect_url', array(), $is_network_level_opt_in ); + } + + if ( ! empty( $next_page ) && $redirect ) { + fs_redirect( $next_page ); + } + + return $next_page; + } + + /** + * Install plugin with new user information after approval. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + function _install_with_new_user() { + $this->_logger->entrance(); + + if ( $this->is_registered() ) { + return; + } + + if ( ( $this->is_plugin() && fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) || + // @todo This logic should be improved because it's executed on every load of a theme. + $this->is_theme() + ) { +// check_admin_referer( $this->_slug . '_activate_new' ); + + if ( fs_request_has( 'user_secret_key' ) ) { + if ( fs_is_network_admin() && isset( $this->_storage->pending_sites_info ) ) { + $pending_sites_info = $this->_storage->pending_sites_info; + + $this->install_many_pending_with_user( + fs_request_get( 'user_id' ), + fs_request_get( 'user_public_key' ), + fs_request_get( 'user_secret_key' ), + fs_request_get_bool( 'is_marketing_allowed', null ), + $pending_sites_info['blog_ids'], + $pending_sites_info['license_key'], + $pending_sites_info['trial_plan_id'] + ); + } else { + $this->install_with_new_user( + fs_request_get( 'user_id' ), + fs_request_get( 'user_public_key' ), + fs_request_get( 'user_secret_key' ), + fs_request_get_bool( 'is_marketing_allowed', null ), + fs_request_get( 'install_id' ), + fs_request_get( 'install_public_key' ), + fs_request_get( 'install_secret_key' ), + true, + fs_request_get_bool( 'auto_install' ) + ); + } + } else if ( fs_request_has( 'pending_activation' ) ) { + $this->set_pending_confirmation( fs_request_get( 'user_email' ), true ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $id + * @param string $public_key + * @param string $secret_key + * + * @return \FS_User + */ + private function setup_user( $id, $public_key, $secret_key ) { + $user = self::_get_user_by_id( $id ); + + if ( is_object( $user ) ) { + $this->_user = $user; + } else { + $user = new FS_User(); + $user->id = $id; + $user->public_key = $public_key; + $user->secret_key = $secret_key; + + $this->_user = $user; + $user_result = $this->get_api_user_scope()->get(); + $user = new FS_User( $user_result ); + + $this->_user = $user; + $this->_store_user(); + } + + return $user; + } + + /** + * Install plugin with new user. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param number $user_id + * @param string $user_public_key + * @param string $user_secret_key + * @param bool|null $is_marketing_allowed + * @param number $install_id + * @param string $install_public_key + * @param string $install_secret_key + * @param bool $redirect + * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will + * redirect (or return a URL) to the account page with a special parameter to + * trigger the auto installation processes. + * + * @return string If redirect is `false`, returns the next page the user should be redirected to. + */ + private function install_with_new_user( + $user_id, + $user_public_key, + $user_secret_key, + $is_marketing_allowed, + $install_id, + $install_public_key, + $install_secret_key, + $redirect = true, + $auto_install = false + ) { + /** + * This method is also executed after opting in with a license key since the + * license can be potentially associated with a different owner. + * + * @since 2.0.0 + */ + $user = self::_get_user_by_id( $user_id ); + + if ( ! is_object( $user ) ) { + $user = new FS_User(); + $user->id = $user_id; + $user->public_key = $user_public_key; + $user->secret_key = $user_secret_key; + + $this->_user = $user; + $user_result = $this->get_api_user_scope()->get(); + $user = new FS_User( $user_result ); + } + + $this->_user = $user; + + $site = new FS_Site(); + $site->id = $install_id; + $site->public_key = $install_public_key; + $site->secret_key = $install_secret_key; + + $this->_site = $site; + $site_result = $this->get_api_site_scope()->get(); + $site = new FS_Site( $site_result ); + $this->_site = $site; + + if ( ! is_null( $is_marketing_allowed ) ) { + $this->disable_opt_in_notice_and_lock_user(); + } + + return $this->setup_account( + $this->_user, + $this->_site, + $redirect, + $auto_install + ); + } + + /** + * Install plugin with user. + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param number $user_id + * @param string $user_public_key + * @param string $user_secret_key + * @param bool|null $is_marketing_allowed + * @param array $site_ids + * @param bool $license_key + * @param bool $trial_plan_id + * @param bool $redirect + * + * @return string If redirect is `false`, returns the next page the user should be redirected to. + */ + private function install_many_pending_with_user( + $user_id, + $user_public_key, + $user_secret_key, + $is_marketing_allowed, + $site_ids, + $license_key = false, + $trial_plan_id = false, + $redirect = true + ) { + $user = $this->setup_user( $user_id, $user_public_key, $user_secret_key ); + + if ( ! is_null( $is_marketing_allowed ) ) { + $this->disable_opt_in_notice_and_lock_user(); + } + + $sites = array(); + foreach ( $site_ids as $site_id ) { + $sites[] = $this->get_site_info( array( 'blog_id' => $site_id ) ); + } + + $this->install_with_user( $user, $license_key, $trial_plan_id, $redirect, true, $sites ); + } + + /** + * Multi-site install with a new user. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $user_id + * @param string $user_public_key + * @param string $user_secret_key + * @param bool|null $is_marketing_allowed + * @param object[] $installs + * @param bool $redirect + * @param bool $auto_install Since 1.2.1.7 If `true` and setting up an account with a valid license, will + * redirect (or return a URL) to the account page with a special parameter to + * trigger the auto installation processes. + * + * @return string If redirect is `false`, returns the next page the user should be redirected to. + */ + private function install_many_with_new_user( + $user_id, + $user_public_key, + $user_secret_key, + $is_marketing_allowed, + array $installs, + $redirect = true, + $auto_install = false + ) { + $this->setup_user( $user_id, $user_public_key, $user_secret_key ); + + if ( ! is_null( $is_marketing_allowed ) ) { + $this->disable_opt_in_notice_and_lock_user(); + } + + $install_ids = array(); + + foreach ( $installs as $install ) { + $install_ids[] = $install->id; + } + + $left = count( $install_ids ); + $offset = 0; + + $installs = array(); + while ( $left > 0 ) { + $result = $this->get_api_user_scope()->get( "/plugins/{$this->_module_id}/installs.json?ids=" . implode( ',', array_slice( $install_ids, $offset, 25 ) ) ); + + if ( ! $this->is_api_result_object( $result, 'installs' ) ) { + // @todo Handle API error. + } + + $installs = array_merge( $installs, $result->installs ); + + $left -= 25; + } + + foreach ( $installs as &$install ) { + $install = new FS_Site( $install ); + } + + return $this->setup_network_account( + $this->_user, + $installs, + $redirect, + $auto_install + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param string|bool $email + * @param bool $redirect + * @param string|bool $license_key Since 1.2.1.5 + * @param bool $is_pending_trial Since 1.2.1.5 + * + * @return string Since 1.2.1.5 if $redirect is `false`, return the pending activation page. + */ + private function set_pending_confirmation( + $email = false, + $redirect = true, + $license_key = false, + $is_pending_trial = false + ) { + if ( $this->_ignore_pending_mode ) { + /** + * If explicitly asked to ignore pending mode, set to anonymous mode + * if require confirmation before finalizing the opt-in. + * + * @author Vova Feldman + * @since 1.2.1.6 + */ + $this->skip_connection( null, fs_is_network_admin() ); + } else { + // Install must be activated via email since + // user with the same email already exist. + $this->_storage->is_pending_activation = true; + $this->_add_pending_activation_notice( $email, $is_pending_trial ); + } + + if ( ! empty( $license_key ) ) { + $this->_storage->pending_license_key = $license_key; + } + + // Remove the opt-in sticky notice. + $this->_admin_notices->remove_sticky( array( + 'connect_account', + 'trial_promotion', + ) ); + + $next_page = $this->get_after_activation_url( 'after_pending_connect_url' ); + + // Reload the page with with pending activation message. + if ( $redirect ) { + fs_redirect( $next_page ); + } + + return $next_page; + } + + /** + * Install plugin with current logged WP user info. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + function _install_with_current_user() { + $this->_logger->entrance(); + + if ( $this->is_registered() ) { + return; + } + + if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) && fs_request_is_post() ) { +// check_admin_referer( 'activate_existing_' . $this->_plugin->public_key ); + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.9 Add license key if given. + */ + $license_key = fs_request_get( 'license_secret_key' ); + + $this->install_with_current_user( $license_key ); + } + } + + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @param string|bool $license_key + * @param number|bool $trial_plan_id + * @param array $sites Since 2.0.0 + * @param bool $redirect + * + * @return object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install. + */ + private function install_with_current_user( + $license_key = false, + $trial_plan_id = false, + $sites = array(), + $redirect = true + ) { + // Get current logged WP user. + $current_user = self::_get_current_wp_user(); + + // Find the relevant FS user by the email. + $user = self::_get_user_by_email( $current_user->user_email ); + + return $this->install_with_user( $user, $license_key, $trial_plan_id, $redirect, true, $sites ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * @param string|bool $license_key + * @param number|bool $trial_plan_id + * @param bool $redirect + * @param bool $setup_account Since 2.0.0. When set to FALSE, executes a light installation without setting up the account as if it's the first opt-in. + * @param array $sites Since 2.0.0. If not empty, should be a collection of site details for the bulk install API request. + * + * @return \FS_Site|object|string If redirect is `false`, returns the next page the user should be redirected to, or the API error object if failed to install. If $setup_account is set to `false`, return the newly created install. + */ + private function install_with_user( + FS_User $user, + $license_key = false, + $trial_plan_id = false, + $redirect = true, + $setup_account = true, + $sites = array() + ) { + // We have to set the user before getting user scope API handler. + $this->_user = $user; + + // Install the plugin. + $result = $this->create_installs_with_user( + $user, + $license_key, + $trial_plan_id, + $sites, + $redirect + ); + + if ( ! $this->is_api_result_entity( $result ) && + ! $this->is_api_result_object( $result, 'installs' ) + ) { + // @todo Handler potential API error of the $result + } + + if ( empty( $sites ) ) { + $site = new FS_Site( $result ); + $this->_site = $site; + + if ( ! $setup_account ) { + $this->_store_site(); + + $this->sync_plan_if_not_exist( $site->plan_id ); + + if ( ! empty( $license_key ) && FS_Plugin_License::is_valid_id( $site->license_id ) ) { + $this->sync_license_if_not_exist( $site->license_id, $license_key ); + } + + $this->_admin_notices->remove_sticky( 'connect_account', false ); + + return $site; + } + + return $this->setup_account( $this->_user, $this->_site, $redirect ); + } else { + $installs = array(); + foreach ( $result->installs as $install ) { + $installs[] = new FS_Site( $install ); + } + + return $this->setup_network_account( + $user, + $installs, + $redirect + ); + } + } + + /** + * Initiate an API request to create a collection of installs. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * @param bool $license_key + * @param bool $trial_plan_id + * @param array $sites + * @param bool $redirect + * @param bool $silent + * + * @return object|mixed + */ + private function create_installs_with_user( + FS_User $user, + $license_key = false, + $trial_plan_id = false, + $sites = array(), + $redirect = false, + $silent = false + ) { + $extra_install_params = array( + 'uid' => $this->get_anonymous_id(), + 'is_disconnected' => false, + ); + + if ( ! empty( $license_key ) ) { + $extra_install_params['license_key'] = $this->apply_filters( 'license_key', $license_key ); + } else if ( FS_Plugin_Plan::is_valid_id( $trial_plan_id ) ) { + $extra_install_params['trial_plan_id'] = $trial_plan_id; + } + + if ( ! empty( $sites ) ) { + $extra_install_params['sites'] = $sites; + } + + $args = $this->get_install_data_for_api( $extra_install_params, false, false ); + + // Install the plugin. + $result = $this->get_api_user_scope_by_user( $user )->call( + "/plugins/{$this->get_id()}/installs.json", + 'post', + $args + ); + + if ( ! $this->is_api_result_entity( $result ) && + ! $this->is_api_result_object( $result, 'installs' ) + ) { + if ( ! empty( $args['license_key'] ) ) { + // Pass full the fully entered license key to the failure handler. + $args['license_key'] = $license_key; + } + + $result = $this->apply_filters( 'after_install_failure', $result, $args ); + + if ( ! $silent ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . + $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '<b>' . $result->error->message . '</b>', + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + } + + if ( $redirect ) { + /** + * We set the user before getting the user scope API handler, so the user became temporarily + * registered (`is_registered() = true`). Since the API returned an error and we will redirect, + * we have to set the user to `null`, otherwise, the user will be redirected to the wrong + * activation page based on the return value of `is_registered()`. In addition, in case the + * context plugin doesn't have a settings menu and the default page is the `Plugins` page, + * misleading plugin activation errors will be shown on the `Plugins` page. + * + * @author Leo Fajardo (@leorw) + */ + $this->_user = null; + + fs_redirect( $this->get_activation_url( array( 'error' => $result->error->message ) ) ); + } + } + + return $result; + } + + /** + * Tries to activate add-on account based on parent plugin info. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param Freemius $parent_fs + */ + private function _activate_addon_account( Freemius $parent_fs ) { + if ( $this->is_registered() ) { + // Already activated. + return; + } + + // Activate add-on with parent plugin credentials. + $addon_install = $parent_fs->get_api_site_scope()->call( + "/addons/{$this->_plugin->id}/installs.json", + 'post', + $this->get_install_data_for_api( array( + 'uid' => $this->get_anonymous_id(), + ), false, false ) + ); + + if ( isset( $addon_install->error ) ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . + $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '<b>' . $addon_install->error->message . '</b>', + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + + return; + } + + // Get user information based on parent's plugin. + $user = $parent_fs->get_user(); + + // First of all, set site and user info - otherwise we won't + // be able to invoke API calls. + $this->_site = new FS_Site( $addon_install ); + $this->_user = $user; + + // Sync add-on plans. + $this->_sync_plans(); + + // Get site's current plan. + //$this->_site->plan = $this->_get_plan_by_id( $this->_site->plan->id ); + + $this->_set_account( $user, $this->_site ); + + // Sync licenses. + $this->_sync_licenses(); + + // Try to activate premium license. + $this->_activate_license( true ); + } + + /** + * Tries to activate parent account based on add-on's info. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param Freemius $parent_fs + */ + private function activate_parent_account( Freemius $parent_fs ) { + if ( ! $this->is_addon() ) { + // This is not an add-on. + return; + } + + if ( $parent_fs->is_registered() ) { + // Already activated. + return; + } + + // Activate parent with add-on's user credentials. + $parent_install = $this->get_api_user_scope()->call( + "/plugins/{$parent_fs->_plugin->id}/installs.json", + 'post', + $parent_fs->get_install_data_for_api( array( + 'uid' => $parent_fs->get_anonymous_id(), + ), false, false ) + ); + + if ( isset( $parent_install->error ) ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Couldn\'t activate %s.', 'could-not-activate-x' ), $this->get_plugin_name() ) . ' ' . + $this->get_text_inline( 'Please contact us with the following message:', 'contact-us-with-error-message' ) . ' ' . '<b>' . $parent_install->error->message . '</b>', + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + + return; + } + + $parent_fs->_admin_notices->remove_sticky( 'connect_account' ); + + if ( $parent_fs->is_pending_activation() ) { + $parent_fs->_admin_notices->remove_sticky( 'activation_pending' ); + + unset( $parent_fs->_storage->is_pending_activation ); + } + + // Get user information based on parent's plugin. + $user = $this->get_user(); + + // First of all, set site info - otherwise we won't + // be able to invoke API calls. + $parent_fs->_site = new FS_Site( $parent_install ); + $parent_fs->_user = $user; + + // Sync add-on plans. + $parent_fs->_sync_plans(); + + $parent_fs->_set_account( $user, $parent_fs->_site ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Admin Menu Items + #---------------------------------------------------------------------------------- + + private $_menu_items = array(); + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.8 + * + * @return array + */ + function get_menu_items() { + return $this->_menu_items; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return string + */ + function get_menu_slug() { + return $this->_menu->get_slug(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function _prepare_admin_menu() { +// if ( ! $this->is_on() ) { +// return; +// } + + /** + * When running from a site admin with a network activated module and the connection + * was NOT delegated and the user still haven't skipped or opted-in, then hide the + * site level settings. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + $should_hide_site_admin_settings = ( + $this->_is_network_active && + ! fs_is_network_admin() && + ! $this->is_delegated_connection() && + ! $this->is_anonymous() && + ! $this->is_registered() + ); + + if ( ( ! $this->has_api_connectivity() && ! $this->is_enable_anonymous() ) || + $should_hide_site_admin_settings + ) { + $this->_menu->remove_menu_item( $should_hide_site_admin_settings ); + } else { + $this->do_action( fs_is_network_admin() ? + 'before_network_admin_menu_init' : + 'before_admin_menu_init' + ); + + $this->add_menu_action(); + + $this->add_network_menu_when_missing(); + + $this->add_submenu_items(); + } + } + + /** + * Admin dashboard menu items modifications. + * + * NOTE: admin_menu action executed before admin_init. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + */ + private function add_menu_action() { + if ( $this->is_activation_mode() ) { + if ( $this->is_plugin() || ( $this->has_settings_menu() && ! $this->is_free_wp_org_theme() ) ) { + $this->override_plugin_menu_with_activation(); + } else { + /** + * Handle theme opt-in when the opt-in form shows as a dialog box in the themes page. + */ + if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) ) { + add_action( 'load-themes.php', array( &$this, '_install_with_current_user' ) ); + } else if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) || + fs_request_get_bool( 'pending_activation' ) + ) { + add_action( 'load-themes.php', array( &$this, '_install_with_new_user' ) ); + } + } + } else { + if ( ! $this->is_registered() ) { + // If not registered try to install user. + if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) { + $this->_install_with_new_user(); + } + } else if ( + fs_request_is_action( 'sync_user' ) && + ( ! $this->has_settings_menu() || $this->is_free_wp_org_theme() ) + ) { + $this->_handle_account_user_sync(); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + */ + function _redirect_on_clicked_menu_link() { + $this->_logger->entrance(); + + $page = fs_request_get('page'); + $page = is_string($page) ? strtolower($page) : ''; + + $this->_logger->log( 'page = ' . $page ); + + foreach ( $this->_menu_items as $priority => $items ) { + foreach ( $items as $item ) { + if ( isset( $item['url'] ) ) { + if ( $page === $this->_menu->get_slug( strtolower( $item['menu_slug'] ) ) ) { + $this->_logger->log( 'Redirecting to ' . $item['url'] ); + + fs_redirect( $item['url'] ); + } + } + } + } + } + + /** + * Remove plugin's all admin menu items & pages, and replace with activation page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + */ + private function override_plugin_menu_with_activation() { + $this->_logger->entrance(); + + $hook = false; + + if ( ! $this->_menu->has_menu() ) { + // Add the opt-in page without a menu item. + $hook = FS_Admin_Menu_Manager::add_subpage( + null, + $this->get_plugin_name(), + $this->get_plugin_name(), + 'manage_options', + $this->_slug, + array( &$this, '_connect_page_render' ) + ); + } else if ( $this->_menu->is_top_level() ) { + if ( $this->_menu->is_override_exact() ) { + // Make sure the current page is matching the activation page. + if ( ! $this->is_matching_url( $this->get_activation_url() ) ) { + return; + } + } + + $hook = $this->_menu->override_menu_item( array( &$this, '_connect_page_render' ) ); + + if ( false === $hook ) { + // Create new menu item just for the opt-in. + $hook = FS_Admin_Menu_Manager::add_page( + $this->get_plugin_name(), + $this->get_plugin_name(), + 'manage_options', + $this->_menu->get_slug(), + array( &$this, '_connect_page_render' ) + ); + } + } else { + $menus = array( $this->_menu->get_parent_slug() ); + + if ( $this->_menu->is_override_exact() ) { + // Make sure the current page is matching the activation page. + if ( ! $this->is_matching_url( $this->get_activation_url() ) ) { + return; + } + } + + foreach ( $menus as $parent_slug ) { + $hook = $this->_menu->override_submenu_action( + $parent_slug, + $this->_menu->get_raw_slug(), + array( &$this, '_connect_page_render' ) + ); + + if ( false !== $hook ) { + // Found plugin's submenu item. + break; + } + } + } + + if ( $this->is_activation_page() ) { + // Clean admin page from distracting content. + self::_clean_admin_content_section(); + } + + if ( false !== $hook ) { + if ( fs_request_is_action( $this->get_unique_affix() . '_activate_existing' ) ) { + $this->_install_with_current_user(); + } else if ( fs_request_is_action( $this->get_unique_affix() . '_activate_new' ) ) { + $this->_install_with_new_user(); + } + } + } + + /** + * If a plugin was network activated and connected but don't have a network + * level settings, then add an artificial menu item for the Account and other + * Freemius settings. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private function add_network_menu_when_missing() { + $this->_logger->entrance(); + + if ( ! $this->_is_network_active ) { + // Plugin wasn't activated on the network level. + return; + } + + if ( ! fs_is_network_admin() ) { + // The context is not the network admin. + return; + } + + if ( $this->_menu->has_network_menu() ) { + // Plugin already has a network level menu. + return; + } + + if ( $this->is_network_activation_mode() ) { + /** + * Do not add during activation mode, otherwise, there will be duplicate menus while the opt-in + * screen is being shown. + * + * @author Leo Fajardo (@leorw) + */ + return; + } + + if ( ! WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED ) { + if ( $this->is_network_delegated_connection() ) { + // Super-admin delegated the connection to the site admins. + return; + } + } + + if ( ! $this->_menu->has_menu() || $this->_menu->is_top_level() ) { + $this->_dynamically_added_top_level_page_hook_name = $this->_menu->add_page_and_update( + $this->get_plugin_name(), + $this->get_plugin_name(), + 'manage_options', + $this->_menu->has_menu() ? $this->_menu->get_slug() : $this->_slug + ); + } else { + $this->_menu->add_subpage_and_update( + $this->_menu->get_parent_slug(), + $this->get_plugin_name(), + $this->get_plugin_name(), + 'manage_options', + $this->_menu->get_slug() + ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.1 + * + * return string + */ + function get_top_level_menu_capability() { + global $menu; + + $top_level_menu_slug = $this->get_top_level_menu_slug(); + + foreach ( $menu as $menu_info ) { + /** + * The second element in the menu info array is the capability/role that has access to the menu and the + * third element is the menu slug. + */ + if ( $menu_info[2] === $top_level_menu_slug ) { + return $menu_info[1]; + } + } + + return 'read'; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @return string + */ + private function get_top_level_menu_slug() { + return ( $this->is_addon() ? + $this->get_parent_instance()->_menu->get_top_level_menu_slug() : + $this->_menu->get_top_level_menu_slug() ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return string + */ + function get_pricing_cta_label() { + $label = $this->get_text_inline( 'Upgrade', 'upgrade' ); + + if ( $this->is_in_trial_promotion() && + ! $this->is_paying_or_trial() + ) { + // If running a trial promotion, modify the pricing to load the trial. + $label = $this->get_text_inline( 'Start Trial', 'start-trial' ); + } else if ( $this->is_paying() ) { + $label = $this->get_text_inline( 'Pricing', 'pricing' ); + } + + return $label; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + function is_pricing_page_visible() { + return ( + // Has at least one paid plan. + $this->has_paid_plan() && + // Didn't ask to hide the pricing page. + $this->is_page_visible( 'pricing' ) && + // Don't have a valid active license or has more than one plan. + ( ! $this->is_paying() || ! $this->is_single_plan() ) + ); + } + + /** + * Add default Freemius menu items. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * @since 1.2.2.7 Also add submenu items when running in a free .org theme so the tabs will be visible. + */ + private function add_submenu_items() { + $this->_logger->entrance(); + + $is_activation_mode = $this->is_activation_mode(); + + if ( $this->is_addon() ) { + // No submenu items for add-ons. + $add_submenu_items = false; + } else if ( $this->is_free_wp_org_theme() && ! fs_is_network_admin() ) { + // Also add submenu items when running in a free .org theme so the tabs will be visible. + $add_submenu_items = true; + } else if ( $is_activation_mode && ! $this->is_free_wp_org_theme() ) { + $add_submenu_items = false; + } else if ( fs_is_network_admin() ) { + /** + * Add submenu items to network level when plugin was network + * activated and the super-admin did NOT delegated the connection + * of all sites to site admins. + */ + $add_submenu_items = ( + $this->_is_network_active && + ( WP_FS__SHOW_NETWORK_EVEN_WHEN_DELEGATED || + ! $this->is_network_delegated_connection() ) + ); + } else { + $add_submenu_items = ( ! $this->_is_network_active || $this->is_delegated_connection() ); + } + + if ( $add_submenu_items ) { + if ( $this->has_affiliate_program() ) { + // Add affiliation page. + $this->add_submenu_item( + $this->get_text_inline( 'Affiliation', 'affiliation' ), + array( &$this, '_affiliation_page_render' ), + $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Affiliation', 'affiliation' ), + 'manage_options', + 'affiliation', + 'Freemius::_clean_admin_content_section', + WP_FS__DEFAULT_PRIORITY, + $this->is_submenu_item_visible( 'affiliation' ) + ); + } + } + + if ( $add_submenu_items || + ( $is_activation_mode && + $this->is_only_premium() && + $this->is_admin_page( 'account' ) && + fs_request_is_action( $this->get_unique_affix() . '_sync_license' ) + ) + ) { + if ( ! WP_FS__DEMO_MODE && $this->is_registered() ) { + $show_account = ( + $this->is_submenu_item_visible( 'account' ) && + /** + * @since 1.2.2.7 Don't show the Account for free WP.org themes without any paid plans. + */ + ( ! $this->is_free_wp_org_theme() || $this->has_paid_plan() ) + ); + + // Add user account page. + $this->add_submenu_item( + $this->get_text_inline( 'Account', 'account' ), + array( &$this, '_account_page_render' ), + $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Account', 'account' ), + 'manage_options', + 'account', + array( &$this, '_account_page_load' ), + WP_FS__DEFAULT_PRIORITY, + ( $add_submenu_items && $show_account ) + ); + } + } + + if ( $add_submenu_items ) { + // Add contact page. + $this->add_submenu_item( + $this->get_text_inline( 'Contact Us', 'contact-us' ), + array( &$this, '_contact_page_render' ), + $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Contact Us', 'contact-us' ), + 'manage_options', + 'contact', + 'Freemius::_clean_admin_content_section', + WP_FS__DEFAULT_PRIORITY, + $this->is_submenu_item_visible( 'contact' ) + ); + + if ( $this->has_addons() ) { + $this->add_submenu_item( + $this->get_text_inline( 'Add-Ons', 'add-ons' ), + array( &$this, '_addons_page_render' ), + $this->get_plugin_name() . ' – ' . $this->get_text_inline( 'Add-Ons', 'add-ons' ), + 'manage_options', + 'addons', + array( &$this, '_addons_page_load' ), + WP_FS__LOWEST_PRIORITY - 1, + $this->is_submenu_item_visible( 'addons' ) + ); + } + } + + if ( $add_submenu_items || + ( $is_activation_mode && $this->is_only_premium() && $this->is_admin_page( 'pricing' ) ) + ) { + if ( ! WP_FS__DEMO_MODE ) { + $show_pricing = ( + $this->is_submenu_item_visible( 'pricing' ) && + $this->is_pricing_page_visible() + ); + + $pricing_cta_text = $this->get_pricing_cta_label(); + $pricing_class = 'upgrade-mode'; + if ( $show_pricing ) { + if ( $this->is_in_trial_promotion() && + ! $this->is_paying_or_trial() + ) { + // If running a trial promotion, modify the pricing to load the trial. + $pricing_class = 'trial-mode'; + } else if ( $this->is_paying() ) { + $pricing_class = ''; + } + } + + // Add upgrade/pricing page. + $this->add_submenu_item( + $pricing_cta_text . ' ' . ( is_rtl() ? $this->get_text_x_inline( '←', 'ASCII arrow left icon', 'symbol_arrow-left' ) : $this->get_text_x_inline( '➤', 'ASCII arrow right icon', 'symbol_arrow-right' ) ), + array( &$this, '_pricing_page_render' ), + $this->get_plugin_name() . ' – ' . $this->get_text_x_inline( 'Pricing', 'noun', 'pricing' ), + 'manage_options', + 'pricing', + 'Freemius::_clean_admin_content_section', + WP_FS__LOWEST_PRIORITY, + ( $add_submenu_items && $show_pricing ), + $pricing_class + ); + } + } + + if ( 0 < count( $this->_menu_items ) ) { + if ( ! $this->_menu->is_top_level() ) { + fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + + // Append submenu items right after the plugin's submenu item. + $this->order_sub_submenu_items(); + } else { + // Append submenu items. + $this->embed_submenu_items(); + } + } + } + + /** + * Moved the actual submenu item additions to a separated function, + * in order to support sub-submenu items when the plugin's settings + * only have a submenu and not top-level menu item. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + */ + private function embed_submenu_items() { + $item_template = $this->_menu->is_top_level() ? + '<span class="fs-submenu-item %s %s %s">%s</span>' : + '<span class="fs-submenu-item fs-sub %s %s %s">%s</span>'; + + $top_level_menu_capability = $this->get_top_level_menu_capability(); + + ksort( $this->_menu_items ); + + $is_first_submenu_item = true; + + foreach ( $this->_menu_items as $priority => $items ) { + foreach ( $items as $item ) { + if ( $item['show_submenu'] && $is_first_submenu_item ) { + if ( $this->_is_network_active && ! empty( $this->_dynamically_added_top_level_page_hook_name ) ) { + $item['menu_slug'] = ''; + + $this->_menu->override_menu_item( $item['render_function'] ); + } + + $is_first_submenu_item = false; + } + + $capability = ( ! empty( $item['capability'] ) ? $item['capability'] : $top_level_menu_capability ); + + $menu_item = sprintf( + $item_template, + $this->get_unique_affix(), + $item['menu_slug'], + ! empty( $item['class'] ) ? $item['class'] : '', + $item['menu_title'] + ); + + $menu_slug = $this->_menu->get_slug( $item['menu_slug'] ); + + if ( ! isset( $item['url'] ) ) { + $hook = FS_Admin_Menu_Manager::add_subpage( + $item['show_submenu'] ? + $this->get_top_level_menu_slug() : + null, + $item['page_title'], + $menu_item, + $capability, + $menu_slug, + $item['render_function'] + ); + + if ( false !== $item['before_render_function'] ) { + add_action( "load-$hook", $item['before_render_function'] ); + } + } else { + FS_Admin_Menu_Manager::add_subpage( + $item['show_submenu'] ? + $this->get_top_level_menu_slug() : + null, + $item['page_title'], + $menu_item, + $capability, + $menu_slug, + array( $this, '' ) + ); + } + } + } + } + + /** + * Re-order the submenu items so all Freemius added new submenu items + * are added right after the plugin's settings submenu item. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + */ + private function order_sub_submenu_items() { + global $submenu; + + $menu_slug = $this->_menu->get_top_level_menu_slug(); + + /** + * Before "admin_menu" fires, WordPress will loop over the default submenus and remove pages for which the user + * does not have permissions. So in case a plugin does not have top-level menu but does have submenus under any + * of the default menus, only users that have the right role can access its sub-submenus (Account, Contact Us, + * Support Forum, etc.) since $submenu[ $menu_slug ] will be empty if the user doesn't have permission. + * + * In case a plugin does not have submenus under any of the default menus but does have submenus under the menu + * of another plugin, only users that have the right role can access its sub-submenus since we will use the + * capability needed to access the parent menu as the capability for the submenus that we will add. + */ + if ( empty( $submenu[ $menu_slug ] ) ) { + return; + } + + $top_level_menu = &$submenu[ $menu_slug ]; + + $all_submenu_items_after = array(); + + $found_submenu_item = false; + + foreach ( $top_level_menu as $submenu_id => $meta ) { + if ( $found_submenu_item ) { + // Remove all submenu items after the plugin's submenu item. + $all_submenu_items_after[] = $meta; + unset( $top_level_menu[ $submenu_id ] ); + } + + if ( $this->_menu->get_raw_slug() === $meta[2] ) { + // Found the submenu item, put all below. + $found_submenu_item = true; + continue; + } + } + + // Embed all plugin's new submenu items. + $this->embed_submenu_items(); + + // Start with specially high number to make sure it's appended. + $i = max( 10000, max( array_keys( $top_level_menu ) ) + 1 ); + foreach ( $all_submenu_items_after as $meta ) { + $top_level_menu[ $i ] = $meta; + $i ++; + } + + // Sort submenu items. + ksort( $top_level_menu ); + } + + /** + * Helper method to return the module's support forum URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return string + */ + function get_support_forum_url() { + return $this->apply_filters( 'support_forum_url', "https://wordpress.org/support/{$this->_module_type}/{$this->_slug}" ); + } + + /** + * Displays the Support Forum link when enabled. + * + * Can be filtered like so: + * + * function _fs_show_support_menu( $is_visible, $menu_id ) { + * if ( 'support' === $menu_id ) { + * return _fs->is_registered(); + * } + * return $is_visible; + * } + * _fs()->add_filter('is_submenu_visible', '_fs_show_support_menu', 10, 2); + * + */ + function _add_default_submenu_items() { + if ( ! $this->is_on() ) { + return; + } + + if ( ! $this->is_activation_mode() && + ( ( $this->_is_network_active && fs_is_network_admin() ) || + ( ! $this->_is_network_active && is_admin() ) ) + ) { + $this->add_submenu_link_item( + $this->apply_filters( 'support_forum_submenu', $this->get_text_inline( 'Support Forum', 'support-forum' ) ), + $this->get_support_forum_url(), + 'wp-support-forum', + null, + 50, + $this->is_submenu_item_visible( 'support' ) + ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param string $menu_title + * @param callable $render_function + * @param bool|string $page_title + * @param string $capability + * @param bool|string $menu_slug + * @param bool|callable $before_render_function + * @param int $priority + * @param bool $show_submenu + * @param string $class Since 1.2.1.5 can add custom classes to menu items. + */ + function add_submenu_item( + $menu_title, + $render_function, + $page_title = false, + $capability = 'manage_options', + $menu_slug = false, + $before_render_function = false, + $priority = WP_FS__DEFAULT_PRIORITY, + $show_submenu = true, + $class = '' + ) { + $this->_logger->entrance( 'Title = ' . $menu_title ); + + if ( $this->is_addon() ) { + $parent_fs = $this->get_parent_instance(); + + if ( is_object( $parent_fs ) ) { + $parent_fs->add_submenu_item( + $menu_title, + $render_function, + $page_title, + $capability, + $menu_slug, + $before_render_function, + $priority, + $show_submenu, + $class + ); + + return; + } + } + + if ( ! isset( $this->_menu_items[ $priority ] ) ) { + $this->_menu_items[ $priority ] = array(); + } + + $this->_menu_items[ $priority ][] = array( + 'page_title' => is_string( $page_title ) ? $page_title : $menu_title, + 'menu_title' => $menu_title, + 'capability' => $capability, + 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), + 'render_function' => $render_function, + 'before_render_function' => $before_render_function, + 'show_submenu' => $show_submenu, + 'class' => $class, + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param string $menu_title + * @param string $url + * @param bool $menu_slug + * @param string $capability + * @param int $priority + * @param bool $show_submenu + */ + function add_submenu_link_item( + $menu_title, + $url, + $menu_slug = false, + $capability = 'read', + $priority = WP_FS__DEFAULT_PRIORITY, + $show_submenu = true + ) { + $this->_logger->entrance( 'Title = ' . $menu_title . '; Url = ' . $url ); + + if ( $this->is_addon() ) { + $parent_fs = $this->get_parent_instance(); + + if ( is_object( $parent_fs ) ) { + $parent_fs->add_submenu_link_item( + $menu_title, + $url, + $menu_slug, + $capability, + $priority, + $show_submenu + ); + + return; + } + } + + if ( ! isset( $this->_menu_items[ $priority ] ) ) { + $this->_menu_items[ $priority ] = array(); + } + + $this->_menu_items[ $priority ][] = array( + 'menu_title' => $menu_title, + 'capability' => $capability, + 'menu_slug' => is_string( $menu_slug ) ? $menu_slug : strtolower( $menu_title ), + 'url' => $url, + 'page_title' => $menu_title, + 'render_function' => 'fs_dummy', + 'before_render_function' => '', + 'show_submenu' => $show_submenu, + ); + } + + #endregion ------------------------------------------------------------------ + + + #-------------------------------------------------------------------------------- + #region Actions / Hooks / Filters + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param string $tag + * + * @return string + */ + public function get_action_tag( $tag ) { + return self::get_action_tag_static( $tag, $this->_slug, $this->is_plugin() ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param string $tag + * @param string $slug + * @param bool $is_plugin + * + * @return string + */ + static function get_action_tag_static( $tag, $slug = '', $is_plugin = true ) { + $action = "fs_{$tag}"; + + if ( ! empty( $slug ) ) { + $action .= '_' . self::get_module_unique_affix( $slug, $is_plugin ); + } + + return $action; + } + + /** + * Returns a string that can be used to generate a unique action name, + * option name, HTML element ID, or HTML element class. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return string + */ + public function get_unique_affix() { + return self::get_module_unique_affix( $this->_slug, $this->is_plugin() ); + } + + /** + * Returns a string that can be used to generate a unique action name, + * option name, HTML element ID, or HTML element class. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.5 + * + * @param string $slug + * @param bool $is_plugin + * + * @return string + */ + static function get_module_unique_affix( $slug, $is_plugin = true ) { + $affix = $slug; + + if ( ! $is_plugin ) { + $affix .= '-' . WP_FS__MODULE_TYPE_THEME; + } + + return $affix; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * @since 1.2.2.5 The AJAX action names are based on the module ID, not like the non-AJAX actions that are + * based on the slug for backward compatibility. + * + * @param string $tag + * + * @return string + */ + function get_ajax_action( $tag ) { + return self::get_ajax_action_static( $tag, $this->_module_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $tag + * + * @return string + */ + function get_ajax_security( $tag ) { + return wp_create_nonce( $this->get_ajax_action( $tag ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $tag + */ + function check_ajax_referer( $tag ) { + check_ajax_referer( $this->get_ajax_action( $tag ), 'security' ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * @since 1.2.2.5 The AJAX action names are based on the module ID, not like the non-AJAX actions that are + * based on the slug for backward compatibility. + * + * @param string $tag + * @param number|null $module_id + * + * @return string + */ + private static function get_ajax_action_static( $tag, $module_id = null ) { + $action = "fs_{$tag}"; + + if ( ! empty( $module_id ) ) { + $action .= "_{$module_id}"; + } + + return $action; + } + + /** + * Do action, specific for the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param string $tag The name of the action to be executed. + * @param mixed $arg,... Optional. Additional arguments which are passed on to the + * functions hooked to the action. Default empty. + * + * @uses do_action() + */ + function do_action( $tag, $arg = '' ) { + $this->_logger->entrance( $tag ); + + $args = func_get_args(); + + call_user_func_array( 'do_action', array_merge( + array( $this->get_action_tag( $tag ) ), + array_slice( $args, 1 ) ) + ); + } + + /** + * Add action, specific for the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param string $tag + * @param callable $function_to_add + * @param int $priority + * @param int $accepted_args + * + * @uses add_action() + */ + function add_action( + $tag, + $function_to_add, + $priority = WP_FS__DEFAULT_PRIORITY, + $accepted_args = 1 + ) { + $this->_logger->entrance( $tag ); + + add_action( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); + } + + /** + * Add AJAX action, specific for the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @param string $tag + * @param callable $function_to_add + * @param int $priority + * + * @uses add_action() + * + * @return bool True if action added, false if no need to add the action since the AJAX call isn't matching. + */ + function add_ajax_action( + $tag, + $function_to_add, + $priority = WP_FS__DEFAULT_PRIORITY + ) { + $this->_logger->entrance( $tag ); + + return self::add_ajax_action_static( + $tag, + $function_to_add, + $priority, + $this->_module_id + ); + } + + /** + * Add AJAX action. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param string $tag + * @param callable $function_to_add + * @param int $priority + * @param number|null $module_id + * + * @return bool True if action added, false if no need to add the action since the AJAX call isn't matching. + * @uses add_action() + * + */ + static function add_ajax_action_static( + $tag, + $function_to_add, + $priority = WP_FS__DEFAULT_PRIORITY, + $module_id = null + ) { + self::$_static_logger->entrance( $tag ); + + if ( ! self::is_ajax_action_static( $tag, $module_id ) ) { + return false; + } + + add_action( + 'wp_ajax_' . self::get_ajax_action_static( $tag, $module_id ), + $function_to_add, + $priority, + 0 + ); + + self::$_static_logger->info( "$tag AJAX callback action added." ); + + return true; + } + + /** + * Send a JSON response back to an Ajax request. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $response + */ + static function shoot_ajax_response( $response ) { + wp_send_json( $response ); + } + + /** + * Send a JSON response back to an Ajax request, indicating success. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $data Data to encode as JSON, then print and exit. + */ + static function shoot_ajax_success( $data = null ) { + wp_send_json_success( $data ); + } + + /** + * Send a JSON response back to an Ajax request, indicating failure. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $error Optional error message. + */ + static function shoot_ajax_failure( $error = '' ) { + $result = array( 'success' => false ); + if ( ! empty( $error ) ) { + $result['error'] = $error; + } + + wp_send_json( $result ); + } + + /** + * Apply filter, specific for the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $tag The name of the filter hook. + * @param mixed $value The value on which the filters hooked to `$tag` are applied on. + * + * @return mixed The filtered value after all hooked functions are applied to it. + * + * @uses apply_filters() + */ + function apply_filters( $tag, $value ) { + $this->_logger->entrance( $tag ); + + $args = func_get_args(); + array_unshift( $args, $this->get_unique_affix() ); + + return call_user_func_array( 'fs_apply_filter', $args ); + } + + /** + * Add filter, specific for the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $tag + * @param callable $function_to_add + * @param int $priority + * @param int $accepted_args + * + * @uses add_filter() + */ + function add_filter( $tag, $function_to_add, $priority = WP_FS__DEFAULT_PRIORITY, $accepted_args = 1 ) { + $this->_logger->entrance( $tag ); + + add_filter( $this->get_action_tag( $tag ), $function_to_add, $priority, $accepted_args ); + } + + /** + * Check if has filter. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + * + * @param string $tag + * @param callable|bool $function_to_check Optional. The callback to check for. Default false. + * + * @return false|int + * + * @uses has_filter() + */ + function has_filter( $tag, $function_to_check = false ) { + $this->_logger->entrance( $tag ); + + return has_filter( $this->get_action_tag( $tag ), $function_to_check ); + } + + #endregion + + /** + * Override default i18n text phrases. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string[] string $key_value + * + * @uses fs_override_i18n() + */ + function override_i18n( $key_value ) { + fs_override_i18n( $key_value, $this->_slug ); + } + + /* Account Page + ------------------------------------------------------------------------------------------------------------------*/ + /** + * Update site information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param bool $store Flush to Database if true. + * @param null|int $network_level_or_blog_id Since 2.0.0 + * @param \FS_Site $site Since 2.0.0 + */ + private function _store_site( $store = true, $network_level_or_blog_id = null, FS_Site $site = null ) { + $this->_logger->entrance(); + + if ( empty( $this->_site->id ) ) { + $this->_logger->error( "Empty install ID, can't store site." ); + + return; + } + + $site_clone = is_object( $site ) ? $site : $this->_site; + $encrypted_site = clone $site_clone; + + $sites = self::get_all_sites( $this->_module_type, $network_level_or_blog_id ); + + $prev_stored_user_id = $this->_storage->get( 'prev_user_id', false, $network_level_or_blog_id ); + + if ( empty( $prev_stored_user_id ) && + $this->_user->id != $this->_site->user_id + ) { + /** + * Store the current user ID as the previous user ID so that the previous user can be used + * as the install's owner while the new owner's details are not yet available. + * + * This will be executed only in the `replica` site. For example, there are 2 sites, namely `original` + * and `replica`, then an ownership change was initiated and completed in the `original`, the `replica` + * will be using the previous user until it is updated again (e.g.: until the next clone of `original` + * into `replica`. + * + * @author Leo Fajardo (@leorw) + */ + $this->_storage->store( 'prev_user_id', $sites[ $this->_slug ]->user_id, $network_level_or_blog_id ); + } + + $sites[ $this->_slug ] = $encrypted_site; + + $this->set_account_option( 'sites', $sites, $store, $network_level_or_blog_id ); + } + + /** + * Update plugin's plans information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @param bool $store Flush to Database if true. + */ + private function _store_plans( $store = true ) { + $this->_logger->entrance(); + + $plans = self::get_all_plans( $this->_module_type ); + + // Copy plans. + $encrypted_plans = array(); + for ( $i = 0, $len = count( $this->_plans ); $i < $len; $i ++ ) { + $encrypted_plans[] = self::_encrypt_entity( $this->_plans[ $i ] ); + } + + $plans[ $this->_slug ] = $encrypted_plans; + + $this->set_account_option( 'plans', $plans, $store ); + } + + /** + * Update user's plugin licenses. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool $store + * @param number|bool $module_id + * @param FS_Plugin_License[] $licenses + */ + private function _store_licenses( $store = true, $module_id = false, $licenses = array() ) { + $this->_logger->entrance(); + + $all_licenses = self::get_all_licenses(); + + if ( ! FS_Plugin::is_valid_id( $module_id ) ) { + $module_id = $this->_module_id; + + $user_licenses = is_array( $this->_licenses ) ? + $this->_licenses : + array(); + + if ( empty( $user_licenses ) ) { + // If the context user doesn't have any license, don't update the licenses collection. + return; + } + + $new_user_licenses_map = array(); + foreach ( $user_licenses as $user_license ) { + $new_user_licenses_map[ $user_license->id ] = $user_license; + } + + self::store_user_id_license_ids_map( array_keys( $new_user_licenses_map ), $this->_module_id, $this->_user->id ); + + // Update user licenses. + $licenses_to_update_count = count( $new_user_licenses_map ); + foreach ( $all_licenses[ $module_id ] as $key => $license ) { + if ( 0 === $licenses_to_update_count ) { + break; + } + + if ( isset( $new_user_licenses_map[ $license->id ] ) ) { + // Update license. + $all_licenses[ $module_id ][ $key ] = $new_user_licenses_map[ $license->id ]; + unset( $new_user_licenses_map[ $license->id ] ); + + $licenses_to_update_count --; + } + } + + if ( ! empty( $new_user_licenses_map ) ) { + // Add new licenses. + $all_licenses[ $module_id ] = array_merge( array_values( $new_user_licenses_map ), $all_licenses[ $module_id ] ); + } + + $licenses = $all_licenses[ $module_id ]; + } + + if ( ! isset( $all_licenses[ $module_id ] ) ) { + $all_licenses[ $module_id ] = array(); + } + + $all_licenses[ $module_id ] = $licenses; + + self::$_accounts->set_option( 'all_licenses', $all_licenses, $store ); + } + + /** + * Update user information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param bool $store Flush to Database if true. + */ + private function _store_user( $store = true ) { + $this->_logger->entrance(); + + if ( empty( $this->_user->id ) ) { + $this->_logger->error( "Empty user ID, can't store user." ); + + return; + } + + $users = self::get_all_users(); + $users[ $this->_user->id ] = $this->_user; + self::$_accounts->set_option( 'users', $users, $store ); + } + + /** + * Update new updates information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param FS_Plugin_Tag|null $update + * @param bool $store Flush to Database if true. + * @param bool|number $plugin_id + */ + private function _store_update( $update, $store = true, $plugin_id = false ) { + $this->_logger->entrance(); + + if ( $update instanceof FS_Plugin_Tag ) { + $update->updated = time(); + } + + if ( ! is_numeric( $plugin_id ) ) { + $plugin_id = $this->_plugin->id; + } + + $updates = self::get_all_updates(); + $updates[ $plugin_id ] = $update; + self::$_accounts->set_option( 'updates', $updates, $store ); + } + + /** + * Update new updates information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param FS_Plugin[] $plugin_addons + * @param bool $store Flush to Database if true. + */ + private function _store_addons( $plugin_addons, $store = true ) { + $this->_logger->entrance(); + + $addons = self::get_all_addons(); + $addons[ $this->_plugin->id ] = $plugin_addons; + self::$_accounts->set_option( 'addons', $addons, $store ); + } + + /** + * Delete plugin's associated add-ons. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.8 + * + * @param bool $store + * + * @return bool + */ + private function _delete_account_addons( $store = true ) { + $all_addons = self::get_all_account_addons(); + + if ( ! isset( $all_addons[ $this->_plugin->id ] ) ) { + return false; + } + + unset( $all_addons[ $this->_plugin->id ] ); + + self::$_accounts->set_option( 'account_addons', $all_addons, $store ); + + return true; + } + + /** + * Update account add-ons list. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param FS_Plugin[] $addons + * @param bool $store Flush to Database if true. + */ + private function _store_account_addons( $addons, $store = true ) { + $this->_logger->entrance(); + + $all_addons = self::get_all_account_addons(); + $all_addons[ $this->_plugin->id ] = $addons; + self::$_accounts->set_option( 'account_addons', $all_addons, $store ); + } + + /** + * Store account params in the Database. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.1 + * + * @param null|int $blog_id Since 2.0.0 + */ + private function _store_account( $blog_id = null ) { + $this->_logger->entrance(); + + $this->_store_site( false, $blog_id ); + $this->_store_user( false ); + $this->_store_plans( false ); + $this->_store_licenses( false ); + + self::$_accounts->store( $blog_id ); + } + + /** + * Sync user's information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * @uses FS_Api + */ + private function _handle_account_user_sync() { + $this->_logger->entrance(); + + $api = $this->get_api_user_scope(); + + // Get user's information. + $user = $api->get( '/', true ); + + if ( isset( $user->id ) ) { + $this->_user->first = $user->first; + $this->_user->last = $user->last; + $this->_user->email = $user->email; + + $is_menu_item_account_visible = $this->is_submenu_item_visible( 'account' ); + + if ( $user->is_verified && + ( ! isset( $this->_user->is_verified ) || false === $this->_user->is_verified ) + ) { + $this->_user->is_verified = true; + + $this->do_action( 'account_email_verified', $user->email ); + + $this->_admin_notices->add( + $this->get_text_inline( 'Your email has been successfully verified - you are AWESOME!', 'email-verified-message' ), + $this->get_text_x_inline( 'Right on', 'a positive response', 'right-on' ) . '!', + 'success', + // Make admin sticky if account menu item is invisible, + // since the page will be auto redirected to the plugin's + // main settings page, and the non-sticky message + // will disappear. + ! $is_menu_item_account_visible, + 'email_verified' + ); + } + + // Flush user details to DB. + $this->_store_user(); + + $this->do_action( 'after_account_user_sync', $user ); + + /** + * If account menu item is hidden, redirect to plugin's main settings page. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @link https://github.com/Freemius/wordpress-sdk/issues/6 + */ + if ( ! $is_menu_item_account_visible ) { + fs_redirect( $this->_get_admin_page_url() ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * @uses FS_Api + * + * @param number|bool $license_id + * + * @return FS_Subscription|object|bool + */ + private function _fetch_site_license_subscription( $license_id = false ) { + $this->_logger->entrance(); + $api = $this->get_api_site_scope(); + + if ( ! is_numeric( $license_id ) ) { + $license_id = $this->_license->id; + } + + $result = $api->get( "/licenses/{$license_id}/subscriptions.json", true ); + + return ! isset( $result->error ) ? + ( ( is_array( $result->subscriptions ) && 0 < count( $result->subscriptions ) ) ? + new FS_Subscription( $result->subscriptions[0] ) : + false + ) : + $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * @uses FS_Api + * + * @param number|bool $plan_id + * + * @return FS_Plugin_Plan|object + */ + private function _fetch_site_plan( $plan_id = false ) { + $this->_logger->entrance(); + $api = $this->get_api_site_scope(); + + if ( ! is_numeric( $plan_id ) ) { + $plan_id = $this->_site->plan_id; + } + + $plan = $api->get( "/plans/{$plan_id}.json", true ); + + return ! isset( $plan->error ) ? new FS_Plugin_Plan( $plan ) : $plan; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * @uses FS_Api + * + * @return FS_Plugin_Plan[]|object + */ + private function _fetch_plugin_plans() { + $this->_logger->entrance(); + $api = $this->get_current_or_network_user_api_scope(); + + /** + * @since 1.2.3 When running in DEV mode, retrieve pending plans as well. + */ + $result = $api->get( $this->add_show_pending( "/plugins/{$this->_module_id}/plans.json" ), true ); + + if ( $this->is_api_result_object( $result, 'plans' ) && is_array( $result->plans ) ) { + for ( $i = 0, $len = count( $result->plans ); $i < $len; $i ++ ) { + $result->plans[ $i ] = new FS_Plugin_Plan( $result->plans[ $i ] ); + } + + $result = $result->plans; + } + + return $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $plan_id + * + * @return \FS_Plugin_Plan|object + */ + private function fetch_plan_by_id( $plan_id ) { + $this->_logger->entrance(); + $api = $this->get_current_or_network_user_api_scope(); + + $result = $api->get( "/plugins/{$this->_module_id}/plans/{$plan_id}.json", true ); + + return $this->is_api_result_entity( $result ) ? + new FS_Plugin_Plan( $result ) : + $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * @uses FS_Api + * + * @param number|bool $plugin_id + * @param number|bool $site_license_id + * @param array $foreign_licenses @since 2.0.0. This is used by network-activated plugins. + * @param number|null $blog_id + * + * @return FS_Plugin_License[]|object + */ + private function _fetch_licenses( + $plugin_id = false, + $site_license_id = false, + $foreign_licenses = array(), + $blog_id = null + ) { + $this->_logger->entrance(); + + $api = $this->get_api_user_scope(); + + if ( ! is_numeric( $plugin_id ) ) { + $plugin_id = $this->_plugin->id; + } + + $user_licenses_endpoint = "/plugins/{$plugin_id}/licenses.json"; + if ( ! empty ( $foreign_licenses ) ) { + $foreign_licenses = array( + // Prefix with `+` to tell the server to include foreign licenses in the licenses collection. + 'ids' => ( urlencode( '+' ) . implode( ',', $foreign_licenses['ids'] ) ), + 'license_keys' => implode( ',', array_map( 'urlencode', $foreign_licenses['license_keys'] ) ) + ); + + $user_licenses_endpoint = add_query_arg( $foreign_licenses, $user_licenses_endpoint ); + } + + $result = $api->get( $user_licenses_endpoint, true ); + + $is_site_license_synced = false; + + $api_errors = array(); + + if ( $this->is_api_result_object( $result, 'licenses' ) && + is_array( $result->licenses ) + ) { + for ( $i = 0, $len = count( $result->licenses ); $i < $len; $i ++ ) { + $result->licenses[ $i ] = new FS_Plugin_License( $result->licenses[ $i ] ); + + if ( ( ! $is_site_license_synced ) && is_numeric( $site_license_id ) ) { + $is_site_license_synced = ( $site_license_id == $result->licenses[ $i ]->id ); + } + } + + $result = $result->licenses; + } else { + $api_errors[] = $result; + $result = array(); + } + + if ( ! $is_site_license_synced ) { + if ( ! is_null( $blog_id ) ) { + /** + * If blog ID is not null, the request is for syncing of the license of a single site via the + * network-level "Account" page. + * + * @author Leo Fajardo (@leorw) + */ + $this->switch_to_blog( $blog_id ); + } + + $api = $this->get_api_site_scope(); + + if ( is_numeric( $site_license_id ) ) { + // Try to retrieve a foreign license that is linked to the install. + $api_result = $api->call( '/licenses.json' ); + + if ( $this->is_api_result_object( $api_result, 'licenses' ) && + is_array( $api_result->licenses ) + ) { + $licenses = $api_result->licenses; + + if ( ! empty( $licenses ) ) { + $result[] = new FS_Plugin_License( $licenses[0] ); + } + } else { + $api_errors[] = $api_result; + } + } else if ( is_object( $this->_license ) ) { + $is_license_in_result = false; + if ( ! empty( $result ) ) { + foreach ( $result as $license ) { + if ( $license->id == $this->_license->id ) { + $is_license_in_result = true; + break; + } + } + } + + if ( ! $is_license_in_result ) { + // Fetch foreign license by ID and license key. + $license = $api->get( "/licenses/{$this->_license->id}.json?license_key=" . + urlencode( $this->_license->secret_key ) ); + + if ( $this->is_api_result_entity( $license ) ) { + $result[] = new FS_Plugin_License( $license ); + } else { + $api_errors[] = $license; + } + } + } + + if ( ! is_null( $blog_id ) ) { + $this->switch_to_blog( $this->_storage->network_install_blog_id ); + } + } + + if ( is_array( $result ) && 0 < count( $result ) ) { + // If found at least one license, return license collection even if there are errors. + return $result; + } + + if ( ! empty( $api_errors ) ) { + // If found any errors and no licenses, return first error. + return $api_errors[0]; + } + + // Fallback to empty licenses list. + return $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param number $license_id + * @param string $license_key + * + * @return \FS_Plugin_License|object + */ + private function fetch_license_by_key( $license_id, $license_key ) { + $this->_logger->entrance(); + + $api = $this->get_current_or_network_user_api_scope(); + + $result = $api->get( "/licenses/{$license_id}.json?license_key=" . urlencode( $license_key ) ); + + return $this->is_api_result_entity( $result ) ? + new FS_Plugin_License( $result ) : + $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * @uses FS_Api + * + * @param number|bool $plugin_id + * @param bool $flush + * + * @return FS_Payment[]|object + */ + function _fetch_payments( $plugin_id = false, $flush = false ) { + $this->_logger->entrance(); + + $api = $this->get_api_user_scope(); + + if ( ! is_numeric( $plugin_id ) ) { + $plugin_id = $this->_plugin->id; + } + + $result = $api->get( "/plugins/{$plugin_id}/payments.json?include_addons=true", $flush ); + + if ( ! isset( $result->error ) ) { + for ( $i = 0, $len = count( $result->payments ); $i < $len; $i ++ ) { + $result->payments[ $i ] = new FS_Payment( $result->payments[ $i ] ); + } + $result = $result->payments; + } + + return $result; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * @uses FS_Api + * + * @param bool $flush + * + * @return \FS_Billing|mixed + */ + function _fetch_billing( $flush = false ) { + require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-billing.php'; + + $billing = $this->get_api_user_scope()->get( 'billing.json', $flush ); + + if ( $this->is_api_result_entity( $billing ) ) { + $billing = new FS_Billing( $billing ); + } + + return $billing; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param FS_Plugin_License[] $licenses + * @param number $module_id + */ + private function _update_licenses( $licenses, $module_id ) { + $this->_logger->entrance(); + + if ( is_array( $licenses ) ) { + for ( $i = 0, $len = count( $licenses ); $i < $len; $i ++ ) { + $licenses[ $i ]->updated = time(); + } + } + + $this->_store_licenses( true, $module_id, $licenses ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool|number $plugin_id + * @param bool $flush Since 1.1.7.3 + * @param int $expiration Since 1.2.2.7 + * + * @return object|false New plugin tag info if exist. + */ + private function _fetch_newer_version( $plugin_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { + $latest_tag = $this->_fetch_latest_version( $plugin_id, $flush, $expiration ); + + if ( ! is_object( $latest_tag ) ) { + return false; + } + + // Check if version is actually newer. + $has_new_version = + // If it's an non-installed add-on then always return latest. + ( $this->_is_addon_id( $plugin_id ) && ! $this->is_addon_activated( $plugin_id ) ) || + // Compare versions. + version_compare( $this->get_plugin_version(), $latest_tag->version, '<' ); + + $this->_logger->departure( $has_new_version ? 'Found newer plugin version ' . $latest_tag->version : 'No new version' ); + + return $has_new_version ? $latest_tag : false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool|number $plugin_id + * @param bool $flush Since 1.1.7.3 + * @param int $expiration Since 1.2.2.7 + * + * @return bool|FS_Plugin_Tag + */ + function get_update( $plugin_id = false, $flush = true, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { + $this->_logger->entrance(); + + if ( ! is_numeric( $plugin_id ) ) { + $plugin_id = $this->_plugin->id; + } + + $this->check_updates( true, $plugin_id, $flush, $expiration ); + $updates = $this->get_all_updates(); + + return isset( $updates[ $plugin_id ] ) && is_object( $updates[ $plugin_id ] ) ? $updates[ $plugin_id ] : false; + } + + /** + * Check if site assigned with active license. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @deprecated Please use has_active_valid_license() instead because license can be cancelled. + */ + function has_active_license() { + return ( + is_object( $this->_license ) && + is_numeric( $this->_license->id ) && + ! $this->_license->is_expired() + ); + } + + /** + * Check if site assigned with active & valid (not expired) license. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + */ + function has_active_valid_license() { + return self::is_active_valid_license( $this->_license ); + } + + /** + * Check if a given license is active & valid (not expired). + * + * @author Vova Feldman (@svovaf) + * @since 2.1.3 + * + * @param FS_Plugin_License $license + * + * @return bool + */ + private static function is_active_valid_license( $license ) { + return ( + is_object( $license ) && + FS_Plugin_License::is_valid_id( $license->id ) && + $license->is_active() && + $license->is_valid() + ); + } + + /** + * Checks if there's any site that is associated with an active & valid license. + * This logic is used to determine if the admin can download the premium code base from a network level admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.3 + * + * @return bool + */ + function has_any_active_valid_license() { + if ( ! fs_is_network_admin() ) { + return $this->has_active_valid_license(); + } + + $installs = $this->get_blog_install_map(); + $all_plugin_licenses = self::get_all_licenses( $this->_module_id ); + + foreach ( $installs as $blog_id => $install ) { + if ( ! FS_Plugin_License::is_valid_id( $install->license_id ) ) { + continue; + } + + foreach ( $all_plugin_licenses as $license ) { + if ( $license->id == $install->license_id ) { + if ( self::is_active_valid_license( $license ) ) { + return true; + } + } + } + } + + return false; + } + + /** + * Check if site assigned with license with enabled features. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function has_features_enabled_license() { + return ( + is_object( $this->_license ) && + is_numeric( $this->_license->id ) && + $this->_license->is_features_enabled() + ); + } + + /** + * Check if user is a trial or have feature enabled license. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @return bool + */ + function can_use_premium_code() { + return $this->is_trial() || $this->has_features_enabled_license(); + } + + /** + * Checks if the current user can activate plugins or switch themes. Note that this method should only be used + * after the `init` action is triggered because it is using `current_user_can()` which is only functional after + * the context user is authenticated. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @return bool + */ + function is_user_admin() { + /** + * Require a super-admin when network activated, running from the network level OR if + * running from the site level but not delegated the opt-in. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + if ( $this->_is_network_active && + ( fs_is_network_admin() || ! $this->is_delegated_connection() ) + ) { + return is_super_admin(); + } + + return ( $this->is_plugin() && current_user_can( is_multisite() ? 'manage_options' : 'activate_plugins' ) ) + || ( $this->is_theme() && current_user_can( 'switch_themes' ) ); + } + + /** + * Sync site's plan. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @uses FS_Api + * + * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by + * the admin. + * @param bool $is_context_single_site @since 2.0.0. This is used when syncing a license for a single install from the + * network-level "Account" page. + */ + private function _sync_license( $background = false, $is_context_single_site = false ) { + $this->_logger->entrance(); + + $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); + + $is_addon_sync = ( ! $this->_plugin->is_addon() && $plugin_id != $this->get_id() ); + + if ( $is_addon_sync ) { + $this->_sync_addon_license( $plugin_id, $background ); + } else { + $this->_sync_plugin_license( $background, true, $is_context_single_site ); + } + + $this->do_action( 'after_account_plan_sync', $this->get_plan_name() ); + } + + /** + * Sync plugin's add-on license. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * @uses FS_Api + * + * @param number $addon_id + * @param bool $background + */ + private function _sync_addon_license( $addon_id, $background ) { + $this->_logger->entrance(); + + if ( $this->is_addon_activated( $addon_id ) ) { + // If already installed, use add-on sync. + $fs_addon = self::get_instance_by_id( $addon_id ); + $fs_addon->_sync_license( $background ); + + return; + } + + // Validate add-on exists. + $addon = $this->get_addon( $addon_id ); + + if ( ! is_object( $addon ) ) { + return; + } + + // Add add-on into account add-ons. + $account_addons = $this->get_account_addons(); + if ( ! is_array( $account_addons ) ) { + $account_addons = array(); + } + $account_addons[] = $addon->id; + $account_addons = array_unique( $account_addons ); + $this->_store_account_addons( $account_addons ); + + // Load add-on licenses. + $licenses = $this->_fetch_licenses( $addon->id ); + + // Sync add-on licenses. + if ( $this->is_array_instanceof( $licenses, 'FS_Plugin_License' ) ) { + $this->_update_licenses( $licenses, $addon->id ); + + if ( ! $this->is_addon_installed( $addon->id ) && FS_License_Manager::has_premium_license( $licenses ) ) { + $plans_result = $this->get_api_site_or_plugin_scope()->get( $this->add_show_pending( "/addons/{$addon_id}/plans.json" ) ); + + if ( ! isset( $plans_result->error ) ) { + $plans = array(); + foreach ( $plans_result->plans as $plan ) { + $plans[] = new FS_Plugin_Plan( $plan ); + } + + $this->_admin_notices->add_sticky( + sprintf( + ( FS_Plan_Manager::instance()->has_free_plan( $plans ) ? + $this->get_text_inline( 'Your %s Add-on plan was successfully upgraded.', 'addon-successfully-upgraded-message' ) : + /* translators: %s:product name, e.g. Facebook add-on was successfully... */ + $this->get_text_inline( '%s Add-on was successfully purchased.', 'addon-successfully-purchased-message' ) ), + $addon->title + ) . ' ' . $this->get_latest_download_link( + $this->get_text_inline( 'Download the latest version', 'download-latest-version' ), + $addon_id + ), + 'addon_plan_upgraded_' . $addon->slug, + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + } + } + } + } + + /** + * Sync site's plugin plan. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * @uses FS_Api + * + * @param bool $background Hints the method if it's a background sync. If false, it means that was initiated by the admin. + * @param bool $send_installs_update Since 2.0.0 + * @param bool $is_context_single_site Since 2.0.0. This is used when sending an update for a single install and + * syncing its license from the network-level "Account" page (e.g.: after + * activating a license only for the single install). + */ + private function _sync_plugin_license( + $background = false, + $send_installs_update = true, + $is_context_single_site = false + ) { + $this->_logger->entrance(); + + $plan_change = 'none'; + + $is_site_level_sync = ( $is_context_single_site || fs_is_blog_admin() || ! $this->_is_network_active ); + + if ( ! $send_installs_update ) { + $site = $this->_site; + } else { + /** + * Sync site info. + * + * @todo This line will execute install sync on a daily basis, even if running the free version (for opted-in users). The reason we want to keep it that way is for cases when the user was a paying customer, then there was a failure in subscription payment, and then after some time the payment was successful. This could be heavily optimized. For example, we can skip the $flush if the current install was never associated with a paid version. + */ + if ( $is_site_level_sync ) { + $result = $this->send_install_update( array(), true ); + $is_valid = $this->is_api_result_entity( $result ); + } else { + $result = $this->send_installs_update( array(), true ); + $is_valid = $this->is_api_result_object( $result, 'installs' ); + } + + if ( ! $is_valid ) { + if ( $is_context_single_site ) { + // Switch back to the main blog so that the following logic will have the right entities. + $this->switch_to_blog( $this->_storage->network_install_blog_id ); + } + + // Show API messages only if not background sync or if paying customer. + if ( ! $background || $this->is_paying() ) { + // Try to ping API to see if not blocked. + if ( ! FS_Api::test() ) { + /** + * Failed to ping API - blocked! + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 Only show message related to one of the Freemius powered plugins. Once it will be resolved it will fix the issue for all plugins anyways. There's no point to scare users with multiple error messages. + */ + $api = $this->get_api_site_scope(); + + if ( ! self::$_global_admin_notices->has_sticky( 'api_blocked' ) ) { + self::$_global_admin_notices->add( + sprintf( + $this->get_text_x_inline( 'Your server is blocking the access to Freemius\' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s', '%1s - plugin title, %2s - API domain', 'server-blocking-access' ), + $this->get_plugin_name(), + '<a href="' . $api->get_url() . '" target="_blank">' . $api->get_url() . '</a>' + ) . '<br> ' . $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . var_export( $result->error, true ), + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error', + $background, + 'api_blocked' + ); + } + } else { + // Authentication params are broken. + $this->_admin_notices->add( + $this->get_text_inline( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.', 'wrong-authentication-param-message' ), + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + } + } + + // No reason to continue with license sync while there are API issues. + return; + } + + if ( $is_site_level_sync ) { + $site = new FS_Site( $result ); + } else { + // Map site addresses to their blog IDs. + $address_to_blog_map = $this->get_address_to_blog_map(); + + // Find the current context install. + $site = null; + foreach ( $result->installs as $install ) { + if ( $install->id == $this->_site->id ) { + $site = new FS_Site( $install ); + } else { + $address = trailingslashit( fs_strip_url_protocol( $install->url ) ); + $blog_id = $address_to_blog_map[ $address ]; + + $this->_store_site( true, $blog_id, new FS_Site( $install ) ); + } + } + } + + // Sync plans. + $this->_sync_plans(); + } + + // Remove sticky API connectivity message. + self::$_global_admin_notices->remove_sticky( 'api_blocked' ); + + if ( ! $this->has_paid_plan() ) { + $this->_site = $site; + $this->_store_site( + true, + $is_site_level_sync ? + null : + $this->get_network_install_blog_id() + ); + } else { + $context_blog_id = 0; + + if ( $is_context_single_site ) { + $context_blog_id = get_current_blog_id(); + + // Switch back to the main blog in order to properly sync the license. + $this->switch_to_blog( $this->_storage->network_install_blog_id ); + } + + /** + * Sync licenses. Pass the site's license ID so that the foreign licenses will be fetched if the license + * associated with that ID is not included in the user's licenses collection. + */ + $this->_sync_licenses( + $site->license_id, + ( $is_context_single_site ? + $context_blog_id : + null + ) + ); + + if ( $is_context_single_site ) { + $this->switch_to_blog( $context_blog_id ); + } + + // Check if plan / license changed. + if ( $site->plan_id != $this->_site->plan_id || + // Check if trial started. + $site->trial_plan_id != $this->_site->trial_plan_id || + $site->trial_ends != $this->_site->trial_ends || + // Check if license changed. + $site->license_id != $this->_site->license_id + ) { + if ( $site->is_trial() && ( ! $this->_site->is_trial() || $site->trial_ends != $this->_site->trial_ends ) ) { + // New trial started. + $this->_site = $site; + $plan_change = 'trial_started'; + + // For trial with subscription use-case. + $new_license = is_null( $site->license_id ) ? null : $this->_get_license_by_id( $site->license_id ); + + if ( is_object( $new_license ) && $new_license->is_valid() ) { + $this->_site = $site; + $this->_update_site_license( $new_license ); + $this->_store_licenses(); + + $this->_sync_site_subscription( $this->_license ); + } + } else if ( $this->_site->is_trial() && ! $site->is_trial() && ! is_numeric( $site->license_id ) ) { + // Was in trial, but now trial expired and no license ID. + // New trial started. + $this->_site = $site; + $plan_change = 'trial_expired'; + } else { + $is_free = $this->is_free_plan(); + + // Make sure license exist and not expired. + $new_license = is_null( $site->license_id ) ? + null : + $this->_get_license_by_id( $site->license_id ); + + if ( $is_free && is_null( $new_license ) && $this->has_any_license() && $this->_license->is_cancelled ) { + // License cancelled. + $this->_site = $site; + $this->_update_site_license( $new_license ); + $this->_store_licenses(); + + $plan_change = 'cancelled'; + } else if ( $is_free && ( ( ! is_object( $new_license ) || $new_license->is_expired() ) ) ) { + // The license is expired, so ignore upgrade method. + $this->_site = $site; + } else { + // License changed. + $this->_site = $site; + + /** + * IMPORTANT: + * The line below should be executed before trying to activate the license on the rest of the network, otherwise, the license' activation counters may be out of sync + there's no need to activate the license on the context site since it's already activated on it. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + $this->_update_site_license( $new_license ); + + if ( ! $is_context_single_site && + fs_is_network_admin() && + $this->_is_network_active && + $new_license->quota > 1 && + get_blog_count() > 1 + ) { + // See if license can activated on all sites. + if ( ! $this->try_activate_license_on_network( $this->_user, $new_license ) ) { + if ( ! fs_request_get_bool( 'auto_install' ) ) { + // Open the license activation dialog box on the account page. + add_action( 'admin_footer', array( + &$this, + '_open_license_activation_dialog_box' + ) ); + } + } + } + + $this->_store_licenses(); + + $plan_change = $is_free ? + 'upgraded' : + ( is_object( $new_license ) ? + 'changed' : + 'downgraded' ); + } + } + + // Store updated site info. + $this->_store_site( + true, + $is_site_level_sync ? + null : + $this->get_network_install_blog_id() + ); + } else { + if ( is_object( $this->_license ) && $this->_license->is_expired() ) { + if ( ! $this->has_features_enabled_license() ) { + $this->_deactivate_license(); + $plan_change = 'downgraded'; + } else { + $plan_change = 'expired'; + } + } + + if ( is_numeric( $site->license_id ) && is_object( $this->_license ) ) { + $this->_sync_site_subscription( $this->_license ); + } + } + } + + $hmm_text = $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...'; + + if ( $this->has_paid_plan() ) { + switch ( $plan_change ) { + case 'none': + if ( ! $background && is_admin() ) { + $plan = $this->is_trial() ? + $this->get_trial_plan() : + $this->get_plan(); + + if ( $plan->is_free() ) { + $this->_admin_notices->add( + sprintf( + $this->get_text_inline( 'It looks like you are still on the %s plan. If you did upgrade or change your plan, it\'s probably an issue on our side - sorry.', 'plan-did-not-change-message' ), + '<i><b>' . $plan->title . ( $this->is_trial() ? ' ' . $this->get_text_x_inline( 'Trial', 'trial period', 'trial' ) : '' ) . '</b></i>' + ) . ' ' . sprintf( + '<a href="%s">%s</a>', + $this->contact_url( + 'bug', + sprintf( $this->get_text_inline( 'I have upgraded my account but when I try to Sync the License, the plan remains %s.', 'plan-did-not-change-email-message' ), + strtoupper( $plan->name ) + ) + ), + $this->get_text_inline( 'Please contact us here', 'contact-us-here' ) + ), + $hmm_text + ); + } + } + break; + case 'upgraded': + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Your plan was successfully upgraded.', 'plan-upgraded-message' ), + '<i>' . $this->get_plugin_name() . '</i>' + ) . $this->get_complete_upgrade_instructions(), + 'plan_upgraded', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + + $this->_admin_notices->remove_sticky( array( + 'trial_started', + 'trial_promotion', + 'trial_expired', + 'activation_complete', + 'license_expired', + ) ); + break; + case 'changed': + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Your plan was successfully changed to %s.', 'plan-changed-to-x-message' ), + $this->get_plan_title() + ), + 'plan_changed' + ); + + $this->_admin_notices->remove_sticky( array( + 'trial_started', + 'trial_promotion', + 'trial_expired', + 'activation_complete', + ) ); + break; + case 'downgraded': + $this->_admin_notices->add_sticky( + ($this->has_free_plan() ? + sprintf( $this->get_text_inline( 'Your license has expired. You can still continue using the free %s forever.', 'license-expired-blocking-message' ), $this->_module_type ) : + /* translators: %1$s: product title; %2$s, %3$s: wrapping HTML anchor element; %4$s: 'plugin', 'theme', or 'add-on'. */ + sprintf( $this->get_text_inline( 'Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.', 'license-expired-blocking-message_premium-only' ), sprintf('<a href="%s">', $this->pricing_url()), '</a>', $this->get_module_label(true) ) ), + 'license_expired', + $hmm_text + ); + $this->_admin_notices->remove_sticky( 'plan_upgraded' ); + break; + case 'cancelled': + $this->_admin_notices->add( + $this->get_text_inline( 'Your license has been cancelled. If you think it\'s a mistake, please contact support.', 'license-cancelled' ) . ' ' . + sprintf( + '<a href="%s">%s</a>', + $this->contact_url( 'bug' ), + $this->get_text_inline( 'Please contact us here', 'contact-us-here' ) + ), + $hmm_text, + 'error' + ); + $this->_admin_notices->remove_sticky( 'plan_upgraded' ); + break; + case 'expired': + $this->_admin_notices->add_sticky( + sprintf( $this->get_text_inline( 'Your license has expired. You can still continue using all the %s features, but you\'ll need to renew your license to continue getting updates and support.', 'license-expired-non-blocking-message' ), $this->get_plan()->title ), + 'license_expired', + $hmm_text + ); + $this->_admin_notices->remove_sticky( 'plan_upgraded' ); + break; + case 'trial_started': + $this->_admin_notices->add_sticky( + sprintf( + $this->get_text_inline( 'Your trial has been successfully started.', 'trial-started-message' ), + '<i>' . $this->get_plugin_name() . '</i>' + ) . $this->get_complete_upgrade_instructions( $this->get_trial_plan()->title ), + 'trial_started', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + + $this->_admin_notices->remove_sticky( array( + 'trial_promotion', + ) ); + break; + case 'trial_expired': + $this->_admin_notices->add_sticky( + ($this->has_free_plan() ? + $this->get_text_inline( 'Your free trial has expired. You can still continue using all our free features.', 'trial-expired-message' ) : + /* translators: %1$s: product title; %2$s, %3$s: wrapping HTML anchor element; %4$s: 'plugin', 'theme', or 'add-on'. */ + sprintf( $this->get_text_inline( 'Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions.', 'trial-expired-message_premium-only' ), sprintf('<a href="%s">', $this->pricing_url()), '</a>', $this->get_module_label(true))), + 'trial_expired', + $hmm_text + ); + $this->_admin_notices->remove_sticky( array( + 'trial_started', + 'trial_promotion', + 'plan_upgraded', + ) ); + break; + } + } + + if ( 'none' !== $plan_change ) { + $this->do_action( 'after_license_change', $plan_change, $this->get_plan() ); + } + } + + /** + * Include the required JS at the footer of the admin to trigger the license activation dialog box. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + public function _open_license_activation_dialog_box() { + $vars = array( 'license_id' => $this->_site->license_id ); + fs_require_once_template( 'js/open-license-activation.php', $vars ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool $background + */ + protected function _activate_license( $background = false ) { + $this->_logger->entrance(); + + $license_id = fs_request_get( 'license_id' ); + + if ( is_object( $this->_site ) && + FS_Plugin_License::is_valid_id( $license_id ) && + $license_id == $this->_site->license_id + ) { + // License is already activated. + return; + } + + $premium_license = FS_Plugin_License::is_valid_id( $license_id ) ? + $this->_get_license_by_id( $license_id ) : + $this->_get_available_premium_license(); + + if ( ! is_object( $premium_license ) ) { + return; + } + + if ( ! is_object( $this->_site ) ) { + // Not yet opted-in. + $user = $this->get_current_or_network_user(); + if ( ! is_object( $user ) ) { + $user = self::_get_user_by_id( $premium_license->user_id ); + } + + if ( is_object( $user ) ) { + $this->install_with_user( $user, $premium_license->secret_key, false, false, false ); + } else { + $this->opt_in( + false, + false, + false, + $premium_license->secret_key + ); + + return; + } + } + + + /** + * If the premium license is already associated with the install, just + * update the license reference (activation is not required). + * + * @since 1.1.9 + */ + if ( $premium_license->id == $this->_site->license_id ) { + // License is already activated. + $this->_update_site_license( $premium_license ); + $this->_store_account(); + + return; + } + + if ( $this->_site->user_id != $premium_license->user_id ) { + $api_request_params = array( 'license_key' => $premium_license->secret_key ); + } else { + $api_request_params = array(); + } + + $api = $this->get_api_site_scope(); + $license = $api->call( "/licenses/{$premium_license->id}.json", 'put', $api_request_params ); + + if ( ! $this->is_api_result_entity( $license ) ) { + if ( ! $background ) { + $this->_admin_notices->add( sprintf( + '%s %s', + $this->get_text_inline( 'It looks like the license could not be activated.', 'license-activation-failed-message' ), + ( is_object( $license ) && isset( $license->error ) ? + $license->error->message : + sprintf( '%s<br><code>%s</code>', + $this->get_text_inline( 'Error received from the server:', 'server-error-message' ), + var_export( $license, true ) + ) + ) + ), + $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...', + 'error' + ); + } + + return; + } + + $premium_license = new FS_Plugin_License( $license ); + + // Updated site plan. + $site = $this->get_api_site_scope()->get( '/', true ); + if ( $this->is_api_result_entity( $site ) ) { + $this->_site = new FS_Site( $site ); + } + $this->_update_site_license( $premium_license ); + + $this->_store_account(); + + if ( ! $background ) { + $this->_admin_notices->add_sticky( + $this->get_text_inline( 'Your license was successfully activated.', 'license-activated-message' ) . + $this->get_complete_upgrade_instructions(), + 'license_activated', + $this->get_text_x_inline( 'Yee-haw', 'interjection expressing joy or exuberance', 'yee-haw' ) . '!' + ); + } + + $this->_admin_notices->remove_sticky( array( + 'trial_promotion', + 'license_expired', + ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param bool $show_notice + */ + protected function _deactivate_license( $show_notice = true ) { + $this->_logger->entrance(); + + $hmm_text = $this->get_text_x_inline( 'Hmm', 'something somebody says when they are thinking about what you have just said.', 'hmm' ) . '...'; + + if ( ! FS_Plugin_License::is_valid_id( $this->_site->license_id ) ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'It looks like your site currently doesn\'t have an active license.', 'no-active-license-message' ), $this->get_plan_title() ), + $hmm_text + ); + + return; + } + + $api = $this->get_api_site_scope(); + $license = $api->call( "/licenses/{$this->_site->license_id}.json", 'delete' ); + + if ( isset( $license->error ) ) { + $this->_admin_notices->add( + $this->get_text_inline( 'It looks like the license deactivation failed.', 'license-deactivation-failed-message' ) . '<br> ' . + $this->get_text_inline( 'Error received from the server:', 'server-error-message' ) . ' ' . var_export( $license->error, true ), + $hmm_text, + 'error' + ); + + return; + } + + // Update license cache. + if ( is_array( $this->_licenses ) ) { + for ( $i = 0, $len = count( $this->_licenses ); $i < $len; $i ++ ) { + if ( $license->id == $this->_licenses[ $i ]->id ) { + $this->_licenses[ $i ] = new FS_Plugin_License( $license ); + } + } + } + + // Updated site plan to default. + $this->_sync_plans(); + $this->_site->plan_id = $this->_plans[0]->id; + // Unlink license from site. + $this->_update_site_license( null ); + + $this->_store_account(); + + if ( $show_notice ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Your license was successfully deactivated, you are back to the %s plan.', 'license-deactivation-message' ), $this->get_plan_title() ), + $this->get_text_inline( 'O.K', 'ok' ) + ); + } + + $this->_admin_notices->remove_sticky( array( + 'plan_upgraded', + 'license_activated', + ) ); + } + + /** + * Site plan downgrade. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @uses FS_Api + */ + private function _downgrade_site() { + $this->_logger->entrance(); + + $api = $this->get_api_site_scope(); + $site = $api->call( 'downgrade.json', 'put' ); + + $plan_downgraded = false; + $plan = false; + if ( $this->is_api_result_entity( $site ) ) { + $prev_plan_id = $this->_site->plan_id; + + // Update new site plan id. + $this->_site->plan_id = $site->plan_id; + + $plan = $this->get_plan(); + $subscription = $this->_sync_site_subscription( $this->_license ); + + // Plan downgraded if plan was changed or subscription was cancelled. + $plan_downgraded = ( $plan instanceof FS_Plugin_Plan && $prev_plan_id != $plan->id ) || + ( is_object( $subscription ) && ! isset( $subscription->error ) && ! $subscription->is_active() ); + } else { + // handle different error cases. + + } + + if ( $plan_downgraded ) { + // Remove previous sticky message about upgrade (if exist). + $this->_admin_notices->remove_sticky( 'plan_upgraded' ); + + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Your plan was successfully downgraded. Your %s plan license will expire in %s.', 'plan-x-downgraded-message' ), + $plan->title, + human_time_diff( time(), strtotime( $this->_license->expiration ) ) + ) + ); + + // Store site updates. + $this->_store_site(); + } else { + $this->_admin_notices->add( + $this->get_text_inline( 'Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes.', 'plan-downgraded-failure-message' ), + $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...', + 'error' + ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.8.1 + * + * @param bool|string $plan_name + * + * @return bool If trial was successfully started. + */ + function start_trial( $plan_name = false ) { + $this->_logger->entrance(); + + // Alias. + $oops_text = $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...'; + + if ( $this->is_trial() ) { + // Already in trial mode. + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'You are already running the %s in a trial mode.', 'in-trial-mode' ), $this->_module_type ), + $oops_text, + 'error' + ); + + return false; + } + + if ( $this->_site->is_trial_utilized() ) { + // Trial was already utilized. + $this->_admin_notices->add( + $this->get_text_inline( 'You already utilized a trial before.', 'trial-utilized' ), + $oops_text, + 'error' + ); + + return false; + } + + if ( false !== $plan_name ) { + $plan = $this->get_plan_by_name( $plan_name ); + + if ( false === $plan ) { + // Plan doesn't exist. + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Plan %s do not exist, therefore, can\'t start a trial.', 'trial-plan-x-not-exist' ), $plan_name ), + $oops_text, + 'error' + ); + + return false; + } + + if ( ! $plan->has_trial() ) { + // Plan doesn't exist. + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Plan %s does not support a trial period.', 'plan-x-no-trial' ), $plan_name ), + $oops_text, + 'error' + ); + + return false; + } + } else { + if ( ! $this->has_trial_plan() ) { + // None of the plans have a trial. + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'None of the %s\'s plans supports a trial period.', 'no-trials' ), $this->_module_type ), + $oops_text, + 'error' + ); + + return false; + } + + $plans_with_trial = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); + + $plan = $plans_with_trial[0]; + } + + $api = $this->get_api_site_scope(); + $plan = $api->call( "plans/{$plan->id}/trials.json", 'post' ); + + if ( ! $this->is_api_result_entity( $plan ) ) { + // Some API error while trying to start the trial. + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Unexpected API error. Please contact the %s\'s author with the following error.', 'unexpected-api-error' ), $this->_module_type ) + . ' ' . var_export( $plan, true ), + $oops_text, + 'error' + ); + + return false; + } + + // Sync license. + $this->_sync_license(); + + return $this->is_trial(); + } + + /** + * Cancel site trial. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @uses FS_Api + */ + private function _cancel_trial() { + $this->_logger->entrance(); + + // Alias. + $oops_text = $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...'; + + if ( ! $this->is_trial() ) { + $this->_admin_notices->add( + $this->get_text_inline( 'It looks like you are not in trial mode anymore so there\'s nothing to cancel :)', 'trial-cancel-no-trial-message' ), + $oops_text, + 'error' + ); + + return; + } + + $trial_plan = $this->get_trial_plan(); + + $api = $this->get_api_site_scope(); + $site = $api->call( 'trials.json', 'delete' ); + + $trial_cancelled = false; + + if ( $this->is_api_result_entity( $site ) ) { + $prev_trial_ends = $this->_site->trial_ends; + + if ( $this->is_paid_trial() ) { + $this->_license->expiration = $site->trial_ends; + $this->_license->is_cancelled = true; + $this->_update_site_license( $this->_license ); + $this->_store_licenses(); + + // Clear subscription reference. + $this->_sync_site_subscription( null ); + } + + // Update site info. + $this->_site = new FS_Site( $site ); + + $trial_cancelled = ( $prev_trial_ends != $site->trial_ends ); + } else { + // @todo handle different error cases. + } + + if ( $trial_cancelled ) { + // Remove previous sticky messages about upgrade or trial (if exist). + $this->_admin_notices->remove_sticky( array( + 'trial_started', + 'trial_promotion', + 'plan_upgraded', + ) ); + + // Store site updates. + $this->_store_site(); + + if ( ! $this->is_addon() || + ! $this->deactivate_premium_only_addon_without_license( true ) + ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Your %s free trial was successfully cancelled.', 'trial-cancel-message' ), $trial_plan->title ) + ); + } + } else { + $this->_admin_notices->add( + $this->get_text_inline( 'Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.', 'trial-cancel-failure-message' ), + $oops_text, + 'error' + ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool|number $plugin_id + * + * @return bool + */ + private function _is_addon_id( $plugin_id ) { + return is_numeric( $plugin_id ) && ( $this->get_id() != $plugin_id ); + } + + /** + * Check if user eligible to download premium version updates. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + private function _can_download_premium() { + return $this->has_any_active_valid_license() || + ( $this->is_trial() && ! $this->get_trial_plan()->is_free() ); + } + + /** + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool|number $addon_id + * @param string $type "json" or "zip" + * + * @return string + */ + private function _get_latest_version_endpoint( $addon_id = false, $type = 'json' ) { + + $is_addon = $this->_is_addon_id( $addon_id ); + + $is_premium = null; + if ( ! $is_addon ) { + $is_premium = ( $this->is_premium() || $this->_can_download_premium() ); + } else if ( $this->is_addon_activated( $addon_id ) ) { + $fs_addon = self::get_instance_by_id( $addon_id ); + $is_premium = ( $fs_addon->is_premium() || $fs_addon->_can_download_premium() ); + } + + // If add-on, then append add-on ID. + $endpoint = ( $is_addon ? "/addons/$addon_id" : '' ) . + '/updates/latest.' . $type; + + // If add-on and not yet activated, try to fetch based on server licensing. + if ( is_bool( $is_premium ) ) { + $endpoint = add_query_arg( 'is_premium', json_encode( $is_premium ), $endpoint ); + } + + if ( $this->has_secret_key() ) { + $endpoint = add_query_arg( 'type', 'all', $endpoint ); + } + + return $endpoint; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool|number $addon_id + * @param bool $flush Since 1.1.7.3 + * @param int $expiration Since 1.2.2.7 + * + * @return object|false Plugin latest tag info. + */ + function _fetch_latest_version( + $addon_id = false, + $flush = true, + $expiration = WP_FS__TIME_24_HOURS_IN_SEC + ) { + $this->_logger->entrance(); + + $switch_to_blog_id = null; + + /** + * @since 1.1.7.3 Check for plugin updates from Freemius only if opted-in. + * @since 1.1.7.4 Also check updates for add-ons. + */ + if ( ! $this->is_registered() && + ! $this->_is_addon_id( $addon_id ) + ) { + if ( ! is_multisite() ) { + return false; + } + + $installs_map = $this->get_blog_install_map(); + + foreach ( $installs_map as $blog_id => $install ) { + /** + * @var FS_Site $install + */ + if ( $install->is_trial() ) { + $switch_to_blog_id = $blog_id; + break; + } + + if ( FS_Plugin_License::is_valid_id( $install->license_id ) ) { + $license = $this->get_license_by_id( $install->license_id ); + + if ( is_object( $license ) && $license->is_features_enabled() ) { + $switch_to_blog_id = $blog_id; + break; + } + } + } + + if ( is_null( $switch_to_blog_id ) ) { + return false; + } + } + + $current_blog_id = is_numeric( $switch_to_blog_id ) ? + get_current_blog_id() : + 0; + + if ( is_numeric( $switch_to_blog_id ) ) { + $this->switch_to_blog( $switch_to_blog_id ); + } + + $tag = $this->get_api_site_or_plugin_scope()->get( + $this->_get_latest_version_endpoint( $addon_id, 'json' ), + $flush, + $expiration + ); + + if ( is_numeric( $switch_to_blog_id ) ) { + $this->switch_to_blog( $current_blog_id ); + } + + $latest_version = ( is_object( $tag ) && isset( $tag->version ) ) ? $tag->version : 'couldn\'t get'; + + $this->_logger->departure( 'Latest version ' . $latest_version ); + + return ( is_object( $tag ) && isset( $tag->version ) ) ? $tag : false; + } + + #---------------------------------------------------------------------------------- + #region Download Plugin + #---------------------------------------------------------------------------------- + + /** + * Download latest plugin version, based on plan. + * + * Not like _download_latest(), this will redirect the page + * to secure download url to prevent dual download (from FS to WP server, + * and then from WP server to the client / browser). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param bool|number $plugin_id + * + * @uses FS_Api + * @uses wp_redirect() + */ + private function download_latest_directly( $plugin_id = false ) { + $this->_logger->entrance(); + + wp_redirect( $this->get_latest_download_api_url( $plugin_id ) ); + } + + /** + * Get latest plugin FS API download URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param bool|number $plugin_id + * + * @return string + */ + private function get_latest_download_api_url( $plugin_id = false ) { + $this->_logger->entrance(); + + return $this->get_api_site_scope()->get_signed_url( + $this->_get_latest_version_endpoint( $plugin_id, 'zip' ) + ); + } + + /** + * Get payment invoice URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * + * @param bool|number $payment_id + * + * @return string + */ + function _get_invoice_api_url( $payment_id = false ) { + $this->_logger->entrance(); + + return $this->get_api_user_scope()->get_signed_url( + "/payments/{$payment_id}/invoice.pdf" + ); + } + + /** + * Get latest plugin download link. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $label + * @param bool|number $plugin_id + * + * @return string + */ + private function get_latest_download_link( $label, $plugin_id = false ) { + return sprintf( + '<a target="_blank" href="%s">%s</a>', + $this->_get_latest_download_local_url( $plugin_id ), + $label + ); + } + + /** + * Get latest plugin download local URL. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param bool|number $plugin_id + * + * @return string + */ + function _get_latest_download_local_url( $plugin_id = false ) { + // Add timestamp to protect from caching. + $params = array( 'ts' => WP_FS__SCRIPT_START_TIME ); + + if ( ! empty( $plugin_id ) ) { + $params['plugin_id'] = $plugin_id; + } else if ( $this->is_addon() ) { + $params['plugin_id'] = $this->get_id(); + } + + $fs = $this->is_addon() ? + $this->get_parent_instance() : + $this; + + return $fs->get_account_url( 'download_latest', $params ); + } + + #endregion Download Plugin ------------------------------------------------------------------ + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @uses FS_Api + * + * @param bool $background Hints the method if it's a background updates check. If false, it means that + * was initiated by the admin. + * @param bool|number $plugin_id + * @param bool $flush Since 1.1.7.3 + * @param int $expiration Since 1.2.2.7 + */ + private function check_updates( + $background = false, + $plugin_id = false, + $flush = true, + $expiration = WP_FS__TIME_24_HOURS_IN_SEC + ) { + $this->_logger->entrance(); + + // Check if there's a newer version for download. + $new_version = $this->_fetch_newer_version( $plugin_id, $flush, $expiration ); + + $update = null; + if ( is_object( $new_version ) ) { + $update = new FS_Plugin_Tag( $new_version ); + + if ( ! $background ) { + $this->_admin_notices->add( + sprintf( + /* translators: %s: Numeric version number (e.g. '2.1.9' */ + $this->get_text_inline( 'Version %s was released.', 'version-x-released' ) . ' ' . $this->get_text_inline( 'Please download %s.', 'please-download-x' ), + $update->version, + sprintf( + '<a href="%s" target="_blank">%s</a>', + $this->get_account_url( 'download_latest' ), + sprintf( + /* translators: %s: plan name (e.g. latest "Professional" version) */ + $this->get_text_inline( 'the latest %s version here', 'latest-x-version' ), + $this->get_plan_title() + ) + ) + ), + $this->get_text_inline( 'New', 'new' ) . '!' + ); + } + } else if ( false === $new_version && ! $background ) { + $this->_admin_notices->add( + $this->get_text_inline( 'Seems like you got the latest release.', 'you-have-latest' ), + $this->get_text_inline( 'You are all good!', 'you-are-good' ) + ); + } + + $this->_store_update( $update, true, $plugin_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool $flush Since 1.1.7.3 add 24 hour cache by default. + * + * @return FS_Plugin[] + * + * @uses FS_Api + */ + private function sync_addons( $flush = false ) { + $this->_logger->entrance(); + + $api = $this->get_api_site_or_plugin_scope(); + + $path = $this->add_show_pending( '/addons.json?enriched=true' ); + + /** + * @since 1.2.1 + * + * If there's a cached version of the add-ons and not asking + * for a flush, just use the currently stored add-ons. + */ + if ( ! $flush && $api->is_cached( $path ) ) { + $addons = self::get_all_addons(); + + return $addons[ $this->_plugin->id ]; + } + + $result = $api->get( $path, $flush ); + + $addons = array(); + if ( $this->is_api_result_object( $result, 'plugins' ) && + is_array( $result->plugins ) + ) { + for ( $i = 0, $len = count( $result->plugins ); $i < $len; $i ++ ) { + $addons[ $i ] = new FS_Plugin( $result->plugins[ $i ] ); + } + + $this->_store_addons( $addons, true ); + } + + return $addons; + } + + /** + * Handle user email update. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * @uses FS_Api + * + * @param string $new_email + * + * @return object + */ + private function update_email( $new_email ) { + $this->_logger->entrance(); + + + $api = $this->get_api_user_scope(); + $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,email,is_verified", 'put', array( + 'email' => $new_email, + 'after_email_confirm_url' => $this->_get_admin_page_url( + 'account', + array( 'fs_action' => 'sync_user' ) + ), + ) ); + + if ( ! isset( $user->error ) ) { + $this->_user->email = $user->email; + $this->_user->is_verified = $user->is_verified; + $this->_store_user(); + } else { + // handle different error cases. + + } + + return $user; + } + + #---------------------------------------------------------------------------------- + #region API Error Handling + #---------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * + * @param mixed $result + * + * @return bool Is API result contains an error. + */ + private function is_api_error( $result ) { + return FS_Api::is_api_error( $result ); + } + + /** + * Checks if given API result is a non-empty and not an error object. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $result + * @param string|null $required_property Optional property we want to verify that is set. + * + * @return bool + */ + function is_api_result_object( $result, $required_property = null ) { + return FS_Api::is_api_result_object( $result, $required_property ); + } + + /** + * Checks if given API result is a non-empty entity object with non-empty ID. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $result + * + * @return bool + */ + private function is_api_result_entity( $result ) { + return FS_Api::is_api_result_entity( $result ); + } + + #endregion + + /** + * Make sure a given argument is an array of a specific type. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $array + * @param string $class + * + * @return bool + */ + private function is_array_instanceof( $array, $class ) { + return ( is_array( $array ) && ( empty( $array ) || $array[0] instanceof $class ) ); + } + + /** + * Start install ownership change. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * @uses FS_Api + * + * @param string $candidate_email + * + * @return bool Is ownership change successfully initiated. + */ + private function init_change_owner( $candidate_email ) { + $this->_logger->entrance(); + + $api = $this->get_api_site_scope(); + $result = $api->call( "/users/{$this->_user->id}.json", 'put', array( + 'email' => $candidate_email, + 'after_confirm_url' => $this->_get_admin_page_url( + 'account', + array( 'fs_action' => 'change_owner' ) + ), + ) ); + + return ! $this->is_api_error( $result ); + } + + /** + * Handle install ownership change. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * @uses FS_Api + * + * @return bool Was ownership change successfully complete. + */ + private function complete_change_owner() { + $this->_logger->entrance(); + + $site_result = $this->get_api_site_scope( true )->get(); + $site = new FS_Site( $site_result ); + $this->_site = $site; + + $user = new FS_User(); + $user->id = fs_request_get( 'user_id' ); + + // Validate install's user and given user. + if ( $user->id != $this->_site->user_id ) { + return false; + } + + $user->public_key = fs_request_get( 'user_public_key' ); + $user->secret_key = fs_request_get( 'user_secret_key' ); + + // Fetch new user information. + $this->_user = $user; + $user_result = $this->get_api_user_scope( true )->get(); + $user = new FS_User( $user_result ); + $this->_user = $user; + + $this->_set_account( $user, $site ); + + return true; + } + + /** + * Handle user name update. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * @uses FS_Api + * + * @return object + */ + private function update_user_name() { + $this->_logger->entrance(); + $name = fs_request_get( 'fs_user_name_' . $this->get_unique_affix(), '' ); + + $api = $this->get_api_user_scope(); + $user = $api->call( "?plugin_id={$this->_plugin->id}&fields=id,first,last", 'put', array( + 'name' => $name, + ) ); + + if ( ! isset( $user->error ) ) { + $this->_user->first = $user->first; + $this->_user->last = $user->last; + $this->_store_user(); + } else { + // handle different error cases. + + } + + return $user; + } + + /** + * Verify user email. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * @uses FS_Api + */ + private function verify_email() { + $this->_handle_account_user_sync(); + + if ( $this->_user->is_verified() ) { + return; + } + + $api = $this->get_api_site_scope(); + $result = $api->call( "/users/{$this->_user->id}/verify.json", 'put', array( + 'after_email_confirm_url' => $this->_get_admin_page_url( + 'account', + array( 'fs_action' => 'sync_user' ) + ) + ) ); + + if ( ! isset( $result->error ) ) { + $this->_admin_notices->add( sprintf( + $this->get_text_inline( 'Verification mail was just sent to %s. If you can\'t find it after 5 min, please check your spam box.', 'verification-email-sent-message' ), + sprintf( '<a href="mailto:%1s">%2s</a>', esc_url( $this->_user->email ), $this->_user->email ) + ) ); + } else { + // handle different error cases. + + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.2 + * + * @param array $params + * @param bool|null $network + * + * @return string + */ + function get_activation_url( $params = array(), $network = null ) { + if ( $this->is_addon() && $this->has_free_plan() ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 Add-on's activation is the parent's module activation. + */ + return $this->get_parent_instance()->get_activation_url( $params ); + } + + return $this->apply_filters( 'connect_url', $this->_get_admin_page_url( '', $params, $network ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param array $params + * + * @return string + */ + function get_reconnect_url( $params = array() ) { + $params['fs_action'] = 'reset_anonymous_mode'; + $params['fs_unique_affix'] = $this->get_unique_affix(); + + return $this->get_activation_url( $params ); + } + + /** + * Get the URL of the page that should be loaded after the user connect + * or skip in the opt-in screen. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param string $filter Filter name. + * @param array $params Since 1.2.2.7 + * @param bool|null $network + * + * @return string + */ + function get_after_activation_url( $filter, $params = array(), $network = null ) { + if ( $this->is_free_wp_org_theme() && + fs_request_has( 'pending_activation' ) + ) { + $first_time_path = ''; + } else { + $first_time_path = $this->_menu->get_first_time_path(); + } + + if ( $this->_is_network_active && + fs_is_network_admin() && + ! $this->_menu->has_network_menu() && + $this->is_network_registered() + ) { + $target_url = $this->get_account_url(); + } else { + // Default plugin's page. + $target_url = $this->_get_admin_page_url( '', array(), $network ); + } + + return add_query_arg( $params, $this->apply_filters( + $filter, + empty( $first_time_path ) ? + $target_url : + $first_time_path + ) ); + } + + /** + * Handle account page updates / edits / actions. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + */ + private function _handle_account_edits() { + if ( ! $this->is_user_admin() ) { + return; + } + + $action = fs_get_action(); + + if ( empty( $action ) ) { + return; + } + + $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); + $install_id = fs_request_get( 'install_id', '' ); + + // Alias. + $oops_text = $this->get_text_x_inline( 'Oops', 'exclamation', 'oops' ) . '...'; + + $is_network_action = $this->is_network_level_action(); + $blog_id = $this->is_network_level_site_specific_action(); + + if ( is_numeric( $blog_id ) ) { + $this->switch_to_blog( $blog_id ); + } else { + $blog_id = ''; + } + + switch ( $action ) { + case 'opt_in': + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + + if ( $plugin_id == $this->get_id() ) { + if ( $is_network_action && ! empty( $blog_id ) ) { + if ( ! $this->is_registered() ) { + $this->install_with_user( + $this->get_network_user(), + false, + false, + false, + false + ); + + $this->_admin_notices->add( + $this->get_text_inline( 'Site successfully opted in.', 'successful-opt-in' ), + $this->get_text_inline( 'Awesome', 'awesome' ) + ); + } + } + } + break; + + case 'toggle_tracking': + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + + if ( $plugin_id == $this->get_id() ) { + if ( $is_network_action && ! empty( $blog_id ) ) { + if ( $this->is_registered() ) { + if ( $this->is_tracking_prohibited() ) { + if ( $this->allow_site_tracking() ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'We appreciate your help in making the %s better by letting us track some usage data.', 'opt-out-message-appreciation' ), $this->_module_type ), + $this->get_text_inline( 'Thank you!', 'thank-you' ) + ); + } + } else { + if ( $this->stop_site_tracking() ) { + $this->_admin_notices->add( + sprintf( + $this->get_text_inline( 'We will no longer be sending any usage data of %s on %s to %s.', 'opted-out-successfully' ), + $this->get_plugin_title(), + fs_strip_url_protocol( get_site_url( $blog_id ) ), + sprintf( + '<a href="%s" target="_blank">%s</a>', + 'https://freemius.com', + 'freemius.com' + ) + ) + ); + } + } + } + } + } + + break; + + case 'delete_account': + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + + if ( $plugin_id == $this->get_id() ) { + if ( $is_network_action && empty( $blog_id ) ) { + $this->delete_network_account_event(); + } else { + $this->delete_account_event(); + } + + // Clear user and site. + $this->_site = null; + $this->_user = null; + + fs_redirect( $this->get_activation_url() ); + } else { + if ( $this->is_addon_activated( $plugin_id ) ) { + $fs_addon = self::get_instance_by_id( $plugin_id ); + $fs_addon->delete_account_event(); + + fs_redirect( $this->_get_admin_page_url( 'account' ) ); + } + } + + return; + + case 'downgrade_account': + if ( is_numeric( $blog_id ) ) { + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + } else { + check_admin_referer( $action ); + } + + if ( $plugin_id == $this->get_id() ) { + $this->_downgrade_site(); + + if ( is_numeric( $blog_id ) ) { + $this->switch_to_blog( $this->_storage->network_install_blog_id ); + } + } else if ( $this->is_addon_activated( $plugin_id ) ) { + $fs_addon = self::get_instance_by_id( $plugin_id ); + $fs_addon->_downgrade_site(); + } + + return; + + case 'activate_license': + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + + $fs = $this; + if ( $plugin_id != $this->get_id() ) { + $fs = $this->is_addon_activated( $plugin_id ) ? + self::get_instance_by_id( $plugin_id ) : + null; + } + + if ( is_object( $fs ) ) { + $fs->_activate_license(); + } + + return; + + case 'deactivate_license': + check_admin_referer( trim( "{$action}:{$blog_id}:{$install_id}", ':' ) ); + + if ( $plugin_id == $this->get_id() ) { + $this->_deactivate_license(); + + if ( $this->is_only_premium() ) { + // Clear user and site. + $this->_site = null; + $this->_user = null; + + fs_redirect( $this->get_activation_url() ); + } + } else { + if ( $this->is_addon_activated( $plugin_id ) ) { + $fs_addon = self::get_instance_by_id( $plugin_id ); + $fs_addon->_deactivate_license(); + } + } + + return; + + case 'check_updates': + check_admin_referer( $action ); + $this->check_updates(); + + return; + + case 'change_owner': + $state = fs_request_get( 'state', 'init' ); + switch ( $state ) { + case 'init': + $candidate_email = fs_request_get( 'candidate_email', '' ); + + if ( $this->init_change_owner( $candidate_email ) ) { + $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder.', 'change-owner-request-sent-x' ), '<b>' . $this->_user->email . '</b>' ) ); + } + break; + case 'owner_confirmed': + $candidate_email = fs_request_get( 'candidate_email', '' ); + + $this->_admin_notices->add( sprintf( $this->get_text_inline( 'Thanks for confirming the ownership change. An email was just sent to %s for final approval.', 'change-owner-request_owner-confirmed' ), '<b>' . $candidate_email . '</b>' ) ); + break; + case 'candidate_confirmed': + if ( $this->complete_change_owner() ) { + $this->_admin_notices->add_sticky( + sprintf( $this->get_text_inline( '%s is the new owner of the account.', 'change-owner-request_candidate-confirmed' ), '<b>' . $this->_user->email . '</b>' ), + 'ownership_changed', + $this->get_text_x_inline( 'Congrats', 'as congratulations', 'congrats' ) . '!' + ); + } else { + // @todo Handle failed ownership change message. + } + break; + } + + return; + + case 'update_email': + check_admin_referer( 'update_email' ); + + $new_email = fs_request_get( 'fs_email_' . $this->get_unique_affix(), '' ); + $result = $this->update_email( $new_email ); + + if ( isset( $result->error ) ) { + switch ( $result->error->code ) { + case 'user_exist': + $this->_admin_notices->add( + $this->get_text_inline( 'Sorry, we could not complete the email update. Another user with the same email is already registered.', 'user-exist-message' ) . ' ' . + sprintf( $this->get_text_inline( 'If you would like to give up the ownership of the %s\'s account to %s click the Change Ownership button.', 'user-exist-message_ownership' ), $this->_module_type, '<b>' . $new_email . '</b>' ) . + sprintf( + '<a style="margin-left: 10px;" href="%s"><button class="button button-primary">%s ➜</button></a>', + $this->get_account_url( 'change_owner', array( + 'state' => 'init', + 'candidate_email' => $new_email + ) ), + $this->get_text_inline( 'Change Ownership', 'change-ownership' ) + ), + $oops_text, + 'error' + ); + break; + } + } else { + $this->_admin_notices->add( $this->get_text_inline( 'Your email was successfully updated. You should receive an email with confirmation instructions in few moments.', 'email-updated-message' ) ); + } + + return; + + case 'update_user_name': + check_admin_referer( 'update_user_name' ); + + $result = $this->update_user_name(); + + if ( isset( $result->error ) ) { + $this->_admin_notices->add( + $this->get_text_inline( 'Please provide your full name.', 'name-update-failed-message' ), + $oops_text, + 'error' + ); + } else { + $this->_admin_notices->add( $this->get_text_inline( 'Your name was successfully updated.', 'name-updated-message' ) ); + } + + return; + + #region Actions that might be called from external links (e.g. email) + + case 'cancel_trial': + if ( $plugin_id == $this->get_id() ) { + $this->_cancel_trial(); + } else { + if ( $this->is_addon_activated( $plugin_id ) ) { + $fs_addon = self::get_instance_by_id( $plugin_id ); + $fs_addon->_cancel_trial(); + } + } + + return; + + case 'verify_email': + $this->verify_email(); + + return; + + case 'sync_user': + $this->_handle_account_user_sync(); + + return; + + case $this->get_unique_affix() . '_sync_license': + $this->_sync_license(); + + return; + + case 'download_latest': + $this->download_latest_directly( $plugin_id ); + + return; + + #endregion + } + + if ( WP_FS__IS_POST_REQUEST ) { + $properties = array( 'site_secret_key', 'site_id', 'site_public_key' ); + foreach ( $properties as $p ) { + if ( 'update_' . $p === $action ) { + check_admin_referer( $action ); + + $this->_logger->log( $action ); + + $site_property = substr( $p, strlen( 'site_' ) ); + $site_property_value = fs_request_get( 'fs_' . $p . '_' . $this->get_unique_affix(), '' ); + $this->get_site()->{$site_property} = $site_property_value; + + // Store account after modification. + $this->_store_site(); + + $this->do_action( 'account_property_edit', 'site', $site_property, $site_property_value ); + + $this->_admin_notices->add( sprintf( + /* translators: %s: User's account property (e.g. email address, name) */ + $this->get_text_inline( 'You have successfully updated your %s.', 'x-updated' ), + '<b>' . str_replace( '_', ' ', $p ) . '</b>' + ) ); + + return; + } + } + } + } + + /** + * Account page resources load. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + */ + function _account_page_load() { + $this->_logger->entrance(); + + $this->_logger->info( var_export( $_REQUEST, true ) ); + + fs_enqueue_local_style( 'fs_account', '/admin/account.css' ); + + if ( $this->has_addons() ) { + wp_enqueue_script( 'plugin-install' ); + add_thickbox(); + + function fs_addons_body_class( $classes ) { + $classes .= ' plugins-php'; + + return $classes; + } + + add_filter( 'admin_body_class', 'fs_addons_body_class' ); + } + + if ( $this->has_paid_plan() && + ! $this->has_any_license() && + ! $this->is_sync_executed() && + $this->is_tracking_allowed() + ) { + /** + * If no licenses found and no sync job was executed during the last 24 hours, + * just execute the sync job right away (blocking execution). + * + * @since 1.1.7.3 + */ + $this->run_manual_sync(); + } + + $this->_handle_account_edits(); + + $this->do_action( 'account_page_load_before_departure' ); + } + + /** + * Renders the "Affiliation" page. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + */ + function _affiliation_page_render() { + $this->_logger->entrance(); + + $this->fetch_affiliate_and_terms(); + + fs_enqueue_local_style( 'fs_affiliation', '/admin/affiliation.css' ); + + $vars = array( 'id' => $this->_module_id ); + echo $this->apply_filters( "/forms/affiliation.php", fs_get_template( '/forms/affiliation.php', $vars ) ); + } + + + /** + * Render account page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + */ + function _account_page_render() { + $this->_logger->entrance(); + + $template = 'account.php'; + $vars = array( 'id' => $this->_module_id ); + + /** + * Added filter to the template to allow developers wrapping the template + * in custom HTML (e.g. within a wizard/tabs). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + */ + echo $this->apply_filters( "templates/{$template}", fs_get_template( $template, $vars ) ); + } + + /** + * Render account connect page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + function _connect_page_render() { + $this->_logger->entrance(); + + $vars = array( 'id' => $this->_module_id ); + + /** + * Added filter to the template to allow developers wrapping the template + * in custom HTML (e.g. within a wizard/tabs). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + */ + echo $this->apply_filters( 'templates/connect.php', fs_get_template( 'connect.php', $vars ) ); + } + + /** + * Load required resources before add-ons page render. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + */ + function _addons_page_load() { + $this->_logger->entrance(); + + fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); + + wp_enqueue_script( 'plugin-install' ); + add_thickbox(); + + function fs_addons_body_class( $classes ) { + $classes .= ' plugins-php'; + + return $classes; + } + + add_filter( 'admin_body_class', 'fs_addons_body_class' ); + + if ( ! $this->is_registered() && $this->is_org_repo_compliant() ) { + $this->_admin_notices->add( + sprintf( $this->get_text_inline( 'Just letting you know that the add-ons information of %s is being pulled from an external server.', 'addons-info-external-message' ), '<b>' . $this->get_plugin_name() . '</b>' ), + $this->get_text_x_inline( 'Heads up', 'advance notice of something that will need attention.', 'heads-up' ), + 'update-nag' + ); + } + } + + /** + * Render add-ons page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + */ + function _addons_page_render() { + $this->_logger->entrance(); + + $vars = array( 'id' => $this->_module_id ); + + /** + * Added filter to the template to allow developers wrapping the template + * in custom HTML (e.g. within a wizard/tabs). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + */ + echo $this->apply_filters( 'templates/add-ons.php', fs_get_template( 'add-ons.php', $vars ) ); + } + + /* Pricing & Upgrade + ------------------------------------------------------------------------------------------------------------------*/ + /** + * Render pricing page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + */ + function _pricing_page_render() { + $this->_logger->entrance(); + + $vars = array( 'id' => $this->_module_id ); + + if ( 'true' === fs_request_get( 'checkout', false ) ) { + echo $this->apply_filters( 'templates/checkout.php', fs_get_template( 'checkout.php', $vars ) ); + } else { + echo $this->apply_filters( 'templates/pricing.php', fs_get_template( 'pricing.php', $vars ) ); + } + } + + #---------------------------------------------------------------------------------- + #region Contact Us + #---------------------------------------------------------------------------------- + + /** + * Render contact-us page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + */ + function _contact_page_render() { + $this->_logger->entrance(); + + $vars = array( 'id' => $this->_module_id ); + + /** + * Added filter to the template to allow developers wrapping the template + * in custom HTML (e.g. within a wizard/tabs). + * + * @author Vova Feldman (@svovaf) + * @since 2.1.3 + */ + echo $this->apply_filters( 'templates/contact.php', fs_get_template( 'contact.php', $vars ) ); + } + + #endregion ------------------------------------------------------------------------ + + /** + * Hide all admin notices to prevent distractions. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @uses remove_all_actions() + */ + private static function _hide_admin_notices() { + remove_all_actions( 'admin_notices' ); + remove_all_actions( 'network_admin_notices' ); + remove_all_actions( 'all_admin_notices' ); + remove_all_actions( 'user_admin_notices' ); + } + + static function _clean_admin_content_section_hook() { + self::_hide_admin_notices(); + + // Hide footer. + echo '<style>#wpfooter { display: none !important; }</style>'; + } + + /** + * Attach to admin_head hook to hide all admin notices. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + */ + static function _clean_admin_content_section() { + add_action( 'admin_head', 'Freemius::_clean_admin_content_section_hook' ); + } + + /* CSS & JavaScript + ------------------------------------------------------------------------------------------------------------------*/ + /* function _enqueue_script($handle, $src) { + $url = plugins_url( substr( WP_FS__DIR_JS, strlen( $this->_plugin_dir_path ) ) . '/assets/js/' . $src ); + + $this->_logger->entrance( 'script = ' . $url ); + + wp_enqueue_script( $handle, $url ); + }*/ + + /* SDK + ------------------------------------------------------------------------------------------------------------------*/ + private $_user_api; + + /** + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @param bool $flush + * + * @return FS_Api + */ + private function get_api_user_scope( $flush = false ) { + if ( ! isset( $this->_user_api ) || $flush ) { + $this->_user_api = $this->get_api_user_scope_by_user( $this->_user ); + } + + return $this->_user_api; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_User $user + * + * @return \FS_Api + */ + private function get_api_user_scope_by_user( FS_User $user ) { + return FS_Api::instance( + $this->_module_id, + 'user', + $user->id, + $user->public_key, + ! $this->is_live(), + $user->secret_key + ); + } + + /** + * + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param bool $flush + * + * @return FS_Api + */ + private function get_current_or_network_user_api_scope( $flush = false ) { + if ( ! $this->_is_network_active || + ( isset( $this->_user ) && $this->_user instanceof FS_User ) + ) { + return $this->get_api_user_scope( $flush ); + } + + $user = $this->get_current_or_network_user(); + + $this->_user_api = FS_Api::instance( + $this->_module_id, + 'user', + $user->id, + $user->public_key, + ! $this->is_live(), + $user->secret_key + ); + + return $this->_user_api; + } + + private $_site_api; + + /** + * + * @author Vova Feldman (@svovaf) + * @since 1.0.2 + * + * @param bool $flush + * + * @return FS_Api + */ + private function get_api_site_scope( $flush = false ) { + if ( ! isset( $this->_site_api ) || $flush ) { + $this->_site_api = FS_Api::instance( + $this->_module_id, + 'install', + $this->_site->id, + $this->_site->public_key, + ! $this->is_live(), + $this->_site->secret_key + ); + } + + return $this->_site_api; + } + + private $_plugin_api; + + /** + * Get plugin public API scope. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return FS_Api + */ + function get_api_plugin_scope() { + if ( ! isset( $this->_plugin_api ) ) { + $this->_plugin_api = FS_Api::instance( + $this->_module_id, + 'plugin', + $this->_plugin->id, + $this->_plugin->public_key, + ! $this->is_live() + ); + } + + return $this->_plugin_api; + } + + /** + * Get site API scope object (fallback to public plugin scope when not registered). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @return FS_Api + */ + function get_api_site_or_plugin_scope() { + return $this->is_registered() ? + $this->get_api_site_scope() : + $this->get_api_plugin_scope(); + } + + /** + * Show trial promotional notice (if any trial exist). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param FS_Plugin_Plan[] $plans + */ + function _check_for_trial_plans( $plans ) { + /** + * For some reason core's do_action() flattens arrays when it has a single object item. Therefore, we need to restructure the array as expected. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.2 + */ + if ( ! is_array( $plans ) && is_object( $plans ) ) { + $plans = array( $plans ); + } + + $this->_storage->has_trial_plan = FS_Plan_Manager::instance()->has_trial_plan( $plans ); + } + + /** + * During trial promotion the "upgrade" submenu item turns to + * "start trial" to encourage the trial. Since we want to keep + * the same menu item handler and there's no robust way to + * add new arguments to the menu item link's querystring, + * use JavaScript to find the menu item and update the href of + * the link. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + */ + function _fix_start_trial_menu_item_url() { + $template_args = array( 'id' => $this->_module_id ); + fs_require_template( 'add-trial-to-pricing.php', $template_args ); + } + + /** + * Check if module is currently in a trial promotion mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + function is_in_trial_promotion() { + return $this->_admin_notices->has_sticky( 'trial_promotion' ); + } + + /** + * Show trial promotional notice (if any trial exist). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool If trial notice added. + */ + function _add_trial_notice() { + if ( ! $this->is_user_admin() ) { + return false; + } + + if ( ! $this->is_user_in_admin() ) { + return false; + } + + if ( $this->_is_network_active ) { + if ( fs_is_network_admin() ) { + // Network level trial is disabled at the moment. + return false; + } + + if ( ! $this->is_delegated_connection() ) { + // Only delegated sites should support trials. + return false; + } + } + + // Check if trial message is already shown. + if ( $this->is_in_trial_promotion() ) { + add_action( 'admin_footer', array( &$this, '_fix_start_trial_menu_item_url' ) ); + + $this->_menu->add_counter_to_menu_item( 1, 'fs-trial' ); + + return false; + } + + if ( $this->is_premium() && ! WP_FS__DEV_MODE ) { + // Don't show trial if running the premium code, unless running in DEV mode. + return false; + } + + if ( ! $this->has_trial_plan() ) { + // No plans with trial. + return false; + } + + if ( ! $this->apply_filters( 'show_trial', true ) ) { + // Developer explicitly asked not to show the trial promo. + return false; + } + + if ( $this->is_registered() ) { + // Check if trial already utilized. + if ( $this->_site->is_trial_utilized() ) { + return false; + } + + if ( $this->is_paying_or_trial() ) { + // Don't show trial if paying or already in trial. + return false; + } + } + + if ( $this->is_activation_mode() || $this->is_pending_activation() ) { + // If not yet opted-in/skipped, or pending activation, don't show trial. + return false; + } + + $last_time_trial_promotion_shown = $this->_storage->get( 'trial_promotion_shown', false ); + $was_promotion_shown_before = ( false !== $last_time_trial_promotion_shown ); + + // Show promotion if never shown before and 24 hours after initial activation with FS. + if ( ! $was_promotion_shown_before && + $this->_storage->install_timestamp > ( time() - $this->apply_filters( 'show_first_trial_after_n_sec', WP_FS__TIME_24_HOURS_IN_SEC ) ) + ) { + return false; + } + + // OR if promotion was shown before, try showing it every 30 days. + if ( $was_promotion_shown_before && + $this->apply_filters( 'reshow_trial_after_every_n_sec', 30 * WP_FS__TIME_24_HOURS_IN_SEC ) > time() - $last_time_trial_promotion_shown + ) { + return false; + } + + $trial_period = $this->_trial_days; + $require_payment = $this->_is_trial_require_payment; + $trial_url = $this->get_trial_url(); + $plans_string = strtolower( $this->get_text_inline( 'Awesome', 'awesome' ) ); + + if ( $this->is_registered() ) { + // If opted-in, override trial with up to date data from API. + $trial_plans = FS_Plan_Manager::instance()->get_trial_plans( $this->_plans ); + $trial_plans_count = count( $trial_plans ); + + if ( 0 === $trial_plans_count ) { + // If there's no plans with a trial just exit. + return false; + } + + /** + * @var FS_Plugin_Plan $paid_plan + */ + $paid_plan = $trial_plans[0]; + $require_payment = $paid_plan->is_require_subscription; + $trial_period = $paid_plan->trial_period; + + $total_paid_plans = count( $this->_plans ) - ( FS_Plan_Manager::instance()->has_free_plan( $this->_plans ) ? 1 : 0 ); + + if ( $total_paid_plans !== $trial_plans_count ) { + // Not all paid plans have a trial - generate a string of those that have it. + for ( $i = 0; $i < $trial_plans_count; $i ++ ) { + $plans_string .= sprintf( + ' <a href="%s">%s</a>', + $trial_url, + $trial_plans[ $i ]->title + ); + + if ( $i < $trial_plans_count - 2 ) { + $plans_string .= ', '; + } else if ( $i == $trial_plans_count - 2 ) { + $plans_string .= ' and '; + } + } + } + } + + $message = sprintf( + $this->get_text_x_inline( 'Hey', 'exclamation', 'hey' ) . '! ' . $this->get_text_inline( 'How do you like %s so far? Test all our %s premium features with a %d-day free trial.', 'trial-x-promotion-message' ), + sprintf( '<b>%s</b>', $this->get_plugin_name() ), + $plans_string, + $trial_period + ); + + // "No Credit-Card Required" or "No Commitment for N Days". + $cc_string = $require_payment ? + sprintf( $this->get_text_inline( 'No commitment for %s days - cancel anytime!', 'no-commitment-for-x-days' ), $trial_period ) : + $this->get_text_inline( 'No credit card required', 'no-cc-required' ) . '!'; + + + // Start trial button. + $button = ' ' . sprintf( + '<a style="margin-left: 10px; vertical-align: super;" href="%s"><button class="button button-primary">%s ➜</button></a>', + $trial_url, + $this->get_text_x_inline( 'Start free trial', 'call to action', 'start-free-trial' ) + ); + + $this->_admin_notices->add_sticky( + $this->apply_filters( 'trial_promotion_message', "{$message} {$cc_string} {$button}" ), + 'trial_promotion', + '', + 'promotion' + ); + + $this->_storage->trial_promotion_shown = WP_FS__SCRIPT_START_TIME; + + return true; + } + + /** + * Lets users/customers know that the product has an affiliate program. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2.11 + * + * @return bool Returns true if the notice has been added. + */ + function _add_affiliate_program_notice() { + if ( ! $this->is_user_admin() ) { + return false; + } + + if ( ! $this->is_user_in_admin() ) { + return false; + } + + // Check if the notice is already shown. + if ( $this->_admin_notices->has_sticky( 'affiliate_program' ) ) { + return false; + } + + if ( + // Product has no affiliate program. + ! $this->has_affiliate_program() || + // User has applied for an affiliate account. + ! empty( $this->_storage->affiliate_application_data ) + ) { + return false; + } + + if ( ! $this->apply_filters( 'show_affiliate_program_notice', true ) ) { + // Developer explicitly asked not to show the notice about the affiliate program. + return false; + } + + if ( $this->is_activation_mode() || $this->is_pending_activation() ) { + // If not yet opted in/skipped, or pending activation, don't show the notice. + return false; + } + + $last_time_notice_was_shown = $this->_storage->get( 'affiliate_program_notice_shown', false ); + $was_notice_shown_before = ( false !== $last_time_notice_was_shown ); + + /** + * Do not show the notice if it was already shown before or less than 30 days have passed since the initial + * activation with FS. + */ + if ( $was_notice_shown_before || + $this->_storage->install_timestamp > ( time() - ( WP_FS__TIME_24_HOURS_IN_SEC * 30 ) ) + ) { + return false; + } + + if ( ! $this->is_paying() && + FS_Plugin::AFFILIATE_MODERATION_CUSTOMERS == $this->_plugin->affiliate_moderation + ) { + // If the user is not a customer and the affiliate program is only for customers, don't show the notice. + return false; + } + + $message = sprintf( + $this->get_text_inline( 'Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!', 'become-an-ambassador-admin-notice' ), + sprintf( '<strong>%s</strong>', $this->get_plugin_name() ), + $this->get_module_label( true ) + ); + + // HTML code for the "Learn more..." button. + $button = ' ' . sprintf( + '<a style="display: block; margin-top: 10px;" href="%s"><button class="button button-primary">%s ➜</button></a>', + $this->_get_admin_page_url( 'affiliation' ), + $this->get_text_inline( 'Learn more', 'learn-more' ) . '...' + ); + + $this->_admin_notices->add_sticky( + $this->apply_filters( 'affiliate_program_notice', "{$message} {$button}" ), + 'affiliate_program', + '', + 'promotion' + ); + + $this->_storage->affiliate_program_notice_shown = WP_FS__SCRIPT_START_TIME; + + return true; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + */ + function _enqueue_common_css() { + if ( $this->has_paid_plan() && ! $this->is_paying() ) { + // Add basic CSS for admin-notices and menu-item colors. + fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + function _show_theme_activation_optin_dialog() { + fs_enqueue_local_style( 'fs_connect', '/admin/connect.css' ); + + add_action( 'admin_footer-themes.php', array( &$this, '_add_fs_theme_activation_dialog' ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + function _add_fs_theme_activation_dialog() { + $vars = array( 'id' => $this->_module_id ); + fs_require_once_template( 'connect.php', $vars ); + } + + /* Action Links + ------------------------------------------------------------------------------------------------------------------*/ + private $_action_links_hooked = false; + private $_action_links = array(); + + /** + * Hook to plugin action links filter. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + */ + private function hook_plugin_action_links() { + $this->_logger->entrance(); + + $this->_action_links_hooked = true; + + $this->_logger->log( 'Adding action links hooks.' ); + + // Add action link to settings page. + add_filter( 'plugin_action_links_' . $this->_plugin_basename, array( + &$this, + '_modify_plugin_action_links_hook' + ), WP_FS__DEFAULT_PRIORITY, 2 ); + add_filter( 'network_admin_plugin_action_links_' . $this->_plugin_basename, array( + &$this, + '_modify_plugin_action_links_hook' + ), WP_FS__DEFAULT_PRIORITY, 2 ); + } + + /** + * Add plugin action link. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @param $label + * @param $url + * @param bool $external + * @param int $priority + * @param bool $key + */ + function add_plugin_action_link( $label, $url, $external = false, $priority = WP_FS__DEFAULT_PRIORITY, $key = false ) { + $this->_logger->entrance(); + + if ( ! isset( $this->_action_links[ $priority ] ) ) { + $this->_action_links[ $priority ] = array(); + } + + if ( false === $key ) { + $key = preg_replace( "/[^A-Za-z0-9 ]/", '', strtolower( $label ) ); + } + + $this->_action_links[ $priority ][] = array( + 'label' => $label, + 'href' => $url, + 'key' => $key, + 'external' => $external + ); + } + + /** + * Adds Upgrade and Add-Ons links to the main Plugins page link actions collection. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + */ + function _add_upgrade_action_link() { + $this->_logger->entrance(); + + if ( ! $this->is_paying() && $this->has_paid_plan() ) { + $this->add_plugin_action_link( + $this->get_text_inline( 'Upgrade', 'upgrade' ), + $this->get_upgrade_url(), + false, + 7, + 'upgrade' + ); + } + + if ( $this->has_addons() ) { + $this->add_plugin_action_link( + $this->get_text_inline( 'Add-Ons', 'add-ons' ), + $this->_get_admin_page_url( 'addons' ), + false, + 9, + 'addons' + ); + } + } + + /** + * Adds "Activate License" or "Change License" link to the main Plugins page link actions collection. + * + * @author Leo Fajardo (@leorw) + * @since 1.1.9 + */ + function _add_license_action_link() { + $this->_logger->entrance(); + + if ( ! self::is_ajax() ) { + // Inject license activation dialog UI and client side code. + add_action( 'admin_footer', array( &$this, '_add_license_activation_dialog_box' ) ); + } + + $link_text = $this->is_free_plan() ? + $this->get_text_inline( 'Activate License', 'activate-license' ) : + $this->get_text_inline( 'Change License', 'change-license' ); + + $this->add_plugin_action_link( + $link_text, + '#', + false, + 11, + ( 'activate-license ' . $this->get_unique_affix() ) + ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + */ + function _add_premium_version_upgrade_selection_action() { + $this->_logger->entrance(); + + if ( ! self::is_ajax() ) { + add_action( 'admin_footer', array( &$this, '_add_premium_version_upgrade_selection_dialog_box' ) ); + } + } + + /** + * Adds "Opt in" or "Opt out" link to the main "Plugins" page link actions collection. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.1.5 + */ + function _add_tracking_links() { + if ( ! current_user_can( 'manage_options' ) ) { + return; + } + + $this->_logger->entrance(); + + /** + * If the activation has been delegated to site admins, no tracking-related actions for now. + * + * @author Leo Fajardo (@leorw) + */ + if ( $this->_is_network_active && $this->is_network_delegated_connection() ) { + return; + } + + if ( fs_request_is_action_secure( $this->get_unique_affix() . '_reconnect' ) ) { + if ( ! $this->is_registered() && $this->is_anonymous() ) { + $this->connect_again(); + + return; + } + } + + if ( ( $this->is_plugin() && ! self::is_plugins_page() ) || + ( $this->is_theme() && ! self::is_themes_page() ) + ) { + // Only show tracking links on the plugins and themes pages. + return; + } + + if ( ! $this->is_enable_anonymous() ) { + // Don't allow to opt-out if anonymous mode is disabled. + return; + } + + if ( ! $this->is_free_plan() ) { + // Don't allow to opt-out if running in paid plan. + return; + } + + if ( $this->add_ajax_action( 'stop_tracking', array( &$this, '_stop_tracking_callback' ) ) ) { + return; + } + + if ( $this->add_ajax_action( 'allow_tracking', array( &$this, '_allow_tracking_callback' ) ) ) { + return; + } + + $url = '#'; + + if ( $this->is_registered() ) { + if ( $this->is_tracking_allowed() ) { + $link_text_id = $this->get_text_inline( 'Opt Out', 'opt-out' ); + } else { + $link_text_id = $this->get_text_inline( 'Opt In', 'opt-in' ); + } + + add_action( 'admin_footer', array( &$this, '_add_optout_dialog' ) ); + } else { + $link_text_id = $this->get_text_inline( 'Opt In', 'opt-in' ); + + $params = ! $this->is_anonymous() ? + array() : + array( + 'nonce' => wp_create_nonce( $this->get_unique_affix() . '_reconnect' ), + 'fs_action' => ( $this->get_unique_affix() . '_reconnect' ), + ); + + $url = $this->get_activation_url( $params ); + } + + if ( $this->is_plugin() && self::is_plugins_page() ) { + $this->add_plugin_action_link( + $link_text_id, + $url, + false, + 13, + "opt-in-or-opt-out {$this->_slug}" + ); + } + } + + /** + * Get the URL of the page that should be loaded right after the plugin activation. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.4 + * + * @return string + */ + function get_after_plugin_activation_redirect_url() { + $url = false; + + if ( ! $this->is_addon() || ! $this->has_free_plan() ) { + $first_time_path = $this->_menu->get_first_time_path(); + $url = $this->is_activation_mode() ? + $this->get_activation_url() : + ( empty( $first_time_path ) ? + $this->_get_admin_page_url() : + $first_time_path ); + } else { + $plugin_fs = false; + + if ( $this->is_parent_plugin_installed() ) { + $plugin_fs = self::get_parent_instance(); + } + + if ( is_object( $plugin_fs ) ) { + if ( ! $plugin_fs->is_registered() ) { + // Forward to parent plugin connect when parent not registered. + $url = $plugin_fs->get_activation_url(); + } else { + // Forward to account page. + $url = $plugin_fs->_get_admin_page_url( 'account' ); + } + } + } + + return $url; + } + + /** + * Forward page to activation page. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + */ + function _redirect_on_activation_hook() { + $url = $this->get_after_plugin_activation_redirect_url(); + + if ( is_string( $url ) ) { + fs_redirect( $url ); + } + } + + /** + * Modify plugin's page action links collection. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @param array $links + * @param $file + * + * @return array + */ + function _modify_plugin_action_links_hook( $links, $file ) { + $this->_logger->entrance(); + + $passed_deactivate = false; + $deactivate_link = ''; + $before_deactivate = array(); + $after_deactivate = array(); + foreach ( $links as $key => $link ) { + if ( 'deactivate' === $key ) { + $deactivate_link = $link; + $passed_deactivate = true; + continue; + } + + if ( ! $passed_deactivate ) { + $before_deactivate[ $key ] = $link; + } else { + $after_deactivate[ $key ] = $link; + } + } + + ksort( $this->_action_links ); + + foreach ( $this->_action_links as $new_links ) { + foreach ( $new_links as $link ) { + $before_deactivate[ $link['key'] ] = '<a href="' . $link['href'] . '"' . ( $link['external'] ? ' target="_blank"' : '' ) . '>' . $link['label'] . '</a>'; + } + } + + if ( ! empty( $deactivate_link ) ) { + /** + * This HTML element is used to identify the correct plugin when attaching an event to its Deactivate link. + * + * @since 1.2.1.6 Always show the deactivation feedback form since we added automatic free version deactivation upon premium code activation. + */ + $deactivate_link .= '<i class="fs-module-id" data-module-id="' . $this->_module_id . '"></i>'; + + // Append deactivation link. + $before_deactivate['deactivate'] = $deactivate_link; + } + + return array_merge( $before_deactivate, $after_deactivate ); + } + + /** + * Adds admin message. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $message + * @param string $title + * @param string $type + */ + function add_admin_message( $message, $title = '', $type = 'success' ) { + $this->_admin_notices->add( $message, $title, $type ); + } + + /** + * Adds sticky admin message. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.0 + * + * @param string $message + * @param string $id + * @param string $title + * @param string $type + */ + function add_sticky_admin_message( $message, $id, $title = '', $type = 'success' ) { + $this->_admin_notices->add_sticky( $message, $id, $title, $type ); + } + + /** + * Helper function that returns the final steps for the upgrade completion. + * + * If the module is already running the premium code, returns an empty string. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @param string $plan_title + * + * @return string + */ + private function get_complete_upgrade_instructions( $plan_title = '' ) { + $this->_logger->entrance(); + + $activate_license_string = $this->get_license_network_activation_notice(); + + if ( ! $this->has_premium_version() || $this->is_premium() ) { + return '' . $activate_license_string; + } + + if ( empty( $plan_title ) ) { + $plan_title = $this->get_plan_title(); + } + + // @since 1.2.1.5 The free version is auto deactivated. + $deactivation_step = version_compare( $this->version, '1.2.1.5', '<' ) ? + ( '<li>' . $this->esc_html_inline( 'Deactivate the free version', 'deactivate-free-version' ) . '.</li>' ) : + ''; + + return sprintf( + ' %s: <ol><li>%s.</li>%s<li>%s (<a href="%s" target="_blank">%s</a>).</li></ol>', + $this->get_text_inline( 'Please follow these steps to complete the upgrade', 'follow-steps-to-complete-upgrade' ), + ( empty( $activate_license_string ) ? '' : $activate_license_string . '</li><li>' ) . + $this->get_latest_download_link( sprintf( + /* translators: %s: Plan title */ + $this->get_text_inline( 'Download the latest %s version', 'download-latest-x-version' ), + $plan_title + ) ), + $deactivation_step, + $this->get_text_inline( 'Upload and activate the downloaded version', 'upload-and-activate' ), + '//bit.ly/upload-wp-' . $this->_module_type . 's', + $this->get_text_inline( 'How to upload and activate?', 'howto-upload-activate' ) + ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param string $url + * @param array $request + */ + private static function enrich_request_for_debug( &$url, &$request ) { + if ( WP_FS__DEBUG_SDK || isset( $_COOKIE['XDEBUG_SESSION'] ) ) { + $url = add_query_arg( 'XDEBUG_SESSION_START', rand( 0, 9999999 ), $url ); + $url = add_query_arg( 'XDEBUG_SESSION', 'PHPSTORM', $url ); + + $request['cookies'] = array( + new WP_Http_Cookie( array( + 'name' => 'XDEBUG_SESSION', + 'value' => 'PHPSTORM', + ) ) + ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param string $url + * @param array $request + * @param int $success_cache_expiration + * @param int $failure_cache_expiration + * @param bool $maybe_enrich_request_for_debug + * + * @return WP_Error|array + */ + static function safe_remote_post( + &$url, + $request, + $success_cache_expiration = 0, + $failure_cache_expiration = 0, + $maybe_enrich_request_for_debug = true + ) { + $should_cache = ($success_cache_expiration + $failure_cache_expiration > 0); + + $cache_key = $should_cache ? md5( fs_strip_url_protocol($url) . json_encode( $request ) ) : false; + + $response = (!WP_FS__DEBUG_SDK && ( false !== $cache_key )) ? + get_transient( $cache_key ) : + false; + + if ( false === $response ) { + if ( $maybe_enrich_request_for_debug ) { + self::enrich_request_for_debug( $url, $request ); + } + + $response = wp_remote_post( $url, $request ); + + if ( $response instanceof WP_Error ) { + if ( 'https://' === substr( $url, 0, 8 ) && + isset( $response->errors ) && + isset( $response->errors['http_request_failed'] ) + ) { + $http_error = strtolower( $response->errors['http_request_failed'][0] ); + + if ( false !== strpos( $http_error, 'ssl' ) || + false !== strpos( $http_error, 'curl error 35' ) + ) { + // Failed due to old version of cURL or Open SSL (SSLv3 is not supported by CloudFlare). + $url = 'http://' . substr( $url, 8 ); + + $request['timeout'] = 15; + $response = wp_remote_post( $url, $request ); + } + } + } + + if ( false !== $cache_key ) { + set_transient( + $cache_key, + $response, + ( ( $response instanceof WP_Error ) ? + $failure_cache_expiration : + $success_cache_expiration ) + ); + } + } + + return $response; + } + + /** + * This method is used to enrich the after upgrade notice instructions when the upgraded + * license cannot be activated network wide (license quota isn't large enough). + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + private function get_license_network_activation_notice() { + if ( ! $this->_is_network_active ) { + // Module isn't network level activated. + return ''; + } + + if ( ! fs_is_network_admin() ) { + // Not network level admin. + return ''; + } + + if ( get_blog_count() == 1 ) { + // There's only a single site in the network so if there's a context license it was already activated. + return ''; + } + + if ( ! is_object( $this->_license ) ) { + // No context license. + return ''; + } + + if ( $this->_license->is_single_site() && 0 < $this->_license->activated ) { + // License was already utilized (this is not 100% the case if all the network is localhost sites and the license can be utilized on unlimited localhost sites). + return ''; + } + + if ( $this->can_activate_license_on_network( $this->_license ) ) { + // License can be activated on all the network, so probably, the license is already activate on all the network (that's how the after upgrade sync works). + return ''; + } + + return sprintf( + $this->get_text_inline( '%sClick here%s to choose the sites where you\'d like to activate the license on.', 'network-choose-sites-for-license' ), + '<a href="' . $this->get_account_url( false, array( 'activate_license' => 'true' ) ) . '">', + '</a>' + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $key + * + * @return string + */ + function get_text( $key ) { + return fs_text( $key, $this->_slug ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * + * @return string + */ + function get_text_inline( $text, $key = '' ) { + return _fs_text_inline( $text, $key, $this->_slug ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * + * @return string + */ + function get_text_x_inline( $text, $context, $key ) { + return _fs_text_x_inline( $text, $context, $key, $this->_slug ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * + * @return string + */ + function esc_html_inline( $text, $key ) { + return esc_html( _fs_text_inline( $text, $key, $this->_slug ) ); + } + + #---------------------------------------------------------------------------------- + #region Versioning + #---------------------------------------------------------------------------------- + + /** + * Check if Freemius in SDK upgrade mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_sdk_upgrade_mode() { + return isset( $this->_storage->sdk_upgrade_mode ) ? + $this->_storage->sdk_upgrade_mode : + false; + } + + /** + * Turn SDK upgrade mode off. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function set_sdk_upgrade_complete() { + $this->_storage->sdk_upgrade_mode = false; + } + + /** + * Check if plugin upgrade mode. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_plugin_upgrade_mode() { + return isset( $this->_storage->plugin_upgrade_mode ) ? + $this->_storage->plugin_upgrade_mode : + false; + } + + /** + * Turn plugin upgrade mode off. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function set_plugin_upgrade_complete() { + $this->_storage->plugin_upgrade_mode = false; + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Permissions + #---------------------------------------------------------------------------------- + + /** + * Check if specific permission requested. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $permission + * + * @return bool + */ + function is_permission_requested( $permission ) { + return isset( $this->_permissions[ $permission ] ) && ( true === $this->_permissions[ $permission ] ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Auto Activation + #---------------------------------------------------------------------------------- + + /** + * Hints the SDK if running an auto-installation. + * + * @var bool + */ + private $_isAutoInstall = false; + + /** + * After upgrade callback to install and auto activate a plugin. + * This code will only be executed on explicit request from the user, + * following the practice Jetpack are using with their theme installations. + * + * @link https://make.wordpress.org/plugins/2017/03/16/clarification-of-guideline-8-executable-code-and-installs/ + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + function _install_premium_version_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'install_premium_version' ); + + if ( ! $this->is_registered() ) { + // Not registered. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Auto installation only works for opted-in users.', 'auto-install-error-not-opted-in' ), + 'code' => 'premium_installed', + ) ); + } + + $plugin_id = fs_request_get( 'target_module_id', $this->get_id() ); + + if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { + // Invalid ID. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), + 'code' => 'invalid_module_id', + ) ); + } + + if ( $plugin_id == $this->get_id() ) { + if ( $this->is_premium() ) { + // Already using the premium code version. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Premium version already active.', 'auto-install-error-premium-activated' ), + 'code' => 'premium_installed', + ) ); + } + if ( ! $this->can_use_premium_code() ) { + // Don't have access to the premium code. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'You do not have a valid license to access the premium version.', 'auto-install-error-invalid-license' ), + 'code' => 'invalid_license', + ) ); + } + if ( ! $this->has_release_on_freemius() ) { + // Plugin is a serviceware, no premium code version. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Plugin is a "Serviceware" which means it does not have a premium code version.', 'auto-install-error-serviceware' ), + 'code' => 'premium_version_missing', + ) ); + } + } else { + $addon = $this->get_addon( $plugin_id ); + + if ( ! is_object( $addon ) ) { + // Invalid add-on ID. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), + 'code' => 'invalid_module_id', + ) ); + } + + if ( $this->is_addon_activated( $plugin_id, true ) ) { + // Premium add-on version is already activated. + self::shoot_ajax_failure( array( + 'message' => $this->get_text_inline( 'Premium add-on version already installed.', 'auto-install-error-premium-addon-activated' ), + 'code' => 'premium_installed', + ) ); + } + } + + $this->_isAutoInstall = true; + + // Try to install and activate. + $updater = FS_Plugin_Updater::instance( $this ); + $result = $updater->install_and_activate_plugin( $plugin_id ); + + if ( is_array( $result ) && ! empty( $result['message'] ) ) { + self::shoot_ajax_failure( array( + 'message' => $result['message'], + 'code' => $result['code'], + ) ); + } + + self::shoot_ajax_success( $result ); + } + + /** + * Displays module activation dialog box after a successful upgrade + * where the user explicitly requested to auto download and install + * the premium version. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + function _add_auto_installation_dialog_box() { + $this->_logger->entrance(); + + if ( ! $this->is_registered() ) { + // Not registered. + return; + } + + $plugin_id = fs_request_get( 'plugin_id', $this->get_id() ); + + if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { + // Invalid module ID. + return; + } + + if ( $plugin_id == $this->get_id() ) { + if ( $this->is_premium() ) { + // Already using the premium code version. + return; + } + if ( ! $this->can_use_premium_code() ) { + // Don't have access to the premium code. + return; + } + if ( ! $this->has_release_on_freemius() ) { + // Plugin is a serviceware, no premium code version. + return; + } + } else { + $addon = $this->get_addon( $plugin_id ); + + if ( ! is_object( $addon ) ) { + // Invalid add-on ID. + return; + } + + if ( $this->is_addon_activated( $plugin_id, true ) ) { + // Premium add-on version is already activated. + return; + } + } + + $vars = array( + 'id' => $this->_module_id, + 'target_module_id' => $plugin_id, + 'slug' => $this->_slug, + ); + + fs_require_template( 'auto-installation.php', $vars ); + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Tabs Integration + #-------------------------------------------------------------------------------- + + #region Module's Original Tabs + + /** + * Inject a JavaScript logic to capture the theme tabs HTML. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + function _tabs_capture() { + $this->_logger->entrance(); + + if ( ! $this->is_theme_settings_page() || + ! $this->is_matching_url( $this->main_menu_url() ) + ) { + return; + } + + $params = array( + 'id' => $this->_module_id, + ); + + fs_require_once_template( 'tabs-capture-js.php', $params ); + } + + /** + * Cache theme's tabs HTML for a week. The cache will also be set as expired + * after version and type (free/premium) changes, in addition to the week period. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + function _store_tabs_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'store_tabs' ); + + // Init filesystem if not yet initiated. + WP_Filesystem(); + + // Get POST body HTML data. + global $wp_filesystem; + $tabs_html = $wp_filesystem->get_contents( "php://input" ); + + if ( is_string( $tabs_html ) ) { + $tabs_html = trim( $tabs_html ); + } + + if ( ! is_string( $tabs_html ) || empty( $tabs_html ) ) { + self::shoot_ajax_failure(); + } + + $this->_cache->set( 'tabs', $tabs_html, 7 * WP_FS__TIME_24_HOURS_IN_SEC ); + + self::shoot_ajax_success(); + } + + /** + * Cache theme's settings page custom styles. The cache will also be set as expired + * after version and type (free/premium) changes, in addition to the week period. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + function _store_tabs_styles() { + $this->_logger->entrance(); + + if ( ! $this->is_theme_settings_page() || + ! $this->is_matching_url( $this->main_menu_url() ) + ) { + return; + } + + $wp_styles = wp_styles(); + + $theme_styles_url = get_template_directory_uri(); + + $stylesheets = array(); + foreach ( $wp_styles->queue as $handler ) { + if ( fs_starts_with( $handler, 'fs_' ) ) { + // Assume that stylesheets that their handler starts with "fs_" belong to the SDK. + continue; + } + + /** + * @var _WP_Dependency $stylesheet + */ + $stylesheet = $wp_styles->registered[ $handler ]; + + if ( fs_starts_with( $stylesheet->src, $theme_styles_url ) ) { + $stylesheets[] = $stylesheet->src; + } + } + + if ( ! empty( $stylesheets ) ) { + $this->_cache->set( 'tabs_stylesheets', $stylesheets, 7 * WP_FS__TIME_24_HOURS_IN_SEC ); + } + } + + /** + * Check if module's original settings page has any tabs. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + private function has_tabs() { + return $this->_cache->has( 'tabs' ); + } + + /** + * Get module's settings page HTML content, starting + * from the beginning of the <div class="wrap"> element, + * until the tabs HTML (including). + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return string + */ + private function get_tabs_html() { + $this->_logger->entrance(); + + return $this->_cache->get( 'tabs' ); + } + + /** + * Check if page should include tabs. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool + */ + private function should_page_include_tabs() { + if ( ! $this->has_settings_menu() ) { + // Don't add tabs if no settings at all. + return false; + } + + if ( ! $this->is_theme() ) { + // Only add tabs to themes for now. + return false; + } + + if ( ! $this->has_paid_plan() && ! $this->has_addons() ) { + // Only add tabs to monetizing themes. + return false; + } + + if ( ! $this->is_theme_settings_page() ) { + // Only add tabs if browsing one of the theme's setting pages. + return false; + } + + if ( $this->is_admin_page( 'pricing' ) && fs_request_get_bool( 'checkout' ) ) { + // Don't add tabs on checkout page, we want to reduce distractions + // as much as possible. + return false; + } + + return true; + } + + /** + * Add the tabs HTML before the setting's page content and + * enqueue any required stylesheets. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool If tabs were included. + */ + function _add_tabs_before_content() { + $this->_logger->entrance(); + + if ( ! $this->should_page_include_tabs() ) { + return false; + } + + /** + * Enqueue the original stylesheets that are included in the + * theme settings page. That way, if the theme settings has + * some custom _styled_ content above the tabs UI, this + * will make sure that the styling is preserved. + */ + $stylesheets = $this->_cache->get( 'tabs_stylesheets', array() ); + if ( is_array( $stylesheets ) ) { + for ( $i = 0, $len = count( $stylesheets ); $i < $len; $i ++ ) { + wp_enqueue_style( "fs_{$this->_module_id}_tabs_{$i}", $stylesheets[ $i ] ); + } + } + + // Cut closing </div> tag. + echo substr( trim( $this->get_tabs_html() ), 0, - 6 ); + + return true; + } + + /** + * Add the tabs closing HTML after the setting's page content. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return bool If tabs closing HTML was included. + */ + function _add_tabs_after_content() { + $this->_logger->entrance(); + + if ( ! $this->should_page_include_tabs() ) { + return false; + } + + echo '</div>'; + + return true; + } + + #endregion + + /** + * Add in-page JavaScript to inject the Freemius tabs into + * the module's setting tabs section. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + function _add_freemius_tabs() { + $this->_logger->entrance(); + + if ( ! $this->should_page_include_tabs() ) { + return; + } + + $params = array( 'id' => $this->_module_id ); + fs_require_once_template( 'tabs.php', $params ); + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Customizer Integration for Themes + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param WP_Customize_Manager $customizer + */ + function _customizer_register( $customizer ) { + $this->_logger->entrance(); + + if ( $this->is_pricing_page_visible() ) { + require_once WP_FS__DIR_INCLUDES . '/customizer/class-fs-customizer-upsell-control.php'; + + $customizer->add_section( 'freemius_upsell', array( + 'title' => '★ ' . $this->get_text_inline( 'View paid features', 'view-paid-features' ), + 'priority' => 1, + ) ); + $customizer->add_setting( 'freemius_upsell', array( + 'sanitize_callback' => 'esc_html', + ) ); + + $customizer->add_control( new FS_Customizer_Upsell_Control( $customizer, 'freemius_upsell', array( + 'fs' => $this, + 'section' => 'freemius_upsell', + 'priority' => 100, + ) ) ); + } + + if ( $this->is_page_visible( 'contact' ) || $this->is_page_visible( 'support' ) ) { + require_once WP_FS__DIR_INCLUDES . '/customizer/class-fs-customizer-support-section.php'; + + // Main Documentation Link In Customizer Root. + $customizer->add_section( new FS_Customizer_Support_Section( $customizer, 'freemius_support', array( + 'fs' => $this, + 'priority' => 1000, + ) ) ); + } + } + + #endregion + + /** + * If the theme has a paid version, add some custom + * styling to the theme's premium version (if exists) + * to highlight that it's the premium version of the + * same theme, making it easier for identification + * after the user upgrades and upload it to the site. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + function _style_premium_theme() { + $this->_logger->entrance(); + + if ( ! self::is_themes_page() ) { + // Only include in the themes page. + return; + } + + if ( ! $this->has_paid_plan() ) { + // Only include if has any paid plans. + return; + } + + $params = null; + fs_require_once_template( '/js/jquery.content-change.php', $params ); + + $params = array( + 'slug' => $this->_slug, + 'id' => $this->_module_id, + ); + + fs_require_template( '/js/style-premium-theme.php', $params ); + } + + /** + * This method will return the absolute URL of the module's local icon. + * + * When you are running your plugin or theme on a **localhost** environment, if the icon + * is not found in the local assets folder, try to fetch the icon URL from Freemius. If not set and + * it's a plugin hosted on WordPress.org, try fetching the icon URL from wordpress.org. + * If an icon is found, this method will automatically attempt to download the icon and store it + * in /freemius/assets/img/{slug}.{png|jpg|gif|svg}. + * + * It's important to mention that this method is NOT phoning home since the developer will deploy + * the product with the local icon in the assets folder. The download process just simplifies + * the process for the developer. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function get_local_icon_url() { + global $fs_active_plugins; + + /** + * @since 1.1.7.5 + */ + $local_path = $this->apply_filters( 'plugin_icon', false ); + + if ( is_string( $local_path ) ) { + $icons = array( $local_path ); + } else { + $img_dir = WP_FS__DIR_IMG; + + // Locate the main assets folder. + if ( 1 < count( $fs_active_plugins->plugins ) ) { + $plugin_or_theme_img_dir = ( $this->is_plugin() ? WP_PLUGIN_DIR : get_theme_root() ); + + foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { + if ( $data->plugin_path == $this->get_plugin_basename() ) { + $img_dir = $plugin_or_theme_img_dir + . '/' + . str_replace( '../themes/', '', $sdk_path ) + . '/assets/img'; + + break; + } + } + } + + // Try to locate the icon in the assets folder. + $icons = glob( fs_normalize_path( $img_dir . "/{$this->_slug}.*" ) ); + + if ( ! is_array( $icons ) || 0 === count( $icons ) ) { + if ( ! WP_FS__IS_LOCALHOST && $this->is_theme() ) { + $icons = array( + fs_normalize_path( $img_dir . '/theme-icon.png' ) + ); + } else { + $icon_found = false; + $local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.png" ); + + if ( ! function_exists( 'get_filesystem_method' ) ) { + require_once ABSPATH . 'wp-admin/includes/file.php'; + } + + $have_write_permissions = ( 'direct' === get_filesystem_method( array(), fs_normalize_path( $img_dir ) ) ); + + /** + * IMPORTANT: THIS CODE WILL NEVER RUN AFTER THE PLUGIN IS IN THE REPO. + * + * This code will only be executed once during the testing + * of the plugin in a local environment. The plugin icon file WILL + * already exist in the assets folder when the plugin is deployed to + * the repository. + */ + if ( WP_FS__IS_LOCALHOST && $have_write_permissions ) { + // Fetch icon from Freemius. + $icon = $this->fetch_remote_icon_url(); + + // Fetch icon from WordPress.org. + if ( empty( $icon ) && $this->is_plugin() && $this->is_org_repo_compliant() ) { + if ( ! function_exists( 'plugins_api' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; + } + + $plugin_information = plugins_api( 'plugin_information', array( + 'slug' => $this->_slug, + 'fields' => array( + 'sections' => false, + 'tags' => false, + 'icons' => true + ) + ) ); + + if ( + ! is_wp_error( $plugin_information ) + && isset( $plugin_information->icons ) + && ! empty( $plugin_information->icons ) + ) { + /** + * Get the smallest icon. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + $icon = end( $plugin_information->icons ); + } + } + + if ( ! empty( $icon ) ) { + if ( 0 !== strpos( $icon, 'http' ) ) { + $icon = 'http:' . $icon; + } + + /** + * Get a clean file extension, e.g.: "jpg" and not "jpg?rev=1305765". + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + $ext = pathinfo( strtok( $icon, '?' ), PATHINFO_EXTENSION ); + + $local_path = fs_normalize_path( "{$img_dir}/{$this->_slug}.{$ext}" ); + + // Try to download the icon. + $icon_found = fs_download_image( $icon, $local_path ); + } + } + + if ( ! $icon_found ) { + // No icons found, fallback to default icon. + if ( $have_write_permissions ) { + // If have write permissions, copy default icon. + copy( fs_normalize_path( $img_dir . "/{$this->_module_type}-icon.png" ), $local_path ); + } else { + // If doesn't have write permissions, use default icon path. + $local_path = fs_normalize_path( $img_dir . "/{$this->_module_type}-icon.png" ); + } + } + + $icons = array( $local_path ); + } + } + } + + $icon_dir = dirname( $icons[0] ); + + return fs_img_url( substr( $icons[0], strlen( $icon_dir ) ), $icon_dir ); + } + + /** + * Fetch module's extended info. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return object|mixed + */ + private function fetch_module_info() { + return $this->get_api_plugin_scope()->get( 'info.json', false, WP_FS__TIME_WEEK_IN_SEC ); + } + + /** + * Fetch module's remote icon URL. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function fetch_remote_icon_url() { + $info = $this->fetch_module_info(); + + return ( $this->is_api_result_object( $info, 'icon' ) && is_string( $info->icon ) ) ? + $info->icon : + ''; + } + + #-------------------------------------------------------------------------------- + #region GDPR + #-------------------------------------------------------------------------------- + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @return bool + */ + function fetch_and_store_current_user_gdpr_anonymously() { + $pong = $this->ping( null, true ); + + if ( ! $this->get_api_plugin_scope()->is_valid_ping( $pong ) ) { + return false; + } else { + FS_GDPR_Manager::instance()->store_is_required( $pong->is_gdpr_required ); + + return $pong->is_gdpr_required; + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param array $user_plugins + * + * @return string + */ + private function get_gdpr_admin_notice_string( $user_plugins ) { + $this->_logger->entrance(); + + $addons = self::get_all_addons(); + + foreach ( $user_plugins as $user_plugin ) { + $has_addons = isset( $addons[ $user_plugin->id ] ); + + if ( WP_FS__MODULE_TYPE_PLUGIN === $user_plugin->type && ! $has_addons ) { + if ( $this->_module_id == $user_plugin->id ) { + $addons = $this->get_addons(); + $has_addons = ( ! empty( $addons ) ); + } else { + $plugin_api = FS_Api::instance( + $user_plugin->id, + 'plugin', + $user_plugin->id, + $user_plugin->public_key, + ! $user_plugin->is_live + ); + + $addons_result = $plugin_api->get( '/addons.json?enriched=true', true ); + + if ( $this->is_api_result_object( $addons_result, 'plugins' ) && + is_array( $addons_result->plugins ) && + ! empty( $addons_result->plugins ) + ) { + $has_addons = true; + } + } + } + + $user_plugin->has_addons = $has_addons; + } + + $is_single_parent_product = ( 1 === count( $user_plugins ) ); + + $multiple_products_text = ''; + + if ( $is_single_parent_product ) { + $single_parent_product = reset( $user_plugins ); + + $thank_you = sprintf( + "<span data-plugin-id='%d'>%s</span>", + $single_parent_product->id, + sprintf( + $single_parent_product->has_addons ? + $this->get_text_inline( 'Thank you so much for using %s and its add-ons!', 'thank-you-for-using-product-and-its-addons' ) : + $this->get_text_inline( 'Thank you so much for using %s!', 'thank-you-for-using-product' ), + sprintf('<b><i>%s</i></b>', $single_parent_product->title) + ) + ); + + $already_opted_in = sprintf( + $this->get_text_inline( "You've already opted-in to our usage-tracking, which helps us keep improving the %s.", 'already-opted-in-to-product-usage-tracking' ), + ( WP_FS__MODULE_TYPE_THEME === $single_parent_product->type ) ? WP_FS__MODULE_TYPE_THEME : WP_FS__MODULE_TYPE_PLUGIN + ); + } else { + $thank_you = $this->get_text_inline( 'Thank you so much for using our products!', 'thank-you-for-using-products' ); + $already_opted_in = $this->get_text_inline( "You've already opted-in to our usage-tracking, which helps us keep improving them.", 'already-opted-in-to-products-usage-tracking' ); + + $products_and_add_ons = ''; + foreach ( $user_plugins as $user_plugin ) { + if ( ! empty( $products_and_add_ons ) ) { + $products_and_add_ons .= ', '; + } + + if ( ! $user_plugin->has_addons ) { + $products_and_add_ons .= sprintf( + "<span data-plugin-id='%d'>%s</span>", + $user_plugin->id, + $user_plugin->title + ); + } else { + $products_and_add_ons .= sprintf( + "<span data-plugin-id='%d'>%s</span>", + $user_plugin->id, + sprintf( + $this->get_text_inline( '%s and its add-ons', 'product-and-its-addons' ), + $user_plugin->title + ) + ); + } + } + + $multiple_products_text = sprintf( + "<small class='products'><strong>%s:</strong> %s</small>", + $this->get_text_inline( 'Products', 'products' ), + $products_and_add_ons + ); + } + + $actions = sprintf( + '<ul><li>%s<span class="action-description"> - %s</span></li><li>%s<span class="action-description"> - %s</span></li></ul>', + sprintf('<button class="button button-primary allow-marketing">%s</button>', $this->get_text_inline( 'Yes', 'yes' ) ), + $this->get_text_inline( 'send me security & feature updates, educational content and offers.', 'send-updates' ), + sprintf('<button class="button button-secondary">%s</button>', $this->get_text_inline( 'No', 'no' ) ), + sprintf( + $this->get_text_inline( 'do %sNOT%s send me security & feature updates, educational content and offers.', 'do-not-send-updates' ), + '<span class="underlined">', + '</span>' + ) + ); + + return sprintf( + '%s %s %s', + $thank_you, + $already_opted_in, + sprintf($this->get_text_inline( 'Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂', 'due-to-gdpr-compliance-requirements' ), '<a href="https://eugdpr.org/" target="_blank" rel="noopener noreferrer">', '</a>') . + '<br><br>' . + '<b>' . $this->get_text_inline( "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:", 'contact-for-updates' ) . '</b>' . + $actions . + ( $is_single_parent_product ? '' : $multiple_products_text ) + ); + } + + /** + * This method is called for opted-in users to fetch the is_marketing_allowed flag of the user for all the + * plugins and themes they've opted in to. + * + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param string $user_email + * @param string $license_key + * @param array $plugin_ids + * @param string|null $license_key + * + * @return array|false + */ + private function fetch_user_marketing_flag_status_by_plugins( $user_email, $license_key, $plugin_ids ) { + $request = array( + 'method' => 'POST', + 'body' => array(), + 'timeout' => WP_FS__DEBUG_SDK ? 60 : 30, + ); + + if ( is_string( $user_email ) ) { + $request['body']['email'] = $user_email; + } else { + $request['body']['license_key'] = $license_key; + } + + $result = array(); + + $url = WP_FS__ADDRESS . '/action/service/user_plugin/'; + $total_plugin_ids = count( $plugin_ids ); + + $plugin_ids_count_per_request = 10; + for ( $i = 1; $i <= $total_plugin_ids; $i += $plugin_ids_count_per_request ) { + $plugin_ids_set = array_slice( $plugin_ids, $i - 1, $plugin_ids_count_per_request ); + + $request['body']['plugin_ids'] = $plugin_ids_set; + + $response = self::safe_remote_post( + $url, + $request, + WP_FS__TIME_24_HOURS_IN_SEC, + WP_FS__TIME_12_HOURS_IN_SEC + ); + + if ( ! is_wp_error( $response ) ) { + $decoded = is_string( $response['body'] ) ? + json_decode( $response['body'] ) : + null; + + if ( + !is_object($decoded) || + !isset($decoded->success) || + true !== $decoded->success || + !isset( $decoded->data ) || + !is_array( $decoded->data ) + ) { + return false; + } + + $result = array_merge( $result, $decoded->data ); + } + } + + return $result; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function _maybe_show_gdpr_admin_notice() { + if ( ! $this->is_user_in_admin() ) { + return; + } + + if ( ! $this->should_handle_gdpr_admin_notice() ) { + return; + } + + if ( ! $this->is_user_admin() ) { + return; + } + + require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; + + $lock = FS_User_Lock::instance(); + + /** + * Try to acquire a 60-sec lock based on the WP user and thread/process ID. + */ + if ( ! $lock->try_lock( 60 ) ) { + return; + } + + /** + * @var $current_wp_user WP_User + */ + $current_wp_user = self::_get_current_wp_user(); + + /** + * @var FS_User $current_fs_user + */ + $current_fs_user = Freemius::_get_user_by_email( $current_wp_user->user_email ); + + $ten_years_in_sec = 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC; + + if ( ! is_object( $current_fs_user ) ) { + // 10-year lock. + $lock->lock( $ten_years_in_sec ); + + return; + } + + $gdpr = FS_GDPR_Manager::instance(); + + if ( $gdpr->is_opt_in_notice_shown() ) { + // 30-day lock. + $lock->lock( 30 * WP_FS__TIME_24_HOURS_IN_SEC ); + + return; + } + + if ( ! $gdpr->should_show_opt_in_notice() ) { + // 10-year lock. + $lock->lock( $ten_years_in_sec ); + + return; + } + + $last_time_notice_shown = $gdpr->last_time_notice_was_shown(); + $was_notice_shown_before = ( false !== $last_time_notice_shown ); + + if ( $was_notice_shown_before && + 30 * WP_FS__TIME_24_HOURS_IN_SEC > time() - $last_time_notice_shown + ) { + // If the notice was shown before, show it again after 30 days from the last time it was shown. + return; + } + + /** + * Find all plugin IDs that were installed by the current admin. + */ + $plugin_ids_map = self::get_user_opted_in_module_ids_map( $current_fs_user->id ); + + if ( empty( $plugin_ids_map )) { + $lock->lock( $ten_years_in_sec ); + + return; + } + + $user_plugins = $this->fetch_user_marketing_flag_status_by_plugins( + $current_fs_user->email, + null, + array_keys( $plugin_ids_map ) + ); + + if ( empty( $user_plugins ) ) { + $lock->lock( + is_array($user_plugins) ? + $ten_years_in_sec : + // Lock for 24-hours on errors. + WP_FS__TIME_24_HOURS_IN_SEC + ); + + return; + } + + $has_unset_marketing_optin = false; + + foreach ( $user_plugins as $user_plugin ) { + if ( true == $user_plugin->is_marketing_allowed ) { + unset( $plugin_ids_map[ $user_plugin->plugin_id ] ); + } + + if ( ! $has_unset_marketing_optin && is_null( $user_plugin->is_marketing_allowed ) ) { + $has_unset_marketing_optin = true; + } + } + + if ( empty( $plugin_ids_map ) || + ( $was_notice_shown_before && ! $has_unset_marketing_optin ) + ) { + $lock->lock( $ten_years_in_sec ); + + return; + } + + $modules = array_merge( + array_values( self::$_accounts->get_option( 'plugins', array() ) ), + array_values( self::$_accounts->get_option( 'themes', array() ) ) + ); + + foreach ( $modules as $module ) { + if ( ! FS_Plugin::is_valid_id( $module->parent_plugin_id ) && isset( $plugin_ids_map[ $module->id ] ) ) { + $plugin_ids_map[ $module->id ] = $module; + } + } + + $plugin_title = null; + if ( 1 === count( $plugin_ids_map ) ) { + $module = reset( $plugin_ids_map ); + $plugin_title = $module->title; + } + + $gdpr->add_opt_in_sticky_notice( + $this->get_gdpr_admin_notice_string( $plugin_ids_map ), + $plugin_title + ); + + $this->add_gdpr_optin_ajax_handler_and_style(); + + $gdpr->notice_was_just_shown(); + + // 30-day lock. + $lock->lock( 30 * WP_FS__TIME_24_HOURS_IN_SEC ); + } + + /** + * Prevents the GDPR opt-in admin notice from being added if the user has already chosen to allow or not allow + * marketing. + * + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + private function disable_opt_in_notice_and_lock_user() { + FS_GDPR_Manager::instance()->disable_opt_in_notice(); + + require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; + + // 10-year lock. + FS_User_Lock::instance()->lock( 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function _add_gdpr_optin_js() { + $vars = array( 'id' => $this->_module_id ); + + fs_require_once_template( 'gdpr-optin-js.php', $vars ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function enqueue_gdpr_optin_notice_style() { + fs_enqueue_local_style( 'fs_gdpr_optin_notice', '/admin/gdpr-optin-notice.css' ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function _maybe_add_gdpr_optin_ajax_handler() { + $this->add_ajax_action( 'fetch_is_marketing_required_flag_value', array( &$this, '_fetch_is_marketing_required_flag_value_ajax_action' ) ); + + if ( FS_GDPR_Manager::instance()->is_opt_in_notice_shown() ) { + $this->add_gdpr_optin_ajax_handler_and_style(); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function _fetch_is_marketing_required_flag_value_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'fetch_is_marketing_required_flag_value' ); + + $license_key = fs_request_get( 'license_key' ); + + if ( empty($license_key) ) { + self::shoot_ajax_failure( $this->get_text_inline( 'License key is empty.', 'empty-license-key' ) ); + } + + $user_plugins = $this->fetch_user_marketing_flag_status_by_plugins( + null, + $license_key, + array( $this->_module_id ) + ); + + if ( ! is_array( $user_plugins ) || + empty($user_plugins) || + !isset($user_plugins[0]->plugin_id) || + $user_plugins[0]->plugin_id != $this->_module_id + ) { + /** + * If faced an error or if the module ID do not match to the current module, ask for GDPR opt-in. + * + * @author Vova Feldman (@svovaf) + */ + self::shoot_ajax_success( array( 'is_marketing_allowed' => null ) ); + } + + self::shoot_ajax_success( array( 'is_marketing_allowed' => $user_plugins[0]->is_marketing_allowed ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + private function add_gdpr_optin_ajax_handler_and_style() { + // Add GDPR action AJAX callback. + $this->add_ajax_action( 'gdpr_optin_action', array( &$this, '_gdpr_optin_ajax_action' ) ); + + add_action( 'admin_footer', array( &$this, '_add_gdpr_optin_js' ) ); + add_action( 'admin_enqueue_scripts', array( &$this, 'enqueue_gdpr_optin_notice_style' ) ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + function _gdpr_optin_ajax_action() { + $this->_logger->entrance(); + + $this->check_ajax_referer( 'gdpr_optin_action' ); + + if ( ! fs_request_has( 'is_marketing_allowed' ) || ! fs_request_has( 'plugin_ids' ) ) { + self::shoot_ajax_failure(); + } + + $current_wp_user = self::_get_current_wp_user(); + + $plugin_ids = fs_request_get( 'plugin_ids', array() ); + if ( ! is_array( $plugin_ids ) || empty( $plugin_ids ) ) { + self::shoot_ajax_failure(); + } + + $modules = array_merge( + array_values( self::$_accounts->get_option( 'plugins', array() ) ), + array_values( self::$_accounts->get_option( 'themes', array() ) ) + ); + + foreach ( $modules as $key => $module ) { + if ( ! in_array( $module->id, $plugin_ids ) ) { + unset( $modules[ $key ] ); + } + } + + if ( empty( $modules ) ) { + self::shoot_ajax_failure(); + } + + $user_api = $this->get_api_user_scope_by_user( Freemius::_get_user_by_email( $current_wp_user->user_email ) ); + + foreach ( $modules as $module ) { + $user_api->call( "?plugin_id={$module->id}", 'put', array( + 'is_marketing_allowed' => ( true == fs_request_get_bool( 'is_marketing_allowed' ) ) + ) ); + } + + FS_GDPR_Manager::instance()->remove_opt_in_notice(); + + require_once WP_FS__DIR_INCLUDES . '/class-fs-user-lock.php'; + + // 10-year lock. + FS_User_Lock::instance()->lock( 10 * 365 * WP_FS__TIME_24_HOURS_IN_SEC ); + + self::shoot_ajax_success(); + } + + /** + * Checks if the GDPR admin notice should be handled. By default, this logic is off, unless the integrator adds the special 'handle_gdpr_admin_notice' filter. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return bool + */ + private function should_handle_gdpr_admin_notice() { + return $this->apply_filters( + 'handle_gdpr_admin_notice', + // Default to false. + false + ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Marketing + #---------------------------------------------------------------------------------- + + /** + * Check if current user purchased any other plugins before. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function has_purchased_before() { + // TODO: Implement has_purchased_before() method. + throw new Exception( 'not implemented' ); + } + + /** + * Check if current user classified as an agency. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_agency() { + // TODO: Implement is_agency() method. + throw new Exception( 'not implemented' ); + } + + /** + * Check if current user classified as a developer. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_developer() { + // TODO: Implement is_developer() method. + throw new Exception( 'not implemented' ); + } + + /** + * Check if current user classified as a business. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_business() { + // TODO: Implement is_business() method. + throw new Exception( 'not implemented' ); + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Helper + #---------------------------------------------------------------------------------- + + /** + * If running with a secret key, assume it's the developer and show pending plans as well. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.2 + * + * @param string $path + * + * @return string + */ + function add_show_pending( $path ) { + if ( ! $this->has_secret_key() ) { + return $path; + } + + return $path . ( false !== strpos( $path, '?' ) ? '&' : '?' ) . 'show_pending=true'; + } + + #endregion + } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-admin-notices.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-admin-notices.php new file mode 100644 index 000000000..01b197af5 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-admin-notices.php @@ -0,0 +1,321 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * WP Admin notices manager both for site level and network level. + * + * Class FS_Admin_Notices + */ + class FS_Admin_Notices { + /** + * @since 1.2.2 + * + * @var string + */ + protected $_module_unique_affix; + /** + * @var string + */ + protected $_id; + /** + * @var string + */ + protected $_title; + /** + * @var FS_Admin_Notice_Manager + */ + protected $_notices; + /** + * @var FS_Admin_Notice_Manager + */ + protected $_network_notices; + /** + * @var int The ID of the blog that is associated with the current site level options. + */ + private $_blog_id = 0; + /** + * @var bool + */ + private $_is_multisite; + /** + * @var FS_Admin_Notices[] + */ + private static $_instances = array(); + + /** + * @param string $id + * @param string $title + * @param string $module_unique_affix + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and + * blog admin pages. + * + * @return FS_Admin_Notices + */ + static function instance( $id, $title = '', $module_unique_affix = '', $is_network_and_blog_admins = false ) { + if ( ! isset( self::$_instances[ $id ] ) ) { + self::$_instances[ $id ] = new FS_Admin_Notices( $id, $title, $module_unique_affix, $is_network_and_blog_admins ); + } + + return self::$_instances[ $id ]; + } + + /** + * @param string $id + * @param string $title + * @param string $module_unique_affix + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and + * blog admin pages. + */ + protected function __construct( $id, $title = '', $module_unique_affix = '', $is_network_and_blog_admins = false ) { + $this->_id = $id; + $this->_title = $title; + $this->_module_unique_affix = $module_unique_affix; + $this->_is_multisite = is_multisite(); + + if ( $this->_is_multisite ) { + $this->_blog_id = get_current_blog_id(); + + $this->_network_notices = FS_Admin_Notice_Manager::instance( + $id, + $title, + $module_unique_affix, + $is_network_and_blog_admins, + true + ); + } + + $this->_notices = FS_Admin_Notice_Manager::instance( + $id, + $title, + $module_unique_affix, + false, + $this->_blog_id + ); + } + + /** + * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $message + * @param string $title + * @param string $type + * @param bool $is_sticky + * @param string $id Message ID + * @param bool $store_if_sticky + * @param int|null $network_level_or_blog_id + * + * @uses add_action() + */ + function add( + $message, + $title = '', + $type = 'success', + $is_sticky = false, + $id = '', + $store_if_sticky = true, + $network_level_or_blog_id = null + ) { + if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) { + $notices = $this->_network_notices; + } else { + $notices = $this->get_site_notices( $network_level_or_blog_id ); + } + + $notices->add( + $message, + $title, + $type, + $is_sticky, + $id, + $store_if_sticky + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param string|string[] $ids + * @param int|null $network_level_or_blog_id + */ + function remove_sticky( $ids, $network_level_or_blog_id = null ) { + if ( ! is_array( $ids ) ) { + $ids = array( $ids ); + } + + if ( $this->should_use_network_notices( $ids[0], $network_level_or_blog_id ) ) { + $notices = $this->_network_notices; + } else { + $notices = $this->get_site_notices( $network_level_or_blog_id ); + } + + return $notices->remove_sticky( $ids ); + } + + /** + * Check if sticky message exists by id. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $id + * @param int|null $network_level_or_blog_id + * + * @return bool + */ + function has_sticky( $id, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) { + $notices = $this->_network_notices; + } else { + $notices = $this->get_site_notices( $network_level_or_blog_id ); + } + + return $notices->has_sticky( $id ); + } + + /** + * Adds sticky admin notification. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param string $message + * @param string $id Message ID + * @param string $title + * @param string $type + * @param int|null $network_level_or_blog_id + * @param number|null $wp_user_id + * @param string|null $plugin_title + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and + * blog admin pages. + */ + function add_sticky( + $message, + $id, + $title = '', + $type = 'success', + $network_level_or_blog_id = null, + $wp_user_id = null, + $plugin_title = null, + $is_network_and_blog_admins = false + ) { + if ( $this->should_use_network_notices( $id, $network_level_or_blog_id ) ) { + $notices = $this->_network_notices; + } else { + $notices = $this->get_site_notices( $network_level_or_blog_id ); + } + + $notices->add_sticky( $message, $id, $title, $type, $wp_user_id, $plugin_title, $is_network_and_blog_admins ); + } + + /** + * Clear all sticky messages. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int|null $network_level_or_blog_id + */ + function clear_all_sticky( $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite || + false === $network_level_or_blog_id || + 0 == $network_level_or_blog_id || + is_null( $network_level_or_blog_id ) + ) { + $notices = $this->get_site_notices( $network_level_or_blog_id ); + $notices->clear_all_sticky(); + } + + if ( $this->_is_multisite && + ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) + ) { + $this->_network_notices->clear_all_sticky(); + } + } + + /** + * Add admin message to all admin messages queue, and hook to all_admin_notices if not yet hooked. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $message + * @param string $title + * @param string $type + * @param bool $is_sticky + * @param string $id Message ID + */ + function add_all( $message, $title = '', $type = 'success', $is_sticky = false, $id = '' ) { + $this->add( $message, $title, $type, $is_sticky, true, $id ); + } + + #-------------------------------------------------------------------------------- + #region Helper Methods + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return FS_Admin_Notice_Manager + */ + private function get_site_notices( $blog_id = 0 ) { + if ( 0 == $blog_id || $blog_id == $this->_blog_id ) { + return $this->_notices; + } + + return FS_Admin_Notice_Manager::instance( + $this->_id, + $this->_title, + $this->_module_unique_affix, + false, + $blog_id + ); + } + + /** + * Check if the network notices should be used. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $id + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite notices (if there's a network). When `false`, use the current context blog notices. When `null`, the decision which notices manager to use (MS vs. Current S) will be handled internally and determined based on the $id and the context admin (blog admin vs. network level admin). + * + * @return bool + */ + private function should_use_network_notices( $id = '', $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite ) { + // Not a multisite environment. + return false; + } + + if ( is_numeric( $network_level_or_blog_id ) ) { + // Explicitly asked to use a specified blog storage. + return false; + } + + if ( is_bool( $network_level_or_blog_id ) ) { + // Explicitly specified whether should use the network or blog level storage. + return $network_level_or_blog_id; + } + + return fs_is_network_admin(); + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-api.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-api.php index 48d060ea2..00a116e1a 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-api.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-api.php @@ -1,558 +1,615 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.4 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - /** - * Class FS_Api - * - * Wraps Freemius API SDK to handle: - * 1. Clock sync. - * 2. Fallback to HTTP when HTTPS fails. - * 3. Adds caching layer to GET requests. - * 4. Adds consistency for failed requests by using last cached version. - */ - class FS_Api { - /** - * @var FS_Api[] - */ - private static $_instances = array(); - - /** - * @var FS_Option_Manager Freemius options, options-manager. - */ - private static $_options; - - /** - * @var FS_Cache_Manager API Caching layer - */ - private static $_cache; - - /** - * @var int Clock diff in seconds between current server to API server. - */ - private static $_clock_diff; - - /** - * @var Freemius_Api - */ - private $_api; - - /** - * @var string - */ - private $_slug; - - /** - * @var FS_Logger - * @since 1.0.4 - */ - private $_logger; - - /** - * @param string $slug - * @param string $scope 'app', 'developer', 'user' or 'install'. - * @param number $id Element's id. - * @param string $public_key Public key. - * @param bool $is_sandbox - * @param bool|string $secret_key Element's secret key. - * - * @return FS_Api - */ - static function instance( $slug, $scope, $id, $public_key, $is_sandbox, $secret_key = false ) { - $identifier = md5( $slug . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) ); - - if ( ! isset( self::$_instances[ $identifier ] ) ) { - self::_init(); - - self::$_instances[ $identifier ] = new FS_Api( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox ); - } - - return self::$_instances[ $identifier ]; - } - - private static function _init() { - if ( isset( self::$_options ) ) { - return; - } - - if ( ! class_exists( 'Freemius_Api' ) ) { - require_once( WP_FS__DIR_SDK . '/Freemius.php' ); - } - - self::$_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true ); - self::$_cache = FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME ); - - self::$_clock_diff = self::$_options->get_option( 'api_clock_diff', 0 ); - Freemius_Api::SetClockDiff( self::$_clock_diff ); - - if ( self::$_options->get_option( 'api_force_http', false ) ) { - Freemius_Api::SetHttp(); - } - } - - /** - * @param string $slug - * @param string $scope 'app', 'developer', 'user' or 'install'. - * @param number $id Element's id. - * @param string $public_key Public key. - * @param bool|string $secret_key Element's secret key. - * @param bool $is_sandbox - */ - private function __construct( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox ) { - $this->_api = new Freemius_Api( $scope, $id, $public_key, $secret_key, $is_sandbox ); - - $this->_slug = $slug; - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_api', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - } - - /** - * Find clock diff between server and API server, and store the diff locally. - * - * @param bool|int $diff - * - * @return bool|int False if clock diff didn't change, otherwise returns the clock diff in seconds. - */ - private function _sync_clock_diff( $diff = false ) { - $this->_logger->entrance(); - - // Sync clock and store. - $new_clock_diff = ( false === $diff ) ? - Freemius_Api::FindClockDiff() : - $diff; - - if ( $new_clock_diff === self::$_clock_diff ) { - return false; - } - - self::$_clock_diff = $new_clock_diff; - - // Update API clock's diff. - Freemius_Api::SetClockDiff( self::$_clock_diff ); - - // Store new clock diff in storage. - self::$_options->set_option( 'api_clock_diff', self::$_clock_diff, true ); - - return $new_clock_diff; - } - - /** - * Override API call to enable retry with servers' clock auto sync method. - * - * @param string $path - * @param string $method - * @param array $params - * @param bool $retry Is in retry or first call attempt. - * - * @return array|mixed|string|void - */ - private function _call( $path, $method = 'GET', $params = array(), $retry = false ) { - $this->_logger->entrance( $method . ':' . $path ); - - if ( self::is_temporary_down() ) { - $result = $this->get_temporary_unavailable_error(); - } else { - $result = $this->_api->Api( $path, $method, $params ); - - if ( null !== $result && - isset( $result->error ) && - isset( $result->error->code ) && - 'request_expired' === $result->error->code - ) { - if ( ! $retry ) { - $diff = isset( $result->error->timestamp ) ? - ( time() - strtotime( $result->error->timestamp ) ) : - false; - - // Try to sync clock diff. - if ( false !== $this->_sync_clock_diff( $diff ) ) { - // Retry call with new synced clock. - return $this->_call( $path, $method, $params, true ); - } - } - } - } - - if ( $this->_logger->is_on() && self::is_api_error( $result ) ) { - // Log API errors. - $this->_logger->api_error( $result ); - } - - return $result; - } - - /** - * Override API call to wrap it in servers' clock sync method. - * - * @param string $path - * @param string $method - * @param array $params - * - * @return array|mixed|string|void - * @throws Freemius_Exception - */ - function call( $path, $method = 'GET', $params = array() ) { - return $this->_call( $path, $method, $params ); - } - - /** - * Get API request URL signed via query string. - * - * @param string $path - * - * @return string - */ - function get_signed_url( $path ) { - return $this->_api->GetSignedUrl( $path ); - } - - /** - * @param string $path - * @param bool $flush - * @param int $expiration (optional) Time until expiration in seconds from now, defaults to 24 hours - * - * @return stdClass|mixed - */ - function get( $path = '/', $flush = false, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { - $this->_logger->entrance( $path ); - - $cache_key = $this->get_cache_key( $path ); - - // Always flush during development. - if ( WP_FS__DEV_MODE || $this->_api->IsSandbox() ) { - $flush = true; - } - - $cached_result = self::$_cache->get( $cache_key ); - - if ( $flush || ! self::$_cache->has_valid( $cache_key ) ) { - $result = $this->call( $path ); - - if ( ! is_object( $result ) || isset( $result->error ) ) { - // Api returned an error. - if ( is_object( $cached_result ) && - ! isset( $cached_result ) - ) { - // If there was an error during a newer data fetch, - // fallback to older data version. - $result = $cached_result; - - if ( $this->_logger->is_on() ) { - $this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) ); - } - } else { - // If no older data version, return result without - // caching the error. - return $result; - } - } - - self::$_cache->set( $cache_key, $result, $expiration ); - - $cached_result = $result; - } else { - $this->_logger->log( 'Using cached API result.' ); - } - - return $cached_result; - } - - /** - * Check if there's a cached version of the API request. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @param string $path - * @param string $method - * @param array $params - * - * @return bool - */ - function is_cached( $path, $method = 'GET', $params = array() ) { - $cache_key = $this->get_cache_key( $path, $method, $params ); - - return self::$_cache->has_valid( $cache_key ); - } - - /** - * Invalidate a cached version of the API request. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param string $path - * @param string $method - * @param array $params - */ - function purge_cache( $path, $method = 'GET', $params = array() ) { - $this->_logger->entrance( "{$method}:{$path}" ); - - $cache_key = $this->get_cache_key( $path, $method, $params ); - - self::$_cache->purge( $cache_key ); - } - - /** - * @param string $path - * @param string $method - * @param array $params - * - * @return string - * @throws \Freemius_Exception - */ - private function get_cache_key( $path, $method = 'GET', $params = array() ) { - $canonized = $this->_api->CanonizePath( $path ); -// $exploded = explode('/', $canonized); -// return $method . '_' . array_pop($exploded) . '_' . md5($canonized . json_encode($params)); - return strtolower( $method . ':' . $canonized ) . ( ! empty( $params ) ? '#' . md5( json_encode( $params ) ) : '' ); - } - - /** - * Test API connectivity. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 If fails, try to fallback to HTTP. - * @since 1.1.6 Added a 5-min caching mechanism, to prevent from overloading the server if the API if - * temporary down. - * - * @return bool True if successful connectivity to the API. - */ - static function test() { - self::_init(); - - $cache_key = 'ping_test'; - - $test = self::$_cache->get_valid( $cache_key, null ); - - if ( is_null( $test ) ) { - $test = Freemius_Api::Test(); - - if ( false === $test && Freemius_Api::IsHttps() ) { - // Fallback to HTTP, since HTTPS fails. - Freemius_Api::SetHttp(); - - self::$_options->set_option( 'api_force_http', true, true ); - - $test = Freemius_Api::Test(); - - if ( false === $test ) { - /** - * API connectivity test fail also in HTTP request, therefore, - * fallback to HTTPS to keep connection secure. - * - * @since 1.1.6 - */ - self::$_options->set_option( 'api_force_http', false, true ); - } - } - - self::$_cache->set( $cache_key, $test, WP_FS__TIME_5_MIN_IN_SEC ); - } - - return $test; - } - - /** - * Check if API is temporary down. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @return bool - */ - static function is_temporary_down() { - self::_init(); - - $test = self::$_cache->get_valid( 'ping_test', null ); - - return ( false === $test ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @return object - */ - private function get_temporary_unavailable_error() { - return (object) array( - 'error' => (object) array( - 'type' => 'TemporaryUnavailable', - 'message' => 'API is temporary unavailable, please retry in ' . ( self::$_cache->get_record_expiration( 'ping_test' ) - WP_FS__SCRIPT_START_TIME ) . ' sec.', - 'code' => 'temporary_unavailable', - 'http' => 503 - ) - ); - } - - /** - * Ping API for connectivity test, and return result object. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param null|string $unique_anonymous_id - * @param array $params - * - * @return object - */ - function ping( $unique_anonymous_id = null, $params = array() ) { - $this->_logger->entrance(); - - if ( self::is_temporary_down() ) { - return $this->get_temporary_unavailable_error(); - } - - $pong = is_null( $unique_anonymous_id ) ? - Freemius_Api::Ping() : - $this->_call( 'ping.json?' . http_build_query( array_merge( - array( 'uid' => $unique_anonymous_id ), - $params - ) ) ); - - if ( $this->is_valid_ping( $pong ) ) { - return $pong; - } - - if ( self::should_try_with_http( $pong ) ) { - // Fallback to HTTP, since HTTPS fails. - Freemius_Api::SetHttp(); - - self::$_options->set_option( 'api_force_http', true, true ); - - $pong = is_null( $unique_anonymous_id ) ? - Freemius_Api::Ping() : - $this->_call( 'ping.json?' . http_build_query( array_merge( - array( 'uid' => $unique_anonymous_id ), - $params - ) ) ); - - if ( ! $this->is_valid_ping( $pong ) ) { - self::$_options->set_option( 'api_force_http', false, true ); - } - } - - return $pong; - } - - /** - * Check if based on the API result we should try - * to re-run the same request with HTTP instead of HTTPS. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param $result - * - * @return bool - */ - private static function should_try_with_http( $result ) { - if ( ! Freemius_Api::IsHttps() ) { - return false; - } - - return ( ! is_object( $result ) || - ! isset( $result->error ) || - ! isset( $result->error->code ) || - ! in_array( $result->error->code, array( - 'curl_missing', - 'cloudflare_ddos_protection', - 'maintenance_mode', - 'squid_cache_block', - 'too_many_requests', - ) ) ); - - } - - /** - * Check if valid ping request result. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.1 - * - * @param mixed $pong - * - * @return bool - */ - function is_valid_ping( $pong ) { - return Freemius_Api::Test( $pong ); - } - - function get_url( $path = '' ) { - return Freemius_Api::GetUrl( $path, $this->_api->IsSandbox() ); - } - - /** - * Clear API cache. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - static function clear_cache() { - self::_init(); - - self::$_cache = FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME ); - self::$_cache->clear(); - } - - #---------------------------------------------------------------------------------- - #region Error Handling - #---------------------------------------------------------------------------------- - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $result - * - * @return bool Is API result contains an error. - */ - static function is_api_error( $result ) { - return ( is_object( $result ) && isset( $result->error ) ) || - is_string( $result ); - } - - /** - * Checks if given API result is a non-empty and not an error object. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $result - * @param string|null $required_property Optional property we want to verify that is set. - * - * @return bool - */ - static function is_api_result_object( $result, $required_property = null ) { - return ( - is_object( $result ) && - ! isset( $result->error ) && - ( empty( $required_property ) || isset( $result->{$required_property} ) ) - ); - } - - /** - * Checks if given API result is a non-empty entity object with non-empty ID. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1.5 - * - * @param mixed $result - * - * @return bool - */ - static function is_api_result_entity( $result ) { - return self::is_api_result_object( $result, 'id' ) && - FS_Entity::is_valid_id( $result->id ); - } - - #endregion +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.4 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Api + * + * Wraps Freemius API SDK to handle: + * 1. Clock sync. + * 2. Fallback to HTTP when HTTPS fails. + * 3. Adds caching layer to GET requests. + * 4. Adds consistency for failed requests by using last cached version. + */ + class FS_Api { + /** + * @var FS_Api[] + */ + private static $_instances = array(); + + /** + * @var FS_Option_Manager Freemius options, options-manager. + */ + private static $_options; + + /** + * @var FS_Cache_Manager API Caching layer + */ + private static $_cache; + + /** + * @var int Clock diff in seconds between current server to API server. + */ + private static $_clock_diff; + + /** + * @var Freemius_Api_WordPress + */ + private $_api; + + /** + * @var string + */ + private $_slug; + + /** + * @var FS_Logger + * @since 1.0.4 + */ + private $_logger; + + /** + * @param string $slug + * @param string $scope 'app', 'developer', 'user' or 'install'. + * @param number $id Element's id. + * @param string $public_key Public key. + * @param bool $is_sandbox + * @param bool|string $secret_key Element's secret key. + * + * @return FS_Api + */ + static function instance( $slug, $scope, $id, $public_key, $is_sandbox, $secret_key = false ) { + $identifier = md5( $slug . $scope . $id . $public_key . ( is_string( $secret_key ) ? $secret_key : '' ) . json_encode( $is_sandbox ) ); + + if ( ! isset( self::$_instances[ $identifier ] ) ) { + self::_init(); + + self::$_instances[ $identifier ] = new FS_Api( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox ); + } + + return self::$_instances[ $identifier ]; + } + + private static function _init() { + if ( isset( self::$_options ) ) { + return; + } + + if ( ! class_exists( 'Freemius_Api_WordPress' ) ) { + require_once WP_FS__DIR_SDK . '/FreemiusWordPress.php'; + } + + self::$_options = FS_Option_Manager::get_manager( WP_FS__OPTIONS_OPTION_NAME, true, true ); + self::$_cache = FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME ); + + self::$_clock_diff = self::$_options->get_option( 'api_clock_diff', 0 ); + Freemius_Api_WordPress::SetClockDiff( self::$_clock_diff ); + + if ( self::$_options->get_option( 'api_force_http', false ) ) { + Freemius_Api_WordPress::SetHttp(); + } + } + + /** + * @param string $slug + * @param string $scope 'app', 'developer', 'user' or 'install'. + * @param number $id Element's id. + * @param string $public_key Public key. + * @param bool|string $secret_key Element's secret key. + * @param bool $is_sandbox + */ + private function __construct( $slug, $scope, $id, $public_key, $secret_key, $is_sandbox ) { + $this->_api = new Freemius_Api_WordPress( $scope, $id, $public_key, $secret_key, $is_sandbox ); + + $this->_slug = $slug; + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_api', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + } + + /** + * Find clock diff between server and API server, and store the diff locally. + * + * @param bool|int $diff + * + * @return bool|int False if clock diff didn't change, otherwise returns the clock diff in seconds. + */ + private function _sync_clock_diff( $diff = false ) { + $this->_logger->entrance(); + + // Sync clock and store. + $new_clock_diff = ( false === $diff ) ? + Freemius_Api_WordPress::FindClockDiff() : + $diff; + + if ( $new_clock_diff === self::$_clock_diff ) { + return false; + } + + self::$_clock_diff = $new_clock_diff; + + // Update API clock's diff. + Freemius_Api_WordPress::SetClockDiff( self::$_clock_diff ); + + // Store new clock diff in storage. + self::$_options->set_option( 'api_clock_diff', self::$_clock_diff, true ); + + return $new_clock_diff; + } + + /** + * Override API call to enable retry with servers' clock auto sync method. + * + * @param string $path + * @param string $method + * @param array $params + * @param bool $retry Is in retry or first call attempt. + * + * @return array|mixed|string|void + */ + private function _call( $path, $method = 'GET', $params = array(), $retry = false ) { + $this->_logger->entrance( $method . ':' . $path ); + + if ( self::is_temporary_down() ) { + $result = $this->get_temporary_unavailable_error(); + } else { + $result = $this->_api->Api( $path, $method, $params ); + + if ( null !== $result && + isset( $result->error ) && + isset( $result->error->code ) && + 'request_expired' === $result->error->code + ) { + if ( ! $retry ) { + $diff = isset( $result->error->timestamp ) ? + ( time() - strtotime( $result->error->timestamp ) ) : + false; + + // Try to sync clock diff. + if ( false !== $this->_sync_clock_diff( $diff ) ) { + // Retry call with new synced clock. + return $this->_call( $path, $method, $params, true ); + } + } + } + } + + if ( $this->_logger->is_on() && self::is_api_error( $result ) ) { + // Log API errors. + $this->_logger->api_error( $result ); + } + + return $result; + } + + /** + * Override API call to wrap it in servers' clock sync method. + * + * @param string $path + * @param string $method + * @param array $params + * + * @return array|mixed|string|void + * @throws Freemius_Exception + */ + function call( $path, $method = 'GET', $params = array() ) { + return $this->_call( $path, $method, $params ); + } + + /** + * Get API request URL signed via query string. + * + * @param string $path + * + * @return string + */ + function get_signed_url( $path ) { + return $this->_api->GetSignedUrl( $path ); + } + + /** + * @param string $path + * @param bool $flush + * @param int $expiration (optional) Time until expiration in seconds from now, defaults to 24 hours + * + * @return stdClass|mixed + */ + function get( $path = '/', $flush = false, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { + $this->_logger->entrance( $path ); + + $cache_key = $this->get_cache_key( $path ); + + // Always flush during development. + if ( WP_FS__DEV_MODE || $this->_api->IsSandbox() ) { + $flush = true; + } + + $cached_result = self::$_cache->get( $cache_key ); + + if ( $flush || ! self::$_cache->has_valid( $cache_key, $expiration ) ) { + $result = $this->call( $path ); + + if ( ! is_object( $result ) || isset( $result->error ) ) { + // Api returned an error. + if ( is_object( $cached_result ) && + ! isset( $cached_result ) + ) { + // If there was an error during a newer data fetch, + // fallback to older data version. + $result = $cached_result; + + if ( $this->_logger->is_on() ) { + $this->_logger->warn( 'Fallback to cached API result: ' . var_export( $cached_result, true ) ); + } + } else { + // If no older data version, return result without + // caching the error. + return $result; + } + } + + self::$_cache->set( $cache_key, $result, $expiration ); + + $cached_result = $result; + } else { + $this->_logger->log( 'Using cached API result.' ); + } + + return $cached_result; + } + + /** + * Check if there's a cached version of the API request. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @param string $path + * @param string $method + * @param array $params + * + * @return bool + */ + function is_cached( $path, $method = 'GET', $params = array() ) { + $cache_key = $this->get_cache_key( $path, $method, $params ); + + return self::$_cache->has_valid( $cache_key ); + } + + /** + * Invalidate a cached version of the API request. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param string $path + * @param string $method + * @param array $params + */ + function purge_cache( $path, $method = 'GET', $params = array() ) { + $this->_logger->entrance( "{$method}:{$path}" ); + + $cache_key = $this->get_cache_key( $path, $method, $params ); + + self::$_cache->purge( $cache_key ); + } + + /** + * Invalidate a cached version of the API request. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $path + * @param int $expiration + * @param string $method + * @param array $params + */ + function update_cache_expiration( $path, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $method = 'GET', $params = array() ) { + $this->_logger->entrance( "{$method}:{$path}:{$expiration}" ); + + $cache_key = $this->get_cache_key( $path, $method, $params ); + + self::$_cache->update_expiration( $cache_key, $expiration ); + } + + /** + * @param string $path + * @param string $method + * @param array $params + * + * @return string + * @throws \Freemius_Exception + */ + private function get_cache_key( $path, $method = 'GET', $params = array() ) { + $canonized = $this->_api->CanonizePath( $path ); +// $exploded = explode('/', $canonized); +// return $method . '_' . array_pop($exploded) . '_' . md5($canonized . json_encode($params)); + return strtolower( $method . ':' . $canonized ) . ( ! empty( $params ) ? '#' . md5( json_encode( $params ) ) : '' ); + } + + /** + * Test API connectivity. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 If fails, try to fallback to HTTP. + * @since 1.1.6 Added a 5-min caching mechanism, to prevent from overloading the server if the API if + * temporary down. + * + * @return bool True if successful connectivity to the API. + */ + static function test() { + self::_init(); + + $cache_key = 'ping_test'; + + $test = self::$_cache->get_valid( $cache_key, null ); + + if ( is_null( $test ) ) { + $test = Freemius_Api_WordPress::Test(); + + if ( false === $test && Freemius_Api_WordPress::IsHttps() ) { + // Fallback to HTTP, since HTTPS fails. + Freemius_Api_WordPress::SetHttp(); + + self::$_options->set_option( 'api_force_http', true, true ); + + $test = Freemius_Api_WordPress::Test(); + + if ( false === $test ) { + /** + * API connectivity test fail also in HTTP request, therefore, + * fallback to HTTPS to keep connection secure. + * + * @since 1.1.6 + */ + self::$_options->set_option( 'api_force_http', false, true ); + } + } + + self::$_cache->set( $cache_key, $test, WP_FS__TIME_5_MIN_IN_SEC ); + } + + return $test; + } + + /** + * Check if API is temporary down. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @return bool + */ + static function is_temporary_down() { + self::_init(); + + $test = self::$_cache->get_valid( 'ping_test', null ); + + return ( false === $test ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @return object + */ + private function get_temporary_unavailable_error() { + return (object) array( + 'error' => (object) array( + 'type' => 'TemporaryUnavailable', + 'message' => 'API is temporary unavailable, please retry in ' . ( self::$_cache->get_record_expiration( 'ping_test' ) - WP_FS__SCRIPT_START_TIME ) . ' sec.', + 'code' => 'temporary_unavailable', + 'http' => 503 + ) + ); + } + + /** + * Ping API for connectivity test, and return result object. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param null|string $unique_anonymous_id + * @param array $params + * + * @return object + */ + function ping( $unique_anonymous_id = null, $params = array() ) { + $this->_logger->entrance(); + + if ( self::is_temporary_down() ) { + return $this->get_temporary_unavailable_error(); + } + + $pong = is_null( $unique_anonymous_id ) ? + Freemius_Api_WordPress::Ping() : + $this->_call( 'ping.json?' . http_build_query( array_merge( + array( 'uid' => $unique_anonymous_id ), + $params + ) ) ); + + if ( $this->is_valid_ping( $pong ) ) { + return $pong; + } + + if ( self::should_try_with_http( $pong ) ) { + // Fallback to HTTP, since HTTPS fails. + Freemius_Api_WordPress::SetHttp(); + + self::$_options->set_option( 'api_force_http', true, true ); + + $pong = is_null( $unique_anonymous_id ) ? + Freemius_Api_WordPress::Ping() : + $this->_call( 'ping.json?' . http_build_query( array_merge( + array( 'uid' => $unique_anonymous_id ), + $params + ) ) ); + + if ( ! $this->is_valid_ping( $pong ) ) { + self::$_options->set_option( 'api_force_http', false, true ); + } + } + + return $pong; + } + + /** + * Check if based on the API result we should try + * to re-run the same request with HTTP instead of HTTPS. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param $result + * + * @return bool + */ + private static function should_try_with_http( $result ) { + if ( ! Freemius_Api_WordPress::IsHttps() ) { + return false; + } + + return ( ! is_object( $result ) || + ! isset( $result->error ) || + ! isset( $result->error->code ) || + ! in_array( $result->error->code, array( + 'curl_missing', + 'cloudflare_ddos_protection', + 'maintenance_mode', + 'squid_cache_block', + 'too_many_requests', + ) ) ); + + } + + /** + * Check if valid ping request result. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.1 + * + * @param mixed $pong + * + * @return bool + */ + function is_valid_ping( $pong ) { + return Freemius_Api_WordPress::Test( $pong ); + } + + function get_url( $path = '' ) { + return Freemius_Api_WordPress::GetUrl( $path, $this->_api->IsSandbox() ); + } + + /** + * Clear API cache. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + static function clear_cache() { + self::_init(); + + self::$_cache = FS_Cache_Manager::get_manager( WP_FS__API_CACHE_OPTION_NAME ); + self::$_cache->clear(); + } + + #---------------------------------------------------------------------------------- + #region Error Handling + #---------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $result + * + * @return bool Is API result contains an error. + */ + static function is_api_error( $result ) { + return ( is_object( $result ) && isset( $result->error ) ) || + is_string( $result ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param mixed $result + * + * @return bool Is API result contains an error. + */ + static function is_api_error_object( $result ) { + return ( + is_object( $result ) && + isset( $result->error ) && + isset( $result->error->message ) + ); + } + + /** + * Checks if given API result is a non-empty and not an error object. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $result + * @param string|null $required_property Optional property we want to verify that is set. + * + * @return bool + */ + static function is_api_result_object( $result, $required_property = null ) { + return ( + is_object( $result ) && + ! isset( $result->error ) && + ( empty( $required_property ) || isset( $result->{$required_property} ) ) + ); + } + + /** + * Checks if given API result is a non-empty entity object with non-empty ID. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.5 + * + * @param mixed $result + * + * @return bool + */ + static function is_api_result_entity( $result ) { + return self::is_api_result_object( $result, 'id' ) && + FS_Entity::is_valid_id( $result->id ); + } + + /** + * Get API result error code. If failed to get code, returns an empty string. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param mixed $result + * + * @return string + */ + static function get_error_code( $result ) { + if ( is_object( $result ) && + isset( $result->error ) && + is_object( $result->error ) && + ! empty( $result->error->code ) + ) { + return $result->error->code; + } + + return ''; + } + + #endregion } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-logger.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-logger.php index 0cd69de80..90e918fe7 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-logger.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-logger.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ @@ -15,6 +15,22 @@ private $_on = false; private $_echo = false; private $_file_start = 0; + /** + * @var int PHP Process ID. + */ + private static $_processID; + /** + * @var string PHP Script user name. + */ + private static $_ownerName; + /** + * @var bool Is storage logging turned on. + */ + private static $_isStorageLoggingOn; + /** + * @var int ABSPATH length. + */ + private static $_abspathLength; private static $LOGGERS = array(); private static $LOG = array(); @@ -27,7 +43,11 @@ $bt = debug_backtrace(); $caller = $bt[2]; - $this->_file_start = strpos( $caller['file'], 'plugins' ) + strlen( 'plugins/' ); + if ( false !== strpos( $caller['file'], 'plugins' ) ) { + $this->_file_start = strpos( $caller['file'], 'plugins' ) + strlen( 'plugins/' ); + } else { + $this->_file_start = strpos( $caller['file'], 'themes' ) + strlen( 'themes/' ); + } if ( $on ) { $this->on(); @@ -47,6 +67,10 @@ public static function get_logger( $id, $on = false, $echo = false ) { $id = strtolower( $id ); + if ( ! isset( self::$_processID ) ) { + self::init(); + } + if ( ! isset( self::$LOGGERS[ $id ] ) ) { self::$LOGGERS[ $id ] = new FS_Logger( $id, $on, $echo ); } @@ -54,7 +78,27 @@ return self::$LOGGERS[ $id ]; } - private static function _hook_footer() { + /** + * Initialize logging global info. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + */ + private static function init() { + self::$_ownerName = function_exists( 'get_current_user' ) ? + get_current_user() : + 'unknown'; + self::$_isStorageLoggingOn = ( 1 == get_option( 'fs_storage_logger', 0 ) ); + self::$_abspathLength = strlen( ABSPATH ); + self::$_processID = mt_rand( 0, 32000 ); + + // Process ID may be `false` on errors. + if ( ! is_numeric( self::$_processID ) ) { + self::$_processID = 0; + } + } + + private static function hook_footer() { if ( self::$_HOOKED_FOOTER ) { return; } @@ -73,7 +117,11 @@ function on() { $this->_on = true; - self::_hook_footer(); + if ( ! function_exists( 'dbDelta' ) ) { + require_once ABSPATH . 'wp-admin/includes/upgrade.php'; + } + + self::hook_footer(); } function echo_on() { @@ -107,17 +155,40 @@ $caller = $bt[ $depth ]; + /** + * Retrieve the correct call file & line number from backtrace + * when logging from a wrapper method. + * + * @author Vova Feldman + * @since 1.2.1.6 + */ + if ( empty( $caller['line'] ) ) { + $depth --; + + while ( $depth >= 0 ) { + if ( ! empty( $bt[ $depth ]['line'] ) ) { + $caller['line'] = $bt[ $depth ]['line']; + $caller['file'] = $bt[ $depth ]['file']; + break; + } + } + } + $log = array_merge( $caller, array( 'cnt' => self::$CNT ++, 'logger' => $this, - 'timestamp' => microtime(true), - 'type' => $type, + 'timestamp' => microtime( true ), + 'log_type' => $type, 'msg' => $message, ) ); + if ( self::$_isStorageLoggingOn ) { + $this->db_log( $type, $message, self::$CNT, $caller ); + } + self::$LOG[] = $log; - if ( $this->is_echo_on() ) { + if ( $this->is_echo_on() && ! Freemius::is_ajax() ) { echo self::format_html( $log ) . "\n"; } } @@ -149,7 +220,10 @@ */ function api_error( $api_result, $wrapper = false ) { $message = ''; - if ( is_object( $api_result ) && isset( $api_result->error ) ) { + if ( is_object( $api_result ) && + ! empty( $api_result->error ) && + ! empty( $api_result->error->message ) + ) { $message = $api_result->error->message; } else if ( is_object( $api_result ) ) { $message = var_export( $api_result, true ); @@ -176,30 +250,442 @@ $this->_log( $msg, 'log', $wrapper ); } + #-------------------------------------------------------------------------------- + #region Log Formatting + #-------------------------------------------------------------------------------- + private static function format( $log, $show_type = true ) { - return '[' . str_pad( $log['cnt'], strlen( self::$CNT ), '0', STR_PAD_LEFT ) . '] [' . $log['logger']->_id . '] ' . ( $show_type ? '[' . $log['type'] . ']' : '' ) . $log['function'] . ' >> ' . $log['msg'] . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ') ' : '' ) . ' [' . $log['timestamp'] . ']'; + return '[' . str_pad( $log['cnt'], strlen( self::$CNT ), '0', STR_PAD_LEFT ) . '] [' . $log['logger']->_id . '] ' . ( $show_type ? '[' . $log['log_type'] . ']' : '' ) . ( ! empty( $log['class'] ) ? $log['class'] . $log['type'] : '' ) . $log['function'] . ' >> ' . $log['msg'] . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ') ' : '' ) . ' [' . $log['timestamp'] . ']'; } private static function format_html( $log ) { - return '<div style="font-size: 13px; font-family: monospace; color: #7da767; padding: 8px 3px; background: #000; border-bottom: 1px solid #555;">[' . $log['cnt'] . '] [' . $log['logger']->_id . '] [' . $log['type'] . '] <b><code style="color: #c4b1e0;">' . $log['function'] . '</code> >> <b style="color: #f59330;">' . esc_html($log['msg']) . '</b></b>' . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ')' : '' ) . ' [' . $log['timestamp'] . ']</div>'; + return '<div style="font-size: 13px; font-family: monospace; color: #7da767; padding: 8px 3px; background: #000; border-bottom: 1px solid #555;">[' . $log['cnt'] . '] [' . $log['logger']->_id . '] [' . $log['log_type'] . '] <b><code style="color: #c4b1e0;">' . ( ! empty( $log['class'] ) ? $log['class'] . $log['type'] : '' ) . $log['function'] . '</code> >> <b style="color: #f59330;">' . esc_html( $log['msg'] ) . '</b></b>' . ( isset( $log['file'] ) ? ' (' . substr( $log['file'], $log['logger']->_file_start ) . ' ' . $log['line'] . ')' : '' ) . ' [' . $log['timestamp'] . ']</div>'; } + #endregion + static function dump() { ?> <!-- BEGIN: Freemius PHP Console Log --> <script type="text/javascript"> <?php - foreach (self::$LOG as $log) - { - echo 'console.' . $log['type'] . '(' . json_encode(self::format($log, false)) . ')' . "\n"; - } + foreach ( self::$LOG as $log ) { + echo 'console.' . $log['log_type'] . '(' . json_encode( self::format( $log, false ) ) . ')' . "\n"; + } ?> </script> <!-- END: Freemius PHP Console Log --> - <?php + <?php } static function get_log() { return self::$LOG; } + + #-------------------------------------------------------------------------------- + #region Database Logging + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @return bool + */ + public static function is_storage_logging_on() { + if ( ! isset( self::$_isStorageLoggingOn ) ) { + self::$_isStorageLoggingOn = ( 1 == get_option( 'fs_storage_logger', 0 ) ); + } + + return self::$_isStorageLoggingOn; + } + + /** + * Turns on/off database persistent debugging to capture + * multi-session logs to debug complex flows like + * plugin auto-deactivate on premium version activation. + * + * @todo Check if Theme Check has issues with DB tables for themes. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param bool $is_on + * + * @return bool + */ + public static function _set_storage_logging( $is_on = true ) { + global $wpdb; + + $table = "{$wpdb->prefix}fs_logger"; + + if ( $is_on ) { + /** + * Create logging table. + * + * NOTE: + * dbDelta must use KEY and not INDEX for indexes. + * + * @link https://core.trac.wordpress.org/ticket/2695 + */ + $result = $wpdb->query( "CREATE TABLE {$table} ( +`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, +`process_id` INT UNSIGNED NOT NULL, +`user_name` VARCHAR(64) NOT NULL, +`logger` VARCHAR(128) NOT NULL, +`log_order` INT UNSIGNED NOT NULL, +`type` ENUM('log','info','warn','error') NOT NULL DEFAULT 'log', +`message` TEXT NOT NULL, +`file` VARCHAR(256) NOT NULL, +`line` INT UNSIGNED NOT NULL, +`function` VARCHAR(256) NOT NULL, +`request_type` ENUM('call','ajax','cron') NOT NULL DEFAULT 'call', +`request_url` VARCHAR(1024) NOT NULL, +`created` DECIMAL(16, 6) NOT NULL, +PRIMARY KEY (`id`), +KEY `process_id` (`process_id` ASC), +KEY `process_logger` (`process_id` ASC, `logger` ASC), +KEY `function` (`function` ASC), +KEY `type` (`type` ASC))" ); + } else { + /** + * Drop logging table. + */ + $result = $wpdb->query( "DROP TABLE IF EXISTS $table;" ); + } + + if ( false !== $result ) { + update_option( 'fs_storage_logger', ( $is_on ? 1 : 0 ) ); + } + + return ( false !== $result ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param string $type + * @param string $message + * @param int $log_order + * @param array $caller + * + * @return false|int + */ + private function db_log( + &$type, + &$message, + &$log_order, + &$caller + ) { + global $wpdb; + + $request_type = 'call'; + if ( defined( 'DOING_CRON' ) && DOING_CRON ) { + $request_type = 'cron'; + } else if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + $request_type = 'ajax'; + } + + $request_url = WP_FS__IS_HTTP_REQUEST ? + $_SERVER['REQUEST_URI'] : + ''; + + return $wpdb->insert( + "{$wpdb->prefix}fs_logger", + array( + 'process_id' => self::$_processID, + 'user_name' => self::$_ownerName, + 'logger' => $this->_id, + 'log_order' => $log_order, + 'type' => $type, + 'request_type' => $request_type, + 'request_url' => $request_url, + 'message' => $message, + 'file' => isset( $caller['file'] ) ? + substr( $caller['file'], self::$_abspathLength ) : + '', + 'line' => $caller['line'], + 'function' => ( ! empty( $caller['class'] ) ? $caller['class'] . $caller['type'] : '' ) . $caller['function'], + 'created' => microtime( true ), + ) + ); + } + + /** + * Persistent DB logger columns. + * + * @var array + */ + private static $_log_columns = array( + 'id', + 'process_id', + 'user_name', + 'logger', + 'log_order', + 'type', + 'message', + 'file', + 'line', + 'function', + 'request_type', + 'request_url', + 'created', + ); + + /** + * Create DB logs query. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param bool $filters + * @param int $limit + * @param int $offset + * @param bool $order + * @param bool $escape_eol + * + * @return string + */ + private static function build_db_logs_query( + $filters = false, + $limit = 200, + $offset = 0, + $order = false, + $escape_eol = false + ) { + global $wpdb; + + $select = '*'; + + if ( $escape_eol ) { + $select = ''; + for ( $i = 0, $len = count( self::$_log_columns ); $i < $len; $i ++ ) { + if ( $i > 0 ) { + $select .= ', '; + } + + if ( 'message' !== self::$_log_columns[ $i ] ) { + $select .= self::$_log_columns[ $i ]; + } else { + $select .= 'REPLACE(message , \'\n\', \' \') AS message'; + } + } + } + + $query = "SELECT {$select} FROM {$wpdb->prefix}fs_logger"; + if ( is_array( $filters ) ) { + $criteria = array(); + + if ( ! empty( $filters['type'] ) && 'all' !== $filters['type'] ) { + $filters['type'] = strtolower( $filters['type'] ); + + switch ( $filters['type'] ) { + case 'warn_error': + $criteria[] = array( 'col' => 'type', 'val' => array( 'warn', 'error' ) ); + break; + case 'error': + case 'warn': + $criteria[] = array( 'col' => 'type', 'val' => $filters['type'] ); + break; + case 'info': + default: + $criteria[] = array( 'col' => 'type', 'val' => array( 'info', 'log' ) ); + break; + } + } + + if ( ! empty( $filters['request_type'] ) ) { + $filters['request_type'] = strtolower( $filters['request_type'] ); + + if ( in_array( $filters['request_type'], array( 'call', 'ajax', 'cron' ) ) ) { + $criteria[] = array( 'col' => 'request_type', 'val' => $filters['request_type'] ); + } + } + + if ( ! empty( $filters['file'] ) ) { + $criteria[] = array( + 'col' => 'file', + 'op' => 'LIKE', + 'val' => '%' . esc_sql( $filters['file'] ), + ); + } + + if ( ! empty( $filters['function'] ) ) { + $criteria[] = array( + 'col' => 'function', + 'op' => 'LIKE', + 'val' => '%' . esc_sql( $filters['function'] ), + ); + } + + if ( ! empty( $filters['process_id'] ) && is_numeric( $filters['process_id'] ) ) { + $criteria[] = array( 'col' => 'process_id', 'val' => $filters['process_id'] ); + } + + if ( ! empty( $filters['logger'] ) ) { + $criteria[] = array( + 'col' => 'logger', + 'op' => 'LIKE', + 'val' => '%' . esc_sql( $filters['logger'] ) . '%', + ); + } + + if ( ! empty( $filters['message'] ) ) { + $criteria[] = array( + 'col' => 'message', + 'op' => 'LIKE', + 'val' => '%' . esc_sql( $filters['message'] ) . '%', + ); + } + + if ( 0 < count( $criteria ) ) { + $query .= "\nWHERE\n"; + + $first = true; + foreach ( $criteria as $c ) { + if ( ! $first ) { + $query .= "AND\n"; + } + + if ( is_array( $c['val'] ) ) { + $operator = 'IN'; + + for ( $i = 0, $len = count( $c['val'] ); $i < $len; $i ++ ) { + $c['val'][ $i ] = "'" . esc_sql( $c['val'][ $i ] ) . "'"; + } + + $val = '(' . implode( ',', $c['val'] ) . ')'; + } else { + $operator = ! empty( $c['op'] ) ? $c['op'] : '='; + $val = "'" . esc_sql( $c['val'] ) . "'"; + } + + $query .= "`{$c['col']}` {$operator} {$val}\n"; + + $first = false; + } + } + } + + if ( ! is_array( $order ) ) { + $order = array( + 'col' => 'id', + 'order' => 'desc' + ); + } + + $query .= " ORDER BY {$order['col']} {$order['order']} LIMIT {$offset},{$limit}"; + + return $query; + } + + /** + * Load logs from DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param bool $filters + * @param int $limit + * @param int $offset + * @param bool $order + * + * @return object[]|null + */ + public static function load_db_logs( + $filters = false, + $limit = 200, + $offset = 0, + $order = false + ) { + global $wpdb; + + $query = self::build_db_logs_query( + $filters, + $limit, + $offset, + $order + ); + + return $wpdb->get_results( $query ); + } + + /** + * Load logs from DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param bool $filters + * @param string $filename + * @param int $limit + * @param int $offset + * @param bool $order + * + * @return false|string File download URL or false on failure. + */ + public static function download_db_logs( + $filters = false, + $filename = '', + $limit = 10000, + $offset = 0, + $order = false + ) { + global $wpdb; + + $query = self::build_db_logs_query( + $filters, + $limit, + $offset, + $order, + true + ); + + $upload_dir = wp_upload_dir(); + if ( empty( $filename ) ) { + $filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv'; + } + $filepath = rtrim( $upload_dir['path'], '/' ) . "/{$filename}"; + + $query .= " INTO OUTFILE '{$filepath}' FIELDS TERMINATED BY '\t' ESCAPED BY '\\\\' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\\n'"; + + $columns = ''; + for ( $i = 0, $len = count( self::$_log_columns ); $i < $len; $i ++ ) { + if ( $i > 0 ) { + $columns .= ', '; + } + + $columns .= "'" . self::$_log_columns[ $i ] . "'"; + } + + $query = "SELECT {$columns} UNION ALL " . $query; + + $result = $wpdb->query( $query ); + + if ( false === $result ) { + return false; + } + + return rtrim( $upload_dir['url'], '/' ) . '/' . $filename; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param string $filename + * + * @return string + */ + public static function get_logs_download_url( $filename = '' ) { + $upload_dir = wp_upload_dir(); + if ( empty( $filename ) ) { + $filename = 'fs-logs-' . date( 'Y-m-d_H-i-s', WP_FS__SCRIPT_START_TIME ) . '.csv'; + } + + return rtrim( $upload_dir['url'], '/' ) . $filename; + } + + #endregion } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-options.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-options.php new file mode 100644 index 000000000..f762a6bf1 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-options.php @@ -0,0 +1,431 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Options + * + * A wrapper class for handling network level and single site level options. + */ + class FS_Options { + /** + * @var string + */ + private $_id; + + /** + * @var array[string]FS_Options { + * @key string + * @value FS_Options + * } + */ + private static $_instances; + + /** + * @var FS_Option_Manager Site level options. + */ + private $_options; + + /** + * @var FS_Option_Manager Network level options. + */ + private $_network_options; + + /** + * @var int The ID of the blog that is associated with the current site level options. + */ + private $_blog_id = 0; + + /** + * @var bool + */ + private $_is_multisite; + + /** + * @var string[] Lazy collection of params on the site level. + */ + private static $_SITE_OPTIONS_MAP; + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param string $id + * @param bool $load + * + * @return FS_Options + */ + static function instance( $id, $load = false ) { + if ( ! isset( self::$_instances[ $id ] ) ) { + self::$_instances[ $id ] = new FS_Options( $id, $load ); + } + + return self::$_instances[ $id ]; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param string $id + * @param bool $load + */ + private function __construct( $id, $load = false ) { + $this->_id = $id; + $this->_is_multisite = is_multisite(); + + if ( $this->_is_multisite ) { + $this->_blog_id = get_current_blog_id(); + $this->_network_options = FS_Option_Manager::get_manager( $id, $load, true ); + } + + $this->_options = FS_Option_Manager::get_manager( $id, $load, $this->_blog_id ); + } + + /** + * Switch the context of the site level options manager. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param $blog_id + */ + function set_site_blog_context( $blog_id ) { + $this->_blog_id = $blog_id; + + $this->_options = FS_Option_Manager::get_manager( $this->_id, false, $this->_blog_id ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $option + * @param mixed $default + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). + * + * @return mixed + */ + function get_option( $option, $default = null, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { + return $this->_network_options->get_option( $option, $default ); + } + + $site_options = $this->get_site_options( $network_level_or_blog_id ); + + return $site_options->get_option( $option, $default ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param string $option + * @param mixed $value + * @param bool $flush + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). + */ + function set_option( $option, $value, $flush = false, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { + $this->_network_options->set_option( $option, $value, $flush ); + } else { + $site_options = $this->get_site_options( $network_level_or_blog_id ); + $site_options->set_option( $option, $value, $flush ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $option + * @param bool $flush + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). + */ + function unset_option( $option, $flush = false, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_storage( $option, $network_level_or_blog_id ) ) { + $this->_network_options->unset_option( $option, $flush ); + } else { + $site_options = $this->get_site_options( $network_level_or_blog_id ); + $site_options->unset_option( $option, $flush ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param bool $flush + * @param bool $network_level + */ + function load( $flush = false, $network_level = true ) { + if ( $this->_is_multisite && $network_level ) { + $this->_network_options->load( $flush ); + } else { + $this->_options->load( $flush ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, store both network storage and the current context blog storage. + */ + function store( $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite || + false === $network_level_or_blog_id || + 0 == $network_level_or_blog_id || + is_null( $network_level_or_blog_id ) + ) { + $site_options = $this->get_site_options( $network_level_or_blog_id ); + $site_options->store(); + } + + if ( $this->_is_multisite && + ( is_null( $network_level_or_blog_id ) || true === $network_level_or_blog_id ) + ) { + $this->_network_options->store(); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int|null|bool $network_level_or_blog_id + * @param bool $flush + */ + function clear( $network_level_or_blog_id = null, $flush = false ) { + if ( ! $this->_is_multisite || + false === $network_level_or_blog_id || + is_null( $network_level_or_blog_id ) || + is_numeric( $network_level_or_blog_id ) + ) { + $site_options = $this->get_site_options( $network_level_or_blog_id ); + $site_options->clear( $flush ); + } + + if ( $this->_is_multisite && + ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) + ) { + $this->_network_options->clear( $flush ); + } + } + + /** + * Migration script to the new storage data structure that is network compatible. + * + * IMPORTANT: + * This method should be executed only after it is determined if this is a network + * level compatible product activation. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + */ + function migrate_to_network( $blog_id = 0 ) { + if ( ! $this->_is_multisite ) { + return; + } + + $updated = false; + + $site_options = $this->get_site_options( $blog_id ); + + $keys = $site_options->get_options_keys(); + + foreach ( $keys as $option ) { + if ( $this->is_site_option( $option ) || + // Don't move admin notices to the network storage. + in_array($option, array( + // Don't move admin notices to the network storage. + 'admin_notices', + // Don't migrate the module specific data, it will be migrated by the FS_Storage. + 'plugin_data', + 'theme_data', + )) + ) { + continue; + } + + $option_updated = false; + + // Migrate option to the network storage. + $site_option = $site_options->get_option( $option ); + + if ( ! $this->_network_options->has_option( $option ) ) { + // Option not set on the network level, so just set it. + $this->_network_options->set_option( $option, $site_option, false ); + + $option_updated = true; + } else { + // Option already set on the network level, so we need to merge it inelegantly. + $network_option = $this->_network_options->get_option( $option ); + + if ( is_array( $network_option ) && is_array( $site_option ) ) { + // Option is an array. + foreach ( $site_option as $key => $value ) { + if ( ! isset( $network_option[ $key ] ) ) { + $network_option[ $key ] = $value; + + $option_updated = true; + } else if ( is_array( $network_option[ $key ] ) && is_array( $value ) ) { + if ( empty( $network_option[ $key ] ) ) { + $network_option[ $key ] = $value; + + $option_updated = true; + } else if ( empty( $value ) ) { + // Do nothing. + } else { + reset($value); + $first_key = key($value); + if ( $value[$first_key] instanceof FS_Entity ) { + // Merge entities by IDs. + $network_entities_ids = array(); + foreach ( $network_option[ $key ] as $entity ) { + $network_entities_ids[ $entity->id ] = true; + } + + foreach ( $value as $entity ) { + if ( ! isset( $network_entities_ids[ $entity->id ] ) ) { + $network_option[ $key ][] = $entity; + + $option_updated = true; + } + } + } + } + } + } + } + + if ( $option_updated ) { + $this->_network_options->set_option( $option, $network_option, false ); + } + } + + /** + * Remove the option from site level storage. + * + * IMPORTANT: + * The line below is intentionally commented since we want to preserve the option + * on the site storage level for "downgrade compatibility". Basically, if the user + * will downgrade to an older version of the plugin with the prev storage structure, + * it will continue working. + * + * @todo After a few releases we can remove this. + */ +// $site_options->unset_option($option, false); + + if ( $option_updated ) { + $updated = true; + } + } + + if ( ! $updated ) { + return; + } + + // Update network level storage. + $this->_network_options->store(); +// $site_options->store(); + } + + + #-------------------------------------------------------------------------------- + #region Helper Methods + #-------------------------------------------------------------------------------- + + /** + * We don't want to load the map right away since it's not even needed in a non-MS environment. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private static function load_site_options_map() { + self::$_SITE_OPTIONS_MAP = array( + 'sites' => true, + 'theme_sites' => true, + 'unique_id' => true, + 'active_plugins' => true, + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $option + * + * @return bool + */ + private function is_site_option( $option ) { + if ( WP_FS__ACCOUNTS_OPTION_NAME != $this->_id ) { + return false; + } + + if ( ! isset( self::$_SITE_OPTIONS_MAP ) ) { + self::load_site_options_map(); + } + + return isset( self::$_SITE_OPTIONS_MAP[ $option ] ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return FS_Option_Manager + */ + private function get_site_options( $blog_id = 0 ) { + if ( 0 == $blog_id || $blog_id == $this->_blog_id ) { + return $this->_options; + } + + return FS_Option_Manager::get_manager( $this->_id, true, $blog_id ); + } + + /** + * Check if an option should be stored on the MS network storage. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $option + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_SITE_LEVEL_PARAMS). + * + * @return bool + */ + private function should_use_network_storage( $option, $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite ) { + // Not a multisite environment. + return false; + } + + if ( is_numeric( $network_level_or_blog_id ) ) { + // Explicitly asked to use a specified blog storage. + return false; + } + + if ( is_bool( $network_level_or_blog_id ) ) { + // Explicitly specified whether should use the network or blog level storage. + return $network_level_or_blog_id; + } + + // Determine which storage to use based on the option. + return ! $this->is_site_option( $option ); + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-plugin-updater.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-plugin-updater.php index 8c2ef8bee..5aba1701f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-plugin-updater.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-plugin-updater.php @@ -1,337 +1,1112 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.4 - * - * @link https://github.com/easydigitaldownloads/EDD-License-handler/blob/master/EDD_SL_Plugin_Updater.php - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - // Uncomment this line for testing. -// set_site_transient( 'update_plugins', null ); - - class FS_Plugin_Updater { - - /** - * @var Freemius - * @since 1.0.4 - */ - private $_fs; - /** - * @var FS_Logger - * @since 1.0.4 - */ - private $_logger; - /** - * @var object - * @since 1.1.8.1 - */ - private $_update_details; - - function __construct( Freemius $freemius ) { - $this->_fs = $freemius; - - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $freemius->get_slug() . '_updater', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_filters(); - } - - /** - * Initiate required filters. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - */ - private function _filters() { - // Override request for plugin information - add_filter( 'plugins_api', array( &$this, 'plugins_api_filter' ), 10, 3 ); - - // WP 3.0+ - add_filter( 'pre_set_site_transient_update_plugins', array( - &$this, - 'pre_set_site_transient_update_plugins_filter' - ) ); - - if ( ! $this->_fs->has_active_valid_license() ) { - /** - * If user has the premium plugin's code but do NOT have an active license, - * encourage him to upgrade by showing that there's a new release, but instead - * of showing an update link, show upgrade link to the pricing page. - * - * @since 1.1.6 - * - */ - // WP 2.9+ - add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( - &$this, - 'catch_plugin_update_row' - ), 9 ); - add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( - &$this, - 'edit_and_echo_plugin_update_row' - ), 11, 2 ); - } - - if ( ! WP_FS__IS_PRODUCTION_MODE ) { - add_filter( 'http_request_host_is_external', array( - $this, - 'http_request_host_is_external_filter' - ), 10, 3 ); - } - } - - /** - * Capture plugin update row by turning output buffering. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - */ - function catch_plugin_update_row() { - ob_start(); - } - - /** - * Overrides default update message format with "renew your license" message. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $file - * @param array $plugin_data - */ - function edit_and_echo_plugin_update_row( $file, $plugin_data ) { - $plugin_update_row = ob_get_clean(); - - $current = get_site_transient( 'update_plugins' ); - if ( ! isset( $current->response[ $file ] ) ) { - echo $plugin_update_row; - - return; - } - - $r = $current->response[ $file ]; - - $plugin_update_row = preg_replace( - '/(\<div.+>)(.+)(\<a.+\<a.+)\<\/div\>/is', - '$1 $2 ' . sprintf( - __fs( 'renew-license-now' ), - '<a href="' . $this->_fs->pricing_url() . '">', '</a>', - $r->new_version ) . - '$4', - $plugin_update_row - ); - - echo $plugin_update_row; - } - - /** - * Since WP version 3.6, a new security feature was added that denies access to repository with a local ip. - * During development mode we want to be able updating plugin versions via our localhost repository. This - * filter white-list all domains including "api.freemius". - * - * @link http://www.emanueletessore.com/wordpress-download-failed-valid-url-provided/ - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param bool $allow - * @param string $host - * @param string $url - * - * @return bool - */ - function http_request_host_is_external_filter( $allow, $host, $url ) { - return ( false !== strpos( $host, 'freemius' ) ) ? true : $allow; - } - - /** - * Check for Updates at the defined API endpoint and modify the update array. - * - * This function dives into the update api just when WordPress creates its update array, - * then adds a custom API call and injects the custom plugin data retrieved from the API. - * It is reassembled from parts of the native WordPress plugin update code. - * See wp-includes/update.php line 121 for the original wp_update_plugins() function. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @uses FS_Api - * - * @param stdClass $transient_data Update array build by WordPress. - * - * @return array Modified update array with custom plugin data. - */ - function pre_set_site_transient_update_plugins_filter( $transient_data ) { - $this->_logger->entrance(); - - if ( empty( $transient_data ) || - defined( 'WP_FS__UNINSTALL_MODE' ) - ) { - return $transient_data; - } - - if ( ! isset( $this->_update_details ) ) { - // Get plugin's newest update. - $new_version = $this->_fs->get_update( false, false ); - - $this->_update_details = false; - - if ( is_object( $new_version ) ) { - $this->_logger->log( 'Found newer plugin version ' . $new_version->version ); - - $plugin_details = new stdClass(); - $plugin_details->slug = $this->_fs->get_slug(); - $plugin_details->new_version = $new_version->version; - $plugin_details->url = WP_FS__ADDRESS; - $plugin_details->package = $new_version->url; - $plugin_details->plugin = $this->_fs->get_plugin_basename(); - - /** - * Cache plugin details locally since set_site_transient( 'update_plugins' ) - * called multiple times and the non wp.org plugins are filtered after the - * call to .org. - * - * @since 1.1.8.1 - */ - $this->_update_details = $plugin_details; - } - } - - if ( is_object( $this->_update_details ) ) { - // Add plugin to transient data. - $transient_data->response[ $this->_fs->get_plugin_basename() ] = $this->_update_details; - } - - return $transient_data; - } - - /** - * Try to fetch plugin's info from .org repository. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @param string $action - * @param object $args - * - * @return bool|mixed - */ - static function _fetch_plugin_info_from_repository( $action, $args ) { - $url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/'; - if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) { - $url = set_url_scheme( $url, 'https' ); - } - - $args = array( - 'timeout' => 15, - 'body' => array( - 'action' => $action, - 'request' => serialize( $args ) - ) - ); - - $request = wp_remote_post( $url, $args ); - - if ( is_wp_error( $request ) ) { - return false; - } - - $res = maybe_unserialize( wp_remote_retrieve_body( $request ) ); - - if ( ! is_object( $res ) && ! is_array( $res ) ) { - return false; - } - - return $res; - } - - /** - * Updates information on the "View version x.x details" page with custom data. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @uses FS_Api - * - * @param object $data - * @param string $action - * @param mixed $args - * - * @return object - */ - function plugins_api_filter( $data, $action = '', $args = null ) { - $this->_logger->entrance(); - - if ( ( 'plugin_information' !== $action ) || - ! isset( $args->slug ) - ) { - return $data; - } - - $addon = false; - $is_addon = false; - - if ( $this->_fs->get_slug() !== $args->slug ) { - $addon = $this->_fs->get_addon_by_slug( $args->slug ); - - if ( ! is_object( $addon ) ) { - return $data; - } - - $is_addon = true; - } - - $plugin_in_repo = false; - if ( ! $is_addon ) { - // Try to fetch info from .org repository. - $data = self::_fetch_plugin_info_from_repository( $action, $args ); - - $plugin_in_repo = ( false !== $data ); - } - - if ( ! $plugin_in_repo ) { - $data = $args; - - // Fetch as much as possible info from local files. - $plugin_local_data = $this->_fs->get_plugin_data(); - $data->name = $plugin_local_data['Name']; - $data->author = $plugin_local_data['Author']; - $data->sections = array( - 'description' => 'Upgrade ' . $plugin_local_data['Name'] . ' to latest.', - ); - - // @todo Store extra plugin info on Freemius or parse readme.txt markup. - /*$info = $this->_fs->get_api_site_scope()->call('/information.json'); - -if ( !isset($info->error) ) { - $data = $info; -}*/ - } - - // Get plugin's newest update. - $new_version = $this->_fs->_fetch_latest_version( $is_addon ? $addon->id : false ); - - if ( $is_addon ) { - $data->name = $addon->title . ' ' . __fs( 'addon', $this->_fs->get_slug() ); - $data->slug = $addon->slug; - $data->url = WP_FS__ADDRESS; - $data->package = $new_version->url; - } - - if ( ! $plugin_in_repo ) { - $data->last_updated = ! is_null( $new_version->updated ) ? $new_version->updated : $new_version->created; - $data->requires = $new_version->requires_platform_version; - $data->tested = $new_version->tested_up_to_version; - } - - $data->version = $new_version->version; - $data->download_link = $new_version->url; - - return $data; - } - } \ No newline at end of file +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.4 + * + * @link https://github.com/easydigitaldownloads/EDD-License-handler/blob/master/EDD_SL_Plugin_Updater.php + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Plugin_Updater { + + /** + * @var Freemius + * @since 1.0.4 + */ + private $_fs; + /** + * @var FS_Logger + * @since 1.0.4 + */ + private $_logger; + /** + * @var object + * @since 1.1.8.1 + */ + private $_update_details; + /** + * @var array + * @since 2.1.2 + */ + private $_translation_updates; + + #-------------------------------------------------------------------------------- + #region Singleton + #-------------------------------------------------------------------------------- + + /** + * @var FS_Plugin_Updater[] + * @since 2.0.0 + */ + private static $_INSTANCES = array(); + + /** + * @param Freemius $freemius + * + * @return FS_Plugin_Updater + */ + static function instance( Freemius $freemius ) { + $key = $freemius->get_id(); + + if ( ! isset( self::$_INSTANCES[ $key ] ) ) { + self::$_INSTANCES[ $key ] = new self( $freemius ); + } + + return self::$_INSTANCES[ $key ]; + } + + #endregion + + private function __construct( Freemius $freemius ) { + $this->_fs = $freemius; + + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $freemius->get_slug() . '_updater', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + $this->filters(); + } + + /** + * Initiate required filters. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + */ + private function filters() { + // Override request for plugin information + add_filter( 'plugins_api', array( &$this, 'plugins_api_filter' ), 10, 3 ); + + $this->add_transient_filters(); + + if ( ! $this->_fs->has_any_active_valid_license() ) { + /** + * If user has the premium plugin's code but do NOT have an active license, + * encourage him to upgrade by showing that there's a new release, but instead + * of showing an update link, show upgrade link to the pricing page. + * + * @since 1.1.6 + * + */ + // WP 2.9+ + add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( + &$this, + 'catch_plugin_update_row' + ), 9 ); + add_action( "after_plugin_row_{$this->_fs->get_plugin_basename()}", array( + &$this, + 'edit_and_echo_plugin_update_row' + ), 11, 2 ); + } + + if ( ! WP_FS__IS_PRODUCTION_MODE ) { + add_filter( 'http_request_host_is_external', array( + $this, + 'http_request_host_is_external_filter' + ), 10, 3 ); + } + + if ( $this->_fs->is_premium() ) { + if ( $this->is_correct_folder_name() ) { + add_filter( 'upgrader_post_install', array( &$this, '_maybe_update_folder_name' ), 10, 3 ); + } + + if ( ! $this->_fs->has_any_active_valid_license() ) { + add_filter( 'wp_prepare_themes_for_js', array( &$this, 'change_theme_update_info_html' ), 10, 1 ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private function add_transient_filters() { + add_filter( 'pre_set_site_transient_update_plugins', array( + &$this, + 'pre_set_site_transient_update_plugins_filter' + ) ); + + add_filter( 'pre_set_site_transient_update_themes', array( + &$this, + 'pre_set_site_transient_update_plugins_filter' + ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private function remove_transient_filters() { + remove_filter( 'pre_set_site_transient_update_plugins', array( + &$this, + 'pre_set_site_transient_update_plugins_filter' + ) ); + + remove_filter( 'pre_set_site_transient_update_themes', array( + &$this, + 'pre_set_site_transient_update_plugins_filter' + ) ); + } + + /** + * Capture plugin update row by turning output buffering. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + */ + function catch_plugin_update_row() { + ob_start(); + } + + /** + * Overrides default update message format with "renew your license" message. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $file + * @param array $plugin_data + */ + function edit_and_echo_plugin_update_row( $file, $plugin_data ) { + $plugin_update_row = ob_get_clean(); + + $current = get_site_transient( 'update_plugins' ); + if ( ! isset( $current->response[ $file ] ) ) { + echo $plugin_update_row; + + return; + } + + $r = $current->response[ $file ]; + + $plugin_update_row = preg_replace( + '/(\<div.+>)(.+)(\<a.+\<a.+)\<\/div\>/is', + '$1 $2 ' . sprintf( + $this->_fs->get_text_inline( '%sRenew your license now%s to access version %s security & feature updates, and support.', 'renew-license-now' ), + '<a href="' . $this->_fs->pricing_url() . '">', '</a>', + $r->new_version ) . + '$4', + $plugin_update_row + ); + + echo $plugin_update_row; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + * + * @param array $prepared_themes + * + * @return array + */ + function change_theme_update_info_html( $prepared_themes ) { + $theme_basename = $this->_fs->get_plugin_basename(); + + if ( ! isset( $prepared_themes[ $theme_basename ] ) ) { + return $prepared_themes; + } + + $themes_update = get_site_transient( 'update_themes' ); + if ( ! isset( $themes_update->response[ $theme_basename ] ) || + empty( $themes_update->response[ $theme_basename ]['package'] ) + ) { + return $prepared_themes; + } + + $prepared_themes[ $theme_basename ]['update'] = preg_replace( + '/(\<p.+>)(.+)(\<a.+\<a.+)\.(.+\<\/p\>)/is', + '$1 $2 ' . sprintf( + $this->_fs->get_text_inline( '%sRenew your license now%s to access version %s security & feature updates, and support.', 'renew-license-now' ), + '<a href="' . $this->_fs->pricing_url() . '">', '</a>', + $themes_update->response[ $theme_basename ]['new_version'] ) . + '$4', + $prepared_themes[ $theme_basename ]['update'] + ); + + // Set to false to prevent the "Update now" link for the context theme from being shown on the "Themes" page. + $prepared_themes[ $theme_basename ]['hasPackage'] = false; + + return $prepared_themes; + } + + /** + * Since WP version 3.6, a new security feature was added that denies access to repository with a local ip. + * During development mode we want to be able updating plugin versions via our localhost repository. This + * filter white-list all domains including "api.freemius". + * + * @link http://www.emanueletessore.com/wordpress-download-failed-valid-url-provided/ + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param bool $allow + * @param string $host + * @param string $url + * + * @return bool + */ + function http_request_host_is_external_filter( $allow, $host, $url ) { + return ( false !== strpos( $host, 'freemius' ) ) ? true : $allow; + } + + /** + * Check for Updates at the defined API endpoint and modify the update array. + * + * This function dives into the update api just when WordPress creates its update array, + * then adds a custom API call and injects the custom plugin data retrieved from the API. + * It is reassembled from parts of the native WordPress plugin update code. + * See wp-includes/update.php line 121 for the original wp_update_plugins() function. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @uses FS_Api + * + * @param object $transient_data Update array build by WordPress. + * + * @return object Modified update array with custom plugin data. + */ + function pre_set_site_transient_update_plugins_filter( $transient_data ) { + $this->_logger->entrance(); + + /** + * "plugins" or "themes". + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + $module_type = $this->_fs->get_module_type() . 's'; + + /** + * Ensure that we don't mix plugins update info with themes update info. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( "pre_set_site_transient_update_{$module_type}" !== current_filter() ) { + return $transient_data; + } + + if ( empty( $transient_data ) || + defined( 'WP_FS__UNINSTALL_MODE' ) + ) { + return $transient_data; + } + + if ( ! isset( $this->_update_details ) ) { + // Get plugin's newest update. + $new_version = $this->_fs->get_update( + false, + fs_request_get_bool( 'force-check' ), + WP_FS__TIME_24_HOURS_IN_SEC / 24 + ); + + $this->_update_details = false; + + if ( is_object( $new_version ) ) { + $this->_logger->log( 'Found newer plugin version ' . $new_version->version ); + + /** + * Cache plugin details locally since set_site_transient( 'update_plugins' ) + * called multiple times and the non wp.org plugins are filtered after the + * call to .org. + * + * @since 1.1.8.1 + */ + $this->_update_details = $this->get_update_details( $new_version ); + } + } + + if ( is_object( $this->_update_details ) ) { + // Add plugin to transient data. + $transient_data->response[ $this->_fs->get_plugin_basename() ] = $this->_fs->is_plugin() ? + $this->_update_details : + (array) $this->_update_details; + } + + $slug = $this->_fs->get_slug(); + + if ( $this->_fs->is_org_repo_compliant() && $this->_fs->is_freemium() ) { + if ( ! isset( $this->_translation_updates ) ) { + $this->_translation_updates = array(); + + if ( current_user_can( 'update_languages' ) ) { + $translation_updates = $this->fetch_wp_org_module_translation_updates( $module_type, $slug ); + if ( ! empty( $translation_updates ) ) { + $this->_translation_updates = $translation_updates; + } + } + } + + if ( ! empty( $this->_translation_updates ) ) { + $all_translation_updates = ( isset( $transient_data->translations ) && is_array( $transient_data->translations ) ) ? + $transient_data->translations : + array(); + + $current_plugin_translation_updates_map = array(); + foreach ( $all_translation_updates as $key => $translation_update ) { + if ( $module_type === ( $translation_update['type'] . 's' ) && $slug === $translation_update['slug'] ) { + $current_plugin_translation_updates_map[ $translation_update['language'] ] = $translation_update; + unset( $all_translation_updates[ $key ] ); + } + } + + foreach ( $this->_translation_updates as $translation_update ) { + $lang = $translation_update['language']; + if ( ! isset( $current_plugin_translation_updates_map[ $lang ] ) || + version_compare( $translation_update['version'], $current_plugin_translation_updates_map[ $lang ]['version'], '>' ) + ) { + $current_plugin_translation_updates_map[ $lang ] = $translation_update; + } + } + + $transient_data->translations = array_merge( $all_translation_updates, array_values( $current_plugin_translation_updates_map ) ); + } + } + + return $transient_data; + } + + /** + * Get module's required data for the updates mechanism. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_Plugin_Tag $new_version + * + * @return object + */ + function get_update_details( FS_Plugin_Tag $new_version ) { + $update = new stdClass(); + $update->slug = $this->_fs->get_slug(); + $update->new_version = $new_version->version; + $update->url = WP_FS__ADDRESS; + $update->package = $new_version->url; + $update->tested = $new_version->tested_up_to_version; + $update->requires = $new_version->requires_platform_version; + + $icon = $this->_fs->get_local_icon_url(); + + if ( ! empty( $icon ) ) { + $update->icons = array( +// '1x' => $icon, +// '2x' => $icon, + 'default' => $icon, + ); + } + + $update->{$this->_fs->get_module_type()} = $this->_fs->get_plugin_basename(); + + return $update; + } + + /** + * Update the updates transient with the module's update information. + * + * This method is required for multisite environment. + * If a module is site activated (not network) and not on the main site, + * the module will NOT be executed on the network level, therefore, the + * custom updates logic will not be executed as well, so unless we force + * the injection of the update into the updates transient, premium updates + * will not work. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param \FS_Plugin_Tag $new_version + */ + function set_update_data( FS_Plugin_Tag $new_version ) { + $this->_logger->entrance(); + + $transient_key = "update_{$this->_fs->get_module_type()}s"; + + $transient_data = get_site_transient( $transient_key ); + + $transient_data = is_object( $transient_data ) ? + $transient_data : + new stdClass(); + + // Alias. + $basename = $this->_fs->get_plugin_basename(); + $is_plugin = $this->_fs->is_plugin(); + + if ( ! isset( $transient_data->response ) || + ! is_array( $transient_data->response ) + ) { + $transient_data->response = array(); + } else if ( ! empty( $transient_data->response[ $basename ] ) ) { + $version = $is_plugin ? + ( ! empty( $transient_data->response[ $basename ]->new_version ) ? + $transient_data->response[ $basename ]->new_version : + null + ) : ( ! empty( $transient_data->response[ $basename ]['new_version'] ) ? + $transient_data->response[ $basename ]['new_version'] : + null + ); + + if ( $version == $new_version->version ) { + // The update data is already set. + return; + } + } + + // Remove the added filters. + $this->remove_transient_filters(); + + $this->_update_details = $this->get_update_details( $new_version ); + + // Set update data in transient. + $transient_data->response[ $basename ] = $is_plugin ? + $this->_update_details : + (array) $this->_update_details; + + if ( ! isset( $transient_data->checked ) || + ! is_array( $transient_data->checked ) + ) { + $transient_data->checked = array(); + } + + // Flag the module as if it was already checked. + $transient_data->checked[ $basename ] = $this->_fs->get_plugin_version(); + $transient_data->last_checked = time(); + + set_site_transient( $transient_key, $transient_data ); + + $this->add_transient_filters(); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.2 + */ + function delete_update_data() { + $this->_logger->entrance(); + + $transient_key = "update_{$this->_fs->get_module_type()}s"; + + $transient_data = get_site_transient( $transient_key ); + + // Alias + $basename = $this->_fs->get_plugin_basename(); + + if ( ! is_object( $transient_data ) || + ! isset( $transient_data->response ) || + ! is_array( $transient_data->response ) || + empty( $transient_data->response[ $basename ] ) + ) { + return; + } + + unset( $transient_data->response[ $basename ] ); + + // Remove the added filters. + $this->remove_transient_filters(); + + set_site_transient( $transient_key, $transient_data ); + + $this->add_transient_filters(); + } + + /** + * Try to fetch plugin's info from .org repository. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @param string $action + * @param object $args + * + * @return bool|mixed + */ + static function _fetch_plugin_info_from_repository( $action, $args ) { + $url = $http_url = 'http://api.wordpress.org/plugins/info/1.0/'; + if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $args = array( + 'timeout' => 15, + 'body' => array( + 'action' => $action, + 'request' => serialize( $args ) + ) + ); + + $request = wp_remote_post( $url, $args ); + + if ( is_wp_error( $request ) ) { + return false; + } + + $res = maybe_unserialize( wp_remote_retrieve_body( $request ) ); + + if ( ! is_object( $res ) && ! is_array( $res ) ) { + return false; + } + + return $res; + } + + /** + * Fetches module translation updates from wordpress.org. + * + * @author Leo Fajardo (@leorw) + * @since 2.1.2 + * + * @param string $module_type + * @param string $slug + * + * @return array|null + */ + private function fetch_wp_org_module_translation_updates( $module_type, $slug ) { + $plugin_data = $this->_fs->get_plugin_data(); + + $locales = array_values( get_available_languages() ); + $locales = apply_filters( "{$module_type}_update_check_locales", $locales ); + $locales = array_unique( $locales ); + + $plugin_basename = $this->_fs->get_plugin_basename(); + if ( 'themes' === $module_type ) { + $plugin_basename = str_replace( '-premium', '', $plugin_basename ); + } + + global $wp_version; + + $request_args = array( + 'timeout' => 15, + 'body' => array( + "{$module_type}" => json_encode( + array( + "{$module_type}" => array( + $plugin_basename => array( + 'Name' => trim( str_replace( '(Premium)', '', $plugin_data['Name'] ) ), + 'Author' => $plugin_data['Author'], + ) + ) + ) + ), + 'translations' => json_encode( $this->get_installed_translations( $module_type, $slug ) ), + 'locale' => json_encode( $locales ) + ), + 'user-agent' => ( 'WordPress/' . $wp_version . '; ' . home_url( '/' ) ) + ); + + $url = "http://api.wordpress.org/{$module_type}/update-check/1.1/"; + if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) { + $url = set_url_scheme( $url, 'https' ); + } + + $raw_response = Freemius::safe_remote_post( + $url, + $request_args, + WP_FS__TIME_24_HOURS_IN_SEC, + WP_FS__TIME_12_HOURS_IN_SEC, + false + ); + + if ( is_wp_error( $raw_response ) ) { + return null; + } + + $response = json_decode( wp_remote_retrieve_body( $raw_response ), true ); + + if ( ! is_array( $response ) ) { + return null; + } + + if ( ! isset( $response['translations'] ) || empty( $response['translations'] ) ) { + return null; + } + + return $response['translations']; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.2 + * + * @param string $module_type + * @param string $slug + * + * @return array + */ + private function get_installed_translations( $module_type, $slug ) { + if ( function_exists( 'wp_get_installed_translations' ) ) { + return wp_get_installed_translations( $module_type ); + } + + $dir = "/{$module_type}"; + + if ( ! is_dir( WP_LANG_DIR . $dir ) ) + return array(); + + $files = scandir( WP_LANG_DIR . $dir ); + if ( ! $files ) + return array(); + + $language_data = array(); + + foreach ( $files as $file ) { + if ( 0 !== strpos( $file, $slug ) ) { + continue; + } + + if ( '.' === $file[0] || is_dir( WP_LANG_DIR . "{$dir}/{$file}" ) ) { + continue; + } + + if ( substr( $file, -3 ) !== '.po' ) { + continue; + } + + if ( ! preg_match( '/(?:(.+)-)?([a-z]{2,3}(?:_[A-Z]{2})?(?:_[a-z0-9]+)?).po/', $file, $match ) ) { + continue; + } + + if ( ! in_array( substr( $file, 0, -3 ) . '.mo', $files ) ) { + continue; + } + + list( , $textdomain, $language ) = $match; + + if ( '' === $textdomain ) { + $textdomain = 'default'; + } + + $language_data[ $textdomain ][ $language ] = wp_get_pomo_file_data( WP_LANG_DIR . "{$dir}/{$file}" ); + } + + return $language_data; + } + + /** + * Updates information on the "View version x.x details" page with custom data. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @uses FS_Api + * + * @param object $data + * @param string $action + * @param mixed $args + * + * @return object + */ + function plugins_api_filter( $data, $action = '', $args = null ) { + $this->_logger->entrance(); + + if ( ( 'plugin_information' !== $action ) || + ! isset( $args->slug ) + ) { + return $data; + } + + $addon = false; + $is_addon = false; + + if ( $this->_fs->get_slug() !== $args->slug ) { + $addon = $this->_fs->get_addon_by_slug( $args->slug ); + + if ( ! is_object( $addon ) ) { + return $data; + } + + $is_addon = true; + } + + $plugin_in_repo = false; + if ( ! $is_addon ) { + // Try to fetch info from .org repository. + $data = self::_fetch_plugin_info_from_repository( $action, $args ); + + $plugin_in_repo = ( false !== $data ); + } + + if ( ! $plugin_in_repo ) { + $data = $args; + + // Fetch as much as possible info from local files. + $plugin_local_data = $this->_fs->get_plugin_data(); + $data->name = $plugin_local_data['Name']; + $data->author = $plugin_local_data['Author']; + $data->sections = array( + 'description' => 'Upgrade ' . $plugin_local_data['Name'] . ' to latest.', + ); + + // @todo Store extra plugin info on Freemius or parse readme.txt markup. + /*$info = $this->_fs->get_api_site_scope()->call('/information.json'); + +if ( !isset($info->error) ) { + $data = $info; +}*/ + } + + // Get plugin's newest update. + $new_version = $this->get_latest_download_details( $is_addon ? $addon->id : false ); + + if ( ! is_object( $new_version ) || empty( $new_version->version ) ) { + $data->version = $this->_fs->get_plugin_version(); + } else { + if ( $is_addon ) { + $data->name = $addon->title . ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ); + $data->slug = $addon->slug; + $data->url = WP_FS__ADDRESS; + $data->package = $new_version->url; + } + + if ( ! $plugin_in_repo ) { + $data->last_updated = ! is_null( $new_version->updated ) ? $new_version->updated : $new_version->created; + $data->requires = $new_version->requires_platform_version; + $data->tested = $new_version->tested_up_to_version; + } + + $data->version = $new_version->version; + $data->download_link = $new_version->url; + } + + return $data; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param number|bool $addon_id + * + * @return object + */ + private function get_latest_download_details( $addon_id = false ) { + return $this->_fs->_fetch_latest_version( $addon_id ); + } + + /** + * Checks if a given basename has a matching folder name + * with the current context plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param string $basename Current plugin's basename. + * + * @return bool + */ + private function is_correct_folder_name( $basename = '' ) { + if ( empty( $basename ) ) { + $basename = $this->_fs->get_plugin_basename(); + } + + return ( $this->_fs->get_target_folder_name() != trim( dirname( $basename ), '/\\' ) ); + } + + /** + * This is a special after upgrade handler for migrating modules + * that didn't use the '-premium' suffix folder structure before + * the migration. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @param bool $response Install response. + * @param array $hook_extra Extra arguments passed to hooked filters. + * @param array $result Installation result data. + * + * @return bool + */ + function _maybe_update_folder_name( $response, $hook_extra, $result ) { + $basename = $this->_fs->get_plugin_basename(); + + if ( true !== $response || + empty( $hook_extra ) || + empty( $hook_extra['plugin'] ) || + $basename !== $hook_extra['plugin'] + ) { + return $response; + } + + $active_plugins_basenames = get_option( 'active_plugins' ); + + for ( $i = 0, $len = count( $active_plugins_basenames ); $i < $len; $i ++ ) { + if ( $basename === $active_plugins_basenames[ $i ] ) { + // Get filename including extension. + $filename = basename( $basename ); + + $new_basename = plugin_basename( + trailingslashit( $this->_fs->get_slug() . ( $this->_fs->is_premium() ? '-premium' : '' ) ) . + $filename + ); + + // Verify that the expected correct path exists. + if ( file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $new_basename ) ) ) { + // Override active plugin name. + $active_plugins_basenames[ $i ] = $new_basename; + update_option( 'active_plugins', $active_plugins_basenames ); + } + + break; + } + } + + return $response; + } + + #---------------------------------------------------------------------------------- + #region Auto Activation + #---------------------------------------------------------------------------------- + + /** + * Installs and active a plugin when explicitly requested that from a 3rd party service. + * + * This logic was inspired by the TGMPA GPL licensed library by Thomas Griffin. + * + * @link http://tgmpluginactivation.com/ + * + * @author Vova Feldman + * @since 1.2.1.7 + * + * @link https://make.wordpress.org/plugins/2017/03/16/clarification-of-guideline-8-executable-code-and-installs/ + * + * @uses WP_Filesystem + * @uses WP_Error + * @uses WP_Upgrader + * @uses Plugin_Upgrader + * @uses Plugin_Installer_Skin + * @uses Plugin_Upgrader_Skin + * + * @param number|bool $plugin_id + * + * @return array + */ + function install_and_activate_plugin( $plugin_id = false ) { + if ( ! empty( $plugin_id ) && ! FS_Plugin::is_valid_id( $plugin_id ) ) { + // Invalid plugin ID. + return array( + 'message' => $this->_fs->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), + 'code' => 'invalid_module_id', + ); + } + + $is_addon = false; + if ( FS_Plugin::is_valid_id( $plugin_id ) && + $plugin_id != $this->_fs->get_id() + ) { + $addon = $this->_fs->get_addon( $plugin_id ); + + if ( ! is_object( $addon ) ) { + // Invalid add-on ID. + return array( + 'message' => $this->_fs->get_text_inline( 'Invalid module ID.', 'auto-install-error-invalid-id' ), + 'code' => 'invalid_module_id', + ); + } + + $slug = $addon->slug; + $title = $addon->title . ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ); + + $is_addon = true; + } else { + $slug = $this->_fs->get_slug(); + $title = $this->_fs->get_plugin_title() . + ( $this->_fs->is_addon() ? ' ' . $this->_fs->get_text_inline( 'Add-On', 'addon' ) : '' ); + } + + if ( $this->is_premium_plugin_active( $plugin_id ) ) { + // Premium version already activated. + return array( + 'message' => $is_addon ? + $this->_fs->get_text_inline( 'Premium add-on version already installed.', 'auto-install-error-premium-addon-activated' ) : + $this->_fs->get_text_inline( 'Premium version already active.', 'auto-install-error-premium-activated' ), + 'code' => 'premium_installed', + ); + } + + $latest_version = $this->get_latest_download_details( $plugin_id ); + $target_folder = "{$slug}-premium"; + + // Prep variables for Plugin_Installer_Skin class. + $extra = array(); + $extra['slug'] = $target_folder; + $source = $latest_version->url; + $api = null; + + $install_url = add_query_arg( + array( + 'action' => 'install-plugin', + 'plugin' => urlencode( $slug ), + ), + 'update.php' + ); + + if ( ! class_exists( 'Plugin_Upgrader', false ) ) { + // Include required resources for the installation. + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + } + + $skin_args = array( + 'type' => 'web', + 'title' => sprintf( $this->_fs->get_text_inline( 'Installing plugin: %s', 'installing-plugin-x' ), $title ), + 'url' => esc_url_raw( $install_url ), + 'nonce' => 'install-plugin_' . $slug, + 'plugin' => '', + 'api' => $api, + 'extra' => $extra, + ); + +// $skin = new Automatic_Upgrader_Skin( $skin_args ); +// $skin = new Plugin_Installer_Skin( $skin_args ); + $skin = new WP_Ajax_Upgrader_Skin( $skin_args ); + + // Create a new instance of Plugin_Upgrader. + $upgrader = new Plugin_Upgrader( $skin ); + + // Perform the action and install the plugin from the $source urldecode(). + add_filter( 'upgrader_source_selection', array( &$this, '_maybe_adjust_source_dir' ), 1, 3 ); + + $install_result = $upgrader->install( $source ); + + remove_filter( 'upgrader_source_selection', array( &$this, '_maybe_adjust_source_dir' ), 1 ); + + if ( is_wp_error( $install_result ) ) { + return array( + 'message' => $install_result->get_error_message(), + 'code' => $install_result->get_error_code(), + ); + } elseif ( is_wp_error( $skin->result ) ) { + return array( + 'message' => $skin->result->get_error_message(), + 'code' => $skin->result->get_error_code(), + ); + } elseif ( $skin->get_errors()->get_error_code() ) { + return array( + 'message' => $skin->get_error_messages(), + 'code' => 'unknown', + ); + } elseif ( is_null( $install_result ) ) { + global $wp_filesystem; + + $error_code = 'unable_to_connect_to_filesystem'; + $error_message = $this->_fs->get_text_inline( 'Unable to connect to the filesystem. Please confirm your credentials.' ); + + // Pass through the error from WP_Filesystem if one was raised. + if ( $wp_filesystem instanceof WP_Filesystem_Base && + is_wp_error( $wp_filesystem->errors ) && + $wp_filesystem->errors->get_error_code() + ) { + $error_message = $wp_filesystem->errors->get_error_message(); + } + + return array( + 'message' => $error_message, + 'code' => $error_code, + ); + } + + // Grab the full path to the main plugin's file. + $plugin_activate = $upgrader->plugin_info(); + + // Try to activate the plugin. + $activation_result = $this->try_activate_plugin( $plugin_activate ); + + if ( is_wp_error( $activation_result ) ) { + return array( + 'message' => $activation_result->get_error_message(), + 'code' => $activation_result->get_error_code(), + ); + } + + return $skin->get_upgrade_messages(); + } + + /** + * Tries to activate a plugin. If fails, returns the error. + * + * @author Vova Feldman + * @since 1.2.1.7 + * + * @param string $file_path Path within wp-plugins/ to main plugin file. + * This determines the styling of the output messages. + * + * @return bool|WP_Error + */ + protected function try_activate_plugin( $file_path ) { + $activate = activate_plugin( $file_path, '', $this->_fs->is_network_active() ); + + return is_wp_error( $activate ) ? + $activate : + true; + } + + /** + * Check if a premium module version is already active. + * + * @author Vova Feldman + * @since 1.2.1.7 + * + * @param number|bool $plugin_id + * + * @return bool + */ + private function is_premium_plugin_active( $plugin_id = false ) { + if ( $plugin_id != $this->_fs->get_id() ) { + return $this->_fs->is_addon_activated( $plugin_id, true ); + } + + return is_plugin_active( $this->_fs->premium_plugin_basename() ); + } + + /** + * Adjust the plugin directory name if necessary. + * Assumes plugin has a folder (not a single file plugin). + * + * The final destination directory of a plugin is based on the subdirectory name found in the + * (un)zipped source. In some cases this subdirectory name is not the same as the expected + * slug and the plugin will not be recognized as installed. This is fixed by adjusting + * the temporary unzipped source subdirectory name to the expected plugin slug. + * + * @author Vova Feldman + * @since 1.2.1.7 + * + * @param string $source Path to upgrade/zip-file-name.tmp/subdirectory/. + * @param string $remote_source Path to upgrade/zip-file-name.tmp. + * @param \WP_Upgrader $upgrader Instance of the upgrader which installs the plugin. + * + * @return string|WP_Error + */ + function _maybe_adjust_source_dir( $source, $remote_source, $upgrader ) { + if ( ! is_object( $GLOBALS['wp_filesystem'] ) ) { + return $source; + } + + // Figure out what the slug is supposed to be. + $desired_slug = $upgrader->skin->options['extra']['slug']; + + $subdir_name = untrailingslashit( str_replace( trailingslashit( $remote_source ), '', $source ) ); + + if ( ! empty( $subdir_name ) && $subdir_name !== $desired_slug ) { + $from_path = untrailingslashit( $source ); + $to_path = trailingslashit( $remote_source ) . $desired_slug; + + if ( true === $GLOBALS['wp_filesystem']->move( $from_path, $to_path ) ) { + return trailingslashit( $to_path ); + } else { + return new WP_Error( + 'rename_failed', + $this->_fs->get_text_inline( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.', 'module-package-rename-failure' ), + array( + 'found' => $subdir_name, + 'expected' => $desired_slug + ) ); + } + } + + return $source; + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-security.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-security.php index d6f59a8e2..4535aa21f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-security.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-security.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ @@ -12,6 +12,9 @@ define( 'WP_FS__SECURITY_PARAMS_PREFIX', 's_' ); + /** + * Class FS_Security + */ class FS_Security { /** * @var FS_Security @@ -24,6 +27,9 @@ */ private static $_logger; + /** + * @return \FS_Security + */ public static function instance() { if ( ! isset( self::$_instance ) ) { self::$_instance = new FS_Security(); @@ -76,4 +82,4 @@ 's_ctx_secure' => $this->get_secure_token( $entity, $timestamp, $action ), ); } - } \ No newline at end of file + } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-storage.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-storage.php new file mode 100644 index 000000000..c46a84d2b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-storage.php @@ -0,0 +1,524 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Storage + * + * A wrapper class for handling network level and single site level storage. + * + * @property bool $is_network_activation + * @property int $network_install_blog_id + * @property object $sync_cron + */ + class FS_Storage { + /** + * @var FS_Storage[] + */ + private static $_instances = array(); + /** + * @var FS_Key_Value_Storage Site level storage. + */ + private $_storage; + + /** + * @var FS_Key_Value_Storage Network level storage. + */ + private $_network_storage; + + /** + * @var string + */ + private $_module_type; + + /** + * @var string + */ + private $_module_slug; + + /** + * @var int The ID of the blog that is associated with the current site level options. + */ + private $_blog_id = 0; + + /** + * @var bool + */ + private $_is_multisite; + + /** + * @var bool + */ + private $_is_network_active = false; + + /** + * @var bool + */ + private $_is_delegated_connection = false; + + /** + * @var array { + * @key string Option name. + * @value int If 0 store on the network level. If 1, store on the network level only if module was network level activated. If 2, store on the network level only if network activated and NOT delegated the connection. + * } + */ + private static $_NETWORK_OPTIONS_MAP; + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $module_type + * @param string $slug + * + * @return FS_Storage + */ + static function instance( $module_type, $slug ) { + $key = $module_type . ':' . $slug; + + if ( ! isset( self::$_instances[ $key ] ) ) { + self::$_instances[ $key ] = new FS_Storage( $module_type, $slug ); + } + + return self::$_instances[ $key ]; + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $module_type + * @param string $slug + */ + private function __construct( $module_type, $slug ) { + $this->_module_type = $module_type; + $this->_module_slug = $slug; + $this->_is_multisite = is_multisite(); + + if ( $this->_is_multisite ) { + $this->_blog_id = get_current_blog_id(); + $this->_network_storage = FS_Key_Value_Storage::instance( $module_type . '_data', $slug, true ); + } + + $this->_storage = FS_Key_Value_Storage::instance( $module_type . '_data', $slug, $this->_blog_id ); + } + + /** + * Tells this storage wrapper class that the context plugin is network active. This flag will affect how values + * are retrieved/stored from/into the storage. + * + * @author Leo Fajardo (@leorw) + * + * @param bool $is_network_active + * @param bool $is_delegated_connection + */ + function set_network_active( $is_network_active = true, $is_delegated_connection = false ) { + $this->_is_network_active = $is_network_active; + $this->_is_delegated_connection = $is_delegated_connection; + } + + /** + * Switch the context of the site level storage manager. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + */ + function set_site_blog_context( $blog_id ) { + $this->_blog_id = $blog_id; + + $this->_storage = $this->get_site_storage( $this->_blog_id ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $key + * @param mixed $value + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). + * @param bool $flush + */ + function store( $key, $value, $network_level_or_blog_id = null, $flush = true ) { + if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) { + $this->_network_storage->store( $key, $value, $flush ); + } else { + $storage = $this->get_site_storage( $network_level_or_blog_id ); + $storage->store( $key, $value, $flush ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param bool $store + * @param string[] $exceptions Set of keys to keep and not clear. + * @param int|null|bool $network_level_or_blog_id + */ + function clear_all( $store = true, $exceptions = array(), $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite || + false === $network_level_or_blog_id || + is_null( $network_level_or_blog_id ) || + is_numeric( $network_level_or_blog_id ) + ) { + $storage = $this->get_site_storage( $network_level_or_blog_id ); + $storage->clear_all( $store, $exceptions ); + } + + if ( $this->_is_multisite && + ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) + ) { + $this->_network_storage->clear_all( $store, $exceptions ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $key + * @param bool $store + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). + */ + function remove( $key, $store = true, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) { + $this->_network_storage->remove( $key, $store ); + } else { + $storage = $this->get_site_storage( $network_level_or_blog_id ); + $storage->remove( $key, $store ); + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param string $key + * @param mixed $default + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). + * + * @return mixed + */ + function get( $key, $default = false, $network_level_or_blog_id = null ) { + if ( $this->should_use_network_storage( $key, $network_level_or_blog_id ) ) { + return $this->_network_storage->get( $key, $default ); + } else { + $storage = $this->get_site_storage( $network_level_or_blog_id ); + + return $storage->get( $key, $default ); + } + } + + /** + * Multisite activated: + * true: Save network storage. + * int: Save site specific storage. + * false|0: Save current site storage. + * null: Save network and current site storage. + * Site level activated: + * Save site storage. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param bool|int|null $network_level_or_blog_id + */ + function save( $network_level_or_blog_id = null ) { + if ( $this->_is_network_active && + ( true === $network_level_or_blog_id || is_null( $network_level_or_blog_id ) ) + ) { + $this->_network_storage->save(); + } + + if ( ! $this->_is_network_active || true !== $network_level_or_blog_id ) { + $storage = $this->get_site_storage( $network_level_or_blog_id ); + $storage->save(); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function get_module_slug() { + return $this->_module_slug; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function get_module_type() { + return $this->_module_type; + } + + /** + * Migration script to the new storage data structure that is network compatible. + * + * IMPORTANT: + * This method should be executed only after it is determined if this is a network + * level compatible product activation. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function migrate_to_network() { + if ( ! $this->_is_multisite ) { + return; + } + + $updated = false; + + if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) { + self::load_network_options_map(); + } + + foreach ( self::$_NETWORK_OPTIONS_MAP as $option => $storage_level ) { + if ( ! $this->is_multisite_option( $option ) ) { + continue; + } + + if ( isset( $this->_storage->{$option} ) && ! isset( $this->_network_storage->{$option} ) ) { + // Migrate option to the network storage. + $this->_network_storage->store( $option, $this->_storage->{$option}, false ); + + /** + * Remove the option from site level storage. + * + * IMPORTANT: + * The line below is intentionally commented since we want to preserve the option + * on the site storage level for "downgrade compatibility". Basically, if the user + * will downgrade to an older version of the plugin with the prev storage structure, + * it will continue working. + * + * @todo After a few releases we can remove this. + */ +// $this->_storage->remove($option, false); + + $updated = true; + } + } + + if ( ! $updated ) { + return; + } + + // Update network level storage. + $this->_network_storage->save(); +// $this->_storage->save(); + } + + #-------------------------------------------------------------------------------- + #region Helper Methods + #-------------------------------------------------------------------------------- + + /** + * We don't want to load the map right away since it's not even needed in a non-MS environment. + * + * Example: + * array( + * 'option1' => 0, // Means that the option should always be stored on the network level. + * 'option2' => 1, // Means that the option should be stored on the network level only when the module was network level activated. + * 'option2' => 2, // Means that the option should be stored on the network level only when the module was network level activated AND the connection was NOT delegated. + * 'option3' => 3, // Means that the option should always be stored on the site level. + * ) + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + private static function load_network_options_map() { + self::$_NETWORK_OPTIONS_MAP = array( + // Network level options. + 'affiliate_application_data' => 0, + 'connectivity_test' => 0, + 'handle_gdpr_admin_notice' => 0, + 'has_trial_plan' => 0, + 'install_sync_timestamp' => 0, + 'install_sync_cron' => 0, + 'is_anonymous_ms' => 0, + 'is_on' => 0, + 'is_plugin_new_install' => 0, + 'network_install_blog_id' => 0, + 'pending_sites_info' => 0, + 'plugin_last_version' => 0, + 'plugin_main_file' => 0, + 'plugin_version' => 0, + 'sdk_downgrade_mode' => 0, + 'sdk_last_version' => 0, + 'sdk_upgrade_mode' => 0, + 'sdk_version' => 0, + 'sticky_optin_added_ms' => 0, + 'subscriptions' => 0, + 'sync_timestamp' => 0, + 'sync_cron' => 0, + 'was_plugin_loaded' => 0, + 'network_user_id' => 0, + 'plugin_upgrade_mode' => 0, + 'plugin_downgrade_mode' => 0, + 'is_network_connected' => 0, + /** + * Special flag that is used when a super-admin upgrades to the new version of the SDK that + * supports network level integration, when the connection decision wasn't made for all of the + * sites in the network. + */ + 'is_network_activation' => 0, + + // When network activated, then network level. + 'install_timestamp' => 1, + 'prev_is_premium' => 1, + + // If not network activated OR delegated, then site level. + 'activation_timestamp' => 2, + 'prev_user_id' => 2, + 'sticky_optin_added' => 2, + 'uninstall_reason' => 2, + 'is_pending_activation' => 2, + 'pending_license_key' => 2, + + // Site level options. + 'is_anonymous' => 3, + ); + } + + /** + * This method will and should only be executed when is_multisite() is true. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $key + * + * @return bool|mixed + */ + private function is_multisite_option( $key ) { + if ( ! isset( self::$_NETWORK_OPTIONS_MAP ) ) { + self::load_network_options_map(); + } + + if ( ! isset( self::$_NETWORK_OPTIONS_MAP[ $key ] ) ) { + // Option not found -> use site level storage. + return false; + } + + if ( 0 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) { + // Option found and set to always use the network level storage on a multisite. + return true; + } + + if ( 3 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) { + // Option found and set to always use the site level storage on a multisite. + return false; + } + + if ( ! $this->_is_network_active ) { + return false; + } + + if ( 1 === self::$_NETWORK_OPTIONS_MAP[ $key ] ) { + // Network activated. + return true; + } + + if ( 2 === self::$_NETWORK_OPTIONS_MAP[ $key ] && ! $this->_is_delegated_connection ) { + // Network activated and not delegated. + return true; + } + + return false; + } + + /** + * @author Leo Fajardo + * + * @param string $key + * @param null|bool|int $network_level_or_blog_id When an integer, use the given blog storage. When `true` use the multisite storage (if there's a network). When `false`, use the current context blog storage. When `null`, the decision which storage to use (MS vs. Current S) will be handled internally and determined based on the $option (based on self::$_BINARY_MAP). + * + * @return bool + */ + private function should_use_network_storage( $key, $network_level_or_blog_id = null ) { + if ( ! $this->_is_multisite ) { + // Not a multisite environment. + return false; + } + + if ( is_numeric( $network_level_or_blog_id ) ) { + // Explicitly asked to use a specified blog storage. + return false; + } + + if ( is_bool( $network_level_or_blog_id ) ) { + // Explicitly specified whether should use the network or blog level storage. + return $network_level_or_blog_id; + } + + // Determine which storage to use based on the option. + return $this->is_multisite_option( $key ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $blog_id + * + * @return \FS_Key_Value_Storage + */ + private function get_site_storage( $blog_id = 0 ) { + if ( ! is_numeric( $blog_id ) || + $blog_id == $this->_blog_id || + 0 == $blog_id + ) { + return $this->_storage; + } + + return FS_Key_Value_Storage::instance( + $this->_module_type . '_data', + $this->_storage->get_secondary_id(), + $blog_id + ); + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Magic methods + #-------------------------------------------------------------------------------- + + function __set( $k, $v ) { + if ( $this->should_use_network_storage( $k ) ) { + $this->_network_storage->{$k} = $v; + } else { + $this->_storage->{$k} = $v; + } + } + + function __isset( $k ) { + return $this->should_use_network_storage( $k ) ? + isset( $this->_network_storage->{$k} ) : + isset( $this->_storage->{$k} ); + } + + function __unset( $k ) { + if ( $this->should_use_network_storage( $k ) ) { + unset( $this->_network_storage->{$k} ); + } else { + unset( $this->_storage->{$k} ); + } + } + + function __get( $k ) { + return $this->should_use_network_storage( $k ) ? + $this->_network_storage->{$k} : + $this->_storage->{$k}; + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-user-lock.php b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-user-lock.php new file mode 100644 index 000000000..842cbba5e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/class-fs-user-lock.php @@ -0,0 +1,126 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.1.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_User_Lock + */ + class FS_User_Lock { + /** + * @var int + */ + private $_wp_user_id; + /** + * @var int + */ + private $_thread_id; + + #-------------------------------------------------------------------------------- + #region Singleton + #-------------------------------------------------------------------------------- + + /** + * @var FS_User_Lock + */ + private static $_instance; + + /** + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return FS_User_Lock + */ + static function instance() { + if ( ! isset( self::$_instance ) ) { + self::$_instance = new self(); + } + + return self::$_instance; + } + + #endregion + + private function __construct() { + $this->_wp_user_id = Freemius::get_current_wp_user_id(); + $this->_thread_id = mt_rand( 0, 32000 ); + } + + + /** + * Try to acquire lock. If the lock is already set or is being acquired by another locker, don't do anything. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @param int $expiration + * + * @return bool TRUE if successfully acquired lock. + */ + function try_lock( $expiration = 0 ) { + if ( $this->is_locked() ) { + // Already locked. + return false; + } + + set_site_transient( "locked_{$this->_wp_user_id}", $this->_thread_id, $expiration ); + + if ( $this->has_lock() ) { + set_site_transient( "locked_{$this->_wp_user_id}", true, $expiration ); + + return true; + } + + return false; + } + + /** + * Acquire lock regardless if it's already acquired by another locker or not. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @param int $expiration + */ + function lock( $expiration = 0 ) { + set_site_transient( "locked_{$this->_wp_user_id}", true, $expiration ); + } + + /** + * Checks if lock is currently acquired. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return bool + */ + function is_locked() { + return ( false !== get_site_transient( "locked_{$this->_wp_user_id}" ) ); + } + + /** + * Unlock the lock. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + */ + function unlock() { + delete_site_transient( "locked_{$this->_wp_user_id}" ); + } + + /** + * Checks if lock is currently acquired by the current locker. + * + * @return bool + */ + private function has_lock() { + return ( $this->_thread_id == get_site_transient( "locked_{$this->_wp_user_id}" ) ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-support-section.php b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-support-section.php new file mode 100644 index 000000000..e84b5354e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-support-section.php @@ -0,0 +1,102 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class Zerif_Customizer_Theme_Info_Main + * + * @since 1.0.0 + * @access public + */ + class FS_Customizer_Support_Section extends WP_Customize_Section { + + function __construct( $manager, $id, $args = array() ) { + $manager->register_section_type( 'FS_Customizer_Support_Section' ); + + parent::__construct( $manager, $id, $args ); + } + + /** + * The type of customize section being rendered. + * + * @since 1.0.0 + * @access public + * @var string + */ + public $type = 'freemius-support-section'; + + /** + * @var Freemius + */ + public $fs = null; + + /** + * Add custom parameters to pass to the JS via JSON. + * + * @since 1.0.0 + */ + public function json() { + $json = parent::json(); + + $is_contact_visible = $this->fs->is_page_visible( 'contact' ); + $is_support_visible = $this->fs->is_page_visible( 'support' ); + + $json['theme_title'] = $this->fs->get_plugin_name(); + + if ( $is_contact_visible && $is_support_visible ) { + $json['theme_title'] .= ' ' . $this->fs->get_text_inline( 'Support', 'support' ); + } + + if ( $is_contact_visible ) { + $json['contact'] = array( + 'label' => $this->fs->get_text_inline( 'Contact Us', 'contact-us' ), + 'url' => $this->fs->contact_url(), + ); + } + + if ( $is_support_visible ) { + $json['support'] = array( + 'label' => $this->fs->get_text_inline( 'Support Forum', 'support-forum' ), + 'url' => $this->fs->get_support_forum_url() + ); + } + + return $json; + } + + /** + * Outputs the Underscore.js template. + * + * @since 1.0.0 + */ + protected function render_template() { + ?> + <li id="fs_customizer_support" + class="accordion-section control-section control-section-{{ data.type }} cannot-expand"> + <h3 class="accordion-section-title"> + <span>{{ data.theme_title }}</span> + <# if ( data.contact && data.support ) { #> + <div class="button-group"> + <# } #> + <# if ( data.contact ) { #> + <a class="button" href="{{ data.contact.url }}" target="_blank">{{ data.contact.label }} </a> + <# } #> + <# if ( data.support ) { #> + <a class="button" href="{{ data.support.url }}" target="_blank">{{ data.support.label }} </a> + <# } #> + <# if ( data.contact && data.support ) { #> + </div> + <# } #> + </h3> + </li> + <?php + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-upsell-control.php b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-upsell-control.php new file mode 100644 index 000000000..02d789599 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/class-fs-customizer-upsell-control.php @@ -0,0 +1,157 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Customizer_Upsell_Control + */ + class FS_Customizer_Upsell_Control extends WP_Customize_Control { + + /** + * Control type + * + * @var string control type + */ + public $type = 'freemius-upsell-control'; + + /** + * @var Freemius + */ + public $fs = null; + + /** + * @param WP_Customize_Manager $manager the customize manager class. + * @param string $id id. + * @param array $args customizer manager parameters. + */ + public function __construct( WP_Customize_Manager $manager, $id, array $args ) { + $manager->register_control_type( 'FS_Customizer_Upsell_Control' ); + + parent::__construct( $manager, $id, $args ); + } + + /** + * Enqueue resources for the control. + */ + public function enqueue() { + fs_enqueue_local_style( 'fs_customizer', 'customizer.css' ); + } + + /** + * Json conversion + */ + public function to_json() { + $pricing_cta = esc_html( $this->fs->get_pricing_cta_label() ) . ' ' . ( is_rtl() ? '←' : '➤' ); + + parent::to_json(); + + $this->json['button_text'] = $pricing_cta; + $this->json['button_url'] = $this->fs->is_in_trial_promotion() ? + $this->fs->get_trial_url() : + $this->fs->get_upgrade_url(); + + // Load features. + $pricing = $this->fs->get_api_plugin_scope()->get( $this->fs->add_show_pending( "pricing.json" ) ); + + if ( $this->fs->is_api_result_object( $pricing, 'plans' ) ) { + // Add support features. + if ( is_array( $pricing->plans ) && 0 < count( $pricing->plans ) ) { + $support_features = array( + 'kb' => 'Help Center', + 'forum' => 'Support Forum', + 'email' => 'Priority Email Support', + 'phone' => 'Phone Support', + 'skype' => 'Skype Support', + 'is_success_manager' => 'Personal Success Manager', + ); + + for ( $i = 0, $len = count( $pricing->plans ); $i < $len; $i ++ ) { + if ( 'free' == $pricing->plans[$i]->name ) { + continue; + } + + if ( ! isset( $pricing->plans[ $i ]->features ) || + ! is_array( $pricing->plans[ $i ]->features ) ) { + $pricing->plans[$i]->features = array(); + } + + foreach ( $support_features as $key => $label ) { + $key = ( 'is_success_manager' !== $key ) ? + "support_{$key}" : + $key; + + if ( ! empty( $pricing->plans[ $i ]->{$key} ) ) { + + $support_feature = new stdClass(); + $support_feature->title = $label; + + $pricing->plans[ $i ]->features[] = $support_feature; + } + } + } + } + } + + $this->json['plans'] = $pricing->plans; + + $this->json['strings'] = array( + 'plan' => $this->fs->get_text_x_inline( 'Plan', 'as product pricing plan', 'plan' ), + ); + } + + /** + * Control content + */ + public function content_template() { + ?> + <div id="fs_customizer_upsell"> + <# if ( data.plans ) { #> + <ul class="fs-customizer-plans"> + <# for (i in data.plans) { #> + <# if ( 'free' != data.plans[i].name && (null != data.plans[i].features && 0 < data.plans[i].features.length) ) { #> + <li class="fs-customizer-plan"> + <div class="fs-accordion-section-open"> + <h2 class="fs-accordion-section-title menu-item"> + <span>{{ data.plans[i].title }}</span> + <button type="button" class="button-link item-edit" aria-expanded="true"> + <span class="screen-reader-text">Toggle section: {{ data.plans[i].title }} {{ data.strings.plan }}</span> + <span class="toggle-indicator" aria-hidden="true"></span> + </button> + </h2> + <div class="fs-accordion-section-content"> + <# if ( data.plans[i].description ) { #> + <h3>{{ data.plans[i].description }}</h3> + <# } #> + <# if ( data.plans[i].features ) { #> + <ul> + <# for ( j in data.plans[i].features ) { #> + <li><div class="fs-feature"> + <span class="dashicons dashicons-yes"></span><span><# if ( data.plans[i].features[j].value ) { #>{{ data.plans[i].features[j].value }} <# } #>{{ data.plans[i].features[j].title }}</span> + <# if ( data.plans[i].features[j].description ) { #> + <span class="dashicons dashicons-editor-help"><span class="fs-feature-desc">{{ data.plans[i].features[j].description }}</span></span> + <# } #> + </div></li> + <# } #> + </ul> + <# } #> + <# if ( 'free' != data.plans[i].name ) { #> + <a href="{{ data.button_url }}" class="button button-primary" target="_blank">{{{ data.button_text }}}</a> + <# } #> + </div> + </div> + </li> + <# } #> + <# } #> + </ul> + <# } #> + </div> + <?php } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/customizer/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/debug/class-fs-debug-bar-panel.php b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/class-fs-debug-bar-panel.php index 1c3259bdf..0b7969d08 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/debug/class-fs-debug-bar-panel.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/class-fs-debug-bar-panel.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -24,8 +24,8 @@ } static function requests_count() { - if ( class_exists( 'Freemius_Api' ) ) { - $logger = Freemius_Api::GetLogger(); + if ( class_exists( 'Freemius_Api_WordPress' ) ) { + $logger = Freemius_Api_WordPress::GetLogger(); } else { $logger = array(); } @@ -34,8 +34,8 @@ } static function total_time() { - if ( class_exists( 'Freemius_Api' ) ) { - $logger = Freemius_Api::GetLogger(); + if ( class_exists( 'Freemius_Api_WordPress' ) ) { + $logger = Freemius_Api_WordPress::GetLogger(); } else { $logger = array(); } @@ -45,7 +45,7 @@ $total_time += $l['total']; } - return number_format( 100 * $total_time, 2 ) . ' ' . __fs( 'ms' ); + return number_format( 100 * $total_time, 2 ) . ' ' . fs_text_x_inline( 'ms', 'milliseconds' ); } function render() { diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/debug/debug-bar-start.php b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/debug-bar-start.php index 852dfd7ce..e783fd690 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/debug/debug-bar-start.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/debug-bar-start.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -38,8 +38,8 @@ require_once dirname( __FILE__ ) . '/class-fs-debug-bar-panel.php'; $statuses[] = array( 'fs_api_requests', - __fs( 'Freemius API' ), - Freemius_Debug_Bar_Panel::requests_count() . ' ' . __fs( 'Requests' ) . + fs_text_inline( 'Freemius API' ), + Freemius_Debug_Bar_Panel::requests_count() . ' ' . fs_text_inline( 'Requests' ) . ' (' . Freemius_Debug_Bar_Panel::total_time() . ')' ); } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/debug/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/debug/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate-terms.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate-terms.php new file mode 100644 index 000000000..6dab87f41 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate-terms.php @@ -0,0 +1,128 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_AffiliateTerms extends FS_Scope_Entity { + + #region Properties + + /** + * @var bool + */ + public $is_active; + /** + * @var string Enum: `affiliation` or `rewards`. Defaults to `affiliation`. + */ + public $type; + /** + * @var string Enum: `payout` or `credit`. Defaults to `payout`. + */ + public $reward_type; + /** + * If `first`, the referral will be attributed to the first visited source containing the affiliation link that + * was clicked. + * + * @var string Enum: `first` or `last`. Defaults to `first`. + */ + public $referral_attribution; + /** + * @var int Defaults to `30`, `0` for session cookie, and `null` for endless cookie (until cookies are cleaned). + */ + public $cookie_days; + /** + * @var int + */ + public $commission; + /** + * @var string Enum: `percentage` or `dollar`. Defaults to `percentage`. + */ + public $commission_type; + /** + * @var null|int Defaults to `0` (affiliate only on first payment). `null` for commission for all renewals. If + * greater than `0`, affiliate will get paid for all renewals for `commission_renewals_days` days after + * the initial upgrade/purchase. + */ + public $commission_renewals_days; + /** + * @var int Only cents and no percentage. In US cents, e.g.: 100 = $1.00. Defaults to `null`. + */ + public $install_commission; + /** + * @var string Required default target link, e.g.: pricing page. + */ + public $default_url; + /** + * @var string One of the following: 'all', 'new_customer', 'new_user'. + * If 'all' - reward for any user type. + * If 'new_customer' - reward only for new customers. + * If 'new_user' - reward only for new users. + */ + public $reward_customer_type; + /** + * @var int Defaults to `0` (affiliate only on directly affiliated links). `null` if an affiliate will get + * paid for all customers' lifetime payments. If greater than `0`, an affiliate will get paid for all + * customer payments for `future_payments_days` days after the initial payment. + */ + public $future_payments_days; + /** + * @var bool If `true`, allow referrals from social sites. + */ + public $is_social_allowed; + /** + * @var bool If `true`, allow conversions without HTTP referrer header at all. + */ + public $is_app_allowed; + /** + * @var bool If `true`, allow referrals from any site. + */ + public $is_any_site_allowed; + + #endregion Properties + + /** + * @author Leo Fajardo (@leorw) + * + * @return string + */ + function get_formatted_commission() + { + return ( 'dollar' === $this->commission_type ) ? + ( '$' . $this->commission ) : + ( $this->commission . '%' ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @return bool + */ + function has_lifetime_commission() { + return ( 0 !== $this->future_payments_days ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @return bool + */ + function is_session_cookie() { + return ( 0 == $this->cookie_days ); + } + + /** + * @author Leo Fajardo (@leorw) + * + * @return bool + */ + function has_renewals_commission() { + return ( is_null( $this->commission_renewals_days ) || $this->commission_renewals_days > 0 ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate.php new file mode 100644 index 000000000..cdae3661d --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-affiliate.php @@ -0,0 +1,84 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Affiliate extends FS_Scope_Entity { + + #region Properties + + /** + * @var string + */ + public $paypal_email; + /** + * @var number + */ + public $custom_affiliate_terms_id; + /** + * @var boolean + */ + public $is_using_custom_terms; + /** + * @var string status Enum: `pending`, `rejected`, `suspended`, or `active`. Defaults to `pending`. + */ + public $status; + /** + * @var string + */ + public $domain; + + #endregion Properties + + /** + * @author Leo Fajardo + * + * @return bool + */ + function is_active() { + return ( 'active' === $this->status ); + } + + /** + * @author Leo Fajardo + * + * @return bool + */ + function is_pending() { + return ( 'pending' === $this->status ); + } + + /** + * @author Leo Fajardo + * + * @return bool + */ + function is_suspended() { + return ( 'suspended' === $this->status ); + } + + /** + * @author Leo Fajardo + * + * @return bool + */ + function is_rejected() { + return ( 'rejected' === $this->status ); + } + + /** + * @author Leo Fajardo + * + * @return bool + */ + function is_blocked() { + return ( 'blocked' === $this->status ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-billing.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-billing.php index 2cef5369d..bf6840179 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-billing.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-billing.php @@ -2,7 +2,7 @@ /** * @package Freemius for EDD Add-On * @copyright Copyright (c) 2016, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.0 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-entity.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-entity.php index 4d45e9a87..5d60773fa 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-entity.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-entity.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ @@ -42,9 +42,9 @@ * @param bool|object $entity */ function __construct( $entity = false ) { - if ( ! ( $entity instanceof stdClass ) ) { - return; - } + if ( ! ( $entity instanceof stdClass ) && ! ( $entity instanceof FS_Entity ) ) { + return; + } $props = fs_get_object_public_vars( $this ); diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-payment.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-payment.php index e3d61868d..dd05c2f5b 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-payment.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-payment.php @@ -1,94 +1,110 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2016, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.0 - */ + /** + * @package Freemius + * @copyright Copyright (c) 2016, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.0 + */ - if ( ! defined( 'ABSPATH' ) ) { - exit; - } + if ( ! defined( 'ABSPATH' ) ) { + exit; + } - class FS_Payment extends FS_Entity { + class FS_Payment extends FS_Entity { - #region Properties + #region Properties - /** - * @var number - */ - public $plugin_id; - /** - * @var number - */ - public $user_id; - /** - * @var number - */ - public $install_id; - /** - * @var number - */ - public $subscription_id; - /** - * @var number - */ - public $plan_id; - /** - * @var number - */ - public $license_id; - /** - * @var float - */ - public $gross; - /** - * @var number - */ - public $bound_payment_id; - /** - * @var string - */ - public $external_id; - /** - * @var string - */ - public $gateway; - /** - * @var string ISO 3166-1 alpha-2 - two-letter country code. - * - * @link http://www.wikiwand.com/en/ISO_3166-1_alpha-2 - */ - public $country_code; - /** - * @var string - */ - public $vat_id; - /** - * @var float Actual Tax / VAT in $$$ - */ - public $vat; + /** + * @var number + */ + public $plugin_id; + /** + * @var number + */ + public $user_id; + /** + * @var number + */ + public $install_id; + /** + * @var number + */ + public $subscription_id; + /** + * @var number + */ + public $plan_id; + /** + * @var number + */ + public $license_id; + /** + * @var float + */ + public $gross; + /** + * @var number + */ + public $bound_payment_id; + /** + * @var string + */ + public $external_id; + /** + * @var string + */ + public $gateway; + /** + * @var string ISO 3166-1 alpha-2 - two-letter country code. + * + * @link http://www.wikiwand.com/en/ISO_3166-1_alpha-2 + */ + public $country_code; + /** + * @var string + */ + public $vat_id; + /** + * @var float Actual Tax / VAT in $$$ + */ + public $vat; + /** + * @var int Payment source. + */ + public $source = 0; - #endregion Properties + #endregion Properties - /** - * @param object|bool $payment - */ - function __construct( $payment = false ) { - parent::__construct( $payment ); - } + /** + * @param object|bool $payment + */ + function __construct( $payment = false ) { + parent::__construct( $payment ); + } - static function get_type() { - return 'payment'; - } + static function get_type() { + return 'payment'; + } - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @return bool - */ - function is_refund() { - return ( parent::is_valid_id( $this->bound_payment_id ) && 0 > $this->gross ); - } - } \ No newline at end of file + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @return bool + */ + function is_refund() { + return ( parent::is_valid_id( $this->bound_payment_id ) && 0 > $this->gross ); + } + + /** + * Checks if the payment was migrated from another platform. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.2 + * + * @return bool + */ + function is_migrated() { + return ( 0 != $this->source ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-info.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-info.php index 33d2d2bb2..f5465349d 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-info.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-info.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-license.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-license.php index dd39b907f..9f2ffcd59 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-license.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-license.php @@ -1,216 +1,269 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.5 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - class FS_Plugin_License extends FS_Entity { - - #region Properties - - /** - * @var number - */ - public $plugin_id; - /** - * @var number - */ - public $user_id; - /** - * @var number - */ - public $plan_id; - /** - * @var number - */ - public $pricing_id; - /** - * @var int|null - */ - public $quota; - /** - * @var int - */ - public $activated; - /** - * @var int - */ - public $activated_local; - /** - * @var string - */ - public $expiration; - /** - * @var string - */ - public $secret_key; - /** - * @var bool $is_free_localhost Defaults to true. If true, allow unlimited localhost installs with the same - * license. - */ - public $is_free_localhost; - /** - * @var bool $is_block_features Defaults to true. If false, don't block features after license expiry - only - * block updates and support. - */ - public $is_block_features; - /** - * @var bool - */ - public $is_cancelled; - - #endregion Properties - - /** - * @param stdClass|bool $license - */ - function __construct( $license = false ) { - parent::__construct( $license ); - } - - static function get_type() { - return 'license'; - } - - /** - * Check how many site activations left. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return int - */ - function left() { - if ( ! $this->is_active() || $this->is_expired() ) { - return 0; - } - - if ( $this->is_unlimited() ) { - return 999; - } - - return ( $this->quota - $this->activated - ( $this->is_free_localhost ? 0 : $this->activated_local ) ); - } - - /** - * Check if single site license. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.8.1 - * - * @return bool - */ - function is_single_site() { - return ( is_numeric( $this->quota ) && 1 == $this->quota ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.5 - * - * @return bool - */ - function is_expired() { - return ! $this->is_lifetime() && ( strtotime( $this->expiration ) < WP_FS__SCRIPT_START_TIME ); - } - - /** - * Check if license is not expired. - * - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @return bool - */ - function is_valid() { - return ! $this->is_expired(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function is_lifetime() { - return is_null( $this->expiration ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.0 - * - * @return bool - */ - function is_unlimited() { - return is_null( $this->quota ); - } - - /** - * Check if license is fully utilized. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool $is_localhost - * - * @return bool - */ - function is_utilized( $is_localhost = null ) { - if ( is_null( $is_localhost ) ) { - $is_localhost = WP_FS__IS_LOCALHOST_FOR_SERVER; - } - - if ( $this->is_unlimited() ) { - return false; - } - - return ! ( $this->is_free_localhost && $is_localhost ) && - ( $this->quota <= $this->activated + ( $this->is_free_localhost ? 0 : $this->activated_local ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.2.1 - * - * @return bool - */ - function is_active() { - return ( ! $this->is_cancelled ); - } - - /** - * Check if license's plan features are enabled. - * - * - Either if plan not expired - * - If expired, based on the configuration to block features or not. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function is_features_enabled() { - return $this->is_active() && ( ! $this->is_block_features || ! $this->is_expired() ); - } - - /** - * Subscription considered to be new without any payments - * if the license expires in less than 24 hours - * from the license creation. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_first_payment_pending() { - return ( WP_FS__TIME_24_HOURS_IN_SEC >= strtotime( $this->expiration ) - strtotime( $this->created ) ); - } - } \ No newline at end of file + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.5 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Plugin_License + */ + class FS_Plugin_License extends FS_Entity { + + #region Properties + + /** + * @var number + */ + public $plugin_id; + /** + * @var number + */ + public $user_id; + /** + * @var number + */ + public $plan_id; + /** + * @var number + */ + public $pricing_id; + /** + * @var int|null + */ + public $quota; + /** + * @var int + */ + public $activated; + /** + * @var int + */ + public $activated_local; + /** + * @var string + */ + public $expiration; + /** + * @var string + */ + public $secret_key; + /** + * @var bool $is_free_localhost Defaults to true. If true, allow unlimited localhost installs with the same + * license. + */ + public $is_free_localhost; + /** + * @var bool $is_block_features Defaults to true. If false, don't block features after license expiry - only + * block updates and support. + */ + public $is_block_features; + /** + * @var bool + */ + public $is_cancelled; + + #endregion Properties + + /** + * @param stdClass|bool $license + */ + function __construct( $license = false ) { + parent::__construct( $license ); + } + + /** + * Get entity type. + * + * @return string + */ + static function get_type() { + return 'license'; + } + + /** + * Check how many site activations left. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return int + */ + function left() { + if ( ! $this->is_active() || $this->is_expired() ) { + return 0; + } + + if ( $this->is_unlimited() ) { + return 999; + } + + return ( $this->quota - $this->activated - ( $this->is_free_localhost ? 0 : $this->activated_local ) ); + } + + /** + * Check if single site license. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.8.1 + * + * @return bool + */ + function is_single_site() { + return ( is_numeric( $this->quota ) && 1 == $this->quota ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.5 + * + * @return bool + */ + function is_expired() { + return ! $this->is_lifetime() && ( strtotime( $this->expiration ) < WP_FS__SCRIPT_START_TIME ); + } + + /** + * Check if license is not expired. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @return bool + */ + function is_valid() { + return ! $this->is_expired(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function is_lifetime() { + return is_null( $this->expiration ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.0 + * + * @return bool + */ + function is_unlimited() { + return is_null( $this->quota ); + } + + /** + * Check if license is fully utilized. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool|null $is_localhost + * + * @return bool + */ + function is_utilized( $is_localhost = null ) { + if ( is_null( $is_localhost ) ) { + $is_localhost = WP_FS__IS_LOCALHOST_FOR_SERVER; + } + + if ( $this->is_unlimited() ) { + return false; + } + + return ! ( $this->is_free_localhost && $is_localhost ) && + ( $this->quota <= $this->activated + ( $this->is_free_localhost ? 0 : $this->activated_local ) ); + } + + /** + * Check if license can be activated. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param bool|null $is_localhost + * + * @return bool + */ + function can_activate( $is_localhost = null ) { + return ! $this->is_utilized( $is_localhost ) && $this->is_features_enabled(); + } + + /** + * Check if license can be activated on a given number of production and localhost sites. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param int $production_count + * @param int $localhost_count + * + * @return bool + */ + function can_activate_bulk( $production_count, $localhost_count ) { + if ( $this->is_unlimited() ) { + return true; + } + + /** + * For simplicity, the logic will work as following: when given X sites to activate the license on, if it's + * possible to activate on ALL of them, do the activation. If it's not possible to activate on ALL of them, + * do NOT activate on any of them. + */ + return ( $this->quota >= $this->activated + $production_count + ( $this->is_free_localhost ? 0 : $this->activated_local + $localhost_count ) ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.1 + * + * @return bool + */ + function is_active() { + return ( ! $this->is_cancelled ); + } + + /** + * Check if license's plan features are enabled. + * + * - Either if plan not expired + * - If expired, based on the configuration to block features or not. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function is_features_enabled() { + return $this->is_active() && ( ! $this->is_block_features || ! $this->is_expired() ); + } + + /** + * Subscription considered to be new without any payments + * if the license expires in less than 24 hours + * from the license creation. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_first_payment_pending() { + return ( WP_FS__TIME_24_HOURS_IN_SEC >= strtotime( $this->expiration ) - strtotime( $this->created ) ); + } + + /** + * @return int + */ + function total_activations() { + return ( $this->activated + $this->activated_local ); + } + } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-plan.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-plan.php index 9e564de44..00a0d747b 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-plan.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-plan.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.5 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-tag.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-tag.php index 5b859fc30..172da23f5 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-tag.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin-tag.php @@ -1,9 +1,9 @@ <?php /** * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.4 + * @copyright Copyright (c) 2018, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 */ if ( ! defined( 'ABSPATH' ) ) { @@ -11,8 +11,34 @@ } class FS_Plugin_Tag extends FS_Entity { + /** + * @var string + */ public $version; + /** + * @var string + */ public $url; + /** + * @var string + */ + public $requires_platform_version; + /** + * @var string + */ + public $tested_up_to_version; + /** + * @var bool + */ + public $has_free; + /** + * @var bool + */ + public $has_premium; + /** + * @var bool + */ + public $is_released; function __construct( $tag = false ) { parent::__construct( $tag ); diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin.php index 0f60b2d7e..cc45e6973 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-plugin.php @@ -1,94 +1,120 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ - if ( ! defined( 'ABSPATH' ) ) { - exit; - } + if ( ! defined( 'ABSPATH' ) ) { + exit; + } - class FS_Plugin extends FS_Scope_Entity { - /** - * @since 1.0.6 - * @var null|number - */ - public $parent_plugin_id; - /** - * @var string - */ - public $title; - /** - * @var string - */ - public $slug; - /** - * @var string 'plugin' or 'theme' - */ - public $type; + class FS_Plugin extends FS_Scope_Entity { + /** + * @since 1.0.6 + * @var null|number + */ + public $parent_plugin_id; + /** + * @var string + */ + public $title; + /** + * @var string + */ + public $slug; + /** + * @since 1.2.2 + * + * @var string 'plugin' or 'theme' + */ + public $type; + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.2.3 + * + * @var string|false false if the module doesn't have an affiliate program or one of the following: 'selected', 'customers', or 'all'. + */ + public $affiliate_moderation; + /** + * @var bool Set to true if the free version of the module is hosted on WordPress.org. Defaults to true. + */ + public $is_wp_org_compliant = true; - #region Install Specific Properties + #region Install Specific Properties - /** - * @var string - */ - public $file; - /** - * @var string - */ - public $version; - /** - * @var bool - */ - public $auto_update; - /** - * @var FS_Plugin_Info - */ - public $info; - /** - * @since 1.0.9 - * - * @var bool - */ - public $is_premium; - /** - * @since 1.0.9 - * - * @var bool - */ - public $is_live; + /** + * @var string + */ + public $file; + /** + * @var string + */ + public $version; + /** + * @var bool + */ + public $auto_update; + /** + * @var FS_Plugin_Info + */ + public $info; + /** + * @since 1.0.9 + * + * @var bool + */ + public $is_premium; + /** + * @since 1.0.9 + * + * @var bool + */ + public $is_live; - #endregion Install Specific Properties + const AFFILIATE_MODERATION_CUSTOMERS = 'customers'; - /** - * @param stdClass|bool $plugin - */ - function __construct( $plugin = false ) { - parent::__construct( $plugin ); + #endregion Install Specific Properties - $this->is_premium = false; - $this->is_live = true; + /** + * @param stdClass|bool $plugin + */ + function __construct( $plugin = false ) { + parent::__construct( $plugin ); - if ( isset( $plugin->info ) && is_object( $plugin->info ) ) { - $this->info = new FS_Plugin_Info( $plugin->info ); - } - } + $this->is_premium = false; + $this->is_live = true; - /** - * Check if plugin is an add-on (has parent). - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool - */ - function is_addon() { - return isset( $this->parent_plugin_id ) && is_numeric( $this->parent_plugin_id ); - } + if ( isset( $plugin->info ) && is_object( $plugin->info ) ) { + $this->info = new FS_Plugin_Info( $plugin->info ); + } + } - static function get_type() { - return 'plugin'; - } - } \ No newline at end of file + /** + * Check if plugin is an add-on (has parent). + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool + */ + function is_addon() { + return isset( $this->parent_plugin_id ) && is_numeric( $this->parent_plugin_id ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.3 + * + * @return bool + */ + function has_affiliate_program() { + return ( ! empty( $this->affiliate_moderation ) ); + } + + static function get_type() { + return 'plugin'; + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-pricing.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-pricing.php index fb70b5aef..f08b85d5f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-pricing.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-pricing.php @@ -2,7 +2,7 @@ /** * @package Freemius for EDD Add-On * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.0 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-scope-entity.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-scope-entity.php index c9108d647..6b831074e 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-scope-entity.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-scope-entity.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.4 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-site.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-site.php index ff35b0b99..c74bb55ba 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-site.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-site.php @@ -1,148 +1,228 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - class FS_Site extends FS_Scope_Entity { - /** - * @var string - */ - public $slug; - /** - * @var number - */ - public $site_id; - /** - * @var number - */ - public $plugin_id; - /** - * @var number - */ - public $user_id; - /** - * @var string - */ - public $title; - /** - * @var string - */ - public $url; - /** - * @var string - */ - public $version; - /** - * @var string E.g. en-GB - */ - public $language; - /** - * @var string E.g. UTF-8 - */ - public $charset; - /** - * @var string Platform version (e.g WordPress version). - */ - public $platform_version; - /** - * Freemius SDK version - * - * @author Leo Fajardo (@leorw) - * @since 1.2.2 - * - * @var string SDK version (e.g.: 1.2.2) - */ - public $sdk_version; - /** - * @var string Programming language version (e.g PHP version). - */ - public $programming_language_version; - /** - * @var FS_Plugin_Plan $plan - */ - public $plan; - /** - * @var number|null - */ - public $license_id; - /** - * @var number|null - */ - public $trial_plan_id; - /** - * @var string|null - */ - public $trial_ends; - /** - * @since 1.0.9 - * - * @var bool - */ - public $is_premium = false; - /** - * @author Leo Fajardo (@leorw) - * - * @since 1.2.1.5 - * - * @var bool - */ - public $is_disconnected = false; - - /** - * @param stdClass|bool $site - */ - function __construct( $site = false ) { - $this->plan = new FS_Plugin_Plan(); - - parent::__construct( $site ); - - if ( is_object( $site ) ) { - $this->plan->id = $site->plan_id; - } - - if ( ! is_bool( $this->is_disconnected ) ) { - $this->is_disconnected = false; - } - } - - static function get_type() { - return 'install'; - } - - function is_localhost() { - // The server has no way to verify if localhost unless localhost appears in domain. - return WP_FS__IS_LOCALHOST_FOR_SERVER; -// return (substr($_SERVER['REMOTE_ADDR'], 0, 4) == '127.' || $_SERVER['REMOTE_ADDR'] == '::1'); - } - - /** - * Check if site in trial. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_trial() { - return is_numeric( $this->trial_plan_id ) && ( strtotime( $this->trial_ends ) > WP_FS__SCRIPT_START_TIME ); - } - - /** - * Check if user already utilized the trial with the current install. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @return bool - */ - function is_trial_utilized() { - return is_numeric( $this->trial_plan_id ); - } - } \ No newline at end of file + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Site extends FS_Scope_Entity { + /** + * @var number + */ + public $site_id; + /** + * @var number + */ + public $plugin_id; + /** + * @var number + */ + public $user_id; + /** + * @var string + */ + public $title; + /** + * @var string + */ + public $url; + /** + * @var string + */ + public $version; + /** + * @var string E.g. en-GB + */ + public $language; + /** + * @var string E.g. UTF-8 + */ + public $charset; + /** + * @var string Platform version (e.g WordPress version). + */ + public $platform_version; + /** + * Freemius SDK version + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @var string SDK version (e.g.: 1.2.2) + */ + public $sdk_version; + /** + * @var string Programming language version (e.g PHP version). + */ + public $programming_language_version; + /** + * @var number|null + */ + public $plan_id; + /** + * @var number|null + */ + public $license_id; + /** + * @var number|null + */ + public $trial_plan_id; + /** + * @var string|null + */ + public $trial_ends; + /** + * @since 1.0.9 + * + * @var bool + */ + public $is_premium = false; + /** + * @author Leo Fajardo (@leorw) + * + * @since 1.2.1.5 + * + * @var bool + */ + public $is_disconnected = false; + /** + * @since 2.0.0 + * + * @var bool + */ + public $is_active = true; + /** + * @since 2.0.0 + * + * @var bool + */ + public $is_uninstalled = false; + + /** + * @param stdClass|bool $site + */ + function __construct( $site = false ) { + parent::__construct( $site ); + + if ( is_object( $site ) ) { + $this->plan_id = $site->plan_id; + } + + if ( ! is_bool( $this->is_disconnected ) ) { + $this->is_disconnected = false; + } + } + + static function get_type() { + return 'install'; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $url + * + * @return bool + */ + static function is_localhost_by_address( $url ) { + if ( false !== strpos( $url, '127.0.0.1' ) || + false !== strpos( $url, 'localhost' ) + ) { + return true; + } + + if ( ! fs_starts_with( $url, 'http' ) ) { + $url = 'http://' . $url; + } + + $url_parts = parse_url( $url ); + + $subdomain = $url_parts['host']; + + return ( + // Starts with. + fs_starts_with( $subdomain, 'local.' ) || + fs_starts_with( $subdomain, 'dev.' ) || + fs_starts_with( $subdomain, 'test.' ) || + fs_starts_with( $subdomain, 'stage.' ) || + fs_starts_with( $subdomain, 'staging.' ) || + + // Ends with. + fs_ends_with( $subdomain, '.dev' ) || + fs_ends_with( $subdomain, '.test' ) || + fs_ends_with( $subdomain, '.staging' ) || + fs_ends_with( $subdomain, '.local' ) || + fs_ends_with( $subdomain, '.example' ) || + fs_ends_with( $subdomain, '.invalid' ) || + // GoDaddy test/dev. + fs_ends_with( $subdomain, '.myftpupload.com' ) || + // ngrok tunneling. + fs_ends_with( $subdomain, '.ngrok.io' ) || + // SiteGround staging. + fs_starts_with( $subdomain, 'staging' ) || + // WPEngine staging. + fs_ends_with( $subdomain, '.staging.wpengine.com' ) || + // Pantheon + ( fs_ends_with($subdomain, 'pantheonsite.io') && + (fs_starts_with($subdomain, 'test-') || fs_starts_with($subdomain, 'dev-'))) || + // Cloudways + fs_ends_with( $subdomain, '.cloudwaysapps.com' ) || + // Kinsta + (fs_ends_with($subdomain, '.kinsta.com') && fs_starts_with($subdomain, 'staging-')) + ); + } + + function is_localhost() { + return ( WP_FS__IS_LOCALHOST_FOR_SERVER || self::is_localhost_by_address( $this->url ) ); + } + + /** + * Check if site in trial. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_trial() { + return is_numeric( $this->trial_plan_id ) && ( strtotime( $this->trial_ends ) > WP_FS__SCRIPT_START_TIME ); + } + + /** + * Check if user already utilized the trial with the current install. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @return bool + */ + function is_trial_utilized() { + return is_numeric( $this->trial_plan_id ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function is_tracking_allowed() { + return ( true !== $this->is_disconnected ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function is_tracking_prohibited() { + return ! $this->is_tracking_allowed(); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-subscription.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-subscription.php index 0041df0e9..8a01402b9 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-subscription.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-subscription.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.9 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-user.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-user.php index d80f7b447..a329e8794 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-user.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/class-fs-user.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/entities/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/entities/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-core-functions.php b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-core-functions.php index 0ec5db195..c419a6ed5 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-core-functions.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-core-functions.php @@ -1,505 +1,1298 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - global $fs_core_logger; - - $fs_core_logger = FS_Logger::get_logger( WP_FS__SLUG . '_core', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - if ( ! function_exists( 'fs_dummy' ) ) { - function fs_dummy() { - } - } - - /* Url. - --------------------------------------------------------------------------------------------*/ - function fs_get_url_daily_cache_killer() { - return date( '\YY\Mm\Dd' ); - } - - /* Templates / Views. - --------------------------------------------------------------------------------------------*/ - if ( ! function_exists( 'fs_get_template_path' ) ) { - function fs_get_template_path( $path ) { - return WP_FS__DIR_TEMPLATES . '/' . trim( $path, '/' ); - } - - function fs_include_template( $path, &$params = null ) { - $VARS = &$params; - include( fs_get_template_path( $path ) ); - } - - function fs_include_once_template( $path, &$params = null ) { - $VARS = &$params; - include_once( fs_get_template_path( $path ) ); - } - - function fs_require_template( $path, &$params = null ) { - $VARS = &$params; - require( fs_get_template_path( $path ) ); - } - - function fs_require_once_template( $path, &$params = null ) { - $VARS = &$params; - require_once( fs_get_template_path( $path ) ); - } - - function fs_get_template( $path, &$params = null ) { - ob_start(); - - $VARS = &$params; - require( fs_get_template_path( $path ) ); - - return ob_get_clean(); - } - } - - /* Scripts and styles including. - --------------------------------------------------------------------------------------------*/ - function fs_enqueue_local_style( $handle, $path, $deps = array(), $ver = false, $media = 'all' ) { - global $fs_core_logger; - if ( $fs_core_logger->is_on() ) { - $fs_core_logger->info( 'handle = ' . $handle . '; path = ' . $path . ';' ); - $fs_core_logger->info( 'plugin_basename = ' . plugins_url( WP_FS__DIR_CSS . trim( $path, '/' ) ) ); - $fs_core_logger->info( 'plugins_url = ' . plugins_url( plugin_basename( WP_FS__DIR_CSS . '/' . trim( $path, '/' ) ) ) ); - } - - wp_enqueue_style( $handle, plugins_url( plugin_basename( WP_FS__DIR_CSS . '/' . trim( $path, '/' ) ) ), $deps, $ver, $media ); - } - - function fs_enqueue_local_script( $handle, $path, $deps = array(), $ver = false, $in_footer = 'all' ) { - global $fs_core_logger; - if ( $fs_core_logger->is_on() ) { - $fs_core_logger->info( 'handle = ' . $handle . '; path = ' . $path . ';' ); - $fs_core_logger->info( 'plugin_basename = ' . plugins_url( WP_FS__DIR_JS . trim( $path, '/' ) ) ); - $fs_core_logger->info( 'plugins_url = ' . plugins_url( plugin_basename( WP_FS__DIR_JS . '/' . trim( $path, '/' ) ) ) ); - } - - wp_enqueue_script( $handle, plugins_url( plugin_basename( WP_FS__DIR_JS . '/' . trim( $path, '/' ) ) ), $deps, $ver, $in_footer ); - } - - function fs_img_url( $path, $img_dir = WP_FS__DIR_IMG ) { - return plugins_url( plugin_basename( $img_dir . '/' . trim( $path, '/' ) ) ); - } - - /* Request handlers. - --------------------------------------------------------------------------------------------*/ - /** - * @param string $key - * @param mixed $def - * - * @return mixed - */ - function fs_request_get( $key, $def = false ) { - return isset( $_REQUEST[ $key ] ) ? $_REQUEST[ $key ] : $def; - } - - function fs_request_has( $key ) { - return isset( $_REQUEST[ $key ] ); - } - - function fs_request_get_bool( $key, $def = false ) { - if ( ! isset( $_REQUEST[ $key ] ) ) { - return $def; - } - - if ( 1 == $_REQUEST[ $key ] || 'true' === strtolower( $_REQUEST[ $key ] ) ) { - return true; - } - - if ( 0 == $_REQUEST[ $key ] || 'false' === strtolower( $_REQUEST[ $key ] ) ) { - return false; - } - - return $def; - } - - function fs_request_is_post() { - return ( 'post' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); - } - - function fs_request_is_get() { - return ( 'get' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); - } - - function fs_get_action( $action_key = 'action' ) { - if ( ! empty( $_REQUEST[ $action_key ] ) ) { - return strtolower( $_REQUEST[ $action_key ] ); - } - - if ( 'action' == $action_key ) { - $action_key = 'fs_action'; - - if ( ! empty( $_REQUEST[ $action_key ] ) ) { - return strtolower( $_REQUEST[ $action_key ] ); - } - } - - return false; - } - - function fs_request_is_action( $action, $action_key = 'action' ) { - return ( strtolower( $action ) === fs_get_action( $action_key ) ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.0 - * - * @since 1.2.1.5 Allow nonce verification. - * - * @param string $action - * @param string $action_key - * @param string $nonce_key - * - * @return bool - */ - function fs_request_is_action_secure( - $action, - $action_key = 'action', - $nonce_key = 'nonce' - ) { - if ( strtolower( $action ) !== fs_get_action( $action_key ) ) { - return false; - } - - $nonce = ! empty( $_REQUEST[ $nonce_key ] ) ? - $_REQUEST[ $nonce_key ] : - ''; - - if ( empty( $nonce ) || - ( false === wp_verify_nonce( $nonce, $action ) ) - ) { - return false; - } - - return true; - } - - function fs_is_plugin_page( $menu_slug ) { - return ( is_admin() && $_REQUEST['page'] === $menu_slug ); - } - - /* Core UI. - --------------------------------------------------------------------------------------------*/ - /** - * @param string $slug - * @param string $page - * @param string $action - * @param string $title - * @param array $params - * @param bool $is_primary - * @param string|bool $icon_class Optional class for an icon (since 1.1.7). - * @param string|bool $confirmation Optional confirmation message before submit (since 1.1.7). - * @param string $method Since 1.1.7 - * - * @uses fs_ui_get_action_button() - */ - function fs_ui_action_button( - $slug, - $page, - $action, - $title, - $params = array(), - $is_primary = true, - $icon_class = false, - $confirmation = false, - $method = 'GET' - ) { - echo fs_ui_get_action_button( - $slug, - $page, - $action, - $title, - $params, - $is_primary, - $icon_class, - $confirmation, - $method - ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param string $slug - * @param string $page - * @param string $action - * @param string $title - * @param array $params - * @param bool $is_primary - * @param string|bool $icon_class Optional class for an icon. - * @param string|bool $confirmation Optional confirmation message before submit. - * @param string $method - * - * @return string - */ - function fs_ui_get_action_button( - $slug, - $page, - $action, - $title, - $params = array(), - $is_primary = true, - $icon_class = false, - $confirmation = false, - $method = 'GET' - ) { - // Prepend icon (if set). - $title = ( is_string( $icon_class ) ? '<i class="' . $icon_class . '"></i> ' : '' ) . $title; - - if ( is_string( $confirmation ) ) { - return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="if (confirm(\'%s\')) this.parentNode.submit(); return false;">%s</a></form>', - freemius( $slug )->_get_admin_page_url( $page, $params ), - $method, - $action, - wp_nonce_field( $action, '_wpnonce', true, false ), - 'button' . ( $is_primary ? ' button-primary' : '' ), - $confirmation, - $title - ); - } else if ( 'GET' !== strtoupper( $method ) ) { - return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="this.parentNode.submit(); return false;">%s</a></form>', - freemius( $slug )->_get_admin_page_url( $page, $params ), - $method, - $action, - wp_nonce_field( $action, '_wpnonce', true, false ), - 'button' . ( $is_primary ? ' button-primary' : '' ), - $title - ); - } else { - return sprintf( '<a href="%s" class="%s">%s</a></form>', - wp_nonce_url( freemius( $slug )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ), - 'button' . ( $is_primary ? ' button-primary' : '' ), - $title - ); - } - } - - function fs_ui_action_link( $slug, $page, $action, $title, $params = array() ) { - ?><a class="" - href="<?php echo wp_nonce_url( freemius( $slug )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ) ?>"><?php echo $title ?></a><?php - } - - /*function fs_error_handler($errno, $errstr, $errfile, $errline) - { - if (false === strpos($errfile, 'freemius/')) - { - // @todo Dump Freemius errors to local log. - } - -// switch ($errno) { -// case E_USER_ERROR: -// break; -// case E_WARNING: -// case E_USER_WARNING: -// break; -// case E_NOTICE: -// case E_USER_NOTICE: -// break; -// default: -// break; -// } - } - - set_error_handler('fs_error_handler');*/ - - if ( ! function_exists( 'fs_nonce_url' ) ) { - /** - * Retrieve URL with nonce added to URL query. - * - * Originally was using `wp_nonce_url()` but the new version - * changed the return value to escaped URL, that's not the expected - * behaviour. - * - * @author Vova Feldman (@svovaf) - * @since ~1.1.3 - * - * @param string $actionurl URL to add nonce action. - * @param int|string $action Optional. Nonce action name. Default -1. - * @param string $name Optional. Nonce name. Default '_wpnonce'. - * - * @return string Escaped URL with nonce action added. - */ - function fs_nonce_url( $actionurl, $action = - 1, $name = '_wpnonce' ) { - return add_query_arg( $name, wp_create_nonce( $action ), $actionurl ); - } - } - - if ( ! function_exists( 'fs_starts_with' ) ) { - /** - * Check if string starts with. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param string $haystack - * @param string $needle - * - * @return bool - */ - function fs_starts_with( $haystack, $needle ) { - $length = strlen( $needle ); - - return ( substr( $haystack, 0, $length ) === $needle ); - } - } - - #region Url Canonization ------------------------------------------------------------------ - - if ( ! function_exists( 'fs_canonize_url' ) ) { - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param string $url - * @param bool $omit_host - * @param array $ignore_params - * - * @return string - */ - function fs_canonize_url( $url, $omit_host = false, $ignore_params = array() ) { - $parsed_url = parse_url( strtolower( $url ) ); - -// if ( ! isset( $parsed_url['host'] ) ) { -// return $url; -// } - - $canonical = ( ( $omit_host || ! isset( $parsed_url['host'] ) ) ? '' : $parsed_url['host'] ) . $parsed_url['path']; - - if ( isset( $parsed_url['query'] ) ) { - parse_str( $parsed_url['query'], $queryString ); - $canonical .= '?' . fs_canonize_query_string( $queryString, $ignore_params ); - } - - return $canonical; - } - } - - if ( ! function_exists( 'fs_canonize_query_string' ) ) { - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param array $params - * @param array $ignore_params - * @param bool $params_prefix - * - * @return string - */ - function fs_canonize_query_string( array $params, array &$ignore_params, $params_prefix = false ) { - if ( ! is_array( $params ) || 0 === count( $params ) ) { - return ''; - } - - // Url encode both keys and values - $keys = fs_urlencode_rfc3986( array_keys( $params ) ); - $values = fs_urlencode_rfc3986( array_values( $params ) ); - $params = array_combine( $keys, $values ); - - // Parameters are sorted by name, using lexicographical byte value ordering. - // Ref: Spec: 9.1.1 (1) - uksort( $params, 'strcmp' ); - - $pairs = array(); - foreach ( $params as $parameter => $value ) { - $lower_param = strtolower( $parameter ); - - // Skip ignore params. - if ( in_array( $lower_param, $ignore_params ) || - ( false !== $params_prefix && fs_starts_with( $lower_param, $params_prefix ) ) - ) { - continue; - } - - if ( is_array( $value ) ) { - // If two or more parameters share the same name, they are sorted by their value - // Ref: Spec: 9.1.1 (1) - natsort( $value ); - foreach ( $value as $duplicate_value ) { - $pairs[] = $lower_param . '=' . $duplicate_value; - } - } else { - $pairs[] = $lower_param . '=' . $value; - } - } - - if ( 0 === count( $pairs ) ) { - return ''; - } - - return implode( "&", $pairs ); - } - } - - if ( ! function_exists( 'fs_urlencode_rfc3986' ) ) { - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param string|string[] $input - * - * @return array|mixed|string - */ - function fs_urlencode_rfc3986( $input ) { - if ( is_array( $input ) ) { - return array_map( 'fs_urlencode_rfc3986', $input ); - } else if ( is_scalar( $input ) ) { - return str_replace( '+', ' ', str_replace( '%7E', '~', rawurlencode( $input ) ) ); - } - - return ''; - } - } - - #endregion Url Canonization ------------------------------------------------------------------ - - function fs_download_image( $from, $to ) { - $ch = curl_init( $from ); - $fp = fopen( fs_normalize_path( $to ), 'wb' ); - curl_setopt( $ch, CURLOPT_FILE, $fp ); - curl_setopt( $ch, CURLOPT_HEADER, 0 ); - curl_exec( $ch ); - curl_close( $ch ); - fclose( $fp ); - } - - /* General Utilities - --------------------------------------------------------------------------------------------*/ - - /** - * Sorts an array by the value of the priority key. - * - * @author Daniel Iser (@danieliser) - * @since 1.1.7 - * - * @param $a - * @param $b - * - * @return int - */ - function fs_sort_by_priority( $a, $b ) { - - // If b has a priority and a does not, b wins. - if ( ! isset( $a['priority'] ) && isset( $b['priority'] ) ) { - return 1; - } // If b has a priority and a does not, b wins. - elseif ( isset( $a['priority'] ) && ! isset( $b['priority'] ) ) { - return - 1; - } // If neither has a priority or both priorities are equal its a tie. - elseif ( ( ! isset( $a['priority'] ) && ! isset( $b['priority'] ) ) || $a['priority'] === $b['priority'] ) { - return 0; - } - - // If both have priority return the winner. - return ( $a['priority'] < $b['priority'] ) ? - 1 : 1; - } +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + if ( ! function_exists( 'fs_dummy' ) ) { + function fs_dummy() { + } + } + + /* Url. + --------------------------------------------------------------------------------------------*/ + if ( ! function_exists( 'fs_get_url_daily_cache_killer' ) ) { + function fs_get_url_daily_cache_killer() { + return date( '\YY\Mm\Dd' ); + } + } + + /* Templates / Views. + --------------------------------------------------------------------------------------------*/ + if ( ! function_exists( 'fs_get_template_path' ) ) { + function fs_get_template_path( $path ) { + return WP_FS__DIR_TEMPLATES . '/' . trim( $path, '/' ); + } + + function fs_include_template( $path, &$params = null ) { + $VARS = &$params; + include fs_get_template_path( $path ); + } + + function fs_include_once_template( $path, &$params = null ) { + $VARS = &$params; + include_once fs_get_template_path( $path ); + } + + function fs_require_template( $path, &$params = null ) { + $VARS = &$params; + require fs_get_template_path( $path ); + } + + function fs_require_once_template( $path, &$params = null ) { + $VARS = &$params; + require_once fs_get_template_path( $path ); + } + + function fs_get_template( $path, &$params = null ) { + ob_start(); + + $VARS = &$params; + require fs_get_template_path( $path ); + + return ob_get_clean(); + } + } + + /* Scripts and styles including. + --------------------------------------------------------------------------------------------*/ + + /** + * Generates an absolute URL to the given path. This function ensures that the URL will be correct whether the asset + * is inside a plugin's folder or a theme's folder. + * + * Examples: + * 1. "themes" folder + * Path: C:/xampp/htdocs/fswp/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css + * URL: http://fswp:8080/wp-content/themes/twentytwelve/freemius/assets/css/admin/common.css + * + * 2. "plugins" folder + * Path: C:/xampp/htdocs/fswp/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css + * URL: http://fswp:8080/wp-content/plugins/rating-widget-premium/freemius/assets/css/admin/common.css + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @param string $asset_abs_path Asset's absolute path. + * + * @return string Asset's URL. + */ + function fs_asset_url( $asset_abs_path ) { + $wp_content_dir = fs_normalize_path( WP_CONTENT_DIR ); + $asset_abs_path = fs_normalize_path( $asset_abs_path ); + $asset_rel_path = str_replace( $wp_content_dir, '', $asset_abs_path ); + + $asset_url = content_url( fs_normalize_path( $asset_rel_path ) ); + + return $asset_url; + } + + function fs_enqueue_local_style( $handle, $path, $deps = array(), $ver = false, $media = 'all' ) { + wp_enqueue_style( $handle, fs_asset_url( WP_FS__DIR_CSS . '/' . trim( $path, '/' ) ), $deps, $ver, $media ); + } + + function fs_enqueue_local_script( $handle, $path, $deps = array(), $ver = false, $in_footer = 'all' ) { + wp_enqueue_script( $handle, fs_asset_url( WP_FS__DIR_JS . '/' . trim( $path, '/' ) ), $deps, $ver, $in_footer ); + } + + function fs_img_url( $path, $img_dir = WP_FS__DIR_IMG ) { + return ( fs_asset_url( $img_dir . '/' . trim( $path, '/' ) ) ); + } + + #-------------------------------------------------------------------------------- + #region Request handlers. + #-------------------------------------------------------------------------------- + + if ( ! function_exists( 'fs_request_get' ) ) { + /** + * @param string $key + * @param mixed $def + * @param string|bool $type Since 1.2.1.7 - when set to 'get' will look for the value passed via querystring, when + * set to 'post' will look for the value passed via the POST request's body, otherwise, + * will check if the parameter was passed in any of the two. + * + * @return mixed + */ + function fs_request_get( $key, $def = false, $type = false ) { + if ( is_string( $type ) ) { + $type = strtolower( $type ); + } + + switch ( $type ) { + case 'post': + $value = isset( $_POST[ $key ] ) ? $_POST[ $key ] : $def; + break; + case 'get': + $value = isset( $_GET[ $key ] ) ? $_GET[ $key ] : $def; + break; + default: + $value = isset( $_REQUEST[ $key ] ) ? $_REQUEST[ $key ] : $def; + break; + } + + return $value; + } + } + + if ( ! function_exists( 'fs_request_has' ) ) { + function fs_request_has( $key ) { + return isset( $_REQUEST[ $key ] ); + } + } + + if ( ! function_exists( 'fs_request_get_bool' ) ) { + function fs_request_get_bool( $key, $def = false ) { + if ( ! isset( $_REQUEST[ $key ] ) ) { + return $def; + } + + if ( 1 == $_REQUEST[ $key ] || 'true' === strtolower( $_REQUEST[ $key ] ) ) { + return true; + } + + if ( 0 == $_REQUEST[ $key ] || 'false' === strtolower( $_REQUEST[ $key ] ) ) { + return false; + } + + return $def; + } + } + + if ( ! function_exists( 'fs_request_is_post' ) ) { + function fs_request_is_post() { + return ( 'post' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); + } + } + + if ( ! function_exists( 'fs_request_is_get' ) ) { + function fs_request_is_get() { + return ( 'get' === strtolower( $_SERVER['REQUEST_METHOD'] ) ); + } + } + + if ( ! function_exists( 'fs_get_action' ) ) { + function fs_get_action( $action_key = 'action' ) { + if ( ! empty( $_REQUEST[ $action_key ] ) && is_string( $_REQUEST[ $action_key ] ) ) { + return strtolower( $_REQUEST[ $action_key ] ); + } + + if ( 'action' == $action_key ) { + $action_key = 'fs_action'; + + if ( ! empty( $_REQUEST[ $action_key ] ) && is_string( $_REQUEST[ $action_key ] ) ) { + return strtolower( $_REQUEST[ $action_key ] ); + } + } + + return false; + } + } + + if ( ! function_exists( 'fs_request_is_action' ) ) { + function fs_request_is_action( $action, $action_key = 'action' ) { + return ( strtolower( $action ) === fs_get_action( $action_key ) ); + } + } + + if ( ! function_exists( 'fs_request_is_action_secure' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.0 + * + * @since 1.2.1.5 Allow nonce verification. + * + * @param string $action + * @param string $action_key + * @param string $nonce_key + * + * @return bool + */ + function fs_request_is_action_secure( + $action, + $action_key = 'action', + $nonce_key = 'nonce' + ) { + if ( strtolower( $action ) !== fs_get_action( $action_key ) ) { + return false; + } + + $nonce = ! empty( $_REQUEST[ $nonce_key ] ) ? + $_REQUEST[ $nonce_key ] : + ''; + + if ( empty( $nonce ) || + ( false === wp_verify_nonce( $nonce, $action ) ) + ) { + return false; + } + + return true; + } + } + + #endregion + + if ( ! function_exists( 'fs_is_plugin_page' ) ) { + function fs_is_plugin_page( $page_slug ) { + return ( is_admin() && $page_slug === fs_request_get( 'page' ) ); + } + } + + if ( ! function_exists( 'fs_get_raw_referer' ) ) { + /** + * Retrieves unvalidated referer from '_wp_http_referer' or HTTP referer. + * + * Do not use for redirects, use {@see wp_get_referer()} instead. + * + * @since 1.2.3 + * + * @return string|false Referer URL on success, false on failure. + */ + function fs_get_raw_referer() { + if ( function_exists( 'wp_get_raw_referer' ) ) { + return wp_get_raw_referer(); + } + if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { + return wp_unslash( $_REQUEST['_wp_http_referer'] ); + } else if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) { + return wp_unslash( $_SERVER['HTTP_REFERER'] ); + } + + return false; + } + } + + /* Core UI. + --------------------------------------------------------------------------------------------*/ + /** + * @param number $module_id + * @param string $page + * @param string $action + * @param string $title + * @param string $button_class + * @param array $params + * @param bool $is_primary + * @param bool $is_small + * @param string|bool $icon_class Optional class for an icon (since 1.1.7). + * @param string|bool $confirmation Optional confirmation message before submit (since 1.1.7). + * @param string $method Since 1.1.7 + * + * @uses fs_ui_get_action_button() + */ + function fs_ui_action_button( + $module_id, + $page, + $action, + $title, + $button_class = '', + $params = array(), + $is_primary = true, + $is_small = false, + $icon_class = false, + $confirmation = false, + $method = 'GET' + ) { + echo fs_ui_get_action_button( + $module_id, + $page, + $action, + $title, + $button_class, + $params, + $is_primary, + $is_small, + $icon_class, + $confirmation, + $method + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param number $module_id + * @param string $page + * @param string $action + * @param string $title + * @param string $button_class + * @param array $params + * @param bool $is_primary + * @param bool $is_small + * @param string|bool $icon_class Optional class for an icon. + * @param string|bool $confirmation Optional confirmation message before submit. + * @param string $method + * + * @return string + */ + function fs_ui_get_action_button( + $module_id, + $page, + $action, + $title, + $button_class = '', + $params = array(), + $is_primary = true, + $is_small = false, + $icon_class = false, + $confirmation = false, + $method = 'GET' + ) { + // Prepend icon (if set). + $title = ( is_string( $icon_class ) ? '<i class="' . $icon_class . '"></i> ' : '' ) . $title; + + if ( is_string( $confirmation ) ) { + return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="if (confirm(\'%s\')) this.parentNode.submit(); return false;">%s</a></form>', + freemius( $module_id )->_get_admin_page_url( $page, $params ), + $method, + $action, + wp_nonce_field( $action, '_wpnonce', true, false ), + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), + $confirmation, + $title + ); + } else if ( 'GET' !== strtoupper( $method ) ) { + return sprintf( '<form action="%s" method="%s"><input type="hidden" name="fs_action" value="%s">%s<a href="#" class="%s" onclick="this.parentNode.submit(); return false;">%s</a></form>', + freemius( $module_id )->_get_admin_page_url( $page, $params ), + $method, + $action, + wp_nonce_field( $action, '_wpnonce', true, false ), + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), + $title + ); + } else { + return sprintf( '<a href="%s" class="%s">%s</a></form>', + wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ), + 'button' . ( ! empty( $button_class ) ? ' ' . $button_class : '' ) . ( $is_primary ? ' button-primary' : '' ) . ( $is_small ? ' button-small' : '' ), + $title + ); + } + } + + function fs_ui_action_link( $module_id, $page, $action, $title, $params = array() ) { + ?><a class="" + href="<?php echo wp_nonce_url( freemius( $module_id )->_get_admin_page_url( $page, array_merge( $params, array( 'fs_action' => $action ) ) ), $action ) ?>"><?php echo $title ?></a><?php + } + + /*function fs_error_handler($errno, $errstr, $errfile, $errline) + { + if (false === strpos($errfile, 'freemius/')) + { + // @todo Dump Freemius errors to local log. + } + +// switch ($errno) { +// case E_USER_ERROR: +// break; +// case E_WARNING: +// case E_USER_WARNING: +// break; +// case E_NOTICE: +// case E_USER_NOTICE: +// break; +// default: +// break; +// } + } + + set_error_handler('fs_error_handler');*/ + + if ( ! function_exists( 'fs_nonce_url' ) ) { + /** + * Retrieve URL with nonce added to URL query. + * + * Originally was using `wp_nonce_url()` but the new version + * changed the return value to escaped URL, that's not the expected + * behaviour. + * + * @author Vova Feldman (@svovaf) + * @since ~1.1.3 + * + * @param string $actionurl URL to add nonce action. + * @param int|string $action Optional. Nonce action name. Default -1. + * @param string $name Optional. Nonce name. Default '_wpnonce'. + * + * @return string Escaped URL with nonce action added. + */ + function fs_nonce_url( $actionurl, $action = - 1, $name = '_wpnonce' ) { + return add_query_arg( $name, wp_create_nonce( $action ), $actionurl ); + } + } + + if ( ! function_exists( 'fs_starts_with' ) ) { + /** + * Check if string starts with. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param string $haystack + * @param string $needle + * + * @return bool + */ + function fs_starts_with( $haystack, $needle ) { + $length = strlen( $needle ); + + return ( substr( $haystack, 0, $length ) === $needle ); + } + } + + if ( ! function_exists( 'fs_ends_with' ) ) { + /** + * Check if string ends with. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $haystack + * @param string $needle + * + * @return bool + */ + function fs_ends_with( $haystack, $needle ) { + $length = strlen( $needle ); + $start = $length * - 1; // negative + + return ( substr( $haystack, $start ) === $needle ); + } + } + + if ( ! function_exists( 'fs_strip_url_protocol' ) ) { + function fs_strip_url_protocol( $url ) { + if ( ! fs_starts_with( $url, 'http' ) ) { + return $url; + } + + $protocol_pos = strpos( $url, '://' ); + + if ( $protocol_pos > 5 ) { + return $url; + } + + return substr( $url, $protocol_pos + 3 ); + } + } + + #region Url Canonization ------------------------------------------------------------------ + + if ( ! function_exists( 'fs_canonize_url' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param string $url + * @param bool $omit_host + * @param array $ignore_params + * + * @return string + */ + function fs_canonize_url( $url, $omit_host = false, $ignore_params = array() ) { + $parsed_url = parse_url( strtolower( $url ) ); + +// if ( ! isset( $parsed_url['host'] ) ) { +// return $url; +// } + + $canonical = ( ( $omit_host || ! isset( $parsed_url['host'] ) ) ? '' : $parsed_url['host'] ) . $parsed_url['path']; + + if ( isset( $parsed_url['query'] ) ) { + parse_str( $parsed_url['query'], $queryString ); + $canonical .= '?' . fs_canonize_query_string( $queryString, $ignore_params ); + } + + return $canonical; + } + } + + if ( ! function_exists( 'fs_canonize_query_string' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param array $params + * @param array $ignore_params + * @param bool $params_prefix + * + * @return string + */ + function fs_canonize_query_string( array $params, array &$ignore_params, $params_prefix = false ) { + if ( ! is_array( $params ) || 0 === count( $params ) ) { + return ''; + } + + // Url encode both keys and values + $keys = fs_urlencode_rfc3986( array_keys( $params ) ); + $values = fs_urlencode_rfc3986( array_values( $params ) ); + $params = array_combine( $keys, $values ); + + // Parameters are sorted by name, using lexicographical byte value ordering. + // Ref: Spec: 9.1.1 (1) + uksort( $params, 'strcmp' ); + + $pairs = array(); + foreach ( $params as $parameter => $value ) { + $lower_param = strtolower( $parameter ); + + // Skip ignore params. + if ( in_array( $lower_param, $ignore_params ) || + ( false !== $params_prefix && fs_starts_with( $lower_param, $params_prefix ) ) + ) { + continue; + } + + if ( is_array( $value ) ) { + // If two or more parameters share the same name, they are sorted by their value + // Ref: Spec: 9.1.1 (1) + natsort( $value ); + foreach ( $value as $duplicate_value ) { + $pairs[] = $lower_param . '=' . $duplicate_value; + } + } else { + $pairs[] = $lower_param . '=' . $value; + } + } + + if ( 0 === count( $pairs ) ) { + return ''; + } + + return implode( "&", $pairs ); + } + } + + if ( ! function_exists( 'fs_urlencode_rfc3986' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param string|string[] $input + * + * @return array|mixed|string + */ + function fs_urlencode_rfc3986( $input ) { + if ( is_array( $input ) ) { + return array_map( 'fs_urlencode_rfc3986', $input ); + } else if ( is_scalar( $input ) ) { + return str_replace( '+', ' ', str_replace( '%7E', '~', rawurlencode( $input ) ) ); + } + + return ''; + } + } + + #endregion Url Canonization ------------------------------------------------------------------ + + /** + * @author Vova Feldman (@svovaf) + * + * @since 1.2.2 Changed to usage of WP_Filesystem_Direct. + * + * @param string $from URL + * @param string $to File path. + * + * @return bool Is successfully downloaded. + */ + function fs_download_image( $from, $to ) { + $dir = dirname( $to ); + + if ( 'direct' !== get_filesystem_method( array(), $dir ) ) { + return false; + } + + if ( ! class_exists( 'WP_Filesystem_Direct' ) ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; + require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php'; + } + + $fs = new WP_Filesystem_Direct( '' ); + $tmpfile = download_url( $from ); + + if ( $tmpfile instanceof WP_Error ) { + // Issue downloading the file. + return false; + } + + $fs->copy( $tmpfile, $to ); + $fs->delete( $tmpfile ); + + return true; + } + + /* General Utilities + --------------------------------------------------------------------------------------------*/ + + /** + * Sorts an array by the value of the priority key. + * + * @author Daniel Iser (@danieliser) + * @since 1.1.7 + * + * @param $a + * @param $b + * + * @return int + */ + function fs_sort_by_priority( $a, $b ) { + + // If b has a priority and a does not, b wins. + if ( ! isset( $a['priority'] ) && isset( $b['priority'] ) ) { + return 1; + } // If b has a priority and a does not, b wins. + elseif ( isset( $a['priority'] ) && ! isset( $b['priority'] ) ) { + return - 1; + } // If neither has a priority or both priorities are equal its a tie. + elseif ( ( ! isset( $a['priority'] ) && ! isset( $b['priority'] ) ) || $a['priority'] === $b['priority'] ) { + return 0; + } + + // If both have priority return the winner. + return ( $a['priority'] < $b['priority'] ) ? - 1 : 1; + } + + #-------------------------------------------------------------------------------- + #region Localization + #-------------------------------------------------------------------------------- + + if ( ! function_exists( 'fs_text' ) ) { + /** + * Retrieve a translated text by key. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $key + * @param string $slug + * + * @return string + * + * @global $fs_text , $fs_text_overrides + */ + function fs_text( $key, $slug = 'freemius' ) { + global $fs_text, + $fs_module_info_text, + $fs_text_overrides; + + if ( isset( $fs_text_overrides[ $slug ] ) ) { + if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { + return $fs_text_overrides[ $slug ][ $key ]; + } + + $lower_key = strtolower( $key ); + if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { + return $fs_text_overrides[ $slug ][ $lower_key ]; + } + } + + if ( ! isset( $fs_text ) ) { + $dir = defined( 'WP_FS__DIR_INCLUDES' ) ? + WP_FS__DIR_INCLUDES : + dirname( __FILE__ ); + + require_once $dir . '/i18n.php'; + } + + if ( isset( $fs_text[ $key ] ) ) { + return $fs_text[ $key ]; + } + + if ( isset( $fs_module_info_text[ $key ] ) ) { + return $fs_module_info_text[ $key ]; + } + + return $key; + } + + /** + * Get a translatable text override if exists, or `false`. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string|false + */ + function fs_text_override( $text, $key, $slug ) { + global $fs_text_overrides; + + /** + * Check if string is overridden. + */ + if ( ! isset( $fs_text_overrides[ $slug ] ) ) { + return false; + } + + if ( empty( $key ) ) { + $key = strtolower( str_replace( ' ', '-', $text ) ); + } + + if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { + return $fs_text_overrides[ $slug ][ $key ]; + } + + $lower_key = strtolower( $key ); + if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { + return $fs_text_overrides[ $slug ][ $lower_key ]; + } + + return false; + } + + /** + * Get a translatable text and its text domain. + * + * When the text is overridden by the module, returns the overridden text and the text domain of the module. Otherwise, returns the original text and 'freemius' as the text domain. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string[] + */ + function fs_text_and_domain( $text, $key, $slug ) { + $override = fs_text_override( $text, $key, $slug ); + + if ( false === $override ) { + // No override, use FS text domain. + $text_domain = 'freemius'; + } else { + // Found an override. + $text = $override; + // Use the module's text domain. + $text_domain = $slug; + } + + return array( $text, $text_domain ); + } + + #region Private + + /** + * Retrieve an inline translated text by key. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + * + * @global $fs_text_overrides + */ + function _fs_text_inline( $text, $key = '', $slug = 'freemius' ) { + list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug ); + + // Avoid misleading Theme Check warning. + $fn = 'translate'; + + return $fn( $text, $text_domain ); + } + + /** + * Retrieve an inline translated text by key with a context. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + * + * @global $fs_text_overrides + */ + function _fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + list( $text, $text_domain ) = fs_text_and_domain( $text, $key, $slug ); + + // Avoid misleading Theme Check warning. + $fn = 'translate_with_gettext_context'; + + return $fn( $text, $context, $text_domain ); + } + + #endregion + + /** + * Retrieve an inline translated text by key. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + * + * @global $fs_text_overrides + */ + function fs_text_inline( $text, $key = '', $slug = 'freemius' ) { + return _fs_text_inline( $text, $key, $slug ); + } + + /** + * Retrieve an inline translated text by key with a context. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + * + * @global $fs_text_overrides + */ + function fs_text_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + return _fs_text_x_inline( $text, $context, $key, $slug ); + } + + /** + * Output a translated text by key. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + * + * @param string $key + * @param string $slug + */ + function fs_echo( $key, $slug = 'freemius' ) { + echo fs_text( $key, $slug ); + } + + /** + * Output an inline translated text. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_echo_inline( $text, $key = '', $slug = 'freemius' ) { + echo _fs_text_inline( $text, $key, $slug ); + } + + /** + * Output an inline translated text with a context. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + echo _fs_text_x_inline( $text, $context, $key, $slug ); + } + } + + if ( ! function_exists( 'fs_esc_attr' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + * + * @return string + */ + function fs_esc_attr( $key, $slug ) { + return esc_attr( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_attr_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_attr_inline( $text, $key = '', $slug = 'freemius' ) { + return esc_attr( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_attr_x_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_attr_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + return esc_attr( _fs_text_x_inline( $text, $context, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_attr_echo' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + */ + function fs_esc_attr_echo( $key, $slug ) { + echo esc_attr( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_attr_echo_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_esc_attr_echo_inline( $text, $key = '', $slug = 'freemius' ) { + echo esc_attr( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + * + * @return string + */ + function fs_esc_js( $key, $slug ) { + return esc_js( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_js_inline( $text, $key = '', $slug = 'freemius' ) { + return esc_js( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js_x_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_js_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + return esc_js( _fs_text_x_inline( $text, $context, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js_echo_x_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_js_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + echo esc_js( _fs_text_x_inline( $text, $context, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js_echo' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + */ + function fs_esc_js_echo( $key, $slug ) { + echo esc_js( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_js_echo_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_esc_js_echo_inline( $text, $key = '', $slug = 'freemius' ) { + echo esc_js( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_json_encode_echo' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + */ + function fs_json_encode_echo( $key, $slug ) { + echo json_encode( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_json_encode_echo_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_json_encode_echo_inline( $text, $key = '', $slug = 'freemius' ) { + echo json_encode( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + * + * @return string + */ + function fs_esc_html( $key, $slug ) { + return esc_html( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_html_inline( $text, $key = '', $slug = 'freemius' ) { + return esc_html( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html_x_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + * + * @return string + */ + function fs_esc_html_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + return esc_html( _fs_text_x_inline( $text, $context, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html_echo_x_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $context Context information for the translators. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_esc_html_echo_x_inline( $text, $context, $key = '', $slug = 'freemius' ) { + echo esc_html( _fs_text_x_inline( $text, $context, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html_echo' ) ) { + /** + * @author Vova Feldman + * @since 1.2.1.6 + * + * @param string $key + * @param string $slug + */ + function fs_esc_html_echo( $key, $slug ) { + echo esc_html( fs_text( $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_esc_html_echo_inline' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 1.2.3 + * + * @param string $text Translatable string. + * @param string $key String key for overrides. + * @param string $slug Module slug for overrides. + */ + function fs_esc_html_echo_inline( $text, $key = '', $slug = 'freemius' ) { + echo esc_html( _fs_text_inline( $text, $key, $slug ) ); + } + } + + if ( ! function_exists( 'fs_override_i18n' ) ) { + /** + * Override default i18n text phrases. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param array[string]string $key_value + * @param string $slug + * + * @global $fs_text_overrides + */ + function fs_override_i18n( array $key_value, $slug = 'freemius' ) { + global $fs_text_overrides; + + if ( ! isset( $fs_text_overrides[ $slug ] ) ) { + $fs_text_overrides[ $slug ] = array(); + } + + foreach ( $key_value as $key => $value ) { + $fs_text_overrides[ $slug ][ $key ] = $value; + } + } + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Multisite Network + #-------------------------------------------------------------------------------- + + if ( ! function_exists( 'fs_is_plugin_uninstall' ) ) { + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function fs_is_plugin_uninstall() { + return ( + defined( 'WP_UNINSTALL_PLUGIN' ) || + ( 0 < did_action( 'update_option_uninstall_plugins' ) ) + ); + } + } + + if ( ! function_exists( 'fs_is_network_admin' ) ) { + /** + * Unlike is_network_admin(), this one will also work properly when + * the context execution is WP AJAX handler, and during plugin + * uninstall. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function fs_is_network_admin() { + return ( + WP_FS__IS_NETWORK_ADMIN || + ( is_multisite() && fs_is_plugin_uninstall() ) + ); + } + } + + if ( ! function_exists( 'fs_is_blog_admin' ) ) { + /** + * Unlike is_blog_admin(), this one will also work properly when + * the context execution is WP AJAX handler, and during plugin + * uninstall. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function fs_is_blog_admin() { + return ( + WP_FS__IS_BLOG_ADMIN || + ( ! is_multisite() && fs_is_plugin_uninstall() ) + ); + } + } + + #endregion + + if ( ! function_exists( 'fs_apply_filter' ) ) { + /** + * Apply filter for specific plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param string $module_unique_affix Module's unique affix. + * @param string $tag The name of the filter hook. + * @param mixed $value The value on which the filters hooked to `$tag` are applied on. + * + * @return mixed The filtered value after all hooked functions are applied to it. + * + * @uses apply_filters() + */ + function fs_apply_filter( $module_unique_affix, $tag, $value ) { + $args = func_get_args(); + + return call_user_func_array( 'apply_filters', array_merge( + array( "fs_{$tag}_{$module_unique_affix}" ), + array_slice( $args, 2 ) ) + ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-essential-functions.php b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-essential-functions.php index b0d9d79f3..727ef2e7b 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-essential-functions.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-essential-functions.php @@ -1,433 +1,477 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.1.5 - */ - - if ( ! function_exists( 'fs_normalize_path' ) ) { - if ( function_exists( 'wp_normalize_path' ) ) { - /** - * Normalize a filesystem path. - * - * Replaces backslashes with forward slashes for Windows systems, and ensures - * no duplicate slashes exist. - * - * @param string $path Path to normalize. - * - * @return string Normalized path. - */ - function fs_normalize_path( $path ) { - return wp_normalize_path( $path ); - } - } else { - function fs_normalize_path( $path ) { - $path = str_replace( '\\', '/', $path ); - $path = preg_replace( '|/+|', '/', $path ); - - return $path; - } - } - } - - #region Core Redirect (copied from BuddyPress) ----------------------------------------- - - if ( ! function_exists( 'fs_redirect' ) ) { - /** - * Redirects to another page, with a workaround for the IIS Set-Cookie bug. - * - * @link http://support.microsoft.com/kb/q176113/ - * @since 1.5.1 - * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status. - * - * @param string $location The path to redirect to. - * @param bool $exit If true, exit after redirect (Since 1.2.1.5). - * @param int $status Status code to use. - * - * @return bool False if $location is not set - */ - function fs_redirect( $location, $exit = true, $status = 302 ) { - global $is_IIS; - - $file = ''; - $line = ''; - if ( headers_sent($file, $line) ) { - if ( WP_FS__DEBUG_SDK && class_exists( 'FS_Admin_Notice_Manager' ) ) { - $notices = FS_Admin_Notice_Manager::instance( 'global' ); - - $notices->add( "Freemius failed to redirect the page because the headers have been already sent from line <b><code>{$line}</code></b> in file <b><code>{$file}</code></b>. If it's unexpected, it usually happens due to invalid space and/or EOL character(s).", 'Oops...', 'error' ); - } - - return false; - } - - if ( defined( 'DOING_AJAX' ) ) { - // Don't redirect on AJAX calls. - return false; - } - - if ( ! $location ) // allows the wp_redirect filter to cancel a redirect - { - return false; - } - - $location = fs_sanitize_redirect( $location ); - - if ( $is_IIS ) { - header( "Refresh: 0;url=$location" ); - } else { - if ( php_sapi_name() != 'cgi-fcgi' ) { - status_header( $status ); - } // This causes problems on IIS and some FastCGI setups - header( "Location: $location" ); - } - - if ( $exit ) { - exit(); - } - - return true; - } - - if ( ! function_exists( 'fs_sanitize_redirect' ) ) { - /** - * Sanitizes a URL for use in a redirect. - * - * @since 2.3 - * - * @param string $location - * - * @return string redirect-sanitized URL - */ - function fs_sanitize_redirect( $location ) { - $location = preg_replace( '|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location ); - $location = fs_kses_no_null( $location ); - - // remove %0d and %0a from location - $strip = array( '%0d', '%0a' ); - $found = true; - while ( $found ) { - $found = false; - foreach ( (array) $strip as $val ) { - while ( strpos( $location, $val ) !== false ) { - $found = true; - $location = str_replace( $val, '', $location ); - } - } - } - - return $location; - } - } - - if ( ! function_exists( 'fs_kses_no_null' ) ) { - /** - * Removes any NULL characters in $string. - * - * @since 1.0.0 - * - * @param string $string - * - * @return string - */ - function fs_kses_no_null( $string ) { - $string = preg_replace( '/\0+/', '', $string ); - $string = preg_replace( '/(\\\\0)+/', '', $string ); - - return $string; - } - } - } - - #endregion Core Redirect (copied from BuddyPress) ----------------------------------------- - - if ( ! function_exists( '__fs' ) ) { - global $fs_text_overrides; - - if ( ! isset( $fs_text_overrides ) ) { - $fs_text_overrides = array(); - } - - /** - * Retrieve a translated text by key. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - * - * @param string $key - * @param string $slug - * - * @return string - * - * @global $fs_text , $fs_text_overrides - */ - function __fs( $key, $slug = 'freemius' ) { - global $fs_text, $fs_text_overrides; - - if ( ! isset( $fs_text ) ) { - require_once( ( defined( 'WP_FS__DIR_INCLUDES' ) ? WP_FS__DIR_INCLUDES : dirname( __FILE__ ) ) . '/i18n.php' ); - } - - if ( isset( $fs_text_overrides[ $slug ] ) ) { - if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { - return $fs_text_overrides[ $slug ][ $key ]; - } - - $lower_key = strtolower( $key ); - if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { - return $fs_text_overrides[ $slug ][ $lower_key ]; - } - } - - return isset( $fs_text[ $key ] ) ? - $fs_text[ $key ] : - $key; - } - - /** - * Display a translated text by key. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.4 - * - * @param string $key - * @param string $slug - */ - function _efs( $key, $slug = 'freemius' ) { - echo __fs( $key, $slug ); - } - - /** - * Override default i18n text phrases. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string[] $key_value - * @param string $slug - * - * @global $fs_text_overrides - */ - function fs_override_i18n( array $key_value, $slug = 'freemius' ) { - global $fs_text_overrides; - - if ( ! isset( $fs_text_overrides[ $slug ] ) ) { - $fs_text_overrides[ $slug ] = array(); - } - - foreach ( $key_value as $key => $value ) { - $fs_text_overrides[ $slug ][ $key ] = $value; - } - } - } - - if ( ! function_exists( 'fs_get_ip' ) ) { - /** - * Get client IP. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.2 - * - * @return string|null - */ - function fs_get_ip() { - $fields = array( - 'HTTP_CF_CONNECTING_IP', - 'HTTP_CLIENT_IP', - 'HTTP_X_FORWARDED_FOR', - 'HTTP_X_FORWARDED', - 'HTTP_FORWARDED_FOR', - 'HTTP_FORWARDED', - 'REMOTE_ADDR', - ); - - foreach ( $fields as $ip_field ) { - if ( ! empty( $_SERVER[ $ip_field ] ) ) { - return $_SERVER[ $ip_field ]; - } - } - - return null; - } - } - - /** - * Leverage backtrace to find caller plugin main file path. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return string - */ - function fs_find_caller_plugin_file() { - /** - * All the code below will be executed once on activation. - * If the user changes the main plugin's file name, the file_exists() - * will catch it. - */ - if ( ! function_exists( 'get_plugins' ) ) { - require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); - } - - $all_plugins = get_plugins(); - $all_plugins_paths = array(); - - // Get active plugin's main files real full names (might be symlinks). - foreach ( $all_plugins as $relative_path => &$data ) { - $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ); - } - - $plugin_file = null; - for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) { - if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) { - $plugin_file = $bt[ $i ]['file']; - break; - } - } - - if ( is_null( $plugin_file ) ) { - // Throw an error to the developer in case of some edge case dev environment. - wp_die( __fs( 'failed-finding-main-path' ), __fs( 'error' ), array( 'back_link' => true ) ); - } - - return $plugin_file; - } - - require_once dirname( __FILE__ ) . '/supplements/fs-essential-functions-1.1.7.1.php'; - - /** - * Update SDK newest version reference. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $sdk_relative_path - * @param string|bool $plugin_file - * - * @global $fs_active_plugins - */ - function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) { - global $fs_active_plugins; - - if ( ! is_string( $plugin_file ) ) { - $plugin_file = plugin_basename( fs_find_caller_plugin_file() ); - } - - $fs_active_plugins->newest = (object) array( - 'plugin_path' => $plugin_file, - 'sdk_path' => $sdk_relative_path, - 'version' => $fs_active_plugins->plugins[ $sdk_relative_path ]->version, - 'in_activation' => ! is_plugin_active( $plugin_file ), - 'timestamp' => time(), - ); - - // Update DB with latest SDK version and path. - update_option( 'fs_active_plugins', $fs_active_plugins ); - } - - /** - * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @return bool Was plugin order changed. Return false if plugin was loaded first anyways. - * - * @global $fs_active_plugins - */ - function fs_newest_sdk_plugin_first() { - global $fs_active_plugins; - - /** - * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins). - * - * @link https://github.com/Freemius/wordpress-sdk/issues/26 - */ -// $active_sitewide_plugins = get_site_option( 'active_sitewide_plugins' ); - - $active_plugins = get_option( 'active_plugins' ); - $newest_sdk_plugin_key = array_search( $fs_active_plugins->newest->plugin_path, $active_plugins ); - if ( 0 == $newest_sdk_plugin_key ) { - // if it's 0 it's the first plugin already, no need to continue - return false; - } - - array_splice( $active_plugins, $newest_sdk_plugin_key, 1 ); - array_unshift( $active_plugins, $fs_active_plugins->newest->plugin_path ); - update_option( 'active_plugins', $active_plugins ); - - return true; - } - - /** - * Go over all Freemius SDKs in the system and find and "remember" - * the newest SDK which is associated with an active plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @global $fs_active_plugins - */ - function fs_fallback_to_newest_active_sdk() { - global $fs_active_plugins; - - /** - * @var object $newest_sdk_data - */ - $newest_sdk_data = null; - $newest_sdk_path = null; - - foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) { - if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' ) - ) { - // If plugin inactive or SDK starter file doesn't exist, remove SDK reference. - if ( ! is_plugin_active( $data->plugin_path ) || - ! file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) ) - ) { - unset( $fs_active_plugins->plugins[ $sdk_relative_path ] ); - - // No need to store the data since it will be stored in fs_update_sdk_newest_version() - // or explicitly with update_option(). - } else { - $newest_sdk_data = $data; - $newest_sdk_path = $sdk_relative_path; - } - } - } - - if ( is_null( $newest_sdk_data ) ) { - // Couldn't find any SDK reference. - $fs_active_plugins = new stdClass(); - update_option( 'fs_active_plugins', $fs_active_plugins ); - } else { - fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path ); - } - } - - #region Actions / Filters ----------------------------------------- - - /** - * Apply filter for specific plugin. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param string $slug Plugin slug - * @param string $tag The name of the filter hook. - * @param mixed $value The value on which the filters hooked to `$tag` are applied on. - * - * @return mixed The filtered value after all hooked functions are applied to it. - * - * @uses apply_filters() - */ - function fs_apply_filter( $slug, $tag, $value ) { - $args = func_get_args(); - - return call_user_func_array( 'apply_filters', array_merge( - array( "fs_{$tag}_{$slug}" ), - array_slice( $args, 2 ) ) - ); - } - - #endregion Actions / Filters ----------------------------------------- \ No newline at end of file +<?php + /** + * IMPORTANT: + * This file will be loaded based on the order of the plugins/themes load. + * If there's a theme and a plugin using Freemius, the plugin's essential + * file will always load first. + * + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.1.5 + */ + + if ( ! function_exists( 'fs_normalize_path' ) ) { + if ( function_exists( 'wp_normalize_path' ) ) { + /** + * Normalize a filesystem path. + * + * Replaces backslashes with forward slashes for Windows systems, and ensures + * no duplicate slashes exist. + * + * @param string $path Path to normalize. + * + * @return string Normalized path. + */ + function fs_normalize_path( $path ) { + return wp_normalize_path( $path ); + } + } else { + function fs_normalize_path( $path ) { + $path = str_replace( '\\', '/', $path ); + $path = preg_replace( '|/+|', '/', $path ); + + return $path; + } + } + } + + #region Core Redirect (copied from BuddyPress) ----------------------------------------- + + if ( ! function_exists( 'fs_redirect' ) ) { + /** + * Redirects to another page, with a workaround for the IIS Set-Cookie bug. + * + * @link http://support.microsoft.com/kb/q176113/ + * @since 1.5.1 + * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status. + * + * @param string $location The path to redirect to. + * @param bool $exit If true, exit after redirect (Since 1.2.1.5). + * @param int $status Status code to use. + * + * @return bool False if $location is not set + */ + function fs_redirect( $location, $exit = true, $status = 302 ) { + global $is_IIS; + + $file = ''; + $line = ''; + if ( headers_sent($file, $line) ) { + if ( WP_FS__DEBUG_SDK && class_exists( 'FS_Admin_Notices' ) ) { + $notices = FS_Admin_Notices::instance( 'global' ); + + $notices->add( "Freemius failed to redirect the page because the headers have been already sent from line <b><code>{$line}</code></b> in file <b><code>{$file}</code></b>. If it's unexpected, it usually happens due to invalid space and/or EOL character(s).", 'Oops...', 'error' ); + } + + return false; + } + + if ( defined( 'DOING_AJAX' ) ) { + // Don't redirect on AJAX calls. + return false; + } + + if ( ! $location ) // allows the wp_redirect filter to cancel a redirect + { + return false; + } + + $location = fs_sanitize_redirect( $location ); + + if ( $is_IIS ) { + header( "Refresh: 0;url=$location" ); + } else { + if ( php_sapi_name() != 'cgi-fcgi' ) { + status_header( $status ); + } // This causes problems on IIS and some FastCGI setups + header( "Location: $location" ); + } + + if ( $exit ) { + exit(); + } + + return true; + } + + if ( ! function_exists( 'fs_sanitize_redirect' ) ) { + /** + * Sanitizes a URL for use in a redirect. + * + * @since 2.3 + * + * @param string $location + * + * @return string redirect-sanitized URL + */ + function fs_sanitize_redirect( $location ) { + $location = preg_replace( '|[^a-z0-9-~+_.?#=&;,/:%!]|i', '', $location ); + $location = fs_kses_no_null( $location ); + + // remove %0d and %0a from location + $strip = array( '%0d', '%0a' ); + $found = true; + while ( $found ) { + $found = false; + foreach ( (array) $strip as $val ) { + while ( strpos( $location, $val ) !== false ) { + $found = true; + $location = str_replace( $val, '', $location ); + } + } + } + + return $location; + } + } + + if ( ! function_exists( 'fs_kses_no_null' ) ) { + /** + * Removes any NULL characters in $string. + * + * @since 1.0.0 + * + * @param string $string + * + * @return string + */ + function fs_kses_no_null( $string ) { + $string = preg_replace( '/\0+/', '', $string ); + $string = preg_replace( '/(\\\\0)+/', '', $string ); + + return $string; + } + } + } + + #endregion Core Redirect (copied from BuddyPress) ----------------------------------------- + + if ( ! function_exists( '__fs' ) ) { + global $fs_text_overrides; + + if ( ! isset( $fs_text_overrides ) ) { + $fs_text_overrides = array(); + } + + /** + * Retrieve a translated text by key. + * + * @deprecated Use `fs_text()` instead since methods starting with `__` trigger warnings in Php 7. + * @todo Remove this method in the future. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + * + * @param string $key + * @param string $slug + * + * @return string + * + * @global $fs_text, $fs_text_overrides + */ + function __fs( $key, $slug = 'freemius' ) { + _deprecated_function( __FUNCTION__, '2.0.0', 'fs_text()' ); + + global $fs_text, + $fs_module_info_text, + $fs_text_overrides; + + if ( isset( $fs_text_overrides[ $slug ] ) ) { + if ( isset( $fs_text_overrides[ $slug ][ $key ] ) ) { + return $fs_text_overrides[ $slug ][ $key ]; + } + + $lower_key = strtolower( $key ); + if ( isset( $fs_text_overrides[ $slug ][ $lower_key ] ) ) { + return $fs_text_overrides[ $slug ][ $lower_key ]; + } + } + + if ( ! isset( $fs_text ) ) { + $dir = defined( 'WP_FS__DIR_INCLUDES' ) ? + WP_FS__DIR_INCLUDES : + dirname( __FILE__ ); + + require_once $dir . '/i18n.php'; + } + + if ( isset( $fs_text[ $key ] ) ) { + return $fs_text[ $key ]; + } + + if ( isset( $fs_module_info_text[ $key ] ) ) { + return $fs_module_info_text[ $key ]; + } + + return $key; + } + + /** + * Output a translated text by key. + * + * @deprecated Use `fs_echo()` instead for consistency with `fs_text()`. + * + * @todo Remove this method in the future. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.4 + * + * @param string $key + * @param string $slug + */ + function _efs( $key, $slug = 'freemius' ) { + fs_echo( $key, $slug ); + } + } + + if ( ! function_exists( 'fs_get_ip' ) ) { + /** + * Get client IP. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.2 + * + * @return string|null + */ + function fs_get_ip() { + $fields = array( + 'HTTP_CF_CONNECTING_IP', + 'HTTP_CLIENT_IP', + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED', + 'HTTP_FORWARDED_FOR', + 'HTTP_FORWARDED', + 'REMOTE_ADDR', + ); + + foreach ( $fields as $ip_field ) { + if ( ! empty( $_SERVER[ $ip_field ] ) ) { + return $_SERVER[ $ip_field ]; + } + } + + return null; + } + } + + /** + * Leverage backtrace to find caller plugin main file path. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return string + */ + function fs_find_caller_plugin_file() { + /** + * All the code below will be executed once on activation. + * If the user changes the main plugin's file name, the file_exists() + * will catch it. + */ + if ( ! function_exists( 'get_plugins' ) ) { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + } + + $all_plugins = get_plugins(); + $all_plugins_paths = array(); + + // Get active plugin's main files real full names (might be symlinks). + foreach ( $all_plugins as $relative_path => &$data ) { + $all_plugins_paths[] = fs_normalize_path( realpath( WP_PLUGIN_DIR . '/' . $relative_path ) ); + } + + $plugin_file = null; + for ( $i = 1, $bt = debug_backtrace(), $len = count( $bt ); $i < $len; $i ++ ) { + if ( empty( $bt[ $i ]['file'] ) ) { + continue; + } + + if ( in_array( fs_normalize_path( $bt[ $i ]['file'] ), $all_plugins_paths ) ) { + $plugin_file = $bt[ $i ]['file']; + break; + } + } + + if ( is_null( $plugin_file ) ) { + // Throw an error to the developer in case of some edge case dev environment. + wp_die( + 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.', + 'Error', + array( 'back_link' => true ) + ); + } + + return $plugin_file; + } + + require_once dirname( __FILE__ ) . '/supplements/fs-essential-functions-1.1.7.1.php'; + + /** + * Update SDK newest version reference. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $sdk_relative_path + * @param string|bool $plugin_file + * + * @global $fs_active_plugins + */ + function fs_update_sdk_newest_version( $sdk_relative_path, $plugin_file = false ) { + /** + * If there is a plugin running an older version of FS (1.2.1 or below), the `fs_update_sdk_newest_version()` + * function in the older version will be used instead of this one. But since the older version is using + * the `is_plugin_active` function to check if a plugin is active, passing the theme's `plugin_path` to the + * `is_plugin_active` function will return false since the path is not a plugin path, so `in_activation` will be + * `true` for theme modules and the upgrading of the SDK version to 1.2.2 or newer version will work fine. + * + * Future versions that will call this function will use the proper logic here instead of just relying on the + * `is_plugin_active` function to fail for themes. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + + global $fs_active_plugins; + + $newest_sdk = $fs_active_plugins->plugins[ $sdk_relative_path ]; + + if ( ! is_string( $plugin_file ) ) { + $plugin_file = plugin_basename( fs_find_caller_plugin_file() ); + } + + if ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) { + $in_activation = ( ! is_plugin_active( $plugin_file ) ); + } else { + $theme = wp_get_theme(); + $in_activation = ( $newest_sdk->plugin_path == $theme->stylesheet ); + } + + $fs_active_plugins->newest = (object) array( + 'plugin_path' => $plugin_file, + 'sdk_path' => $sdk_relative_path, + 'version' => $newest_sdk->version, + 'in_activation' => $in_activation, + 'timestamp' => time(), + ); + + // Update DB with latest SDK version and path. + update_option( 'fs_active_plugins', $fs_active_plugins ); + } + + /** + * Reorder the plugins load order so the plugin with the newest Freemius SDK is loaded first. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @return bool Was plugin order changed. Return false if plugin was loaded first anyways. + * + * @global $fs_active_plugins + */ + function fs_newest_sdk_plugin_first() { + global $fs_active_plugins; + + /** + * @todo Multi-site network activated plugin are always loaded prior to site plugins so if there's a a plugin activated in the network mode that has an older version of the SDK of another plugin which is site activated that has new SDK version, the fs-essential-functions.php will be loaded from the older SDK. Same thing about MU plugins (loaded even before network activated plugins). + * + * @link https://github.com/Freemius/wordpress-sdk/issues/26 + */ + + $newest_sdk_plugin_path = $fs_active_plugins->newest->plugin_path; + + $active_plugins = get_option( 'active_plugins', array() ); + $newest_sdk_plugin_key = array_search( $newest_sdk_plugin_path, $active_plugins ); + if ( 0 === $newest_sdk_plugin_key ) { + // if it's 0 it's the first plugin already, no need to continue + return false; + } else if ( is_numeric( $newest_sdk_plugin_key ) ) { + // Remove plugin from its current position. + array_splice( $active_plugins, $newest_sdk_plugin_key, 1 ); + + // Set it to be included first. + array_unshift( $active_plugins, $newest_sdk_plugin_path ); + + update_option( 'active_plugins', $active_plugins ); + + return true; + } else if ( is_multisite() && false === $newest_sdk_plugin_key ) { + // Plugin is network active. + $network_active_plugins = get_site_option( 'active_sitewide_plugins', array() ); + + if (isset($network_active_plugins[$newest_sdk_plugin_path])) { + reset($network_active_plugins); + if ( $newest_sdk_plugin_path === key($network_active_plugins) ) { + // Plugin is already activated first on the network level. + return false; + } else if ( is_numeric( $newest_sdk_plugin_key ) ) { + $time = $network_active_plugins[$newest_sdk_plugin_path]; + + // Remove plugin from its current position. + unset($network_active_plugins[$newest_sdk_plugin_path]); + + // Set it to be included first. + $network_active_plugins = array($newest_sdk_plugin_path => $time) + $network_active_plugins; + + update_site_option( 'active_sitewide_plugins', $network_active_plugins ); + + return true; + } + } + } + + return false; + } + + /** + * Go over all Freemius SDKs in the system and find and "remember" + * the newest SDK which is associated with an active plugin. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @global $fs_active_plugins + */ + function fs_fallback_to_newest_active_sdk() { + global $fs_active_plugins; + + /** + * @var object $newest_sdk_data + */ + $newest_sdk_data = null; + $newest_sdk_path = null; + + foreach ( $fs_active_plugins->plugins as $sdk_relative_path => $data ) { + if ( is_null( $newest_sdk_data ) || version_compare( $data->version, $newest_sdk_data->version, '>' ) + ) { + // If plugin inactive or SDK starter file doesn't exist, remove SDK reference. + if ( 'plugin' === $data->type ) { + $is_module_active = is_plugin_active( $data->plugin_path ); + } else { + $active_theme = wp_get_theme(); + $is_module_active = ( $data->plugin_path === $active_theme->get_template() ); + } + + $is_sdk_exists = file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $sdk_relative_path . '/start.php' ) ); + + if ( ! $is_module_active || ! $is_sdk_exists ) { + unset( $fs_active_plugins->plugins[ $sdk_relative_path ] ); + + // No need to store the data since it will be stored in fs_update_sdk_newest_version() + // or explicitly with update_option(). + } else { + $newest_sdk_data = $data; + $newest_sdk_path = $sdk_relative_path; + } + } + } + + if ( is_null( $newest_sdk_data ) ) { + // Couldn't find any SDK reference. + $fs_active_plugins = new stdClass(); + update_option( 'fs_active_plugins', $fs_active_plugins ); + } else { + fs_update_sdk_newest_version( $newest_sdk_path, $newest_sdk_data->plugin_path ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-plugin-info-dialog.php b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-plugin-info-dialog.php index dc81b7c35..489bb4c3e 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/fs-plugin-info-dialog.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/fs-plugin-info-dialog.php @@ -1,930 +1,1113 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.6 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - /** - * Class FS_Plugin_Info_Dialog - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - */ - class FS_Plugin_Info_Dialog { - /** - * @since 1.1.7 - * - * @var FS_Logger - */ - private $_logger; - - /** - * @since 1.1.7 - * - * @var Freemius - */ - private $_fs; - - function __construct( Freemius $fs ) { - $this->_fs = $fs; - - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $fs->get_slug() . '_info', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - // Remove default plugin information action. - remove_all_actions( 'install_plugins_pre_plugin-information' ); - - // Override action with custom plugins function for add-ons. - add_action( 'install_plugins_pre_plugin-information', array( &$this, 'install_plugin_information' ) ); - - // Override request for plugin information for Add-ons. - add_filter( - 'fs_plugins_api', - array( &$this, '_get_addon_info_filter' ), - WP_FS__DEFAULT_PRIORITY, 3 ); - } - - /** - * Generate add-on plugin information. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param array $data - * @param string $action - * @param object|null $args - * - * @return array|null - */ - function _get_addon_info_filter( $data, $action = '', $args = null ) { - $this->_logger->entrance(); - - $parent_plugin_id = fs_request_get( 'parent_plugin_id', false ); - - if ( $this->_fs->get_id() != $parent_plugin_id || - ( 'plugin_information' !== $action ) || - ! isset( $args->slug ) - ) { - return $data; - } - - // Find add-on by slug. - $selected_addon = $this->_fs->get_addon_by_slug($args->slug, WP_FS__DEV_MODE); - - if ( false === $selected_addon ) { - return $data; - } - - if ( ! isset( $selected_addon->info ) ) { - // Setup some default info. - $selected_addon->info = new stdClass(); - $selected_addon->info->selling_point_0 = 'Selling Point 1'; - $selected_addon->info->selling_point_1 = 'Selling Point 2'; - $selected_addon->info->selling_point_2 = 'Selling Point 3'; - $selected_addon->info->description = '<p>Tell your users all about your add-on</p>'; - } - - fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); - - $data = $args; - - $is_free = true; - - // Load add-on pricing. - $has_pricing = false; - $has_features = false; - $plans = false; - $plans_result = $this->_fs->get_api_site_or_plugin_scope()->get( "/addons/{$selected_addon->id}/plans.json?type=visible" ); - if ( ! isset( $plans_result->error ) ) { - $plans = $plans_result->plans; - if ( is_array( $plans ) ) { - for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { - $plans[ $i ] = new FS_Plugin_Plan( $plans[ $i ] ); - $plan = $plans[ $i ]; - - $pricing_result = $this->_fs->get_api_site_or_plugin_scope()->get( "/addons/{$selected_addon->id}/plans/{$plan->id}/pricing.json" ); - if ( ! isset( $pricing_result->error ) ) { - // Update plan's pricing. - $plan->pricing = $pricing_result->pricing; - - if ( is_array( $plan->pricing ) && ! empty( $plan->pricing ) ) { - $is_free = false; - - foreach ( $plan->pricing as &$pricing ) { - $pricing = new FS_Pricing( $pricing ); - } - } - - $has_pricing = true; - } - - $features_result = $this->_fs->get_api_site_or_plugin_scope()->get( "/addons/{$selected_addon->id}/plans/{$plan->id}/features.json" ); - if ( ! isset( $features_result->error ) && - is_array( $features_result->features ) && - 0 < count( $features_result->features ) - ) { - // Update plan's pricing. - $plan->features = $features_result->features; - - $has_features = true; - } - } - } - } - - // Fetch latest version from Freemius. - $latest = $this->_fs->_fetch_latest_version( $selected_addon->id ); - - if ( ! $is_free ) { - // If paid add-on, then it's not on wordpress.org - $is_wordpress_org = false; - } else { - // If no versions found, then assume it's a .org plugin. - $is_wordpress_org = ( false === $latest ); - } - - if ( $is_wordpress_org ) { - $repo_data = FS_Plugin_Updater::_fetch_plugin_info_from_repository( - 'plugin_information', (object) array( - 'slug' => $selected_addon->slug, - 'is_ssl' => is_ssl(), - 'fields' => array( - 'banners' => true, - 'reviews' => true, - 'downloaded' => false, - 'active_installs' => true - ) - ) ); - - if ( ! empty( $repo_data ) ) { - $data = $repo_data; - $data->wp_org_missing = false; - } else { - // Couldn't find plugin on .org. - $is_wordpress_org = false; - - // Plugin is missing, not on Freemius nor WP.org. - $data->wp_org_missing = true; - } - } - - if ( ! $is_wordpress_org ) { - $data->checkout_link = $this->_fs->checkout_url(); - $data->fs_missing = ( false === $latest ); - - if ( $is_free ) { - $data->download_link = $this->_fs->_get_latest_download_local_url( $selected_addon->id ); - } - } - - if ( ! $is_wordpress_org ) { -// Fetch as much as possible info from local files. - $plugin_local_data = $this->_fs->get_plugin_data(); - $data->name = $selected_addon->title; - $data->author = $plugin_local_data['Author']; - $view_vars = array( 'plugin' => $selected_addon ); - $data->sections = array( - 'description' => fs_get_template( '/plugin-info/description.php', $view_vars ), - ); - - if ( ! empty( $selected_addon->info->banner_url ) ) { - $data->banners = array( - 'low' => $selected_addon->info->banner_url, - ); - } - - if ( ! empty( $selected_addon->info->screenshots ) ) { - $view_vars = array( - 'screenshots' => $selected_addon->info->screenshots, - 'plugin' => $selected_addon, - ); - $data->sections['screenshots'] = fs_get_template( '/plugin-info/screenshots.php', $view_vars ); - } - - if ( is_object( $latest ) ) { - $data->version = $latest->version; - $data->last_updated = ! is_null( $latest->updated ) ? $latest->updated : $latest->created; - $data->requires = $latest->requires_platform_version; - $data->tested = $latest->tested_up_to_version; - } else { - // Add dummy version. - $data->version = '1.0.0'; - - // Add message to developer to deploy the plugin through Freemius. - } - } - - if ( $has_pricing ) { - // Add plans to data. - $data->plans = $plans; - - if ( $has_features ) { - $view_vars = array( - 'plans' => $plans, - 'plugin' => $selected_addon, - ); - $data->sections['features'] = fs_get_template( '/plugin-info/features.php', $view_vars ); - } - } - - $data->is_paid = ! $is_free; - $data->external = ! $is_wordpress_org; - - return $data; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param FS_Plugin_Plan $plan - * - * @return string - */ - private function get_billing_cycle( FS_Plugin_Plan $plan ) { - $billing_cycle = null; - - if ( 1 === count( $plan->pricing ) && 1 == $plan->pricing[0]->licenses ) { - $pricing = $plan->pricing[0]; - if ( isset( $pricing->annual_price ) ) { - $billing_cycle = 'annual'; - } else if ( isset( $pricing->monthly_price ) ) { - $billing_cycle = 'monthly'; - } else if ( isset( $pricing->lifetime_price ) ) { - $billing_cycle = 'lifetime'; - } - } else { - foreach ( $plan->pricing as $pricing ) { - if ( isset( $pricing->annual_price ) ) { - $billing_cycle = 'annual'; - } else if ( isset( $pricing->monthly_price ) ) { - $billing_cycle = 'monthly'; - } else if ( isset( $pricing->lifetime_price ) ) { - $billing_cycle = 'lifetime'; - } - - if ( ! is_null( $billing_cycle ) ) { - break; - } - } - } - - return $billing_cycle; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param FS_Plugin_Plan $plan - * @param FS_Pricing $pricing - * - * @return float|null|string - */ - private function get_price_tag( FS_Plugin_Plan $plan, FS_Pricing $pricing ) { - $price_tag = ''; - if ( isset( $pricing->annual_price ) ) { - $price_tag = $pricing->annual_price . ( $plan->is_block_features ? ' / year' : '' ); - } else if ( isset( $pricing->monthly_price ) ) { - $price_tag = $pricing->monthly_price . ' / mo'; - } else if ( isset( $pricing->lifetime_price ) ) { - $price_tag = $pricing->lifetime_price; - } - - return '$' . $price_tag; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param object $api - * @param FS_Plugin_Plan|null $plan - * - * @return string - */ - private function get_plugin_cta( $api, $plan = null ) { - if ( ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) ) { - - if ( ! empty( $api->checkout_link ) && isset( $api->plans ) && 0 < is_array( $api->plans ) ) { - if ( is_null( $plan ) ) { - $plan = $api->plans[0]; - } - - return ' <a class="button button-primary right" href="' . $this->_fs->addon_checkout_url( - $plan->plugin_id, - $plan->pricing[0]->id, - $this->get_billing_cycle( $plan ), - $plan->has_trial() - ) . '" target="_parent">' . - ( ! $plan->has_trial() ? - __fs( 'purchase', $api->slug ) : - sprintf( __fs( 'start-free-x', $api->slug ), $this->get_trial_period( $plan ) ) - ) . - '</a>'; - - // @todo Add Cart concept. -// echo ' <a class="button right" href="' . $status['url'] . '" target="_parent">' . __( 'Add to Cart' ) . '</a>'; - - } else if ( ! empty( $api->download_link ) ) { - $status = install_plugin_install_status( $api ); - - // Hosted on WordPress.org. - switch ( $status['status'] ) { - case 'install': - if ( $api->external && - $this->_fs->is_org_repo_compliant() || - ! $this->_fs->is_premium() - ) { - /** - * Add-on hosted on Freemius, not yet installed, and core - * plugin is wordpress.org compliant. Therefore, require a download - * since installing external plugins is not allowed by the wp.org guidelines. - */ - return ' <a class="button button-primary right" href="' . esc_url( $api->download_link ) . '" target="_blank">' . __fs( 'download-latest', $api->slug ) . '</a>'; - } else { - if ( $status['url'] ) { - return '<a class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __( 'Install Now' ) . '</a>'; - } - } - break; - case 'update_available': - if ( $status['url'] ) { - return '<a class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __( 'Install Update Now' ) . '</a>'; - } - break; - case 'newer_installed': - return '<a class="button button-primary right disabled">' . sprintf( __( 'Newer Version (%s) Installed' ), $status['version'] ) . '</a>'; - break; - case 'latest_installed': - return '<a class="button button-primary right disabled">' . __( 'Latest Version Installed' ) . '</a>'; - break; - } - - } - } - - return ''; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.7 - * - * @param FS_Plugin_Plan $plan - * - * @return string - */ - private function get_trial_period( $plan ) { - $trial_period = (int) $plan->trial_period; - - switch ( $trial_period ) { - case 30: - return 'month'; - case 60: - return '2 months'; - default: - return "{$plan->trial_period} days"; - } - } - - /** - * Display plugin information in dialog box form. - * - * Based on core install_plugin_information() function. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - */ - function install_plugin_information() { - global $tab; - - if ( empty( $_REQUEST['plugin'] ) ) { - return; - } - - $args = array( - 'slug' => wp_unslash( $_REQUEST['plugin'] ), - 'is_ssl' => is_ssl(), - 'fields' => array( - 'banners' => true, - 'reviews' => true, - 'downloaded' => false, - 'active_installs' => true - ) - ); - - if ( is_array( $args ) ) { - $args = (object) $args; - } - - if ( ! isset( $args->per_page ) ) { - $args->per_page = 24; - } - - if ( ! isset( $args->locale ) ) { - $args->locale = get_locale(); - } - - $api = apply_filters( 'fs_plugins_api', false, 'plugin_information', $args ); - - if ( is_wp_error( $api ) ) { - wp_die( $api ); - } - - $plugins_allowedtags = array( - 'a' => array( - 'href' => array(), - 'title' => array(), - 'target' => array(), - // Add image style for screenshots. - 'class' => array() - ), - 'style' => array(), - 'abbr' => array( 'title' => array() ), - 'acronym' => array( 'title' => array() ), - 'code' => array(), - 'pre' => array(), - 'em' => array(), - 'strong' => array(), - 'div' => array( 'class' => array() ), - 'span' => array( 'class' => array() ), - 'p' => array(), - 'ul' => array(), - 'ol' => array(), - 'li' => array( 'class' => array() ), - 'i' => array( 'class' => array() ), - 'h1' => array(), - 'h2' => array(), - 'h3' => array(), - 'h4' => array(), - 'h5' => array(), - 'h6' => array(), - 'img' => array( 'src' => array(), 'class' => array(), 'alt' => array() ), -// 'table' => array(), -// 'td' => array(), -// 'tr' => array(), -// 'th' => array(), -// 'thead' => array(), -// 'tbody' => array(), - ); - - $plugins_section_titles = array( - 'description' => _x( 'Description', 'Plugin installer section title' ), - 'installation' => _x( 'Installation', 'Plugin installer section title' ), - 'faq' => _x( 'FAQ', 'Plugin installer section title' ), - 'screenshots' => _x( 'Screenshots', 'Plugin installer section title' ), - 'changelog' => _x( 'Changelog', 'Plugin installer section title' ), - 'reviews' => _x( 'Reviews', 'Plugin installer section title' ), - 'other_notes' => _x( 'Other Notes', 'Plugin installer section title' ), - ); - - // Sanitize HTML -// foreach ( (array) $api->sections as $section_name => $content ) { -// $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); -// } - - foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) { - if ( isset( $api->$key ) ) { - $api->$key = wp_kses( $api->$key, $plugins_allowedtags ); - } - } - - // Add after $api->slug is ready. - $plugins_section_titles['features'] = __fs( 'features-and-pricing', $api->slug ); - - $_tab = esc_attr( $tab ); - - $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; // Default to the Description tab, Do not translate, API returns English. - if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { - $section_titles = array_keys( (array) $api->sections ); - $section = array_shift( $section_titles ); - } - - iframe_header( __( 'Plugin Install' ) ); - - $_with_banner = ''; - -// var_dump($api->banners); - if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) { - $_with_banner = 'with-banner'; - $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; - $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; - ?> - <style type="text/css"> - #plugin-information-title.with-banner - { - background-image: url( <?php echo esc_url( $low ); ?> ); - } - - @media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) - { - #plugin-information-title.with-banner - { - background-image: url( <?php echo esc_url( $high ); ?> ); - } - } - </style> - <?php - } - - echo '<div id="plugin-information-scrollable">'; - echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>"; - echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n"; - - foreach ( (array) $api->sections as $section_name => $content ) { - if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) { - continue; - } - - if ( isset( $plugins_section_titles[ $section_name ] ) ) { - $title = $plugins_section_titles[ $section_name ]; - } else { - $title = ucwords( str_replace( '_', ' ', $section_name ) ); - } - - $class = ( $section_name === $section ) ? ' class="current"' : ''; - $href = add_query_arg( array( 'tab' => $tab, 'section' => $section_name ) ); - $href = esc_url( $href ); - $san_section = esc_attr( $section_name ); - echo "\t<a name='$san_section' href='$href' $class>$title</a>\n"; - } - - echo "</div>\n"; - - ?> - <div id="<?php echo $_tab; ?>-content" class='<?php echo $_with_banner; ?>'> - <div class="fyi"> - <?php if ( $api->is_paid ) : ?> - <?php if ( isset( $api->plans ) ) : ?> - <div class="plugin-information-pricing"> - <?php foreach ( $api->plans as $plan ) : ?> - <?php - /** - * @var FS_Plugin_Plan $plan - */ - ?> - <?php $first_pricing = $plan->pricing[0] ?> - <?php $is_multi_cycle = $first_pricing->is_multi_cycle() ?> - <div class="fs-plan<?php if ( ! $is_multi_cycle ) { - echo ' fs-single-cycle'; - } ?>" data-plan-id="<?php echo $plan->id ?>"> - <h3 data-plan="<?php echo $plan->id ?>"><?php printf( __fs( 'x-plan', $api->slug ), $plan->title ) ?></h3> - <?php $has_annual = $first_pricing->has_annual() ?> - <?php $has_monthly = $first_pricing->has_monthly() ?> - <div class="nav-tab-wrapper"> - <?php $billing_cycles = array( 'monthly', 'annual', 'lifetime' ) ?> - <?php $i = 0; - foreach ( $billing_cycles as $cycle ) : ?> - <?php $prop = "{$cycle}_price"; - if ( isset( $first_pricing->{$prop} ) ) : ?> - <?php $is_featured = ( 'annual' === $cycle && $is_multi_cycle ) ?> - <?php - $prices = array(); - foreach ( $plan->pricing as $pricing ) { - if ( isset( $pricing->{$prop} ) ) { - $prices[] = array( - 'id' => $pricing->id, - 'licenses' => $pricing->licenses, - 'price' => $pricing->{$prop} - ); - } - } - ?> - <a class="nav-tab" data-billing-cycle="<?php echo $cycle ?>" - data-pricing="<?php echo esc_attr( json_encode( $prices ) ) ?>"> - <?php if ( $is_featured ) : ?> - <label>★ <?php _efs( 'best', $api->slug ) ?> ★</label> - <?php endif ?> - <?php _efs( $cycle, $api->slug ) ?> - </a> - <?php endif ?> - <?php $i ++; endforeach ?> - <?php wp_enqueue_script( 'jquery' ) ?> - <script type="text/javascript"> - (function ($, undef) { - var - _formatBillingFrequency = function (cycle) { - switch (cycle) { - case 'monthly': - return '<?php printf(__fs('billed-x', $api->slug), __fs('monthly', $api->slug)) ?>'; - case 'annual': - return '<?php printf(__fs('billed-x', $api->slug), __fs('annually', $api->slug)) ?>'; - case 'lifetime': - return '<?php printf(__fs('billed-x', $api->slug), __fs('once', $api->slug)) ?>'; - } - }, - _formatLicensesTitle = function (pricing) { - switch (pricing.licenses) { - case 1: - return '<?php _efs( 'license-single-site', $api->slug ) ?>'; - case null: - return '<?php _efs( 'license-unlimited', $api->slug ) ?>'; - default: - return '<?php _efs( 'license-x-sites', $api->slug ) ?>'.replace('%s', pricing.licenses); - } - }, - _formatPrice = function (pricing, cycle, multipleLicenses) { - if (undef === multipleLicenses) - multipleLicenses = true; - - var priceCycle; - switch (cycle) { - case 'monthly': - priceCycle = ' / <?php _efs('mo', $api->slug) ?>'; - break; - case 'lifetime': - priceCycle = ''; - break; - case 'annual': - default: - priceCycle = ' / <?php _efs('year', $api->slug) ?>'; - break; - } - - if (!multipleLicenses && 1 == pricing.licenses) { - return '$' + pricing.price + priceCycle; - } - - return _formatLicensesTitle(pricing) + ' - <var class="fs-price">$' + pricing.price + priceCycle + '</var>'; - }, - _checkoutUrl = function (plan, pricing, cycle) { - return '<?php echo esc_url_raw(remove_query_arg('billing_cycle', add_query_arg(array('plugin_id' => $plan->plugin_id), $api->checkout_link))) ?>' + - '&plan_id=' + plan + - '&pricing_id=' + pricing + - '&billing_cycle=' + cycle<?php if ($plan->has_trial()) { echo " + '&trial=true'"; }?>; - }, - _updateCtaUrl = function (plan, pricing, cycle) { - $('.plugin-information-pricing .button, #plugin-information-footer .button').attr('href', _checkoutUrl(plan, pricing, cycle)); - }; - - $(document).ready(function () { - var $plan = $('.plugin-information-pricing .fs-plan[data-plan-id=<?php echo $plan->id ?>]'); - $plan.find('input[type=radio]').live('click', function () { - _updateCtaUrl( - $plan.attr('data-plan-id'), - $(this).val(), - $plan.find('.nav-tab-active').attr('data-billing-cycle') - ); - - $plan.find('.fs-trial-terms .fs-price').html( - $(this).parents('label').find('.fs-price').html() - ); - }); - - $plan.find('.nav-tab').click(function () { - if ($(this).hasClass('nav-tab-active')) - return; - - var $this = $(this), - billingCycle = $this.attr('data-billing-cycle'), - pricing = JSON.parse($this.attr('data-pricing')), - $pricesList = $this.parents('.fs-plan').find('.fs-pricing-body .fs-licenses'), - html = ''; - - // Un-select previously selected tab. - $plan.find('.nav-tab').removeClass('nav-tab-active'); - - // Select current tab. - $this.addClass('nav-tab-active'); - - // Render licenses prices. - if (1 == pricing.length) { - html = '<li><label><?php _efs( 'price', $api->slug ) ?>: ' + _formatPrice(pricing[0], billingCycle, false) + '</label></li>'; - } else { - for (var i = 0; i < pricing.length; i++) { - html += '<li><label><input name="pricing-<?php echo $plan->id ?>" type="radio" value="' + pricing[i].id + '">' + _formatPrice(pricing[i], billingCycle) + '</label></li>'; - } - } - $pricesList.html(html); - - if (1 < pricing.length) { - // Select first license option. - $pricesList.find('li:first input').click(); - } - else { - _updateCtaUrl( - $plan.attr('data-plan-id'), - pricing[0].id, - billingCycle - ); - } - - // Update billing frequency. - $plan.find('.fs-billing-frequency').html(_formatBillingFrequency(billingCycle)); - - if ('annual' === billingCycle) { - $plan.find('.fs-annual-discount').show(); - } else { - $plan.find('.fs-annual-discount').hide(); - } - }); - - <?php if ( $has_annual ) : ?> - // Select annual by default. - $plan.find('.nav-tab[data-billing-cycle=annual]').click(); - <?php else : ?> - // Select first tab. - $plan.find('.nav-tab:first').click(); - <?php endif ?> - }); - }(jQuery)); - </script> - </div> - <div class="fs-pricing-body"> - <span class="fs-billing-frequency"></span> - <?php $annual_discount = ( $has_annual && $has_monthly ) ? $plan->pricing[0]->annual_discount_percentage() : 0 ?> - <?php if ( $annual_discount > 0 ) : ?> - <span - class="fs-annual-discount"><?php printf( __fs( 'save-x', $api->slug ), $annual_discount . '%' ) ?></span> - <?php endif ?> - <ul class="fs-licenses"> - </ul> - <?php echo $this->get_plugin_cta( $api, $plan ) ?> - <div style="clear:both"></div> - <?php if ( $plan->has_trial() ) : ?> - <?php $trial_period = $this->get_trial_period( $plan ) ?> - <ul class="fs-trial-terms"> - <li> - <i class="dashicons dashicons-yes"></i><?php printf( __fs( 'no-commitment-x', $api->slug ), $trial_period ) ?> - </li> - <li> - <i class="dashicons dashicons-yes"></i><?php printf( __fs( 'after-x-pay-as-little-y', $api->slug ), $trial_period, '<var class="fs-price">' . $this->get_price_tag( $plan, $plan->pricing[0] ) . '</var>' ) ?> - </li> - </ul> - <?php endif ?> - </div> - </div> - </div> - <?php endforeach ?> - <?php endif ?> - <?php endif ?> - <div> - <h3><?php _efs( 'details', $api->slug ) ?></h3> - <ul> - <?php if ( ! empty( $api->version ) ) { ?> - <li><strong><?php _e( 'Version:' ); ?></strong> <?php echo $api->version; ?></li> - <?php - } - if ( ! empty( $api->author ) ) { - ?> - <li> - <strong><?php _e( 'Author:' ); ?></strong> <?php echo links_add_target( $api->author, '_blank' ); ?> - </li> - <?php - } - if ( ! empty( $api->last_updated ) ) { - ?> - <li><strong><?php _e( 'Last Updated:' ); ?></strong> <span - title="<?php echo $api->last_updated; ?>"> - <?php printf( __( '%s ago' ), human_time_diff( strtotime( $api->last_updated ) ) ); ?> - </span></li> - <?php - } - if ( ! empty( $api->requires ) ) { - ?> - <li> - <strong><?php _e( 'Requires WordPress Version:' ); ?></strong> <?php printf( __( '%s or higher' ), $api->requires ); ?> - </li> - <?php - } - if ( ! empty( $api->tested ) ) { - ?> - <li><strong><?php _e( 'Compatible up to:' ); ?></strong> <?php echo $api->tested; ?> - </li> - <?php - } - if ( ! empty( $api->downloaded ) ) { - ?> - <li> - <strong><?php _e( 'Downloaded:' ); ?></strong> <?php printf( _n( '%s time', '%s times', $api->downloaded ), number_format_i18n( $api->downloaded ) ); ?> - </li> - <?php - } - if ( ! empty( $api->slug ) && empty( $api->external ) ) { - ?> - <li><a target="_blank" - href="https://wordpress.org/plugins/<?php echo $api->slug; ?>/"><?php _e( 'WordPress.org Plugin Page »' ); ?></a> - </li> - <?php - } - if ( ! empty( $api->homepage ) ) { - ?> - <li><a target="_blank" - href="<?php echo esc_url( $api->homepage ); ?>"><?php _e( 'Plugin Homepage »' ); ?></a> - </li> - <?php - } - if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { - ?> - <li><a target="_blank" - href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin »' ); ?></a> - </li> - <?php } ?> - </ul> - </div> - <?php if ( ! empty( $api->rating ) ) { ?> - <h3><?php _e( 'Average Rating' ); ?></h3> - <?php wp_star_rating( array( - 'rating' => $api->rating, - 'type' => 'percent', - 'number' => $api->num_ratings - ) ); ?> - <small><?php printf( _n( '(based on %s rating)', '(based on %s ratings)', $api->num_ratings ), number_format_i18n( $api->num_ratings ) ); ?></small> - <?php - } - - if ( ! empty( $api->ratings ) && array_sum( (array) $api->ratings ) > 0 ) { - foreach ( $api->ratings as $key => $ratecount ) { - // Avoid div-by-zero. - $_rating = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0; - ?> - <div class="counter-container"> - <span class="counter-label"><a - href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?>?filter=<?php echo $key; ?>" - target="_blank" - title="<?php echo esc_attr( sprintf( _n( 'Click to see reviews that provided a rating of %d star', 'Click to see reviews that provided a rating of %d stars', $key ), $key ) ); ?>"><?php printf( _n( '%d star', '%d stars', $key ), $key ); ?></a></span> - <span class="counter-back"> - <span class="counter-bar" style="width: <?php echo 92 * $_rating; ?>px;"></span> - </span> - <span class="counter-count"><?php echo number_format_i18n( $ratecount ); ?></span> - </div> - <?php - } - } - if ( ! empty( $api->contributors ) ) { - ?> - <h3><?php _e( 'Contributors' ); ?></h3> - <ul class="contributors"> - <?php - foreach ( (array) $api->contributors as $contrib_username => $contrib_profile ) { - if ( empty( $contrib_username ) && empty( $contrib_profile ) ) { - continue; - } - if ( empty( $contrib_username ) ) { - $contrib_username = preg_replace( '/^.+\/(.+)\/?$/', '\1', $contrib_profile ); - } - $contrib_username = sanitize_user( $contrib_username ); - if ( empty( $contrib_profile ) ) { - echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</li>"; - } else { - echo "<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</a></li>"; - } - } - ?> - </ul> - <?php if ( ! empty( $api->donate_link ) ) { ?> - <a target="_blank" - href="<?php echo esc_url( $api->donate_link ); ?>"><?php _e( 'Donate to this plugin »' ); ?></a> - <?php } ?> - <?php } ?> - </div> - <div id="section-holder" class="wrap"> - <?php - if ( ! empty( $api->tested ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->tested ) ), $api->tested, '>' ) ) { - echo '<div class="notice notice-warning"><p>' . '<strong>' . __( 'Warning:' ) . '</strong> ' . __( 'This plugin has not been tested with your current version of WordPress.' ) . '</p></div>'; - } else if ( ! empty( $api->requires ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->requires ) ), $api->requires, '<' ) ) { - echo '<div class="notice notice-warning"><p>' . '<strong>' . __( 'Warning:' ) . '</strong> ' . __( 'This plugin has not been marked as compatible with your version of WordPress.' ) . '</p></div>'; - } - - foreach ( (array) $api->sections as $section_name => $content ) { - $content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' ); - $content = links_add_target( $content, '_blank' ); - - $san_section = esc_attr( $section_name ); - - $display = ( $section_name === $section ) ? 'block' : 'none'; - - if ( 'description' === $section_name && - ( ( ! $api->external && $api->wp_org_missing ) || - ( $api->external && $api->fs_missing ) ) - ) { - $missing_notice = array( - 'type' => 'error', - 'id' => md5( microtime() ), - 'message' => __fs( ( $api->is_paid ? 'paid-addon-not-deployed' : 'free-addon-not-deployed' ), $api->slug ), - ); - fs_require_template( 'admin-notice.php', $missing_notice ); - } - echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n"; - echo $content; - echo "\t</div>\n"; - } - echo "</div>\n"; - echo "</div>\n"; - echo "</div>\n"; // #plugin-information-scrollable - echo "<div id='$tab-footer'>\n"; - - echo $this->get_plugin_cta( $api ); - - echo "</div>\n"; - - iframe_footer(); - exit; -} - } +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.6 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Class FS_Plugin_Info_Dialog + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + */ + class FS_Plugin_Info_Dialog { + /** + * @since 1.1.7 + * + * @var FS_Logger + */ + private $_logger; + + /** + * @since 1.1.7 + * + * @var Freemius + */ + private $_fs; + + function __construct( Freemius $fs ) { + $this->_fs = $fs; + + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $fs->get_slug() . '_info', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + // Remove default plugin information action. + remove_all_actions( 'install_plugins_pre_plugin-information' ); + + // Override action with custom plugins function for add-ons. + add_action( 'install_plugins_pre_plugin-information', array( &$this, 'install_plugin_information' ) ); + + // Override request for plugin information for Add-ons. + add_filter( + 'fs_plugins_api', + array( &$this, '_get_addon_info_filter' ), + WP_FS__DEFAULT_PRIORITY, 3 ); + } + + /** + * Generate add-on plugin information. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param array $data + * @param string $action + * @param object|null $args + * + * @return array|null + */ + function _get_addon_info_filter( $data, $action = '', $args = null ) { + $this->_logger->entrance(); + + $parent_plugin_id = fs_request_get( 'parent_plugin_id', false ); + + if ( $this->_fs->get_id() != $parent_plugin_id || + ( 'plugin_information' !== $action ) || + ! isset( $args->slug ) + ) { + return $data; + } + + // Find add-on by slug. + $selected_addon = $this->_fs->get_addon_by_slug( $args->slug, WP_FS__DEV_MODE ); + + if ( false === $selected_addon ) { + return $data; + } + + if ( ! isset( $selected_addon->info ) ) { + // Setup some default info. + $selected_addon->info = new stdClass(); + $selected_addon->info->selling_point_0 = 'Selling Point 1'; + $selected_addon->info->selling_point_1 = 'Selling Point 2'; + $selected_addon->info->selling_point_2 = 'Selling Point 3'; + $selected_addon->info->description = '<p>Tell your users all about your add-on</p>'; + } + + fs_enqueue_local_style( 'fs_addons', '/admin/add-ons.css' ); + + $data = $args; + + $has_free_plan = false; + $has_paid_plan = false; + + // Load add-on pricing. + $has_pricing = false; + $has_features = false; + $plans = false; + + $result = $this->_fs->get_api_plugin_scope()->get( $this->_fs->add_show_pending( "/addons/{$selected_addon->id}/pricing.json?type=visible" ) ); + + if ( ! isset( $result->error ) ) { + $plans = $result->plans; + + if ( is_array( $plans ) ) { + for ( $i = 0, $len = count( $plans ); $i < $len; $i ++ ) { + $pricing = isset( $plans[ $i ]->pricing ) ? $plans[ $i ]->pricing : null; + $features = isset( $plans[ $i ]->features ) ? $plans[ $i ]->features : null; + + $plans[ $i ] = new FS_Plugin_Plan( $plans[ $i ] ); + $plan = $plans[ $i ]; + + if ( 'free' == $plans[ $i ]->name || + ! is_array( $pricing ) || + 0 == count( $pricing ) + ) { + $has_free_plan = true; + } + + if ( is_array( $pricing ) && 0 < count( $pricing ) ) { + $has_paid_plan = true; + + foreach ( $pricing as &$prices ) { + $prices = new FS_Pricing( $prices ); + } + + $plan->pricing = $pricing; + + $has_pricing = true; + } + + if ( is_array( $features ) && 0 < count( $features ) ) { + $plan->features = $features; + + $has_features = true; + } + } + } + } + + if ( ! $has_paid_plan && $selected_addon->is_wp_org_compliant ) { + $repo_data = FS_Plugin_Updater::_fetch_plugin_info_from_repository( + 'plugin_information', (object) array( + 'slug' => $selected_addon->slug, + 'is_ssl' => is_ssl(), + 'fields' => array( + 'banners' => true, + 'reviews' => true, + 'downloaded' => false, + 'active_installs' => true + ) + ) ); + + if ( ! empty( $repo_data ) ) { + $data = $repo_data; + $data->wp_org_missing = false; + } else { + // Couldn't find plugin on .org. + $selected_addon->is_wp_org_compliant = false; + + // Plugin is missing, not on Freemius nor WP.org. + $data->wp_org_missing = true; + } + + $data->fs_missing = ( ! $has_free_plan || $data->wp_org_missing ); + } else { + $data->wp_org_missing = false; + + // Fetch latest version from Freemius. + $latest = $this->_fs->_fetch_latest_version( $selected_addon->id ); + + if ( $has_paid_plan ) { + $data->checkout_link = $this->_fs->checkout_url(); + } + if ( $has_free_plan ) { + $data->download_link = $this->_fs->_get_latest_download_local_url( $selected_addon->id ); + } + + $data->fs_missing = ( false === $latest ); + + + // Fetch as much as possible info from local files. + $plugin_local_data = $this->_fs->get_plugin_data(); + $data->author = $plugin_local_data['Author']; + + if ( ! empty( $selected_addon->info->banner_url ) ) { + $data->banners = array( + 'low' => $selected_addon->info->banner_url, + ); + } + + if ( ! empty( $selected_addon->info->screenshots ) ) { + $view_vars = array( + 'screenshots' => $selected_addon->info->screenshots, + 'plugin' => $selected_addon, + ); + $data->sections['screenshots'] = fs_get_template( '/plugin-info/screenshots.php', $view_vars ); + } + + if ( is_object( $latest ) ) { + $data->version = $latest->version; + $data->last_updated = $latest->created; + $data->requires = $latest->requires_platform_version; + $data->tested = $latest->tested_up_to_version; + } else { + // Add dummy version. + $data->version = '1.0.0'; + + // Add message to developer to deploy the plugin through Freemius. + } + } + + $data->name = $selected_addon->title; + $view_vars = array( 'plugin' => $selected_addon ); + $data->sections = array( + 'description' => fs_get_template( '/plugin-info/description.php', $view_vars ), + ); + + if ( $has_pricing ) { + // Add plans to data. + $data->plans = $plans; + + if ( $has_features ) { + $view_vars = array( + 'plans' => $plans, + 'plugin' => $selected_addon, + ); + $data->sections['features'] = fs_get_template( '/plugin-info/features.php', $view_vars ); + } + } + + $data->has_free_plan = $has_free_plan; + $data->has_paid_plan = $has_paid_plan; + $data->is_paid = $has_paid_plan; + $data->is_wp_org_compliant = $selected_addon->is_wp_org_compliant; + + return $data; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param FS_Plugin_Plan $plan + * + * @return string + */ + private function get_billing_cycle( FS_Plugin_Plan $plan ) { + $billing_cycle = null; + + if ( 1 === count( $plan->pricing ) && 1 == $plan->pricing[0]->licenses ) { + $pricing = $plan->pricing[0]; + if ( isset( $pricing->annual_price ) ) { + $billing_cycle = 'annual'; + } else if ( isset( $pricing->monthly_price ) ) { + $billing_cycle = 'monthly'; + } else if ( isset( $pricing->lifetime_price ) ) { + $billing_cycle = 'lifetime'; + } + } else { + foreach ( $plan->pricing as $pricing ) { + if ( isset( $pricing->annual_price ) ) { + $billing_cycle = 'annual'; + } else if ( isset( $pricing->monthly_price ) ) { + $billing_cycle = 'monthly'; + } else if ( isset( $pricing->lifetime_price ) ) { + $billing_cycle = 'lifetime'; + } + + if ( ! is_null( $billing_cycle ) ) { + break; + } + } + } + + return $billing_cycle; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param FS_Plugin_Plan $plan + * @param FS_Pricing $pricing + * + * @return float|null|string + */ + private function get_price_tag( FS_Plugin_Plan $plan, FS_Pricing $pricing ) { + $price_tag = ''; + if ( isset( $pricing->annual_price ) ) { + $price_tag = $pricing->annual_price . ( $plan->is_block_features ? ' / year' : '' ); + } else if ( isset( $pricing->monthly_price ) ) { + $price_tag = $pricing->monthly_price . ' / mo'; + } else if ( isset( $pricing->lifetime_price ) ) { + $price_tag = $pricing->lifetime_price; + } + + return '$' . $price_tag; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param object $api + * @param FS_Plugin_Plan $plan + * + * @return string + */ + private function get_checkout_cta( $api, $plan = null ) { + if ( empty( $api->checkout_link ) || + ! isset( $api->plans ) || + ! is_array( $api->plans ) || + 0 == count( $api->plans ) + ) { + return ''; + } + + if ( is_null( $plan ) ) { + foreach ( $api->plans as $p ) { + if ( ! empty( $p->pricing ) ) { + $plan = $p; + break; + } + } + } + + return '<a class="button button-primary fs-checkout-button right" href="' . $this->_fs->addon_checkout_url( + $plan->plugin_id, + $plan->pricing[0]->id, + $this->get_billing_cycle( $plan ), + $plan->has_trial() + ) . '" target="_parent">' . + ( ! $plan->has_trial() ? + fs_text_x_inline( 'Purchase', 'verb', 'purchase', $api->slug ) : + sprintf( + /* translators: %s: N-days trial */ + fs_text_inline( 'Start my free %s', 'start-free-x', $api->slug ), + $this->get_trial_period( $plan ) + ) + ) . + '</a>'; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param object $api + * @param bool $is_primary + * + * @return string + */ + private function get_download_cta( $api, $is_primary = true ) { + if ( empty( $api->download_link ) ) { + return ''; + } + + $status = install_plugin_install_status( $api ); + + $has_paid_version = $api->has_paid_plan; + + // Hosted on WordPress.org. + switch ( $status['status'] ) { + case 'install': + if ( $api->is_wp_org_compliant || + ! $this->_fs->is_org_repo_compliant() || + $this->_fs->is_premium() + ) { + /** + * Allow immediate installation if one of the following: + * 1. WordPress.org add-on. + * 2. The core module is NOT wp.org compliant. + * 3. The core module is running the premium version which is not wp.org compliant. + */ + if ( $status['url'] ) { + return $this->get_cta( + ( $has_paid_version ? + fs_esc_html_inline( 'Install Free Version Now', 'install-free-version-now', $api->slug ) : + fs_esc_html_inline( 'Install Now', 'install-now', $api->slug ) ), + $is_primary, + false, + $status['url'], + '_parent' + ); + } + } + + return $this->get_cta( + ( $has_paid_version ? + fs_esc_html_x_inline( 'Download Latest Free Version', 'as download latest version', 'download-latest-free-version', $api->slug ) : + fs_esc_html_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $api->slug ) ), + $is_primary, + false, + esc_url( $api->download_link ) + ); + break; + case 'update_available': + if ( $status['url'] ) { + return $this->get_cta( + ( $has_paid_version ? + fs_esc_html_inline( 'Install Free Version Update Now', 'install-free-version-update-now', $api->slug ) : + fs_esc_html_inline( 'Install Update Now', 'install-update-now', $api->slug ) ), + $is_primary, + false, + $status['url'], + '_parent' + ); + } + break; + case 'newer_installed': + return $this->get_cta( + ( $has_paid_version ? + esc_html( sprintf( fs_text_inline( 'Newer Free Version (%s) Installed', 'newer-free-installed', $api->slug ), $status['version'] ) ) : + esc_html( sprintf( fs_text_inline( 'Newer Version (%s) Installed', 'newer-installed', $api->slug ), $status['version'] ) ) ), + $is_primary, + true + ); + break; + case 'latest_installed': + return $this->get_cta( + ( $has_paid_version ? + fs_esc_html_inline( 'Latest Free Version Installed', 'latest-free-installed', $api->slug ) : + fs_esc_html_inline( 'Latest Version Installed', 'latest-installed', $api->slug ) ), + $is_primary, + true + ); + break; + } + + return ''; + } + + /** + * Helper method to get a CTA button HTML. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $label + * @param bool $is_primary + * @param bool $is_disabled + * @param string $href + * @param string $target + * + * @return string + */ + private function get_cta( + $label, + $is_primary = true, + $is_disabled = false, + $href = '', + $target = '_blank' + ) { + $classes = array(); + + if ( ! $is_primary ) { + $classes[] = 'left'; + } else { + $classes[] = 'button-primary'; + $classes[] = 'right'; + } + + if ( $is_disabled ) { + $classes[] = 'disabled'; + } + + return sprintf( + '<a %s class="button %s">%s</a>', + empty( $href ) ? '' : 'href="' . $href . '" target="' . $target . '"', + implode( ' ', $classes ), + $label + ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.7 + * + * @param FS_Plugin_Plan $plan + * + * @return string + */ + private function get_trial_period( $plan ) { + $trial_period = (int) $plan->trial_period; + + switch ( $trial_period ) { + case 30: + return 'month'; + case 60: + return '2 months'; + default: + return "{$plan->trial_period} days"; + } + } + + /** + * Display plugin information in dialog box form. + * + * Based on core install_plugin_information() function. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + */ + function install_plugin_information() { + global $tab; + + if ( empty( $_REQUEST['plugin'] ) ) { + return; + } + + $args = array( + 'slug' => wp_unslash( $_REQUEST['plugin'] ), + 'is_ssl' => is_ssl(), + 'fields' => array( + 'banners' => true, + 'reviews' => true, + 'downloaded' => false, + 'active_installs' => true + ) + ); + + if ( is_array( $args ) ) { + $args = (object) $args; + } + + if ( ! isset( $args->per_page ) ) { + $args->per_page = 24; + } + + if ( ! isset( $args->locale ) ) { + $args->locale = get_locale(); + } + + $api = apply_filters( 'fs_plugins_api', false, 'plugin_information', $args ); + + if ( is_wp_error( $api ) ) { + wp_die( $api ); + } + + $plugins_allowedtags = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'target' => array(), + // Add image style for screenshots. + 'class' => array() + ), + 'style' => array(), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'div' => array( 'class' => array() ), + 'span' => array( 'class' => array() ), + 'p' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array( 'class' => array() ), + 'i' => array( 'class' => array() ), + 'h1' => array(), + 'h2' => array(), + 'h3' => array(), + 'h4' => array(), + 'h5' => array(), + 'h6' => array(), + 'img' => array( 'src' => array(), 'class' => array(), 'alt' => array() ), +// 'table' => array(), +// 'td' => array(), +// 'tr' => array(), +// 'th' => array(), +// 'thead' => array(), +// 'tbody' => array(), + ); + + $plugins_section_titles = array( + 'description' => fs_text_x_inline( 'Description', 'Plugin installer section title', 'description', $api->slug ), + 'installation' => fs_text_x_inline( 'Installation', 'Plugin installer section title', 'installation', $api->slug ), + 'faq' => fs_text_x_inline( 'FAQ', 'Plugin installer section title', 'faq', $api->slug ), + 'screenshots' => fs_text_inline( 'Screenshots', 'screenshots', $api->slug ), + 'changelog' => fs_text_x_inline( 'Changelog', 'Plugin installer section title', 'changelog', $api->slug ), + 'reviews' => fs_text_x_inline( 'Reviews', 'Plugin installer section title', 'reviews', $api->slug ), + 'other_notes' => fs_text_x_inline( 'Other Notes', 'Plugin installer section title', 'other-notes', $api->slug ), + ); + + // Sanitize HTML +// foreach ( (array) $api->sections as $section_name => $content ) { +// $api->sections[$section_name] = wp_kses( $content, $plugins_allowedtags ); +// } + + foreach ( array( 'version', 'author', 'requires', 'tested', 'homepage', 'downloaded', 'slug' ) as $key ) { + if ( isset( $api->$key ) ) { + $api->$key = wp_kses( $api->$key, $plugins_allowedtags ); + } + } + + // Add after $api->slug is ready. + $plugins_section_titles['features'] = fs_text_x_inline( 'Features & Pricing', 'Plugin installer section title', 'features-and-pricing', $api->slug ); + + $_tab = esc_attr( $tab ); + + $section = isset( $_REQUEST['section'] ) ? wp_unslash( $_REQUEST['section'] ) : 'description'; // Default to the Description tab, Do not translate, API returns English. + if ( empty( $section ) || ! isset( $api->sections[ $section ] ) ) { + $section_titles = array_keys( (array) $api->sections ); + $section = array_shift( $section_titles ); + } + + iframe_header( fs_text_inline( 'Plugin Install', 'plugin-install', $api->slug ) ); + + $_with_banner = ''; + +// var_dump($api->banners); + if ( ! empty( $api->banners ) && ( ! empty( $api->banners['low'] ) || ! empty( $api->banners['high'] ) ) ) { + $_with_banner = 'with-banner'; + $low = empty( $api->banners['low'] ) ? $api->banners['high'] : $api->banners['low']; + $high = empty( $api->banners['high'] ) ? $api->banners['low'] : $api->banners['high']; + ?> + <style type="text/css"> + #plugin-information-title.with-banner + { + background-image: url( <?php echo esc_url( $low ); ?> ); + } + + @media only screen and ( -webkit-min-device-pixel-ratio: 1.5 ) + { + #plugin-information-title.with-banner + { + background-image: url( <?php echo esc_url( $high ); ?> ); + } + } + </style> + <?php + } + + echo '<div id="plugin-information-scrollable">'; + echo "<div id='{$_tab}-title' class='{$_with_banner}'><div class='vignette'></div><h2>{$api->name}</h2></div>"; + echo "<div id='{$_tab}-tabs' class='{$_with_banner}'>\n"; + + foreach ( (array) $api->sections as $section_name => $content ) { + if ( 'reviews' === $section_name && ( empty( $api->ratings ) || 0 === array_sum( (array) $api->ratings ) ) ) { + continue; + } + + if ( isset( $plugins_section_titles[ $section_name ] ) ) { + $title = $plugins_section_titles[ $section_name ]; + } else { + $title = ucwords( str_replace( '_', ' ', $section_name ) ); + } + + $class = ( $section_name === $section ) ? ' class="current"' : ''; + $href = add_query_arg( array( 'tab' => $tab, 'section' => $section_name ) ); + $href = esc_url( $href ); + $san_section = esc_attr( $section_name ); + echo "\t<a name='$san_section' href='$href' $class>$title</a>\n"; + } + + echo "</div>\n"; + + ?> + <div id="<?php echo $_tab; ?>-content" class='<?php echo $_with_banner; ?>'> + <div class="fyi"> + <?php if ( $api->is_paid ) : ?> + <?php if ( isset( $api->plans ) ) : ?> + <div class="plugin-information-pricing"> + <?php foreach ( $api->plans as $plan ) : ?> + <?php + if ( empty( $plan->pricing ) ) { + continue; + } + + /** + * @var FS_Plugin_Plan $plan + */ + ?> + <?php $first_pricing = $plan->pricing[0] ?> + <?php $is_multi_cycle = $first_pricing->is_multi_cycle() ?> + <div class="fs-plan<?php if ( ! $is_multi_cycle ) { + echo ' fs-single-cycle'; + } ?>" data-plan-id="<?php echo $plan->id ?>"> + <h3 data-plan="<?php echo $plan->id ?>"><?php echo esc_html( sprintf( fs_text_x_inline( '%s Plan', 'e.g. Professional Plan', 'x-plan', $api->slug ), $plan->title ) ) ?></h3> + <?php $has_annual = $first_pricing->has_annual() ?> + <?php $has_monthly = $first_pricing->has_monthly() ?> + <div class="nav-tab-wrapper"> + <?php $billing_cycles = array( 'monthly', 'annual', 'lifetime' ) ?> + <?php $i = 0; + foreach ( $billing_cycles as $cycle ) : ?> + <?php $prop = "{$cycle}_price"; + if ( isset( $first_pricing->{$prop} ) ) : ?> + <?php $is_featured = ( 'annual' === $cycle && $is_multi_cycle ) ?> + <?php + $prices = array(); + foreach ( $plan->pricing as $pricing ) { + if ( isset( $pricing->{$prop} ) ) { + $prices[] = array( + 'id' => $pricing->id, + 'licenses' => $pricing->licenses, + 'price' => $pricing->{$prop} + ); + } + } + ?> + <a class="nav-tab" data-billing-cycle="<?php echo $cycle ?>" + data-pricing="<?php echo esc_attr( json_encode( $prices ) ) ?>"> + <?php if ( $is_featured ) : ?> + <label> + ★ <?php fs_esc_html_echo_x_inline( 'Best', 'e.g. the best product', 'best', $api->slug ) ?> + ★</label> + <?php endif ?> + <?php + switch ( $cycle ) { + case 'monthly': + fs_esc_html_echo_x_inline( 'Monthly', 'as every month', 'monthly', $api->slug ); + break; + case 'annual': + fs_esc_html_echo_x_inline( 'Annual', 'as once a year', 'annual', $api->slug ); + break; + case 'lifetime': + fs_esc_html_echo_inline( 'Lifetime', 'lifetime', $api->slug ); + break; + } + ?> + </a> + <?php endif ?> + <?php $i ++; endforeach ?> + <?php wp_enqueue_script( 'jquery' ) ?> + <script type="text/javascript"> + (function ($, undef) { + var + _formatBillingFrequency = function (cycle) { + switch (cycle) { + case 'monthly': + return '<?php printf( fs_text_x_inline( 'Billed %s', 'e.g. billed monthly', 'billed-x', $api->slug ), fs_text_x_inline( 'Monthly', 'as every month', 'monthly', $api->slug ) ) ?>'; + case 'annual': + return '<?php printf( fs_text_x_inline( 'Billed %s', 'e.g. billed monthly', 'billed-x', $api->slug ), fs_text_x_inline( 'Annually', 'as once a year', 'annually', $api->slug ) ) ?>'; + case 'lifetime': + return '<?php printf( fs_text_x_inline( 'Billed %s', 'e.g. billed monthly', 'billed-x', $api->slug ), fs_text_x_inline( 'Once', 'as once a year', 'once', $api->slug ) ) ?>'; + } + }, + _formatLicensesTitle = function (pricing) { + switch (pricing.licenses) { + case 1: + return '<?php fs_esc_attr_echo_inline( 'Single Site License', 'license-single-site', $api->slug ) ?>'; + case null: + return '<?php fs_esc_attr_echo_inline( 'Unlimited Licenses', 'license-unlimited', $api->slug ) ?>'; + default: + return '<?php fs_esc_attr_echo_inline( 'Up to %s Sites', 'license-x-sites', $api->slug ) ?>'.replace('%s', pricing.licenses); + } + }, + _formatPrice = function (pricing, cycle, multipleLicenses) { + if (undef === multipleLicenses) + multipleLicenses = true; + + var priceCycle; + switch (cycle) { + case 'monthly': + priceCycle = ' / <?php fs_echo_x_inline( 'mo', 'as monthly period', 'mo', $api->slug ) ?>'; + break; + case 'lifetime': + priceCycle = ''; + break; + case 'annual': + default: + priceCycle = ' / <?php fs_echo_x_inline( 'year', 'as annual period', 'year', $api->slug ) ?>'; + break; + } + + if (!multipleLicenses && 1 == pricing.licenses) { + return '$' + pricing.price + priceCycle; + } + + return _formatLicensesTitle(pricing) + ' - <var class="fs-price">$' + pricing.price + priceCycle + '</var>'; + }, + _checkoutUrl = function (plan, pricing, cycle) { + return '<?php echo esc_url_raw( remove_query_arg( 'billing_cycle', add_query_arg( array( 'plugin_id' => $plan->plugin_id ), $api->checkout_link ) ) ) ?>' + + '&plan_id=' + plan + + '&pricing_id=' + pricing + + '&billing_cycle=' + cycle<?php if ( $plan->has_trial() ) { + echo " + '&trial=true'"; + }?>; + }, + _updateCtaUrl = function (plan, pricing, cycle) { + $('.plugin-information-pricing .button, #plugin-information-footer .button.fs-checkout-button').attr('href', _checkoutUrl(plan, pricing, cycle)); + }; + + $(document).ready(function () { + var $plan = $('.plugin-information-pricing .fs-plan[data-plan-id=<?php echo $plan->id ?>]'); + $plan.find('input[type=radio]').live('click', function () { + _updateCtaUrl( + $plan.attr('data-plan-id'), + $(this).val(), + $plan.find('.nav-tab-active').attr('data-billing-cycle') + ); + + $plan.find('.fs-trial-terms .fs-price').html( + $(this).parents('label').find('.fs-price').html() + ); + }); + + $plan.find('.nav-tab').click(function () { + if ($(this).hasClass('nav-tab-active')) + return; + + var $this = $(this), + billingCycle = $this.attr('data-billing-cycle'), + pricing = JSON.parse($this.attr('data-pricing')), + $pricesList = $this.parents('.fs-plan').find('.fs-pricing-body .fs-licenses'), + html = ''; + + // Un-select previously selected tab. + $plan.find('.nav-tab').removeClass('nav-tab-active'); + + // Select current tab. + $this.addClass('nav-tab-active'); + + // Render licenses prices. + if (1 == pricing.length) { + html = '<li><label><?php echo fs_esc_attr_x_inline( 'Price', 'noun', 'price', $api->slug ) ?>: ' + _formatPrice(pricing[0], billingCycle, false) + '</label></li>'; + } else { + for (var i = 0; i < pricing.length; i++) { + html += '<li><label><input name="pricing-<?php echo $plan->id ?>" type="radio" value="' + pricing[i].id + '">' + _formatPrice(pricing[i], billingCycle) + '</label></li>'; + } + } + $pricesList.html(html); + + if (1 < pricing.length) { + // Select first license option. + $pricesList.find('li:first input').click(); + } + else { + _updateCtaUrl( + $plan.attr('data-plan-id'), + pricing[0].id, + billingCycle + ); + } + + // Update billing frequency. + $plan.find('.fs-billing-frequency').html(_formatBillingFrequency(billingCycle)); + + if ('annual' === billingCycle) { + $plan.find('.fs-annual-discount').show(); + } else { + $plan.find('.fs-annual-discount').hide(); + } + }); + + <?php if ( $has_annual ) : ?> + // Select annual by default. + $plan.find('.nav-tab[data-billing-cycle=annual]').click(); + <?php else : ?> + // Select first tab. + $plan.find('.nav-tab:first').click(); + <?php endif ?> + }); + }(jQuery)); + </script> + </div> + <div class="fs-pricing-body"> + <span class="fs-billing-frequency"></span> + <?php $annual_discount = ( $has_annual && $has_monthly ) ? $plan->pricing[0]->annual_discount_percentage() : 0 ?> + <?php if ( $annual_discount > 0 ) : ?> + <span + class="fs-annual-discount"><?php printf( + /* translators: %s: Discount (e.g. discount of $5 or 10%) */ + fs_esc_html_inline( 'Save %s', 'save-x', $api->slug ), $annual_discount . '%' ) ?></span> + <?php endif ?> + <ul class="fs-licenses"> + </ul> + <?php echo $this->get_checkout_cta( $api, $plan, false ) ?> + <div style="clear:both"></div> + <?php if ( $plan->has_trial() ) : ?> + <?php $trial_period = $this->get_trial_period( $plan ) ?> + <ul class="fs-trial-terms"> + <li> + <i class="dashicons dashicons-yes"></i><?php echo esc_html( sprintf( fs_text_inline( 'No commitment for %s - cancel anytime', 'no-commitment-x', $api->slug ), $trial_period ) ) ?> + </li> + <li> + <i class="dashicons dashicons-yes"></i><?php printf( esc_html( fs_text_inline( 'After your free %s, pay as little as %s', 'after-x-pay-as-little-y', $api->slug ) ), $trial_period, '<var class="fs-price">' . $this->get_price_tag( $plan, $plan->pricing[0] ) . '</var>' ) ?> + </li> + </ul> + <?php endif ?> + </div> + </div> + </div> + <?php endforeach ?> + <?php endif ?> + <?php endif ?> + <div> + <h3><?php fs_echo_inline( 'Details', 'details', $api->slug ) ?></h3> + <ul> + <?php if ( ! empty( $api->version ) ) { ?> + <li> + <strong><?php fs_esc_html_echo_x_inline( 'Version', 'product version', 'version', $api->slug ); ?> + :</strong> <?php echo $api->version; ?></li> + <?php + } + if ( ! empty( $api->author ) ) { + ?> + <li> + <strong><?php fs_echo_x_inline( 'Author', 'as the plugin author', 'author', $api->slug ); ?> + :</strong> <?php echo links_add_target( $api->author, '_blank' ); ?> + </li> + <?php + } + if ( ! empty( $api->last_updated ) ) { + ?> + <li><strong><?php fs_echo_inline( 'Last Updated', 'last-updated', $api->slug ); ?> + :</strong> <span + title="<?php echo $api->last_updated; ?>"> + <?php echo esc_html( sprintf( + /* translators: %s: time period (e.g. "2 hours" ago) */ + fs_text_x_inline( '%s ago', 'x-ago', $api->slug ), + human_time_diff( strtotime( $api->last_updated ) ) + ) ) ?> + </span></li> + <?php + } + if ( ! empty( $api->requires ) ) { + ?> + <li> + <strong><?php fs_esc_html_echo_inline( 'Requires WordPress Version', 'requires-wordpress-version', $api->slug ) ?> + :</strong> <?php echo esc_html( sprintf( fs_text_inline( '%s or higher', 'x-or-higher', $api->slug ), $api->requires ) ) ?> + </li> + <?php + } + if ( ! empty( $api->tested ) ) { + ?> + <li> + <strong><?php fs_esc_html_echo_inline( 'Compatible up to', 'compatible-up-to', $api->slug ); ?> + :</strong> <?php echo $api->tested; ?> + </li> + <?php + } + if ( ! empty( $api->downloaded ) ) { + ?> + <li> + <strong><?php fs_esc_html_echo_inline( 'Downloaded', 'downloaded', $api->slug ) ?> + :</strong> <?php echo esc_html( sprintf( + ( ( 1 == $api->downloaded ) ? + /* translators: %s: 1 or One (Number of times downloaded) */ + fs_text_inline( '%s time', 'x-time', $api->slug ) : + /* translators: %s: Number of times downloaded */ + fs_text_inline( '%s times', 'x-times', $api->slug ) + ), + number_format_i18n( $api->downloaded ) + ) ); ?> + </li> + <?php + } + if ( ! empty( $api->slug ) && true == $api->is_wp_org_compliant ) { + ?> + <li><a target="_blank" + href="https://wordpress.org/plugins/<?php echo $api->slug; ?>/"><?php fs_esc_html_echo_inline( 'WordPress.org Plugin Page', 'wp-org-plugin-page', $api->slug ) ?> + »</a> + </li> + <?php + } + if ( ! empty( $api->homepage ) ) { + ?> + <li><a target="_blank" + href="<?php echo esc_url( $api->homepage ); ?>"><?php fs_esc_html_echo_inline( 'Plugin Homepage', 'plugin-homepage', $api->slug ) ?> + »</a> + </li> + <?php + } + if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { + ?> + <li><a target="_blank" + href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_esc_html_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?> + »</a> + </li> + <?php } ?> + </ul> + </div> + <?php if ( ! empty( $api->rating ) ) { ?> + <h3><?php fs_echo_inline( 'Average Rating', 'average-rating', $api->slug ); ?></h3> + <?php wp_star_rating( array( + 'rating' => $api->rating, + 'type' => 'percent', + 'number' => $api->num_ratings + ) ); ?> + <small>(<?php echo esc_html( sprintf( + fs_text_inline( 'based on %s', 'based-on-x', $api->slug ), + sprintf( + ( ( 1 == $api->num_ratings ) ? + /* translators: %s: 1 or One */ + fs_text_inline( '%s rating', 'x-rating', $api->slug ) : + /* translators: %s: Number larger than 1 */ + fs_text_inline( '%s ratings', 'x-ratings', $api->slug ) + ), + number_format_i18n( $api->num_ratings ) + ) ) ) ?>) + </small> + <?php + } + + if ( ! empty( $api->ratings ) && array_sum( (array) $api->ratings ) > 0 ) { + foreach ( $api->ratings as $key => $ratecount ) { + // Avoid div-by-zero. + $_rating = $api->num_ratings ? ( $ratecount / $api->num_ratings ) : 0; + $stars_label = sprintf( + ( ( 1 == $key ) ? + /* translators: %s: 1 or One */ + fs_text_inline( '%s star', 'x-star', $api->slug ) : + /* translators: %s: Number larger than 1 */ + fs_text_inline( '%s stars', 'x-stars', $api->slug ) + ), + number_format_i18n( $key ) + ); + ?> + <div class="counter-container"> + <span class="counter-label"><a + href="https://wordpress.org/support/view/plugin-reviews/<?php echo $api->slug; ?>?filter=<?php echo $key; ?>" + target="_blank" + title="<?php echo esc_attr( sprintf( + /* translators: %s: # of stars (e.g. 5 stars) */ + fs_text_inline( 'Click to see reviews that provided a rating of %s', 'click-to-reviews', $api->slug ), + $stars_label + ) ) ?>"><?php echo $stars_label ?></a></span> + <span class="counter-back"> + <span class="counter-bar" style="width: <?php echo 92 * $_rating; ?>px;"></span> + </span> + <span class="counter-count"><?php echo number_format_i18n( $ratecount ); ?></span> + </div> + <?php + } + } + if ( ! empty( $api->contributors ) ) { + ?> + <h3><?php fs_echo_inline( 'Contributors', 'contributors', $api->slug ); ?></h3> + <ul class="contributors"> + <?php + foreach ( (array) $api->contributors as $contrib_username => $contrib_profile ) { + if ( empty( $contrib_username ) && empty( $contrib_profile ) ) { + continue; + } + if ( empty( $contrib_username ) ) { + $contrib_username = preg_replace( '/^.+\/(.+)\/?$/', '\1', $contrib_profile ); + } + $contrib_username = sanitize_user( $contrib_username ); + if ( empty( $contrib_profile ) ) { + echo "<li><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</li>"; + } else { + echo "<li><a href='{$contrib_profile}' target='_blank'><img src='https://wordpress.org/grav-redirect.php?user={$contrib_username}&s=36' width='18' height='18' />{$contrib_username}</a></li>"; + } + } + ?> + </ul> + <?php if ( ! empty( $api->donate_link ) ) { ?> + <a target="_blank" + href="<?php echo esc_url( $api->donate_link ); ?>"><?php fs_echo_inline( 'Donate to this plugin', 'donate-to-plugin', $api->slug ) ?> + »</a> + <?php } ?> + <?php } ?> + </div> + <div id="section-holder" class="wrap"> + <?php + if ( ! empty( $api->tested ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->tested ) ), $api->tested, '>' ) ) { + echo '<div class="notice notice-warning"><p>' . '<strong>' . fs_text_inline( 'Warning', 'warning', $api->slug ) . ':</strong> ' . fs_text_inline( 'This plugin has not been tested with your current version of WordPress.', 'not-tested-warning', $api->slug ) . '</p></div>'; + } else if ( ! empty( $api->requires ) && version_compare( substr( $GLOBALS['wp_version'], 0, strlen( $api->requires ) ), $api->requires, '<' ) ) { + echo '<div class="notice notice-warning"><p>' . '<strong>' . fs_text_inline( 'Warning', 'warning', $api->slug ) . ':</strong> ' . fs_text_inline( 'This plugin has not been marked as compatible with your version of WordPress.', 'not-compatible-warning', $api->slug ) . '</p></div>'; + } + + foreach ( (array) $api->sections as $section_name => $content ) { + $content = links_add_base_url( $content, 'https://wordpress.org/plugins/' . $api->slug . '/' ); + $content = links_add_target( $content, '_blank' ); + + $san_section = esc_attr( $section_name ); + + $display = ( $section_name === $section ) ? 'block' : 'none'; + + if ( 'description' === $section_name && + ( ( $api->is_wp_org_compliant && $api->wp_org_missing ) || + ( ! $api->is_wp_org_compliant && $api->fs_missing ) ) + ) { + $missing_notice = array( + 'type' => 'error', + 'id' => md5( microtime() ), + 'message' => $api->is_paid ? + fs_text_inline( 'Paid add-on must be deployed to Freemius.', 'paid-addon-not-deployed', $api->slug ) : + fs_text_inline( 'Add-on must be deployed to WordPress.org or Freemius.', 'free-addon-not-deployed', $api->slug ), + ); + fs_require_template( 'admin-notice.php', $missing_notice ); + } + echo "\t<div id='section-{$san_section}' class='section' style='display: {$display};'>\n"; + echo $content; + echo "\t</div>\n"; + } + echo "</div>\n"; + echo "</div>\n"; + echo "</div>\n"; // #plugin-information-scrollable + echo "<div id='$tab-footer'>\n"; + + if ( $api->has_paid_plan && ! empty( $api->checkout_link ) ) { + echo $this->get_checkout_cta( $api ); + } + + if ( ! empty( $api->download_link ) ) { + echo $this->get_download_cta( $api, empty( $api->checkout_link ) ); + } + + echo "</div>\n"; + + iframe_footer(); + exit; + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/i18n.php b/wp-content/plugins/nextgen-gallery/freemius/includes/i18n.php index 7a6377f90..4de505c49 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/i18n.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/i18n.php @@ -2,14 +2,18 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.4 + * + * @deprecated This file is no longer in use. It's still in the project for backward compatibility. */ if ( ! defined( 'ABSPATH' ) ) { exit; } + require_once dirname( __FILE__ ) . '/l10n.php'; + /** * All strings can now be overridden. * @@ -27,508 +31,573 @@ * my_freemius->override_i18n( array( * 'opt-in-connect' => __( "Yes - I'm in!", '{your-text_domain}' ), * 'skip' => __( 'Not today', '{your-text_domain}' ), - * ); + * ) ); */ global $fs_text; $fs_text = array( - 'account' => __( 'Account', 'freemius' ), - 'addon' => __( 'Add On', 'freemius' ), - 'contact-us' => __( 'Contact Us', 'freemius' ), - 'contact-support' => __( 'Contact Support', 'freemius' ), - 'change-ownership' => __( 'Change Ownership', 'freemius' ), - 'support' => __( 'Support', 'freemius' ), - 'support-forum' => __( 'Support Forum', 'freemius' ), - 'add-ons' => __( 'Add Ons', 'freemius' ), - 'upgrade' => _x( 'Upgrade', 'verb', 'freemius' ), - 'awesome' => __( 'Awesome', 'freemius' ), - 'pricing' => _x( 'Pricing', 'noun', 'freemius' ), - 'price' => _x( 'Price', 'noun', 'freemius' ), - 'unlimited-updates' => __( 'Unlimited Updates', 'freemius' ), - 'downgrade' => _x( 'Downgrade', 'verb', 'freemius' ), - 'cancel-trial' => __( 'Cancel Trial', 'freemius' ), - 'free-trial' => __( 'Free Trial', 'freemius' ), - 'start-free-x' => __( 'Start my free %s', 'freemius' ), - 'no-commitment-x' => __( 'No commitment for %s - cancel anytime', 'freemius' ), - 'after-x-pay-as-little-y' => __( 'After your free %s, pay as little as %s', 'freemius' ), - 'details' => __( 'Details', 'freemius' ), - 'account-details' => __( 'Account Details', 'freemius' ), - 'delete' => _x( 'Delete', 'verb', 'freemius' ), - 'show' => _x( 'Show', 'verb', 'freemius' ), - 'hide' => _x( 'Hide', 'verb', 'freemius' ), - 'edit' => _x( 'Edit', 'verb', 'freemius' ), - 'update' => _x( 'Update', 'verb', 'freemius' ), - 'date' => __( 'Date', 'freemius' ), - 'amount' => __( 'Amount', 'freemius' ), - 'invoice' => __( 'Invoice', 'freemius' ), - 'billing' => __( 'Billing', 'freemius' ), - 'payments' => __( 'Payments', 'freemius' ), - 'delete-account' => __( 'Delete Account', 'freemius' ), - 'dismiss' => _x( 'Dismiss', 'as close a window', 'freemius' ), - 'plan' => _x( 'Plan', 'as product pricing plan', 'freemius' ), - 'change-plan' => __( 'Change Plan', 'freemius' ), - 'download-x-version' => _x( 'Download %s Version', 'as download professional version', 'freemius' ), - 'download-x-version-now' => _x( 'Download %s version now', 'as download professional version now', - 'freemius' ), - 'download-latest' => _x( 'Download Latest', 'as download latest version', 'freemius' ), - 'you-have-x-license' => _x( 'You have a %s license.', 'E.g. you have a professional license.', - 'freemius' ), - 'new' => __( 'New', 'freemius' ), - 'free' => __( 'Free', 'freemius' ), - 'trial' => _x( 'Trial', 'as trial plan', 'freemius' ), - 'start-trial' => _x( 'Start Trial', 'as starting a trial plan', 'freemius' ), - 'purchase' => _x( 'Purchase', 'verb', 'freemius' ), - 'purchase-license' => __( 'Purchase License', 'freemius' ), - 'buy' => _x( 'Buy', 'verb', 'freemius' ), - 'buy-license' => __( 'Buy License', 'freemius' ), - 'license-single-site' => __( 'Single Site License', 'freemius' ), - 'license-unlimited' => __( 'Unlimited Licenses', 'freemius' ), - 'license-x-sites' => __( 'Up to %s Sites', 'freemius' ), - 'renew-license-now' => __( '%sRenew your license now%s to access version %s features and support.', - 'freemius' ), - 'ask-for-upgrade-email-address' => __( "Enter the email address you've used for the upgrade below and we will resend you the license key.", - 'freemius' ), - 'x-plan' => _x( '%s Plan', 'e.g. Professional Plan', 'freemius' ), - 'you-are-step-away' => __( 'You are just one step away - %s', 'freemius' ), - 'activate-x-now' => _x( 'Complete "%s" Activation Now', - '%s - plugin name. As complete "Jetpack" activation now', 'freemius' ), - 'few-plugin-tweaks' => __( 'We made a few tweaks to the plugin, %s', 'freemius' ), - 'optin-x-now' => __( 'Opt-in to make "%s" Better!', 'freemius' ), - 'error' => __( 'Error', 'freemius' ), - 'failed-finding-main-path' => __( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.', - 'freemius' ), - #region Account + 'account' => _fs_text( 'Account' ), + 'addon' => _fs_text( 'Add-On' ), + 'contact-us' => _fs_text( 'Contact Us' ), + 'contact-support' => _fs_text( 'Contact Support' ), + 'change-ownership' => _fs_text( 'Change Ownership' ), + 'support' => _fs_text( 'Support' ), + 'support-forum' => _fs_text( 'Support Forum' ), + 'add-ons' => _fs_text( 'Add-Ons' ), + 'upgrade' => _fs_x( 'Upgrade', 'verb' ), + 'awesome' => _fs_text( 'Awesome' ), + 'pricing' => _fs_x( 'Pricing', 'noun' ), + 'price' => _fs_x( 'Price', 'noun' ), + 'unlimited-updates' => _fs_text( 'Unlimited Updates' ), + 'downgrade' => _fs_x( 'Downgrade', 'verb' ), + 'cancel-subscription' => _fs_x( 'Cancel Subscription', 'verb' ), + 'cancel-trial' => _fs_text( 'Cancel Trial' ), + 'free-trial' => _fs_text( 'Free Trial' ), + 'start-free-x' => _fs_text( 'Start my free %s' ), + 'no-commitment-x' => _fs_text( 'No commitment for %s - cancel anytime' ), + 'after-x-pay-as-little-y' => _fs_text( 'After your free %s, pay as little as %s' ), + 'details' => _fs_text( 'Details' ), + 'account-details' => _fs_text( 'Account Details' ), + 'delete' => _fs_x( 'Delete', 'verb' ), + 'show' => _fs_x( 'Show', 'verb' ), + 'hide' => _fs_x( 'Hide', 'verb' ), + 'edit' => _fs_x( 'Edit', 'verb' ), + 'update' => _fs_x( 'Update', 'verb' ), + 'date' => _fs_text( 'Date' ), + 'amount' => _fs_text( 'Amount' ), + 'invoice' => _fs_text( 'Invoice' ), + 'billing' => _fs_text( 'Billing' ), + 'payments' => _fs_text( 'Payments' ), + 'delete-account' => _fs_text( 'Delete Account' ), + 'dismiss' => _fs_x( 'Dismiss', 'as close a window' ), + 'plan' => _fs_x( 'Plan', 'as product pricing plan' ), + 'change-plan' => _fs_text( 'Change Plan' ), + 'download-x-version' => _fs_x( 'Download %s Version', 'as download professional version' ), + 'download-x-version-now' => _fs_x( 'Download %s version now', 'as download professional version now' ), + 'download-latest' => _fs_x( 'Download Latest', 'as download latest version' ), + 'you-have-x-license' => _fs_x( 'You have a %s license.', 'E.g. you have a professional license.' ), + 'new' => _fs_text( 'New' ), + 'free' => _fs_text( 'Free' ), + 'trial' => _fs_x( 'Trial', 'as trial plan' ), + 'start-trial' => _fs_x( 'Start Trial', 'as starting a trial plan' ), + 'purchase' => _fs_x( 'Purchase', 'verb' ), + 'purchase-license' => _fs_text( 'Purchase License' ), + 'buy' => _fs_x( 'Buy', 'verb' ), + 'buy-license' => _fs_text( 'Buy License' ), + 'license-single-site' => _fs_text( 'Single Site License' ), + 'license-unlimited' => _fs_text( 'Unlimited Licenses' ), + 'license-x-sites' => _fs_text( 'Up to %s Sites' ), + 'renew-license-now' => _fs_text( '%sRenew your license now%s to access version %s security & feature updates, and support.' ), + 'ask-for-upgrade-email-address' => _fs_text( "Enter the email address you've used for the upgrade below and we will resend you the license key." ), + 'x-plan' => _fs_x( '%s Plan', 'e.g. Professional Plan' ), + 'you-are-step-away' => _fs_text( 'You are just one step away - %s' ), + 'activate-x-now' => _fs_x( 'Complete "%s" Activation Now', + '%s - plugin name. As complete "Jetpack" activation now' ), + 'few-plugin-tweaks' => _fs_text( 'We made a few tweaks to the %s, %s' ), + 'optin-x-now' => _fs_text( 'Opt in to make "%s" Better!' ), + 'error' => _fs_text( 'Error' ), + 'failed-finding-main-path' => _fs_text( 'Freemius SDK couldn\'t find the plugin\'s main file. Please contact sdk@freemius.com with the current error.' ), + 'learn-more' => _fs_text( 'Learn more' ), - 'expiration' => _x( 'Expiration', 'as expiration date', 'freemius' ), - 'license' => _x( 'License', 'as software license', 'freemius' ), - 'not-verified' => __( 'not verified', 'freemius' ), - 'verify-email' => __( 'Verify Email', 'freemius' ), - 'expires-in' => _x( 'Expires in %s', 'e.g. expires in 2 months', 'freemius' ), - 'renews-in' => _x( 'Auto renews in %s', 'e.g. auto renews in 2 months', 'freemius' ), - 'no-expiration' => __( 'No expiration', 'freemius' ), - 'expired' => __( 'Expired', 'freemius' ), - 'cancelled' => __( 'Cancelled', 'freemius' ), - 'in-x' => _x( 'In %s', 'e.g. In 2 hours', 'freemius' ), - 'x-ago' => _x( '%s ago', 'e.g. 2 min ago', 'freemius' ), - 'version' => _x( 'Version', 'as plugin version', 'freemius' ), - 'name' => __( 'Name', 'freemius' ), - 'email' => __( 'Email', 'freemius' ), - 'email-address' => __( 'Email address', 'freemius' ), - 'verified' => __( 'Verified', 'freemius' ), - 'plugin' => __( 'Plugin', 'freemius' ), - 'plugins' => __( 'Plugins', 'freemius' ), - 'themes' => __( 'Themes', 'freemius' ), - 'path' => _x( 'Path', 'as file/folder path', 'freemius' ), - 'title' => __( 'Title', 'freemius' ), - 'free-version' => __( 'Free version', 'freemius' ), - 'premium-version' => __( 'Premium version', 'freemius' ), - 'slug' => _x( 'Slug', 'as WP plugin slug', 'freemius' ), - 'id' => __( 'ID', 'freemius' ), - 'users' => __( 'Users', 'freemius' ), - 'plugin-installs' => __( 'Plugin Installs', 'freemius' ), - 'sites' => _x( 'Sites', 'like websites', 'freemius' ), - 'user-id' => __( 'User ID', 'freemius' ), - 'site-id' => __( 'Site ID', 'freemius' ), - 'public-key' => __( 'Public Key', 'freemius' ), - 'secret-key' => __( 'Secret Key', 'freemius' ), - 'no-secret' => _x( 'No Secret', 'as secret encryption key missing', 'freemius' ), - 'no-id' => __( 'No ID', 'freemius' ), - 'sync-license' => _x( 'Sync License', 'as synchronize license', 'freemius' ), - 'sync' => _x( 'Sync', 'as synchronize', 'freemius' ), - 'activate-license' => __( 'Activate License', 'freemius' ), - 'activate-free-version' => __( 'Activate Free Version', 'freemius' ), - 'activate-license-message' => __( 'Please enter the license key that you received in the email right after the purchase:', - 'freemius' ), - 'activating-license' => __( 'Activating license...', 'freemius' ), - 'change-license' => __( 'Change License', 'freemius' ), - 'update-license' => __( 'Update License', 'freemius' ), - 'deactivate-license' => __( 'Deactivate License', 'freemius' ), - 'activate' => __( 'Activate', 'freemius' ), - 'deactivate' => __( 'Deactivate', 'freemius' ), - 'skip-deactivate' => __( 'Skip & Deactivate', 'freemius' ), - 'no-deactivate' => __( 'No - just deactivate', 'freemius' ), - 'yes-do-your-thing' => __( 'Yes - do your thing', 'freemius' ), - 'active' => _x( 'Active', 'active mode', 'freemius' ), - 'is-active' => _x( 'Is Active', 'is active mode?', 'freemius' ), - 'install-now' => __( 'Install Now', 'freemius' ), - 'install-update-now' => __( 'Install Update Now', 'freemius' ), - 'more-information-about-x' => __( 'More information about %s', 'freemius' ), - 'localhost' => __( 'Localhost', 'freemius' ), - 'activate-x-plan' => _x( 'Activate %s Plan', 'as activate Professional plan', 'freemius' ), - 'x-left' => _x( '%s left', 'as 5 licenses left', 'freemius' ), - 'last-license' => __( 'Last license', 'freemius' ), - 'what-is-your-x' => __( 'What is your %s?', 'freemius' ), - 'activate-this-addon' => __( 'Activate this add-on', 'freemius' ), - 'deactivate-license-confirm' => __( 'Deactivating your license will block all premium features, but will enable you to activate the license on another site. Are you sure you want to proceed?', - 'freemius' ), - 'delete-account-x-confirm' => __( 'Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the "Cancel" button, and first "Downgrade" your account. Are you sure you would like to continue with the deletion?', - 'freemius' ), - 'delete-account-confirm' => __( 'Deletion is not temporary. Only delete if you no longer want to use this plugin anymore. Are you sure you would like to continue with the deletion?', - 'freemius' ), - 'downgrade-x-confirm' => __( 'Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s.', - 'freemius' ), - 'cancel-trial-confirm' => __( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', - 'freemius' ), - 'after-downgrade-non-blocking' => __( 'You can still enjoy all %s features but you will not have access to plugin updates and support.', - 'freemius' ), - 'after-downgrade-blocking' => __( 'Once your license expire you can still use the Free version but you will NOT have access to the %s features.', - 'freemius' ), - 'proceed-confirmation' => __( 'Are you sure you want to proceed?', 'freemius' ), + #region Affiliation + 'affiliation' => _fs_text( 'Affiliation' ), + 'affiliate' => _fs_text( 'Affiliate' ), + 'affiliate-tracking' => _fs_text( '%s tracking cookie after the first visit to maximize earnings potential.' ), + 'renewals-commission' => _fs_text( 'Get commission for automated subscription renewals.' ), + 'affiliate-application-accepted' => _fs_text( "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." ), + 'affiliate-application-thank-you' => _fs_text( "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." ), + 'affiliate-application-rejected' => _fs_text( "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." ), + 'affiliate-account-suspended' => _fs_text( 'Your affiliation account was temporarily suspended.' ), + 'affiliate-account-blocked' => _fs_text( 'Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.' ), + 'become-an-ambassador' => _fs_text( 'Like the %s? Become our ambassador and earn cash ;-)' ), + 'become-an-ambassador-admin-notice' => _fs_text( 'Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!' ), + 'refer-new-customers' => _fs_text( 'Refer new customers to our %s and earn %s commission on each successful sale you refer!' ), + 'program-summary' => _fs_text( 'Program Summary' ), + 'commission-on-new-license-purchase' => _fs_text( '%s commission when a customer purchases a new license.' ), + 'unlimited-commissions' => _fs_text( 'Unlimited commissions.' ), + 'minimum-payout-amount' => _fs_text( '%s minimum payout amount.' ), + 'payouts-unit-and-processing' => _fs_text( 'Payouts are in USD and processed monthly via PayPal.' ), + 'commission-payment' => _fs_text( 'As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.' ), + 'become-an-affiliate' => _fs_text( 'Become an affiliate' ), + 'apply-to-become-an-affiliate' => _fs_text( 'Apply to become an affiliate' ), + 'full-name' => _fs_text( 'Full name' ), + 'paypal-account-email-address' => _fs_text( 'PayPal account email address' ), + 'promotion-methods' => _fs_text( 'Promotion methods' ), + 'social-media' => _fs_text( 'Social media (Facebook, Twitter, etc.)' ), + 'mobile-apps' => _fs_text( 'Mobile apps' ), + 'statistics-information-field-label' => _fs_text( 'Website, email, and social media statistics (optional)' ), + 'statistics-information-field-desc' => _fs_text( 'Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).' ), + 'promotion-method-desc-field-label' => _fs_text( 'How will you promote us?' ), + 'promotion-method-desc-field-desc' => _fs_text( 'Please provide details on how you intend to promote %s (please be as specific as possible).' ), + 'domain-field-label' => _fs_text( 'Where are you going to promote the %s?' ), + 'domain-field-desc' => _fs_text( 'Enter the domain of your website or other websites from where you plan to promote the %s.' ), + 'extra-domain-fields-label' => _fs_text( 'Extra Domains' ), + 'extra-domain-fields-desc' => _fs_text( 'Extra domains where you will be marketing the product from.' ), + 'add-another-domain' => _fs_text( 'Add another domain' ), + 'remove' => _fs_x( 'Remove', 'Remove domain' ), + 'email-address-is-required' => _fs_text( 'Email address is required.' ), + 'domain-is-required' => _fs_text( 'Domain is required.' ), + 'invalid-domain' => _fs_text( 'Invalid domain' ), + 'paypal-email-address-is-required' => _fs_text( 'PayPal email address is required.' ), + 'processing' => _fs_text( 'Processing...' ), + 'non-expiring' => _fs_text( 'Non-expiring' ), + 'account-is-pending-activation' => _fs_text( 'Account is pending activation.' ), + #endregion Affiliation + + #region Account + 'expiration' => _fs_x( 'Expiration', 'as expiration date' ), + 'license' => _fs_x( 'License', 'as software license' ), + 'not-verified' => _fs_text( 'not verified' ), + 'verify-email' => _fs_text( 'Verify Email' ), + 'expires-in' => _fs_x( 'Expires in %s', 'e.g. expires in 2 months' ), + 'renews-in' => _fs_x( 'Auto renews in %s', 'e.g. auto renews in 2 months' ), + 'no-expiration' => _fs_text( 'No expiration' ), + 'expired' => _fs_text( 'Expired' ), + 'cancelled' => _fs_text( 'Cancelled' ), + 'in-x' => _fs_x( 'In %s', 'e.g. In 2 hours' ), + 'x-ago' => _fs_x( '%s ago', 'e.g. 2 min ago' ), + /* translators: %s: Version number (e.g. 4.6 or higher) */ + 'x-or-higher' => _fs_text( '%s or higher' ), + 'version' => _fs_x( 'Version', 'as plugin version' ), + 'name' => _fs_text( 'Name' ), + 'email' => _fs_text( 'Email' ), + 'email-address' => _fs_text( 'Email address' ), + 'verified' => _fs_text( 'Verified' ), + 'module' => _fs_text( 'Module' ), + 'module-type' => _fs_text( 'Module Type' ), + 'plugin' => _fs_text( 'Plugin' ), + 'plugins' => _fs_text( 'Plugins' ), + 'theme' => _fs_text( 'Theme' ), + 'themes' => _fs_text( 'Themes' ), + 'path' => _fs_x( 'Path', 'as file/folder path' ), + 'title' => _fs_text( 'Title' ), + 'free-version' => _fs_text( 'Free version' ), + 'premium-version' => _fs_text( 'Premium version' ), + 'slug' => _fs_x( 'Slug', 'as WP plugin slug' ), + 'id' => _fs_text( 'ID' ), + 'users' => _fs_text( 'Users' ), + 'module-installs' => _fs_text( '%s Installs' ), + 'sites' => _fs_x( 'Sites', 'like websites' ), + 'user-id' => _fs_text( 'User ID' ), + 'site-id' => _fs_text( 'Site ID' ), + 'public-key' => _fs_text( 'Public Key' ), + 'secret-key' => _fs_text( 'Secret Key' ), + 'no-secret' => _fs_x( 'No Secret', 'as secret encryption key missing' ), + 'no-id' => _fs_text( 'No ID' ), + 'sync-license' => _fs_x( 'Sync License', 'as synchronize license' ), + 'sync' => _fs_x( 'Sync', 'as synchronize' ), + 'activate-license' => _fs_text( 'Activate License' ), + 'activate-free-version' => _fs_text( 'Activate Free Version' ), + 'activate-license-message' => _fs_text( 'Please enter the license key that you received in the email right after the purchase:' ), + 'activating-license' => _fs_text( 'Activating license...' ), + 'change-license' => _fs_text( 'Change License' ), + 'update-license' => _fs_text( 'Update License' ), + 'deactivate-license' => _fs_text( 'Deactivate License' ), + 'activate' => _fs_text( 'Activate' ), + 'deactivate' => _fs_text( 'Deactivate' ), + 'skip-deactivate' => _fs_text( 'Skip & Deactivate' ), + 'skip-and-x' => _fs_text( 'Skip & %s' ), + 'no-deactivate' => _fs_text( 'No - just deactivate' ), + 'yes-do-your-thing' => _fs_text( 'Yes - do your thing' ), + 'active' => _fs_x( 'Active', 'active mode' ), + 'is-active' => _fs_x( 'Is Active', 'is active mode?' ), + 'install-now' => _fs_text( 'Install Now' ), + 'install-update-now' => _fs_text( 'Install Update Now' ), + 'more-information-about-x' => _fs_text( 'More information about %s' ), + 'localhost' => _fs_text( 'Localhost' ), + 'activate-x-plan' => _fs_x( 'Activate %s Plan', 'as activate Professional plan' ), + 'x-left' => _fs_x( '%s left', 'as 5 licenses left' ), + 'last-license' => _fs_text( 'Last license' ), + 'what-is-your-x' => _fs_text( 'What is your %s?' ), + 'activate-this-addon' => _fs_text( 'Activate this add-on' ), + 'deactivate-license-confirm' => _fs_text( 'Deactivating your license will block all premium features, but will enable you to activate the license on another site. Are you sure you want to proceed?' ), + 'delete-account-x-confirm' => _fs_text( 'Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the "Cancel" button, and first "Downgrade" your account. Are you sure you would like to continue with the deletion?' ), + 'delete-account-confirm' => _fs_text( 'Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?' ), + 'downgrade-x-confirm' => _fs_text( 'Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s.' ), + 'cancel-trial-confirm' => _fs_text( 'Cancelling the trial will immediately block access to all premium features. Are you sure?' ), + 'after-downgrade-non-blocking' => _fs_text( 'You can still enjoy all %s features but you will not have access to %s updates and support.' ), + 'after-downgrade-blocking' => _fs_text( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.' ), + 'proceed-confirmation' => _fs_text( 'Are you sure you want to proceed?' ), #endregion Account - 'add-ons-for-x' => __( 'Add Ons for %s', 'freemius' ), - 'add-ons-missing' => __( 'We could\'nt load the add-ons list. It\'s probably an issue on our side, please try to come back in few minutes.', - 'freemius' ), + 'add-ons-for-x' => _fs_text( 'Add Ons for %s' ), + 'add-ons-missing' => _fs_text( 'We could\'nt load the add-ons list. It\'s probably an issue on our side, please try to come back in few minutes.' ), #region Plugin Deactivation - 'anonymous-feedback' => __( 'Anonymous feedback', 'freemius' ), - 'quick-feedback' => __( 'Quick feedback', 'freemius' ), - 'deactivation-share-reason' => __( 'If you have a moment, please let us know why you are deactivating', - 'freemius' ), - 'deactivation-modal-button-confirm' => __( 'Yes - Deactivate', 'freemius' ), - 'deactivation-modal-button-submit' => __( 'Submit & Deactivate', 'freemius' ), - 'cancel' => __( 'Cancel', 'freemius' ), - 'reason-no-longer-needed' => __( 'I no longer need the plugin', 'freemius' ), - 'reason-found-a-better-plugin' => __( 'I found a better plugin', 'freemius' ), - 'reason-needed-for-a-short-period' => __( 'I only needed the plugin for a short period', 'freemius' ), - 'reason-broke-my-site' => __( 'The plugin broke my site', 'freemius' ), - 'reason-suddenly-stopped-working' => __( 'The plugin suddenly stopped working', 'freemius' ), - 'reason-cant-pay-anymore' => __( "I can't pay for it anymore", 'freemius' ), - 'reason-temporary-deactivation' => __( "It's a temporary deactivation. I'm just debugging an issue.", - 'freemius' ), - 'reason-other' => _x( 'Other', - 'the text of the "other" reason for deactivating the plugin that is shown in the modal box.', 'freemius' ), - 'ask-for-reason-message' => __( 'Kindly tell us the reason so we can improve.', 'freemius' ), - 'placeholder-plugin-name' => __( "What's the plugin's name?", 'freemius' ), - 'placeholder-comfortable-price' => __( 'What price would you feel comfortable paying?', 'freemius' ), - 'reason-couldnt-make-it-work' => __( "I couldn't understand how to make it work", 'freemius' ), - 'reason-great-but-need-specific-feature' => __( "The plugin is great, but I need specific feature that you don't support", - 'freemius' ), - 'reason-not-working' => __( 'The plugin is not working', 'freemius' ), - 'reason-not-what-i-was-looking-for' => __( "It's not what I was looking for", 'freemius' ), - 'reason-didnt-work-as-expected' => __( "The plugin didn't work as expected", 'freemius' ), - 'placeholder-feature' => __( 'What feature?', 'freemius' ), - 'placeholder-share-what-didnt-work' => __( "Kindly share what didn't work so we can fix it for future users...", - 'freemius' ), - 'placeholder-what-youve-been-looking-for' => __( "What you've been looking for?", 'freemius' ), - 'placeholder-what-did-you-expect' => __( "What did you expect?", 'freemius' ), - 'reason-didnt-work' => __( "The plugin didn't work", 'freemius' ), - 'reason-dont-like-to-share-my-information' => __( "I don't like to share my information with you", 'freemius' ), - 'dont-have-to-share-any-data' => __( "You might have missed it, but you don't have to share any data and can just %s the opt-in.", - 'freemius' ), + 'anonymous-feedback' => _fs_text( 'Anonymous feedback' ), + 'quick-feedback' => _fs_text( 'Quick feedback' ), + 'deactivation-share-reason' => _fs_text( 'If you have a moment, please let us know why you are %s' ), + 'deactivating' => _fs_text( 'deactivating' ), + 'deactivation' => _fs_text( 'Deactivation' ), + 'theme-switch' => _fs_text( 'Theme Switch' ), + 'switching' => _fs_text( 'switching' ), + 'switch' => _fs_text( 'Switch' ), + 'activate-x' => _fs_text( 'Activate %s' ), + 'deactivation-modal-button-confirm' => _fs_text( 'Yes - %s' ), + 'deactivation-modal-button-submit' => _fs_text( 'Submit & %s' ), + 'cancel' => _fs_text( 'Cancel' ), + 'reason-no-longer-needed' => _fs_text( 'I no longer need the %s' ), + 'reason-found-a-better-plugin' => _fs_text( 'I found a better %s' ), + 'reason-needed-for-a-short-period' => _fs_text( 'I only needed the %s for a short period' ), + 'reason-broke-my-site' => _fs_text( 'The %s broke my site' ), + 'reason-suddenly-stopped-working' => _fs_text( 'The %s suddenly stopped working' ), + 'reason-cant-pay-anymore' => _fs_text( "I can't pay for it anymore" ), + 'reason-temporary-deactivation' => _fs_text( "It's a temporary deactivation. I'm just debugging an issue." ), + 'reason-temporary-x' => _fs_text( "It's a temporary %s. I'm just debugging an issue." ), + 'reason-other' => _fs_x( 'Other', + 'the text of the "other" reason for deactivating the module that is shown in the modal box.' ), + 'ask-for-reason-message' => _fs_text( 'Kindly tell us the reason so we can improve.' ), + 'placeholder-plugin-name' => _fs_text( "What's the %s's name?" ), + 'placeholder-comfortable-price' => _fs_text( 'What price would you feel comfortable paying?' ), + 'reason-couldnt-make-it-work' => _fs_text( "I couldn't understand how to make it work" ), + 'reason-great-but-need-specific-feature' => _fs_text( "The %s is great, but I need specific feature that you don't support" ), + 'reason-not-working' => _fs_text( 'The %s is not working' ), + 'reason-not-what-i-was-looking-for' => _fs_text( "It's not what I was looking for" ), + 'reason-didnt-work-as-expected' => _fs_text( "The %s didn't work as expected" ), + 'placeholder-feature' => _fs_text( 'What feature?' ), + 'placeholder-share-what-didnt-work' => _fs_text( "Kindly share what didn't work so we can fix it for future users..." ), + 'placeholder-what-youve-been-looking-for' => _fs_text( "What you've been looking for?" ), + 'placeholder-what-did-you-expect' => _fs_text( "What did you expect?" ), + 'reason-didnt-work' => _fs_text( "The %s didn't work" ), + 'reason-dont-like-to-share-my-information' => _fs_text( "I don't like to share my information with you" ), + 'dont-have-to-share-any-data' => _fs_text( "You might have missed it, but you don't have to share any data and can just %s the opt-in." ), #endregion Plugin Deactivation #region Connect - 'hey-x' => _x( 'Hey %s,', 'greeting', 'freemius' ), - 'thanks-x' => _x( 'Thanks %s!', 'a greeting. E.g. Thanks John!', 'freemius' ), - 'connect-message' => __( 'Never miss an important update - opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s.', - 'freemius' ), - 'connect-message_on-update' => __( 'Please help us improve %1$s! If you opt-in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that\'s okay! %1$s will still work just fine.', - 'freemius' ), - 'pending-activation-message' => __( 'You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s.', 'freemius' ), - 'complete-the-install' => __( 'complete the install', 'freemius' ), - 'start-the-trial' => __( 'start the trial', 'freemius' ), - 'thanks-for-purchasing' => __( 'Thanks for purchasing %s! To get started, please enter your license key:', - 'freemius' ), - 'license-sync-disclaimer' => __( 'The plugin will be periodically sending data to %s to check for plugin updates and verify the validity of your license.', - 'freemius' ), - 'what-permissions' => __( 'What permissions are being granted?', 'freemius' ), - 'permissions-profile' => __( 'Your Profile Overview', 'freemius' ), - 'permissions-profile_desc' => __( 'Name and email address', 'freemius' ), - 'permissions-site' => __( 'Your Site Overview', 'freemius' ), - 'permissions-site_desc' => __( 'Site URL, WP version, PHP info, plugins & themes', - 'freemius' ), - 'permissions-events' => __( 'Current Plugin Events', 'freemius' ), - 'permissions-events_desc' => __( 'Activation, deactivation and uninstall', 'freemius' ), - 'permissions-plugins_themes' => __( 'Plugins & Themes', 'freemius' ), - 'permissions-plugins_themes_desc' => __( 'Titles, versions and state.', 'freemius' ), - 'permissions-admin-notices' => __( 'Admin Notices', 'freemius' ), - 'permissions-newsletter' => __( 'Newsletter', 'freemius' ), - 'permissions-newsletter_desc' => __( 'Updates, announcements, marketing, no spam', 'freemius' ), - 'privacy-policy' => __( 'Privacy Policy', 'freemius' ), - 'tos' => __( 'Terms of Service', 'freemius' ), - 'activating' => _x( 'Activating', 'as activating plugin', 'freemius' ), - 'sending-email' => _x( 'Sending email', 'as in the process of sending an email', - 'freemius' ), - 'opt-in-connect' => _x( 'Allow & Continue', 'button label', 'freemius' ), - 'agree-activate-license' => _x( 'Agree & Activate License', 'button label', 'freemius' ), - 'skip' => _x( 'Skip', 'verb', 'freemius' ), - 'click-here-to-use-plugin-anonymously' => __( 'Click here to use the plugin anonymously', 'freemius' ), - 'resend-activation-email' => __( 'Re-send activation email', 'freemius' ), - 'license-key' => __( 'License key', 'freemius' ), - 'send-license-key' => __( 'Send License Key', 'freemius' ), - 'sending-license-key' => __( 'Sending license key', 'freemius' ), - 'have-license-key' => __( 'Have a license key?', 'freemius' ), - 'dont-have-license-key' => __( 'Don\'t have a license key?', 'freemius' ), - 'cant-find-license-key' => __( "Can't find your license key?", 'freemius' ), - 'email-not-found' => __( "We couldn't find your email address in the system, are you sure it's the right address?", - 'freemius' ), - 'no-active-licenses' => __( "We can't see any active licenses associated with that email address, are you sure it's the right address?", - 'freemius' ), - 'opt-in' => __( 'Opt In', 'freemius' ), - 'opt-out' => __( 'Opt Out', 'freemius' ), - 'opt-out-cancel' => __( 'On second thought - I want to continue helping', - 'freemius' ), - 'opting-out' => __( 'Opting out...', 'freemius' ), - 'opting-in' => __( 'Opting in...', 'freemius' ), - 'opt-out-message-appreciation' => __( 'We appreciate your help in making the %s better by letting us track some usage data.', - 'freemius' ), - 'opt-out-message-usage-tracking' => __( "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking.", - 'freemius' ), - 'opt-out-message-clicking-opt-out' => __( 'By clicking "Opt Out", we will no longer be sending any data from %s to %s.', - 'freemius' ), + 'hey-x' => _fs_x( 'Hey %s,', 'greeting' ), + 'thanks-x' => _fs_x( 'Thanks %s!', 'a greeting. E.g. Thanks John!' ), + 'connect-message' => _fs_text( 'Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s.' ), + 'connect-message_on-update' => _fs_text( 'Please help us improve %1$s! If you opt in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that\'s okay! %1$s will still work just fine.' ), + 'pending-activation-message' => _fs_text( 'You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s.' ), + 'complete-the-install' => _fs_text( 'complete the install' ), + 'start-the-trial' => _fs_text( 'start the trial' ), + 'thanks-for-purchasing' => _fs_text( 'Thanks for purchasing %s! To get started, please enter your license key:' ), + 'license-sync-disclaimer' => _fs_text( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.' ), + 'what-permissions' => _fs_text( 'What permissions are being granted?' ), + 'permissions-profile' => _fs_text( 'Your Profile Overview' ), + 'permissions-profile_desc' => _fs_text( 'Name and email address' ), + 'permissions-site' => _fs_text( 'Your Site Overview' ), + 'permissions-site_desc' => _fs_text( 'Site URL, WP version, PHP info, plugins & themes' ), + 'permissions-events' => _fs_text( 'Current %s Events' ), + 'permissions-events_desc' => _fs_text( 'Activation, deactivation and uninstall' ), + 'permissions-plugins_themes' => _fs_text( 'Plugins & Themes' ), + 'permissions-plugins_themes_desc' => _fs_text( 'Titles, versions and state.' ), + 'permissions-admin-notices' => _fs_text( 'Admin Notices' ), + 'permissions-newsletter' => _fs_text( 'Newsletter' ), + 'permissions-newsletter_desc' => _fs_text( 'Updates, announcements, marketing, no spam' ), + 'privacy-policy' => _fs_text( 'Privacy Policy' ), + 'tos' => _fs_text( 'Terms of Service' ), + 'activating' => _fs_x( 'Activating', 'as activating plugin' ), + 'sending-email' => _fs_x( 'Sending email', 'as in the process of sending an email' ), + 'opt-in-connect' => _fs_x( 'Allow & Continue', 'button label' ), + 'agree-activate-license' => _fs_x( 'Agree & Activate License', 'button label' ), + 'skip' => _fs_x( 'Skip', 'verb' ), + 'click-here-to-use-plugin-anonymously' => _fs_text( 'Click here to use the plugin anonymously' ), + 'resend-activation-email' => _fs_text( 'Re-send activation email' ), + 'license-key' => _fs_text( 'License key' ), + 'send-license-key' => _fs_text( 'Send License Key' ), + 'sending-license-key' => _fs_text( 'Sending license key' ), + 'have-license-key' => _fs_text( 'Have a license key?' ), + 'dont-have-license-key' => _fs_text( 'Don\'t have a license key?' ), + 'cant-find-license-key' => _fs_text( "Can't find your license key?" ), + 'email-not-found' => _fs_text( "We couldn't find your email address in the system, are you sure it's the right address?" ), + 'no-active-licenses' => _fs_text( "We can't see any active licenses associated with that email address, are you sure it's the right address?" ), + 'opt-in' => _fs_text( 'Opt In' ), + 'opt-out' => _fs_text( 'Opt Out' ), + 'opt-out-cancel' => _fs_text( 'On second thought - I want to continue helping' ), + 'opting-out' => _fs_text( 'Opting out...' ), + 'opting-in' => _fs_text( 'Opting in...' ), + 'opt-out-message-appreciation' => _fs_text( 'We appreciate your help in making the %s better by letting us track some usage data.' ), + 'opt-out-message-usage-tracking' => _fs_text( "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." ), + 'opt-out-message-clicking-opt-out' => _fs_text( 'By clicking "Opt Out", we will no longer be sending any data from %s to %s.' ), + 'apply-on-all-sites-in-the-network' => _fs_text( 'Apply on all sites in the network.' ), + 'delegate-to-site-admins' => _fs_text( 'Delegate to Site Admins' ), + 'delegate-to-site-admins-and-continue' => _fs_text( 'Delegate to Site Admins & Continue' ), + 'continue' => _fs_text( 'Continue' ), + 'allow' => _fs_text( 'allow' ), + 'delegate' => _fs_text( 'delegate' ), #endregion Connect #region Screenshots - 'screenshots' => __( 'Screenshots', 'freemius' ), - 'view-full-size-x' => __( 'Click to view full-size screenshot %d', 'freemius' ), + 'screenshots' => _fs_text( 'Screenshots' ), + 'view-full-size-x' => _fs_text( 'Click to view full-size screenshot %d' ), #endregion Screenshots #region Debug - 'freemius-debug' => __( 'Freemius Debug', 'freemius' ), - 'on' => _x( 'On', 'as turned on', 'freemius' ), - 'off' => _x( 'Off', 'as turned off', 'freemius' ), - 'debugging' => _x( 'Debugging', 'as code debugging', 'freemius' ), - 'freemius-state' => __( 'Freemius State', 'freemius' ), - 'connected' => _x( 'Connected', 'as connection was successful', 'freemius' ), - 'blocked' => _x( 'Blocked', 'as connection blocked', 'freemius' ), - 'api' => _x( 'API', 'as application program interface', 'freemius' ), - 'sdk' => _x( 'SDK', 'as software development kit versions', 'freemius' ), - 'sdk-versions' => _x( 'SDK Versions', 'as software development kit versions', - 'freemius' ), - 'plugin-path' => _x( 'Plugin Path', 'as plugin folder path', 'freemius' ), - 'sdk-path' => _x( 'SDK Path', 'as sdk path', 'freemius' ), - 'addons-of-x' => __( 'Add Ons of Plugin %s', 'freemius' ), - 'delete-all-confirm' => __( 'Are you sure you want to delete all Freemius data?', - 'freemius' ), - 'actions' => __( 'Actions', 'freemius' ), - 'delete-all-accounts' => __( 'Delete All Accounts', 'freemius' ), - 'start-fresh' => __( 'Start Fresh', 'freemius' ), - 'clear-api-cache' => __( 'Clear API Cache', 'freemius' ), - 'sync-data-from-server' => __( 'Sync Data From Server', 'freemius' ), - 'scheduled-crons' => __( 'Scheduled Crons', 'freemius' ), - 'plugins-themes-sync' => __( 'Plugins & Themes Sync', 'freemius' ), + 'freemius-debug' => _fs_text( 'Freemius Debug' ), + 'on' => _fs_x( 'On', 'as turned on' ), + 'off' => _fs_x( 'Off', 'as turned off' ), + 'debugging' => _fs_x( 'Debugging', 'as code debugging' ), + 'freemius-state' => _fs_text( 'Freemius State' ), + 'connected' => _fs_x( 'Connected', 'as connection was successful' ), + 'blocked' => _fs_x( 'Blocked', 'as connection blocked' ), + 'api' => _fs_x( 'API', 'as application program interface' ), + 'sdk' => _fs_x( 'SDK', 'as software development kit versions' ), + 'sdk-versions' => _fs_x( 'SDK Versions', 'as software development kit versions' ), + 'plugin-path' => _fs_x( 'Plugin Path', 'as plugin folder path' ), + 'sdk-path' => _fs_x( 'SDK Path', 'as sdk path' ), + 'addons-of-x' => _fs_text( 'Add Ons of Plugin %s' ), + 'delete-all-confirm' => _fs_text( 'Are you sure you want to delete all Freemius data?' ), + 'actions' => _fs_text( 'Actions' ), + 'delete-all-accounts' => _fs_text( 'Delete All Accounts' ), + 'start-fresh' => _fs_text( 'Start Fresh' ), + 'clear-api-cache' => _fs_text( 'Clear API Cache' ), + 'sync-data-from-server' => _fs_text( 'Sync Data From Server' ), + 'scheduled-crons' => _fs_text( 'Scheduled Crons' ), + 'cron-type' => _fs_text( 'Cron Type' ), + 'plugins-themes-sync' => _fs_text( 'Plugins & Themes Sync' ), + 'module-licenses' => _fs_text( '%s Licenses' ), + 'debug-log' => _fs_text( 'Debug Log' ), + 'all' => _fs_text( 'All' ), + 'file' => _fs_text( 'File' ), + 'function' => _fs_text( 'Function' ), + 'process-id' => _fs_text( 'Process ID' ), + 'logger' => _fs_text( 'Logger' ), + 'message' => _fs_text( 'Message' ), + 'download' => _fs_text( 'Download' ), + 'filter' => _fs_text( 'Filter' ), + 'type' => _fs_text( 'Type' ), + 'all-types' => _fs_text( 'All Types' ), + 'all-requests' => _fs_text( 'All Requests' ), #endregion Debug #region Expressions - 'congrats' => _x( 'Congrats', 'as congratulations', 'freemius' ), - 'oops' => _x( 'Oops', 'exclamation', 'freemius' ), - 'yee-haw' => _x( 'Yee-haw', 'interjection expressing joy or exuberance', - 'freemius' ), - 'woot' => _x( 'W00t', - '(especially in electronic communication) used to express elation, enthusiasm, or triumph.', 'freemius' ), - 'right-on' => _x( 'Right on', 'a positive response', 'freemius' ), - 'hmm' => _x( 'Hmm', - 'something somebody says when they are thinking about what you have just said. ', 'freemius' ), - 'ok' => __( 'O.K', 'freemius' ), - 'hey' => _x( 'Hey', 'exclamation', 'freemius' ), - 'heads-up' => _x( 'Heads up', - 'advance notice of something that will need attention.', 'freemius' ), + 'congrats' => _fs_x( 'Congrats', 'as congratulations' ), + 'oops' => _fs_x( 'Oops', 'exclamation' ), + 'yee-haw' => _fs_x( 'Yee-haw', 'interjection expressing joy or exuberance' ), + 'woot' => _fs_x( 'W00t', + '(especially in electronic communication) used to express elation, enthusiasm, or triumph.' ), + 'right-on' => _fs_x( 'Right on', 'a positive response' ), + 'hmm' => _fs_x( 'Hmm', + 'something somebody says when they are thinking about what you have just said. ' ), + 'ok' => _fs_text( 'O.K' ), + 'hey' => _fs_x( 'Hey', 'exclamation' ), + 'heads-up' => _fs_x( 'Heads up', + 'advance notice of something that will need attention.' ), #endregion Expressions #region Admin Notices - 'you-have-latest' => __( 'Seems like you got the latest release.', 'freemius' ), - 'you-are-good' => __( 'You are all good!', 'freemius' ), - 'user-exist-message' => __( 'Sorry, we could not complete the email update. Another user with the same email is already registered.', - 'freemius' ), - 'user-exist-message_ownership' => __( 'If you would like to give up the ownership of the plugin\'s account to %s click the Change Ownership button.', - 'freemius' ), - 'email-updated-message' => __( 'Your email was successfully updated. You should receive an email with confirmation instructions in few moments.', - 'freemius' ), - 'name-updated-message' => __( 'Your name was successfully updated.', 'freemius' ), - 'x-updated' => __( 'You have successfully updated your %s.', 'freemius' ), - 'name-update-failed-message' => __( 'Please provide your full name.', 'freemius' ), - 'verification-email-sent-message' => __( 'Verification mail was just sent to %s. If you can\'t find it after 5 min, please check your spam box.', - 'freemius' ), - 'addons-info-external-message' => __( 'Just letting you know that the add-ons information of %s is being pulled from an external server.', - 'freemius' ), - 'no-cc-required' => __( 'No credit card required', 'freemius' ), - 'premium-activated-message' => __( 'Premium plugin version was successfully activated.', - 'freemius' ), - 'successful-version-upgrade-message' => __( 'The upgrade of %s was successfully completed.', 'freemius' ), - 'activation-with-plan-x-message' => __( 'Your account was successfully activated with the %s plan.', - 'freemius' ), - 'download-latest-x-version-now' => __( 'Download the latest %s version now', 'freemius' ), - 'follow-steps-to-complete-upgrade' => __( 'Please follow these steps to complete the upgrade', - 'freemius' ), - 'download-latest-x-version' => __( 'Download the latest %s version', 'freemius' ), - 'download-latest-version' => __( 'Download the latest version', 'freemius' ), - 'deactivate-free-version' => __( 'Deactivate the free version', 'freemius' ), - 'upload-and-activate' => __( 'Upload and activate the downloaded version', 'freemius' ), - 'howto-upload-activate' => __( 'How to upload and activate?', 'freemius' ), - 'addon-successfully-purchased-message' => _x( '%s Add-on was successfully purchased.', - '%s - product name, e.g. Facebook add-on was successfully...', 'freemius' ), - 'addon-successfully-upgraded-message' => __( 'Your %s Add-on plan was successfully upgraded.', - 'freemius' ), - 'email-verified-message' => __( 'Your email has been successfully verified - you are AWESOME!', - 'freemius' ), - 'plan-upgraded-message' => __( 'Your plan was successfully upgraded.', 'freemius' ), - 'plan-changed-to-x-message' => __( 'Your plan was successfully changed to %s.', 'freemius' ), - 'license-expired-blocking-message' => __( 'Your license has expired. You can still continue using the free plugin forever.', - 'freemius' ), - 'license-cancelled' => __( 'Your license has been cancelled. If you think it\'s a mistake, please contact support.', - 'freemius' ), - 'trial-started-message' => __( 'Your trial has been successfully started.', 'freemius' ), - 'license-activated-message' => __( 'Your license was successfully activated.', 'freemius' ), - 'no-active-license-message' => __( 'It looks like your site currently doesn\'t have an active license.', - 'freemius' ), - 'license-deactivation-message' => __( 'Your license was successfully deactivated, you are back to the %s plan.', - 'freemius' ), - 'license-deactivation-failed-message' => __( 'It looks like the license deactivation failed.', - 'freemius' ), - 'license-activation-failed-message' => __( 'It looks like the license could not be activated.', - 'freemius' ), - 'server-error-message' => __( 'Error received from the server:', 'freemius' ), - 'trial-expired-message' => __( 'Your trial has expired. You can still continue using all our free features.', - 'freemius' ), - 'plan-x-downgraded-message' => __( 'Your plan was successfully downgraded. Your %s plan license will expire in %s.', - 'freemius' ), - 'plan-downgraded-failure-message' => __( 'Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes.', - 'freemius' ), - 'trial-cancel-no-trial-message' => __( 'It looks like you are not in trial mode anymore so there\'s nothing to cancel :)', - 'freemius' ), - 'trial-cancel-message' => __( 'Your %s free trial was successfully cancelled.', - 'freemius' ), - 'version-x-released' => _x( 'Version %s was released.', '%s - numeric version number', - 'freemius' ), - 'please-download-x' => __( 'Please download %s.', 'freemius' ), - 'latest-x-version' => _x( 'the latest %s version here', - '%s - plan name, as the latest professional version here', 'freemius' ), - 'trial-x-promotion-message' => __( 'How do you like %s so far? Test all our %s premium features with a %d-day free trial.', - 'freemius' ), - 'start-free-trial' => _x( 'Start free trial', 'call to action', 'freemius' ), - 'starting-trial' => __( 'Starting trial', 'freemius' ), - 'please-wait' => __( 'Please wait', 'freemius' ), - 'trial-cancel-failure-message' => __( 'Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.', - 'freemius' ), - 'trial-utilized' => __( 'You already utilized a trial before.', 'freemius' ), - 'in-trial-mode' => __( 'You are already running the plugin in a trial mode.', - 'freemius' ), - 'trial-plan-x-not-exist' => __( 'Plan %s do not exist, therefore, can\'t start a trial.', - 'freemius' ), - 'plan-x-no-trial' => __( 'Plan %s does not support a trial period.', 'freemius' ), - 'no-trials' => __( 'None of the plugin\'s plans supports a trial period.', - 'freemius' ), - 'unexpected-api-error' => __( 'Unexpected API error. Please contact the plugin\'s author with the following error.', - 'freemius' ), - 'no-commitment-for-x-days' => __( 'No commitment for %s days - cancel anytime!', 'freemius' ), - 'license-expired-non-blocking-message' => __( 'Your license has expired. You can still continue using all the %s features, but you\'ll need to renew your license to continue getting updates and support.', - 'freemius' ), - 'could-not-activate-x' => __( 'Couldn\'t activate %s.', 'freemius' ), - 'contact-us-with-error-message' => __( 'Please contact us with the following message:', 'freemius' ), - 'plan-did-not-change-message' => __( 'It looks like you are still on the %s plan. If you did upgrade or change your plan, it\'s probably an issue on our side - sorry.', - 'freemius' ), - 'contact-us-here' => __( 'Please contact us here', 'freemius' ), - 'plan-did-not-change-email-message' => __( 'I have upgraded my account but when I try to Sync the License, the plan remains %s.', - 'freemius' ), + 'you-have-latest' => _fs_text( 'Seems like you got the latest release.' ), + 'you-are-good' => _fs_text( 'You are all good!' ), + 'user-exist-message' => _fs_text( 'Sorry, we could not complete the email update. Another user with the same email is already registered.' ), + 'user-exist-message_ownership' => _fs_text( 'If you would like to give up the ownership of the %s\'s account to %s click the Change Ownership button.' ), + 'email-updated-message' => _fs_text( 'Your email was successfully updated. You should receive an email with confirmation instructions in few moments.' ), + 'name-updated-message' => _fs_text( 'Your name was successfully updated.' ), + 'x-updated' => _fs_text( 'You have successfully updated your %s.' ), + 'name-update-failed-message' => _fs_text( 'Please provide your full name.' ), + 'verification-email-sent-message' => _fs_text( 'Verification mail was just sent to %s. If you can\'t find it after 5 min, please check your spam box.' ), + 'addons-info-external-message' => _fs_text( 'Just letting you know that the add-ons information of %s is being pulled from an external server.' ), + 'no-cc-required' => _fs_text( 'No credit card required' ), + 'premium-activated-message' => _fs_text( 'Premium %s version was successfully activated.' ), + 'successful-version-upgrade-message' => _fs_text( 'The upgrade of %s was successfully completed.' ), + 'activation-with-plan-x-message' => _fs_text( 'Your account was successfully activated with the %s plan.' ), + 'download-latest-x-version-now' => _fs_text( 'Download the latest %s version now' ), + 'follow-steps-to-complete-upgrade' => _fs_text( 'Please follow these steps to complete the upgrade' ), + 'download-latest-x-version' => _fs_text( 'Download the latest %s version' ), + 'download-latest-version' => _fs_text( 'Download the latest version' ), + 'deactivate-free-version' => _fs_text( 'Deactivate the free version' ), + 'upload-and-activate' => _fs_text( 'Upload and activate the downloaded version' ), + 'howto-upload-activate' => _fs_text( 'How to upload and activate?' ), + 'addon-successfully-purchased-message' => _fs_x( '%s Add-on was successfully purchased.', + '%s - product name, e.g. Facebook add-on was successfully...' ), + 'addon-successfully-upgraded-message' => _fs_text( 'Your %s Add-on plan was successfully upgraded.' ), + 'email-verified-message' => _fs_text( 'Your email has been successfully verified - you are AWESOME!' ), + 'plan-upgraded-message' => _fs_text( 'Your plan was successfully upgraded.' ), + 'plan-changed-to-x-message' => _fs_text( 'Your plan was successfully changed to %s.' ), + 'license-expired-blocking-message' => _fs_text( 'Your license has expired. You can still continue using the free %s forever.' ), + 'license-cancelled' => _fs_text( 'Your license has been cancelled. If you think it\'s a mistake, please contact support.' ), + 'trial-started-message' => _fs_text( 'Your trial has been successfully started.' ), + 'license-activated-message' => _fs_text( 'Your license was successfully activated.' ), + 'no-active-license-message' => _fs_text( 'It looks like your site currently doesn\'t have an active license.' ), + 'license-deactivation-message' => _fs_text( 'Your license was successfully deactivated, you are back to the %s plan.' ), + 'license-deactivation-failed-message' => _fs_text( 'It looks like the license deactivation failed.' ), + 'license-activation-failed-message' => _fs_text( 'It looks like the license could not be activated.' ), + 'server-error-message' => _fs_text( 'Error received from the server:' ), + 'trial-expired-message' => _fs_text( 'Your trial has expired. You can still continue using all our free features.' ), + 'plan-x-downgraded-message' => _fs_text( 'Your plan was successfully downgraded. Your %s plan license will expire in %s.' ), + 'plan-downgraded-failure-message' => _fs_text( 'Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes.' ), + 'trial-cancel-no-trial-message' => _fs_text( 'It looks like you are not in trial mode anymore so there\'s nothing to cancel :)' ), + 'trial-cancel-message' => _fs_text( 'Your %s free trial was successfully cancelled.' ), + 'version-x-released' => _fs_x( 'Version %s was released.', '%s - numeric version number' ), + 'please-download-x' => _fs_text( 'Please download %s.' ), + 'latest-x-version' => _fs_x( 'the latest %s version here', + '%s - plan name, as the latest professional version here' ), + 'trial-x-promotion-message' => _fs_text( 'How do you like %s so far? Test all our %s premium features with a %d-day free trial.' ), + 'start-free-trial' => _fs_x( 'Start free trial', 'call to action' ), + 'starting-trial' => _fs_text( 'Starting trial' ), + 'please-wait' => _fs_text( 'Please wait' ), + 'trial-cancel-failure-message' => _fs_text( 'Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes.' ), + 'trial-utilized' => _fs_text( 'You already utilized a trial before.' ), + 'in-trial-mode' => _fs_text( 'You are already running the %s in a trial mode.' ), + 'trial-plan-x-not-exist' => _fs_text( 'Plan %s do not exist, therefore, can\'t start a trial.' ), + 'plan-x-no-trial' => _fs_text( 'Plan %s does not support a trial period.' ), + 'no-trials' => _fs_text( 'None of the %s\'s plans supports a trial period.' ), + 'unexpected-api-error' => _fs_text( 'Unexpected API error. Please contact the %s\'s author with the following error.' ), + 'no-commitment-for-x-days' => _fs_text( 'No commitment for %s days - cancel anytime!' ), + 'license-expired-non-blocking-message' => _fs_text( 'Your license has expired. You can still continue using all the %s features, but you\'ll need to renew your license to continue getting updates and support.' ), + 'could-not-activate-x' => _fs_text( 'Couldn\'t activate %s.' ), + 'contact-us-with-error-message' => _fs_text( 'Please contact us with the following message:' ), + 'plan-did-not-change-message' => _fs_text( 'It looks like you are still on the %s plan. If you did upgrade or change your plan, it\'s probably an issue on our side - sorry.' ), + 'contact-us-here' => _fs_text( 'Please contact us here' ), + 'plan-did-not-change-email-message' => _fs_text( 'I have upgraded my account but when I try to Sync the License, the plan remains %s.' ), #endregion Admin Notices #region Connectivity Issues - 'connectivity-test-fails-message' => __( 'From unknown reason, the API connectivity test failed.', - 'freemius' ), - 'connectivity-test-maybe-temporary' => __( 'It\'s probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?', - 'freemius' ), - 'curl-missing-message' => __( 'We use PHP cURL library for the API calls, which is a very common library and usually installed out of the box. Unfortunately, cURL is not installed on your server.', - 'freemius' ), - 'cloudflare-blocks-connection-message' => __( 'From unknown reason, CloudFlare, the firewall we use, blocks the connection.', - 'freemius' ), - 'x-requires-access-to-api' => _x( '%s requires an access to our API.', - 'as pluginX requires an access to our API', 'freemius' ), - 'squid-blocks-connection-message' => __( 'It looks like your server is using Squid ACL (access control lists), which blocks the connection.', - 'freemius' ), - 'squid-no-clue-title' => __( 'I don\'t know what is Squid or ACL, help me!', 'freemius' ), - 'squid-no-clue-desc' => __( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.', - 'freemius' ), - 'sysadmin-title' => __( 'I\'m a system administrator', 'freemius' ), - 'squid-sysadmin-desc' => __( 'Great, please whitelist the following domains: %s. Once you done, deactivate the plugin and activate it again.', - 'freemius' ), - 'curl-missing-no-clue-title' => __( 'I don\'t know what is cURL or how to install it, help me!', - 'freemius' ), - 'curl-missing-no-clue-desc' => __( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.', - 'freemius' ), - 'curl-missing-sysadmin-desc' => __( 'Great, please install cURL and enable it in your php.ini file. To make sure it was successfully activated, use \'phpinfo()\'. Once activated, deactivate the plugin and reactivate it back again.', - 'freemius' ), - 'happy-to-resolve-issue-asap' => __( 'We are sure it\'s an issue on our side and more than happy to resolve it for you ASAP if you give us a chance.', - 'freemius' ), - 'contact-support-before-deactivation' => __( 'Sorry for the inconvenience and we are here to help if you give us a chance.', - 'freemius' ), - 'fix-issue-title' => __( 'Yes - I\'m giving you a chance to fix it', 'freemius' ), - 'fix-issue-desc' => __( 'We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update.', - 'freemius' ), - 'install-previous-title' => __( 'Let\'s try your previous version', 'freemius' ), - 'install-previous-desc' => __( 'Uninstall this version and install the previous one.', - 'freemius' ), - 'deactivate-plugin-title' => __( 'That\'s exhausting, please deactivate', 'freemius' ), - 'deactivate-plugin-desc' => __( 'We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future.', - 'freemius' ), - 'fix-request-sent-message' => __( 'Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.', - 'freemius' ), - 'server-blocking-access' => _x( 'Your server is blocking the access to Freemius\' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s', - '%1s - plugin title, %2s - API domain', 'freemius' ), - 'wrong-authentication-param-message' => __( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.', - 'freemius' ), + 'connectivity-test-fails-message' => _fs_text( 'From unknown reason, the API connectivity test failed.' ), + 'connectivity-test-maybe-temporary' => _fs_text( 'It\'s probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?' ), + 'curl-missing-message' => _fs_text( 'We use PHP cURL library for the API calls, which is a very common library and usually installed and activated out of the box. Unfortunately, cURL is not activated (or disabled) on your server.' ), + 'curl-disabled-methods' => _fs_text( 'Disabled method(s):' ), + 'cloudflare-blocks-connection-message' => _fs_text( 'From unknown reason, CloudFlare, the firewall we use, blocks the connection.' ), + 'x-requires-access-to-api' => _fs_x( '%s requires an access to our API.', + 'as pluginX requires an access to our API' ), + 'squid-blocks-connection-message' => _fs_text( 'It looks like your server is using Squid ACL (access control lists), which blocks the connection.' ), + 'squid-no-clue-title' => _fs_text( 'I don\'t know what is Squid or ACL, help me!' ), + 'squid-no-clue-desc' => _fs_text( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.' ), + 'sysadmin-title' => _fs_text( 'I\'m a system administrator' ), + 'squid-sysadmin-desc' => _fs_text( 'Great, please whitelist the following domains: %s. Once you are done, deactivate the %s and activate it again.' ), + 'curl-missing-no-clue-title' => _fs_text( 'I don\'t know what is cURL or how to install it, help me!' ), + 'curl-missing-no-clue-desc' => _fs_text( 'We\'ll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update.' ), + 'curl-missing-sysadmin-desc' => _fs_text( 'Great, please install cURL and enable it in your php.ini file. In addition, search for the \'disable_functions\' directive in your php.ini file and remove any disabled methods starting with \'curl_\'. To make sure it was successfully activated, use \'phpinfo()\'. Once activated, deactivate the %s and reactivate it back again.' ), + 'happy-to-resolve-issue-asap' => _fs_text( 'We are sure it\'s an issue on our side and more than happy to resolve it for you ASAP if you give us a chance.' ), + 'contact-support-before-deactivation' => _fs_text( 'Sorry for the inconvenience and we are here to help if you give us a chance.' ), + 'fix-issue-title' => _fs_text( 'Yes - I\'m giving you a chance to fix it' ), + 'fix-issue-desc' => _fs_text( 'We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update.' ), + 'install-previous-title' => _fs_text( 'Let\'s try your previous version' ), + 'install-previous-desc' => _fs_text( 'Uninstall this version and install the previous one.' ), + 'deactivate-plugin-title' => _fs_text( 'That\'s exhausting, please deactivate' ), + 'deactivate-plugin-desc' => _fs_text( 'We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future.' ), + 'fix-request-sent-message' => _fs_text( 'Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience.' ), + 'server-blocking-access' => _fs_x( 'Your server is blocking the access to Freemius\' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s', + '%1s - plugin title, %2s - API domain' ), + 'wrong-authentication-param-message' => _fs_text( 'It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again.' ), #endregion Connectivity Issues #region Change Owner - 'change-owner-request-sent-x' => __( 'Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder.', - 'freemius' ), - 'change-owner-request_owner-confirmed' => __( 'Thanks for confirming the ownership change. An email was just sent to %s for final approval.', - 'freemius' ), - 'change-owner-request_candidate-confirmed' => __( '%s is the new owner of the account.', 'freemius' ), + 'change-owner-request-sent-x' => _fs_text( 'Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder.' ), + 'change-owner-request_owner-confirmed' => _fs_text( 'Thanks for confirming the ownership change. An email was just sent to %s for final approval.' ), + 'change-owner-request_candidate-confirmed' => _fs_text( '%s is the new owner of the account.' ), #endregion Change Owner - 'addon-x-cannot-run-without-y' => _x( '%s cannot run without %s.', - 'addonX cannot run without pluginY', 'freemius' ), - 'addon-x-cannot-run-without-parent' => _x( '%s cannot run without the plugin.', 'addonX cannot run...', - 'freemius' ), - 'plugin-x-activation-message' => _x( '%s activation was successfully completed.', - 'pluginX activation was successfully...', 'freemius' ), - 'features-and-pricing' => _x( 'Features & Pricing', 'Plugin installer section title', - 'freemius' ), - 'free-addon-not-deployed' => __( 'Add-on must be deployed to WordPress.org or Freemius.', - 'freemius' ), - 'paid-addon-not-deployed' => __( 'Paid add-on must be deployed to Freemius.', 'freemius' ), + 'addon-x-cannot-run-without-y' => _fs_x( '%s cannot run without %s.', + 'addonX cannot run without pluginY' ), + 'addon-x-cannot-run-without-parent' => _fs_x( '%s cannot run without the plugin.', 'addonX cannot run...' ), + 'plugin-x-activation-message' => _fs_x( '%s activation was successfully completed.', + 'pluginX activation was successfully...' ), + 'features-and-pricing' => _fs_x( 'Features & Pricing', 'Plugin installer section title' ), + 'free-addon-not-deployed' => _fs_text( 'Add-on must be deployed to WordPress.org or Freemius.' ), + 'paid-addon-not-deployed' => _fs_text( 'Paid add-on must be deployed to Freemius.' ), #-------------------------------------------------------------------------------- #region Add-On Licensing #-------------------------------------------------------------------------------- - 'addon-no-license-message' => __( '%s is a premium only add-on. You have to purchase a license first before activating the plugin.', - 'freemius' ), - 'addon-trial-cancelled-message' => __( '%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you\'ll have to purchase a license.', - 'freemius' ), + 'addon-no-license-message' => _fs_text( '%s is a premium only add-on. You have to purchase a license first before activating the plugin.' ), + 'addon-trial-cancelled-message' => _fs_text( '%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you\'ll have to purchase a license.' ), #endregion #-------------------------------------------------------------------------------- #region Billing Cycles #-------------------------------------------------------------------------------- - 'monthly' => _x( 'Monthly', 'as every month', 'freemius' ), - 'mo' => _x( 'mo', 'as monthly period', 'freemius' ), - 'annual' => _x( 'Annual', 'as once a year', 'freemius' ), - 'annually' => _x( 'Annually', 'as once a year', 'freemius' ), - 'once' => _x( 'Once', 'as once a year', 'freemius' ), - 'year' => _x( 'year', 'as annual period', 'freemius' ), - 'lifetime' => __( 'Lifetime', 'freemius' ), - 'best' => _x( 'Best', 'e.g. the best product', 'freemius' ), - 'billed-x' => _x( 'Billed %s', 'e.g. billed monthly', 'freemius' ), - 'save-x' => _x( 'Save %s', 'as a discount of $5 or 10%', 'freemius' ), + 'monthly' => _fs_x( 'Monthly', 'as every month' ), + 'mo' => _fs_x( 'mo', 'as monthly period' ), + 'annual' => _fs_x( 'Annual', 'as once a year' ), + 'annually' => _fs_x( 'Annually', 'as once a year' ), + 'once' => _fs_x( 'Once', 'as once a year' ), + 'year' => _fs_x( 'year', 'as annual period' ), + 'lifetime' => _fs_text( 'Lifetime' ), + 'best' => _fs_x( 'Best', 'e.g. the best product' ), + 'billed-x' => _fs_x( 'Billed %s', 'e.g. billed monthly' ), + 'save-x' => _fs_x( 'Save %s', 'as a discount of $5 or 10%' ), #endregion Billing Cycles - 'view-details' => __( 'View details', 'freemius' ), + 'view-details' => _fs_text( 'View details' ), #-------------------------------------------------------------------------------- #region Trial #-------------------------------------------------------------------------------- - 'approve-start-trial' => _x( 'Approve & Start Trial', 'button label', 'freemius' ), + 'approve-start-trial' => _fs_x( 'Approve & Start Trial', 'button label' ), /* translators: %1$s: Number of trial days; %2$s: Plan name; */ - 'start-trial-prompt-header' => __( 'You are 1-click away from starting your %1$s-day free trial of the %2$s plan.', 'freemius' ), + 'start-trial-prompt-header' => _fs_text( 'You are 1-click away from starting your %1$s-day free trial of the %2$s plan.' ), /* translators: %s: Link to freemius.com */ - 'start-trial-prompt-message' => __( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt-in with your user and non-sensitive site information, allowing the plugin to periodically send data to %s to check for version updates and to validate your trial.', 'freemius' ), + 'start-trial-prompt-message' => _fs_text( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.' ), #endregion #-------------------------------------------------------------------------------- #region Billing Details #-------------------------------------------------------------------------------- - 'business-name' => __( 'Business name', 'freemius' ), - 'tax-vat-id' => __( 'Tax / VAT ID', 'freemius' ), - 'address-line-n' => __( 'Address Line %d', 'freemius' ), - 'country' => __( 'Country', 'freemius' ), - 'select-country' => __( 'Select Country', 'freemius' ), - 'city' => __( 'City', 'freemius' ), - 'town' => __( 'Town', 'freemius' ), - 'state' => __( 'State', 'freemius' ), - 'province' => __( 'Province', 'freemius' ), - 'zip-postal-code' => __( 'ZIP / Postal Code', 'freemius' ), + 'business-name' => _fs_text( 'Business name' ), + 'tax-vat-id' => _fs_text( 'Tax / VAT ID' ), + 'address-line-n' => _fs_text( 'Address Line %d' ), + 'country' => _fs_text( 'Country' ), + 'select-country' => _fs_text( 'Select Country' ), + 'city' => _fs_text( 'City' ), + 'town' => _fs_text( 'Town' ), + 'state' => _fs_text( 'State' ), + 'province' => _fs_text( 'Province' ), + 'zip-postal-code' => _fs_text( 'ZIP / Postal Code' ), #endregion + #-------------------------------------------------------------------------------- + #region Module Installation + #-------------------------------------------------------------------------------- + 'installing-plugin-x' => _fs_text( 'Installing plugin: %s' ), + 'auto-installation' => _fs_text( 'Automatic Installation' ), + /* translators: %s: Number of seconds */ + 'x-sec' => _fs_text( '%s sec' ), + 'installing-in-n' => _fs_text( 'An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.' ), + 'installing-module-x' => _fs_text( 'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.' ), + 'cancel-installation' => _fs_text( 'Cancel Installation' ), + 'module-package-rename-failure' => _fs_text( 'The remote plugin package does not contain a folder with the desired slug and renaming did not work.' ), + 'auto-install-error-invalid-id' => _fs_text( 'Invalid module ID.' ), + 'auto-install-error-not-opted-in' => _fs_text( 'Auto installation only works for opted-in users.' ), + 'auto-install-error-premium-activated' => _fs_text( 'Premium version already active.' ), + 'auto-install-error-premium-addon-activated' => _fs_text( 'Premium add-on version already installed.' ), + 'auto-install-error-invalid-license' => _fs_text( 'You do not have a valid license to access the premium version.' ), + 'auto-install-error-serviceware' => _fs_text( 'Plugin is a "Serviceware" which means it does not have a premium code version.' ), + #endregion + + /* translators: %s: Page name */ + 'secure-x-page-header' => _fs_text( 'Secure HTTPS %s page, running from an external domain' ), + 'pci-compliant' => _fs_text( 'PCI compliant' ), + 'view-paid-features' => _fs_text( 'View paid features' ), ); + + /** + * Localization of the strings in the plugin/theme info dialog box. + * + * $fs_module_info_text should ONLY include strings that are not located in $fs_text. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + global $fs_module_info_text; + + $fs_module_info_text = array( + 'description' => _fs_x( 'Description', 'Plugin installer section title' ), + 'installation' => _fs_x( 'Installation', 'Plugin installer section title' ), + 'faq' => _fs_x( 'FAQ', 'Plugin installer section title' ), + 'changelog' => _fs_x( 'Changelog', 'Plugin installer section title' ), + 'reviews' => _fs_x( 'Reviews', 'Plugin installer section title' ), + 'other_notes' => _fs_x( 'Other Notes', 'Plugin installer section title' ), + /* translators: %s: 1 or One */ + 'x-star' => _fs_text( '%s star' ), + /* translators: %s: Number larger than 1 */ + 'x-stars' => _fs_text( '%s stars' ), + /* translators: %s: 1 or One */ + 'x-rating' => _fs_text( '%s rating' ), + /* translators: %s: Number larger than 1 */ + 'x-ratings' => _fs_text( '%s ratings' ), + /* translators: %s: 1 or One (Number of times downloaded) */ + 'x-time' => _fs_text( '%s time' ), + /* translators: %s: Number of times downloaded */ + 'x-times' => _fs_text( '%s times' ), + /* translators: %s: # of stars (e.g. 5 stars) */ + 'click-to-reviews' => _fs_text( 'Click to see reviews that provided a rating of %s' ), + 'last-updated:' => _fs_text( 'Last Updated' ), + 'requires-wordpress-version:' => _fs_text( 'Requires WordPress Version:' ), + 'author:' => _fs_x( 'Author:', 'as the plugin author' ), + 'compatible-up-to:' => _fs_text( 'Compatible up to:' ), + 'downloaded:' => _fs_text( 'Downloaded:' ), + 'wp-org-plugin-page' => _fs_text( 'WordPress.org Plugin Page' ), + 'plugin-homepage' => _fs_text( 'Plugin Homepage' ), + 'donate-to-plugin' => _fs_text( 'Donate to this plugin' ), + 'average-rating' => _fs_text( 'Average Rating' ), + 'based-on-x' => _fs_text( 'based on %s' ), + 'warning:' => _fs_text( 'Warning:' ), + 'contributors' => _fs_text( 'Contributors' ), + 'plugin-install' => _fs_text( 'Plugin Install' ), + 'not-tested-warning' => _fs_text( 'This plugin has not been tested with your current version of WordPress.' ), + 'not-compatible-warning' => _fs_text( 'This plugin has not been marked as compatible with your version of WordPress.' ), + 'newer-installed' => _fs_text( 'Newer Version (%s) Installed' ), + 'latest-installed' => _fs_text( 'Latest Version Installed' ), + ); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/l10n.php b/wp-content/plugins/nextgen-gallery/freemius/includes/l10n.php new file mode 100644 index 000000000..a497e81b4 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/l10n.php @@ -0,0 +1,48 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.1.6 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * Retrieve the translation of $text. + * + * @since 1.2.1.6 + * + * @param string $text + * + * @return string + */ + function _fs_text( $text ) { + // Avoid misleading Theme Check warning. + $fn = 'translate'; + return $fn( $text, 'freemius' ); + } + + /** + * Retrieve translated string with gettext context. + * + * Quite a few times, there will be collisions with similar translatable text + * found in more than two places, but with different translated context. + * + * By including the context in the pot file, translators can translate the two + * strings differently. + * + * @since 1.2.1.6 + * + * @param string $text + * @param string $context + * + * @return string + */ + function _fs_x( $text, $context ) { + // Avoid misleading Theme Check warning. + $fn = 'translate_with_gettext_context'; + return $fn( $text, $context, 'freemius' ); + } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-menu-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-menu-manager.php index 467a104f0..489ddafee 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-menu-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-menu-manager.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.3 */ @@ -15,9 +15,25 @@ #region Properties /** + * @since 1.2.2 + * + * @var string + */ + protected $_module_unique_affix; + + /** + * @since 1.2.2 + * + * @var number + */ + protected $_module_id; + + /** + * @since 1.2.2 + * * @var string */ - protected $_plugin_slug; + protected $_module_type; /** * @since 1.0.6 @@ -67,6 +83,18 @@ * @var string */ private $_first_time_path; + /** + * @since 1.2.2 + * + * @var bool + */ + private $_menu_exists; + /** + * @since 2.0.0 + * + * @var bool + */ + private $_network_menu_exists; #endregion Properties @@ -83,22 +111,28 @@ private static $_instances = array(); /** - * @param string $plugin_slug + * @param number $module_id + * @param string $module_type + * @param string $module_unique_affix * - * @return FS_Admin_Notice_Manager + * @return FS_Admin_Menu_Manager */ - static function instance( $plugin_slug ) { - if ( ! isset( self::$_instances[ $plugin_slug ] ) ) { - self::$_instances[ $plugin_slug ] = new FS_Admin_Menu_Manager( $plugin_slug ); + static function instance( $module_id, $module_type, $module_unique_affix ) { + $key = 'm_' . $module_id; + + if ( ! isset( self::$_instances[ $key ] ) ) { + self::$_instances[ $key ] = new FS_Admin_Menu_Manager( $module_id, $module_type, $module_unique_affix ); } - return self::$_instances[ $plugin_slug ]; + return self::$_instances[ $key ]; } - protected function __construct( $plugin_slug ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $plugin_slug . '_admin_menu', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + protected function __construct( $module_id, $module_type, $module_unique_affix ) { + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $module_id . '_admin_menu', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - $this->_plugin_slug = $plugin_slug; + $this->_module_id = $module_id; + $this->_module_type = $module_type; + $this->_module_unique_affix = $module_unique_affix; } #endregion Singleton @@ -120,7 +154,10 @@ * @param bool $is_addon */ function init( $menu, $is_addon = false ) { - $this->_menu_slug = $menu['slug']; + $this->_menu_exists = ( isset( $menu['slug'] ) && ! empty( $menu['slug'] ) ); + $this->_network_menu_exists = ( ! empty( $menu['network'] ) && true === $menu['network'] ); + + $this->_menu_slug = ( $this->_menu_exists ? $menu['slug'] : $this->_module_unique_affix ); $this->_default_submenu_items = array(); // @deprecated @@ -131,17 +168,26 @@ // @deprecated $this->_parent_type = 'page'; - if ( ! $is_addon && isset( $menu ) ) { - $this->_default_submenu_items = array( - 'contact' => $this->get_bool_option( $menu, 'contact', true ), - 'support' => $this->get_bool_option( $menu, 'support', true ), - 'account' => $this->get_bool_option( $menu, 'account', true ), - 'pricing' => $this->get_bool_option( $menu, 'pricing', true ), - 'addons' => $this->get_bool_option( $menu, 'addons', true ), - ); + if ( isset( $menu ) ) { + if ( ! $is_addon ) { + $this->_default_submenu_items = array( + 'contact' => $this->get_bool_option( $menu, 'contact', true ), + 'support' => $this->get_bool_option( $menu, 'support', true ), + 'affiliation' => $this->get_bool_option( $menu, 'affiliation', true ), + 'account' => $this->get_bool_option( $menu, 'account', true ), + 'pricing' => $this->get_bool_option( $menu, 'pricing', true ), + 'addons' => $this->get_bool_option( $menu, 'addons', true ), + ); + + // @deprecated + $this->_type = $this->get_option( $menu, 'type', 'page' ); + + $this->_first_time_path = $this->get_option( $menu, 'first-path', false ); + if ( ! empty( $this->_first_time_path ) && is_string( $this->_first_time_path ) ) { + $this->_first_time_path = admin_url( $this->_first_time_path, 'admin' ); + } + } - // @deprecated - $this->_type = $this->get_option( $menu, 'type', 'page' ); $this->_is_override_exact = $this->get_bool_option( $menu, 'override_exact' ); if ( isset( $menu['parent'] ) ) { @@ -162,11 +208,6 @@ // 'page' // ) ); } - - $this->_first_time_path = $this->get_option( $menu, 'first-path', false ); - if ( ! empty( $this->_first_time_path ) && is_string( $this->_first_time_path ) ) { - $this->_first_time_path = admin_url( $this->_first_time_path, 'admin' ); - } } } @@ -220,14 +261,24 @@ } /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 + * @author Leo Fajardo (@leorw) + * @since 1.2.2 * - * @return string + * @return bool */ -// function slug(){ -// return $this->_menu_slug; -// } + function has_menu() { + return $this->_menu_exists; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return bool + */ + function has_network_menu() { + return $this->_network_menu_exists; + } /** * @author Vova Feldman (@svovaf) @@ -235,12 +286,17 @@ * * @param string $id * @param bool $default + * @param bool $ignore_menu_existence Since 1.2.2.7 If true, check if the submenu item visible even if there's no parent menu. * * @return bool */ - function is_submenu_item_visible( $id, $default = true ) { + function is_submenu_item_visible( $id, $default = true, $ignore_menu_existence = false ) { + if ( ! $ignore_menu_existence && ! $this->has_menu() ) { + return false; + } + return fs_apply_filter( - $this->_plugin_slug, + $this->_module_unique_affix, 'is_submenu_visible', $this->get_bool_option( $this->_default_submenu_items, $id, $default ), $id @@ -261,7 +317,7 @@ function get_slug( $page = '' ) { return ( ( false === strpos( $this->_menu_slug, '.php?' ) ) ? $this->_menu_slug : - $this->_plugin_slug ) . ( empty( $page ) ? '' : ( '-' . $page ) ); + $this->_module_unique_affix ) . ( empty( $page ) ? '' : ( '-' . $page ) ); } /** @@ -335,7 +391,7 @@ if ( false === strpos( $this->_menu_slug, '.php?' ) ) { return $this->_menu_slug; } else { - return $this->_plugin_slug; + return $this->_module_unique_affix; } } @@ -359,10 +415,30 @@ * * @return bool */ - function is_activation_page() { - return isset( $_GET['page'] ) && - ( ( strtolower( $this->_menu_slug ) === strtolower( $_GET['page'] ) ) || - ( strtolower( $this->_plugin_slug ) === strtolower( $_GET['page'] ) ) ); + function is_main_settings_page() { + if ( $this->_menu_exists && + ( fs_is_plugin_page( $this->_menu_slug ) || fs_is_plugin_page( $this->_module_unique_affix ) ) + ) { + /** + * Module has a settings menu and the context page is the main settings page, so assume it's in + * activation (doesn't really check if already opted-in/skipped or not). + * + * @since 1.2.2 + */ + return true; + } + + global $pagenow; + if ( ( WP_FS__MODULE_TYPE_THEME === $this->_module_type ) && Freemius::is_themes_page() ) { + /** + * In activation only when show_optin query string param is given. + * + * @since 1.2.2 + */ + return fs_request_get_bool( $this->_module_unique_affix . '_show_optin' ); + } + + return false; } #region Submenu Override @@ -453,6 +529,49 @@ ); } + /** + * Find plugin's admin dashboard main submenu item. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.6 + * + * @return array|false + */ + private function find_main_submenu() { + global $submenu; + + $top_level_menu_slug = $this->get_top_level_menu_slug(); + + if ( ! isset( $submenu[ $top_level_menu_slug ] ) ) { + return false; + } + + $submenu_slug = $this->get_raw_slug(); + + $position = - 1; + $found_submenu = false; + + $hook_name = get_plugin_page_hookname( $submenu_slug, '' ); + + foreach ( $submenu[ $top_level_menu_slug ] as $pos => $sub ) { + if ( $submenu_slug === $sub[2] ) { + $position = $pos; + $found_submenu = $sub; + } + } + + if ( false === $found_submenu ) { + return false; + } + + return array( + 'menu' => $found_submenu, + 'parent_slug' => $top_level_menu_slug, + 'position' => $position, + 'hook_name' => $hook_name + ); + } + /** * Remove all sub-menu items. * @@ -470,7 +589,16 @@ return false; } - $submenu[ $menu_slug ] = array(); + /** + * This method is NOT executed for WordPress.org themes. + * Since we maintain only one version of the SDK we added this small + * hack to avoid the error from Theme Check since it's a false-positive. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + $submenu_ref = &$submenu; + $submenu_ref[ $menu_slug ] = array(); return true; } @@ -480,25 +608,58 @@ * @author Vova Feldman (@svovaf) * @since 1.0.9 * - * @return array[string]mixed + * @param bool $remove_top_level_menu + * + * @return false|array[string]mixed */ - function remove_menu_item() { - $this->_logger->entrance(); + function remove_menu_item( $remove_top_level_menu = false ) { + $this->_logger->entrance(); - // Find main menu item. - $menu = $this->find_top_level_menu(); + // Find main menu item. + $top_level_menu = $this->find_top_level_menu(); - if ( false === $menu ) { - return false; - } + if ( false === $top_level_menu ) { + return false; + } + + // Remove it with its actions. + remove_all_actions( $top_level_menu['hook_name'] ); + + // Remove all submenu items. + $this->remove_all_submenu_items(); - // Remove it with its actions. - remove_all_actions( $menu['hook_name'] ); + if ( $remove_top_level_menu ) { + global $menu; + unset( $menu[ $top_level_menu['position'] ] ); + } - // Remove all submenu items. - $this->remove_all_submenu_items(); + return $top_level_menu; + } + + /** + * Get module's main admin setting page URL. + * + * @todo This method was only tested for wp.org compliant themes with a submenu item. Need to test for plugins with top level, submenu, and CPT top level, menu items. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @return string + */ + function main_menu_url() { + $this->_logger->entrance(); - return $menu; + if ( $this->_is_top_level ) { + $menu = $this->find_top_level_menu(); + } else { + $menu = $this->find_main_submenu(); + } + + $parent_slug = isset( $menu['parent_slug'] ) ? + $menu['parent_slug'] : + 'admin.php'; + + return admin_url( $parent_slug . '?page=' . $menu['menu'][2] ); } /** @@ -507,7 +668,7 @@ * * @param callable $function * - * @return array[string]mixed + * @return false|array[string]mixed */ function override_menu_item( $function ) { $found_menu = $this->remove_menu_item(); @@ -530,7 +691,7 @@ unset( $menu[ $found_menu['position'] ] ); // Create new top-level menu action. - $hookname = add_menu_page( + $hookname = self::add_page( $found_menu['menu'][3], $found_menu['menu'][0], 'manage_options', @@ -554,18 +715,243 @@ * @param string $class */ function add_counter_to_menu_item( $counter = 1, $class = '' ) { - global $menu; + global $menu, $submenu; + + $mask = '%s <span class="update-plugins %s count-%3$s" aria-hidden="true"><span>%3$s<span class="screen-reader-text">%3$s notifications</span></span></span>'; + + /** + * This method is NOT executed for WordPress.org themes. + * Since we maintain only one version of the SDK we added this small + * hack to avoid the error from Theme Check since it's a false-positive. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + $menu_ref = &$menu; + $submenu_ref = &$submenu; + + if ( $this->_is_top_level ) { + // Find main menu item. + $found_menu = $this->find_top_level_menu(); + + if ( false !== $found_menu ) { + // Override menu label. + $menu_ref[ $found_menu['position'] ][0] = sprintf( + $mask, + $found_menu['menu'][0], + $class, + $counter + ); + } + } else { + $found_submenu = $this->find_main_submenu(); + + if ( false !== $found_submenu ) { + // Override menu label. + $submenu_ref[ $found_submenu['parent_slug'] ][ $found_submenu['position'] ][0] = sprintf( + $mask, + $found_submenu['menu'][0], + $class, + $counter + ); + } + } + } - // Find main menu item. - $found_menu = $this->find_top_level_menu(); + #endregion Top level menu Override - if ( false === $menu ) { - return; - } + /** + * Add a top-level menu page. + * + * Note for WordPress.org Theme/Plugin reviewer: + * + * This is a replication of `add_menu_page()` to avoid Theme Check warning. + * + * Why? + * ==== + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This method will not run for wp.org themes (only plugins) since theme + * admin settings/options are now only allowed in the customizer. + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + * + * @param string $page_title The text to be displayed in the title tags of the page when the menu is + * selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable|string $function The function to be called to output the content for this page. + * @param string $icon_url The URL to the icon to be used for this menu. + * * Pass a base64-encoded SVG using a data URI, which will be colored to + * match the color scheme. This should begin with + * 'data:image/svg+xml;base64,'. + * * Pass the name of a Dashicons helper class to use a font icon, + * e.g. 'dashicons-chart-pie'. + * * Pass 'none' to leave div.wp-menu-image empty so an icon can be added + * via CSS. + * @param int $position The position in the menu order this one should appear. + * + * @return string The resulting page's hook_suffix. + */ + static function add_page( + $page_title, + $menu_title, + $capability, + $menu_slug, + $function = '', + $icon_url = '', + $position = null + ) { + $fn = 'add_menu' . '_page'; + + return $fn( + $page_title, + $menu_title, + $capability, + $menu_slug, + $function, + $icon_url, + $position + ); + } - // Override menu label. - $menu[ $found_menu['position'] ][0] = $found_menu['menu'][0] . ' <span class="update-plugins ' . $class . ' count-' . $counter . '"><span>' . $counter . '</span></span>'; + /** + * Add page and update menu instance settings. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $page_title + * @param string $menu_title + * @param string $capability + * @param string $menu_slug + * @param callable|string $function + * @param string $icon_url + * @param int|null $position + * + * @return string + */ + function add_page_and_update( + $page_title, + $menu_title, + $capability, + $menu_slug, + $function = '', + $icon_url = '', + $position = null + ) { + $this->_menu_slug = $menu_slug; + $this->_is_top_level = true; + $this->_menu_exists = true; + $this->_network_menu_exists = true; + + return self::add_page( + $page_title, + $menu_title, + $capability, + $menu_slug, + $function, + $icon_url, + $position + ); + } + + /** + * Add a submenu page. + * + * Note for WordPress.org Theme/Plugin reviewer: + * + * This is a replication of `add_submenu_page()` to avoid Theme Check warning. + * + * Why? + * ==== + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This method will not run for wp.org themes (only plugins) since theme + * admin settings/options are now only allowed in the customizer. + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + * + * @param string $parent_slug The slug name for the parent menu (or the file name of a standard + * WordPress admin page). + * @param string $page_title The text to be displayed in the title tags of the page when the menu is + * selected. + * @param string $menu_title The text to be used for the menu. + * @param string $capability The capability required for this menu to be displayed to the user. + * @param string $menu_slug The slug name to refer to this menu by (should be unique for this menu). + * @param callable|string $function The function to be called to output the content for this page. + * + * @return false|string The resulting page's hook_suffix, or false if the user does not have the capability + * required. + */ + static function add_subpage( + $parent_slug, + $page_title, + $menu_title, + $capability, + $menu_slug, + $function = '' + ) { + $fn = 'add_submenu' . '_page'; + + return $fn( $parent_slug, + $page_title, + $menu_title, + $capability, + $menu_slug, + $function + ); } - #endregion Top level menu Override + /** + * Add sub page and update menu instance settings. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $parent_slug + * @param string $page_title + * @param string $menu_title + * @param string $capability + * @param string $menu_slug + * @param callable|string $function + * + * @return string + */ + function add_subpage_and_update( + $parent_slug, + $page_title, + $menu_title, + $capability, + $menu_slug, + $function = '' + ) { + $this->_menu_slug = $menu_slug; + $this->_parent_slug = $parent_slug; + $this->_is_top_level = false; + $this->_menu_exists = true; + $this->_network_menu_exists = true; + + return self::add_subpage( + $parent_slug, + $page_title, + $menu_title, + $capability, + $menu_slug, + $function + ); + } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-notice-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-notice-manager.php index c1c6b4953..b68a479b5 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-notice-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-admin-notice-manager.php @@ -1,313 +1,398 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.7 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - class FS_Admin_Notice_Manager { - /** - * @var string - */ - protected $_slug; - /** - * @var string - */ - protected $_title; - /** - * @var array[] - */ - private $_admin_messages = array(); - /** - * @var FS_Key_Value_Storage - */ - private $_sticky_storage; - /** - * @var FS_Plugin_Manager[] - */ - private static $_instances = array(); - /** - * @var FS_Logger - */ - protected $_logger; - - /** - * @param string $slug - * @param string $title - * - * @return FS_Admin_Notice_Manager - */ - static function instance( $slug, $title = '' ) { - if ( ! isset( self::$_instances[ $slug ] ) ) { - self::$_instances[ $slug ] = new FS_Admin_Notice_Manager( $slug, $title ); - } - - return self::$_instances[ $slug ]; - } - - protected function __construct( $slug, $title = '' ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_data', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_slug = $slug; - $this->_title = ! empty( $title ) ? $title : ''; - $this->_sticky_storage = FS_Key_Value_Storage::instance( 'admin_notices', $this->_slug ); - - if ( is_admin() ) { - if ( 0 < count( $this->_sticky_storage ) ) { - // If there are sticky notices for the current slug, add a callback - // to the AJAX action that handles message dismiss. - add_action( "wp_ajax_fs_dismiss_notice_action_{$slug}", array( - &$this, - 'dismiss_notice_ajax_callback' - ) ); - - foreach ( $this->_sticky_storage as $id => $msg ) { - // Add admin notice. - $this->add( - $msg['message'], - $msg['title'], - $msg['type'], - true, - $msg['all'], - $msg['id'], - false - ); - } - } - } - } - - /** - * Remove sticky message by ID. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - */ - function dismiss_notice_ajax_callback() { - $this->_sticky_storage->remove( $_POST['message_id'] ); - wp_die(); - } - - /** - * Rendered sticky message dismiss JavaScript. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - static function _add_sticky_dismiss_javascript() { - $params = array(); - fs_require_once_template( 'sticky-admin-notice-js.php', $params ); - } - - private static $_added_sticky_javascript = false; - - /** - * Hook to the admin_footer to add sticky message dismiss JavaScript handler. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - private static function has_sticky_messages() { - if ( ! self::$_added_sticky_javascript ) { - add_action( 'admin_footer', array( 'FS_Admin_Notice_Manager', '_add_sticky_dismiss_javascript' ) ); - } - } - - /** - * Handle admin_notices by printing the admin messages stacked in the queue. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - */ - function _admin_notices_hook() { - $notice_type = 'admin_notices'; - - if ( function_exists( 'current_user_can' ) && - ! current_user_can( 'manage_options' ) - ) { - // Only show messages to admins. - return; - } - - if ( ! isset( $this->_admin_messages[ $notice_type ] ) || ! is_array( $this->_admin_messages[ $notice_type ] ) ) { - return; - } - - foreach ( $this->_admin_messages[ $notice_type ] as $id => $msg ) { - fs_require_template( 'admin-notice.php', $msg ); - - if ( $msg['sticky'] ) { - self::has_sticky_messages(); - } - } - } - - /** - * Handle all_admin_notices by printing the admin messages stacked in the queue. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - */ - function _all_admin_notices_hook() { - $notice_type = 'all_admin_notices'; - - if ( ! isset( $this->_admin_messages[ $notice_type ] ) || ! is_array( $this->_admin_messages[ $notice_type ] ) ) { - return; - } - - foreach ( $this->_admin_messages[ $notice_type ] as $id => $msg ) { - fs_require_template( 'all-admin-notice.php', $msg ); - } - } - - /** - * Enqueue common stylesheet to style admin notice. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - */ - function _enqueue_styles() { - fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); - } - - /** - * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $message - * @param string $title - * @param string $type - * @param bool $is_sticky - * @param bool $all_admin - * @param string $id Message ID - * @param bool $store_if_sticky - * - * @uses add_action() - */ - function add( $message, $title = '', $type = 'success', $is_sticky = false, $all_admin = false, $id = '', $store_if_sticky = true ) { - $key = ( $all_admin ? 'all_admin_notices' : 'admin_notices' ); - - if ( ! isset( $this->_admin_messages[ $key ] ) ) { - $this->_admin_messages[ $key ] = array(); - - add_action( $key, array( &$this, "_{$key}_hook" ) ); - add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_styles' ) ); - - } - - if ( '' === $id ) { - $id = md5( $title . ' ' . $message . ' ' . $type ); - } - - $message_object = array( - 'message' => $message, - 'title' => $title, - 'type' => $type, - 'sticky' => $is_sticky, - 'id' => $id, - 'all' => $all_admin, - 'slug' => $this->_slug, - 'plugin' => $this->_title, - ); - - if ( $is_sticky && $store_if_sticky ) { - $this->_sticky_storage->{$id} = $message_object; - } - - $this->_admin_messages[ $key ][ $id ] = $message_object; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @param string|string[] $ids - */ - function remove_sticky( $ids ) { - if ( ! is_array( $ids ) ) { - $ids = array( $ids ); - } - - foreach ( $ids as $id ) { - // Remove from sticky storage. - $this->_sticky_storage->remove( $id ); - - // Remove from current admin messages. - if ( isset( $this->_admin_messages['all_admin_notices'] ) && isset( $this->_admin_messages['all_admin_notices'][ $id ] ) ) { - unset( $this->_admin_messages['all_admin_notices'][ $id ] ); - } - if ( isset( $this->_admin_messages['admin_notices'] ) && isset( $this->_admin_messages['admin_notices'][ $id ] ) ) { - unset( $this->_admin_messages['admin_notices'][ $id ] ); - } - } - } - - /** - * Check if sticky message exists by id. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - * - * @param $id - * - * @return bool - */ - function has_sticky( $id ) { - return isset( $this->_sticky_storage[ $id ] ); - } - - /** - * Adds sticky admin notification. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.7 - * - * @param string $message - * @param string $id Message ID - * @param string $title - * @param string $type - * @param bool $all_admin - */ - function add_sticky( $message, $id, $title = '', $type = 'success', $all_admin = false ) { - $message = fs_apply_filter( $this->_slug, "sticky_message_{$id}", $message ); - $title = fs_apply_filter( $this->_slug, "sticky_title_{$id}", $title ); - - $this->add( $message, $title, $type, true, $all_admin, $id ); - } - - /** - * Clear all sticky messages. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.8 - */ - function clear_all_sticky() { - $this->_sticky_storage->clear_all(); - } - - /** - * Add admin message to all admin messages queue, and hook to all_admin_notices if not yet hooked. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.4 - * - * @param string $message - * @param string $title - * @param string $type - * @param bool $is_sticky - * @param string $id Message ID - */ - function add_all( $message, $title = '', $type = 'success', $is_sticky = false, $id = '' ) { - $this->add( $message, $title, $type, $is_sticky, true, $id ); - } - } \ No newline at end of file + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.7 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Admin_Notice_Manager { + /** + * @since 1.2.2 + * + * @var string + */ + protected $_module_unique_affix; + /** + * @var string + */ + protected $_id; + /** + * @var string + */ + protected $_title; + /** + * @var array[string]array + */ + private $_notices = array(); + /** + * @var FS_Key_Value_Storage + */ + private $_sticky_storage; + /** + * @var FS_Logger + */ + protected $_logger; + /** + * @since 2.0.0 + * @var int The ID of the blog that is associated with the current site level admin notices. + */ + private $_blog_id = 0; + /** + * @since 2.0.0 + * @var bool + */ + private $_is_network_notices; + + /** + * @var FS_Admin_Notice_Manager[] + */ + private static $_instances = array(); + + /** + * @param string $id + * @param string $title + * @param string $module_unique_affix + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on + * network and blog admin pages. + * @param bool $network_level_or_blog_id Since 2.0.0 + * + * @return \FS_Admin_Notice_Manager + */ + static function instance( + $id, + $title = '', + $module_unique_affix = '', + $is_network_and_blog_admins = false, + $network_level_or_blog_id = false + ) { + if ( $is_network_and_blog_admins ) { + $network_level_or_blog_id = true; + } + + $key = strtolower( $id ); + + if ( is_multisite() ) { + if ( true === $network_level_or_blog_id ) { + $key .= ':ms'; + } else if ( is_numeric( $network_level_or_blog_id ) && $network_level_or_blog_id > 0 ) { + $key .= ":{$network_level_or_blog_id}"; + } else { + $network_level_or_blog_id = get_current_blog_id(); + + $key .= ":{$network_level_or_blog_id}"; + } + } + + if ( ! isset( self::$_instances[ $key ] ) ) { + self::$_instances[ $key ] = new FS_Admin_Notice_Manager( + $id, + $title, + $module_unique_affix, + $is_network_and_blog_admins, + $network_level_or_blog_id + ); + } + + return self::$_instances[ $key ]; + } + + /** + * @param string $id + * @param string $title + * @param string $module_unique_affix + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network and + * blog admin pages. + * @param bool|int $network_level_or_blog_id + */ + protected function __construct( + $id, + $title = '', + $module_unique_affix = '', + $is_network_and_blog_admins = false, + $network_level_or_blog_id = false + ) { + $this->_id = $id; + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $this->_id . '_data', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + $this->_title = ! empty( $title ) ? $title : ''; + $this->_module_unique_affix = $module_unique_affix; + $this->_sticky_storage = FS_Key_Value_Storage::instance( 'admin_notices', $this->_id, $network_level_or_blog_id ); + + if ( is_multisite() ) { + $this->_is_network_notices = ( true === $network_level_or_blog_id ); + + if ( is_numeric( $network_level_or_blog_id ) ) { + $this->_blog_id = $network_level_or_blog_id; + } + } else { + $this->_is_network_notices = false; + } + + $is_network_admin = fs_is_network_admin(); + $is_blog_admin = fs_is_blog_admin(); + + if ( ( $this->_is_network_notices && $is_network_admin ) || + ( ! $this->_is_network_notices && $is_blog_admin ) || + ( $is_network_and_blog_admins && ( $is_network_admin || $is_blog_admin ) ) + ) { + if ( 0 < count( $this->_sticky_storage ) ) { + $ajax_action_suffix = str_replace( ':', '-', $this->_id ); + + // If there are sticky notices for the current slug, add a callback + // to the AJAX action that handles message dismiss. + add_action( "wp_ajax_fs_dismiss_notice_action_{$ajax_action_suffix}", array( + &$this, + 'dismiss_notice_ajax_callback' + ) ); + + foreach ( $this->_sticky_storage as $msg ) { + // Add admin notice. + $this->add( + $msg['message'], + $msg['title'], + $msg['type'], + true, + $msg['id'], + false, + isset( $msg['wp_user_id'] ) ? $msg['wp_user_id'] : null, + ! empty( $msg['plugin'] ) ? $msg['plugin'] : null, + $is_network_and_blog_admins + ); + } + } + } + } + + /** + * Remove sticky message by ID. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + */ + function dismiss_notice_ajax_callback() { + $this->_sticky_storage->remove( $_POST['message_id'] ); + wp_die(); + } + + /** + * Rendered sticky message dismiss JavaScript. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + static function _add_sticky_dismiss_javascript() { + $params = array(); + fs_require_once_template( 'sticky-admin-notice-js.php', $params ); + } + + private static $_added_sticky_javascript = false; + + /** + * Hook to the admin_footer to add sticky message dismiss JavaScript handler. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + private static function has_sticky_messages() { + if ( ! self::$_added_sticky_javascript ) { + add_action( 'admin_footer', array( 'FS_Admin_Notice_Manager', '_add_sticky_dismiss_javascript' ) ); + } + } + + /** + * Handle admin_notices by printing the admin messages stacked in the queue. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + */ + function _admin_notices_hook() { + if ( function_exists( 'current_user_can' ) && + ! current_user_can( 'manage_options' ) + ) { + // Only show messages to admins. + return; + } + + foreach ( $this->_notices as $id => $msg ) { + if ( isset( $msg['wp_user_id'] ) && is_numeric( $msg['wp_user_id'] ) ) { + if ( get_current_user_id() != $msg['wp_user_id'] ) { + continue; + } + } + + fs_require_template( 'admin-notice.php', $msg ); + + if ( $msg['sticky'] ) { + self::has_sticky_messages(); + } + } + } + + /** + * Enqueue common stylesheet to style admin notice. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + */ + function _enqueue_styles() { + fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + } + + /** + * Add admin message to admin messages queue, and hook to admin_notices / all_admin_notices if not yet hooked. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.4 + * + * @param string $message + * @param string $title + * @param string $type + * @param bool $is_sticky + * @param string $id Message ID + * @param bool $store_if_sticky + * @param number|null $wp_user_id + * @param string|null $plugin_title + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network + * and blog admin pages. + * + * @uses add_action() + */ + function add( + $message, + $title = '', + $type = 'success', + $is_sticky = false, + $id = '', + $store_if_sticky = true, + $wp_user_id = null, + $plugin_title = null, + $is_network_and_blog_admins = false + ) { + $notices_type = $this->get_notices_type(); + + if ( empty( $this->_notices ) ) { + if ( ! $is_network_and_blog_admins ) { + add_action( $notices_type, array( &$this, "_admin_notices_hook" ) ); + } else { + add_action( 'network_admin_notices', array( &$this, "_admin_notices_hook" ) ); + add_action( 'admin_notices', array( &$this, "_admin_notices_hook" ) ); + } + + add_action( 'admin_enqueue_scripts', array( &$this, '_enqueue_styles' ) ); + } + + if ( '' === $id ) { + $id = md5( $title . ' ' . $message . ' ' . $type ); + } + + $message_object = array( + 'message' => $message, + 'title' => $title, + 'type' => $type, + 'sticky' => $is_sticky, + 'id' => $id, + 'manager_id' => $this->_id, + 'plugin' => ( ! is_null( $plugin_title ) ? $plugin_title : $this->_title ), + 'wp_user_id' => $wp_user_id, + ); + + if ( $is_sticky && $store_if_sticky ) { + $this->_sticky_storage->{$id} = $message_object; + } + + $this->_notices[ $id ] = $message_object; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param string|string[] $ids + */ + function remove_sticky( $ids ) { + if ( ! is_array( $ids ) ) { + $ids = array( $ids ); + } + + foreach ( $ids as $id ) { + // Remove from sticky storage. + $this->_sticky_storage->remove( $id ); + + if ( isset( $this->_notices[ $id ] ) ) { + unset( $this->_notices[ $id ] ); + } + } + } + + /** + * Check if sticky message exists by id. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + * + * @param $id + * + * @return bool + */ + function has_sticky( $id ) { + return isset( $this->_sticky_storage[ $id ] ); + } + + /** + * Adds sticky admin notification. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.7 + * + * @param string $message + * @param string $id Message ID + * @param string $title + * @param string $type + * @param number|null $wp_user_id + * @param string|null $plugin_title + * @param bool $is_network_and_blog_admins Whether or not the message should be shown both on network + * and blog admin pages. + */ + function add_sticky( $message, $id, $title = '', $type = 'success', $wp_user_id = null, $plugin_title = null, $is_network_and_blog_admins = false ) { + if ( ! empty( $this->_module_unique_affix ) ) { + $message = fs_apply_filter( $this->_module_unique_affix, "sticky_message_{$id}", $message ); + $title = fs_apply_filter( $this->_module_unique_affix, "sticky_title_{$id}", $title ); + } + + $this->add( $message, $title, $type, true, $id, true, $wp_user_id, $plugin_title, $is_network_and_blog_admins ); + } + + /** + * Clear all sticky messages. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.8 + */ + function clear_all_sticky() { + $this->_sticky_storage->clear_all(); + } + + #-------------------------------------------------------------------------------- + #region Helper Method + #-------------------------------------------------------------------------------- + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + private function get_notices_type() { + return $this->_is_network_notices ? + 'network_admin_notices' : + 'admin_notices'; + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-cache-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-cache-manager.php index 595f49848..c6cb2826f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-cache-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-cache-manager.php @@ -1,237 +1,326 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.1.6 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - class FS_Cache_Manager { - /** - * @var FS_Option_Manager - */ - private $_options; - /** - * @var FS_Logger - */ - private $_logger; - - /** - * @var FS_Cache_Manager[] - */ - private static $_MANAGERS = array(); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.3 - * - * @param string $id - */ - private function __construct( $id ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_cach_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_logger->entrance(); - $this->_logger->log( 'id = ' . $id ); - - $this->_options = FS_Option_Manager::get_manager( $id, true ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param $id - * - * @return FS_Cache_Manager - */ - static function get_manager( $id ) { - $id = strtolower( $id ); - - if ( ! isset( self::$_MANAGERS[ $id ] ) ) { - self::$_MANAGERS[ $id ] = new FS_Cache_Manager( $id ); - } - - return self::$_MANAGERS[ $id ]; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @return bool - */ - function is_empty() { - $this->_logger->entrance(); - - return $this->_options->is_empty(); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - */ - function clear() { - $this->_logger->entrance(); - - $this->_options->clear( true ); - } - - /** - * Delete cache manager from DB. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function delete() { - $this->_options->delete(); - } - - /** - * Check if there's a cached item. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - * - * @return bool - */ - function has( $key ) { - $cache_entry = $this->_options->get_option( $key, false ); - - return ( is_object( $cache_entry ) && - isset( $cache_entry->timestamp ) && - is_numeric( $cache_entry->timestamp ) - ); - } - - /** - * Check if there's a valid cached item. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - * - * @return bool - */ - function has_valid( $key ) { - $cache_entry = $this->_options->get_option( $key, false ); - - return ( is_object( $cache_entry ) && - isset( $cache_entry->timestamp ) && - is_numeric( $cache_entry->timestamp ) && - $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME - ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - * @param mixed $default - * - * @return mixed - */ - function get( $key, $default = null ) { - $this->_logger->entrance( 'key = ' . $key ); - - $cache_entry = $this->_options->get_option( $key, false ); - - if ( is_object( $cache_entry ) && - isset( $cache_entry->timestamp ) && - is_numeric( $cache_entry->timestamp ) - ) { - return $cache_entry->result; - } - - return $default; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - * @param mixed $default - * - * @return mixed - */ - function get_valid( $key, $default = null ) { - $this->_logger->entrance( 'key = ' . $key ); - - $cache_entry = $this->_options->get_option( $key, false ); - - if ( is_object( $cache_entry ) && - isset( $cache_entry->timestamp ) && - is_numeric( $cache_entry->timestamp ) && - $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME - ) { - return $cache_entry->result; - } - - return $default; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - * @param mixed $value - * @param int $expiration - */ - function set( $key, $value, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { - $this->_logger->entrance( 'key = ' . $key ); - - $cache_entry = new stdClass(); - $cache_entry->result = $value; - $cache_entry->timestamp = WP_FS__SCRIPT_START_TIME + $expiration; - $this->_options->set_option( $key, $cache_entry, true ); - } - - /** - * Get cached record expiration, or false if not cached or expired. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.7.3 - * - * @param string $key - * - * @return bool|int - */ - function get_record_expiration( $key ) { - $this->_logger->entrance( 'key = ' . $key ); - - $cache_entry = $this->_options->get_option( $key, false ); - - if ( is_object( $cache_entry ) && - isset( $cache_entry->timestamp ) && - is_numeric( $cache_entry->timestamp ) && - $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME - ) { - return $cache_entry->timestamp; - } - - return false; - } - - /** - * Purge cached item. - * - * @author Vova Feldman (@svovaf) - * @since 1.1.6 - * - * @param string $key - */ - function purge( $key ) { - $this->_logger->entrance( 'key = ' . $key ); - - $this->_options->unset_option( $key, true ); - } - } \ No newline at end of file + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.1.6 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Cache_Manager { + /** + * @var FS_Option_Manager + */ + private $_options; + /** + * @var FS_Logger + */ + private $_logger; + + /** + * @var FS_Cache_Manager[] + */ + private static $_MANAGERS = array(); + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.3 + * + * @param string $id + */ + private function __construct( $id ) { + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_cach_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + $this->_logger->entrance(); + $this->_logger->log( 'id = ' . $id ); + + $this->_options = FS_Option_Manager::get_manager( $id, true, true ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param $id + * + * @return FS_Cache_Manager + */ + static function get_manager( $id ) { + $id = strtolower( $id ); + + if ( ! isset( self::$_MANAGERS[ $id ] ) ) { + self::$_MANAGERS[ $id ] = new FS_Cache_Manager( $id ); + } + + return self::$_MANAGERS[ $id ]; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @return bool + */ + function is_empty() { + $this->_logger->entrance(); + + return $this->_options->is_empty(); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + */ + function clear() { + $this->_logger->entrance(); + + $this->_options->clear( true ); + } + + /** + * Delete cache manager from DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function delete() { + $this->_options->delete(); + } + + /** + * Check if there's a cached item. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + * + * @return bool + */ + function has( $key ) { + $cache_entry = $this->_options->get_option( $key, false ); + + return ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) + ); + } + + /** + * Check if there's a valid cached item. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + * @param null|int $expiration Since 1.2.2.7 + * + * @return bool + */ + function has_valid( $key, $expiration = null ) { + $cache_entry = $this->_options->get_option( $key, false ); + + $is_valid = ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) && + $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME + ); + + if ( $is_valid && + is_numeric( $expiration ) && + isset( $cache_entry->created ) && + is_numeric( $cache_entry->created ) && + $cache_entry->created + $expiration < WP_FS__SCRIPT_START_TIME + ) { + /** + * Even if the cache is still valid, since we are checking for validity + * with an explicit expiration period, if the period has past, return + * `false` as if the cache is invalid. + * + * @since 1.2.2.7 + */ + $is_valid = false; + } + + return $is_valid; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + function get( $key, $default = null ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = $this->_options->get_option( $key, false ); + + if ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) + ) { + return $cache_entry->result; + } + + return is_object( $default ) ? clone $default : $default; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + * @param mixed $default + * + * @return mixed + */ + function get_valid( $key, $default = null ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = $this->_options->get_option( $key, false ); + + if ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) && + $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME + ) { + return $cache_entry->result; + } + + return is_object( $default ) ? clone $default : $default; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + * @param mixed $value + * @param int $expiration + * @param int $created Since 2.0.0 Cache creation date. + */ + function set( $key, $value, $expiration = WP_FS__TIME_24_HOURS_IN_SEC, $created = WP_FS__SCRIPT_START_TIME ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = new stdClass(); + + $cache_entry->result = $value; + $cache_entry->created = $created; + $cache_entry->timestamp = $created + $expiration; + $this->_options->set_option( $key, $cache_entry, true ); + } + + /** + * Get cached record expiration, or false if not cached or expired. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.7.3 + * + * @param string $key + * + * @return bool|int + */ + function get_record_expiration( $key ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = $this->_options->get_option( $key, false ); + + if ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) && + $cache_entry->timestamp > WP_FS__SCRIPT_START_TIME + ) { + return $cache_entry->timestamp; + } + + return false; + } + + /** + * Purge cached item. + * + * @author Vova Feldman (@svovaf) + * @since 1.1.6 + * + * @param string $key + */ + function purge( $key ) { + $this->_logger->entrance( 'key = ' . $key ); + + $this->_options->unset_option( $key, true ); + } + + /** + * Extend cached item caching period. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @param string $key + * @param int $expiration + * + * @return bool + */ + function update_expiration( $key, $expiration = WP_FS__TIME_24_HOURS_IN_SEC ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = $this->_options->get_option( $key, false ); + + if ( ! is_object( $cache_entry ) || + ! isset( $cache_entry->timestamp ) || + ! is_numeric( $cache_entry->timestamp ) + ) { + return false; + } + + $this->set( $key, $cache_entry->result, $expiration, $cache_entry->created ); + + return true; + } + + /** + * Set cached item as expired. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + * + * @param string $key + */ + function expire( $key ) { + $this->_logger->entrance( 'key = ' . $key ); + + $cache_entry = $this->_options->get_option( $key, false ); + + if ( is_object( $cache_entry ) && + isset( $cache_entry->timestamp ) && + is_numeric( $cache_entry->timestamp ) + ) { + // Set to expired. + $cache_entry->timestamp = WP_FS__SCRIPT_START_TIME; + $this->_options->set_option( $key, $cache_entry, true ); + } + } + + #-------------------------------------------------------------------------------- + #region Migration + #-------------------------------------------------------------------------------- + + /** + * Migrate options from site level. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function migrate_to_network() { + $this->_options->migrate_to_network(); + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-gdpr-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-gdpr-manager.php new file mode 100644 index 000000000..a64abb082 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-gdpr-manager.php @@ -0,0 +1,202 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.1.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_GDPR_Manager { + /** + * @var FS_Option_Manager + */ + private $_storage; + /** + * @var array { + * @type bool $required Are GDPR rules apply on the current context admin. + * @type bool $show_opt_in_notice Should the marketing and offers opt-in message be shown to the admin or not. If not set, defaults to `true`. + * @type int $notice_shown_at Last time the special GDPR opt-in message was shown to the current admin. + * } + */ + private $_data; + /** + * @var int + */ + private $_wp_user_id; + /** + * @var string + */ + private $_option_name; + /** + * @var FS_Admin_Notices + */ + private $_notices; + + #-------------------------------------------------------------------------------- + #region Singleton + #-------------------------------------------------------------------------------- + + /** + * @var FS_GDPR_Manager + */ + private static $_instance; + + /** + * @return FS_GDPR_Manager + */ + public static function instance() { + if ( ! isset( self::$_instance ) ) { + self::$_instance = new self(); + } + + return self::$_instance; + } + + #endregion + + private function __construct() { + $this->_storage = FS_Option_Manager::get_manager( WP_FS__GDPR_OPTION_NAME, true, true ); + $this->_wp_user_id = Freemius::get_current_wp_user_id(); + $this->_option_name = "u{$this->_wp_user_id}"; + $this->_data = $this->_storage->get_option( $this->_option_name, array() ); + $this->_notices = FS_Admin_Notices::instance( 'all_admins', '', '', true ); + + if ( ! is_array( $this->_data ) ) { + $this->_data = array(); + } + } + + /** + * Update a GDPR option for the current admin and store it. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @param string $name + * @param mixed $value + */ + private function update_option( $name, $value ) { + $this->_data[ $name ] = $value; + + $this->_storage->set_option( $this->_option_name, $this->_data, true ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @return bool|null + */ + public function is_required() { + return isset( $this->_data['required'] ) ? + $this->_data['required'] : + null; + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + * + * @param bool $is_required + */ + public function store_is_required( $is_required ) { + $this->update_option( 'required', $is_required ); + } + + /** + * Checks if the GDPR opt-in sticky notice is currently shown. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return bool + */ + public function is_opt_in_notice_shown() { + return $this->_notices->has_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true ); + } + + /** + * Remove the GDPR opt-in sticky notice. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + */ + public function remove_opt_in_notice() { + $this->_notices->remove_sticky( "gdpr_optin_actions_{$this->_wp_user_id}", true ); + + $this->disable_opt_in_notice(); + } + + /** + * Prevents the opt-in message from being added/shown. + * + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + public function disable_opt_in_notice() { + $this->update_option( 'show_opt_in_notice', false ); + } + + /** + * Checks if a GDPR opt-in message needs to be shown to the current admin. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return bool + */ + public function should_show_opt_in_notice() { + return ( + ! isset( $this->_data['show_opt_in_notice'] ) || + true === $this->_data['show_opt_in_notice'] + ); + } + + /** + * Get the last time the GDPR opt-in notice was shown. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + * + * @return false|int + */ + public function last_time_notice_was_shown() { + return isset( $this->_data['notice_shown_at'] ) ? + $this->_data['notice_shown_at'] : + false; + } + + /** + * Update the timestamp of the last time the GDPR opt-in message was shown to now. + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + */ + public function notice_was_just_shown() { + $this->update_option( 'notice_shown_at', WP_FS__SCRIPT_START_TIME ); + } + + /** + * @param string $message + * @param string|null $plugin_title + * + * @author Vova Feldman (@svovaf) + * @since 2.1.0 + */ + public function add_opt_in_sticky_notice( $message, $plugin_title = null ) { + $this->_notices->add_sticky( + $message, + "gdpr_optin_actions_{$this->_wp_user_id}", + '', + 'promotion', + true, + $this->_wp_user_id, + $plugin_title, + true + ); + } + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-key-value-storage.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-key-value-storage.php index 1dd6c2343..713df6f68 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-key-value-storage.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-key-value-storage.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.7 */ @@ -46,19 +46,36 @@ * @var string */ protected $_id; + /** + * @since 1.2.2 + * * @var string */ - protected $_slug; + protected $_secondary_id; + + /** + * @since 2.0.0 + * @var int The ID of the blog that is associated with the current site level options. + */ + private $_blog_id = 0; + + /** + * @since 2.0.0 + * @var bool + */ + private $_is_multisite_storage; + /** * @var array */ protected $_data; /** - * @var FS_Plugin_Manager[] + * @var FS_Key_Value_Storage[] */ private static $_instances = array(); + /** * @var FS_Logger */ @@ -66,30 +83,61 @@ /** * @param string $id - * @param string $slug + * @param string $secondary_id + * @param bool $network_level_or_blog_id * * @return FS_Key_Value_Storage */ - static function instance( $id, $slug ) { - $key = $id . ':' . $slug; + static function instance( $id, $secondary_id, $network_level_or_blog_id = false ) { + $key = $id . ':' . $secondary_id; + + if ( is_multisite() ) { + if ( true === $network_level_or_blog_id ) { + $key .= ':ms'; + } else if ( is_numeric( $network_level_or_blog_id ) && $network_level_or_blog_id > 0 ) { + $key .= ":{$network_level_or_blog_id}"; + } else { + $network_level_or_blog_id = get_current_blog_id(); + + $key .= ":{$network_level_or_blog_id}"; + } + } + if ( ! isset( self::$_instances[ $key ] ) ) { - self::$_instances[ $key ] = new FS_Key_Value_Storage( $id, $slug ); + self::$_instances[ $key ] = new FS_Key_Value_Storage( $id, $secondary_id, $network_level_or_blog_id ); } return self::$_instances[ $key ]; } - protected function __construct( $id, $slug ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + protected function __construct( $id, $secondary_id, $network_level_or_blog_id = false ) { + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $secondary_id . '_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + $this->_id = $id; + $this->_secondary_id = $secondary_id; + + if ( is_multisite() ) { + $this->_is_multisite_storage = ( true === $network_level_or_blog_id ); + + if ( is_numeric( $network_level_or_blog_id ) ) { + $this->_blog_id = $network_level_or_blog_id; + } + } else { + $this->_is_multisite_storage = false; + } - $this->_slug = $slug; - $this->_id = $id; $this->load(); } protected function get_option_manager() { - return FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); - } + return FS_Option_Manager::get_manager( + WP_FS__ACCOUNTS_OPTION_NAME, + true, + $this->_is_multisite_storage ? + true : + ( $this->_blog_id > 0 ? $this->_blog_id : false ) + ); + } protected function get_all_data() { return $this->get_option_manager()->get_option( $this->_id, array() ); @@ -103,8 +151,8 @@ */ function load() { $all_plugins_data = $this->get_all_data(); - $this->_data = isset( $all_plugins_data[ $this->_slug ] ) ? - $all_plugins_data[ $this->_slug ] : + $this->_data = isset( $all_plugins_data[ $this->_secondary_id ] ) ? + $all_plugins_data[ $this->_secondary_id ] : array(); } @@ -130,12 +178,20 @@ $this->_data[ $key ] = $value; - $all_data[ $this->_slug ] = $this->_data; + $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, $flush ); } + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function save() { + $this->get_option_manager()->store(); + } + /** * @author Vova Feldman (@svovaf) * @since 1.0.7 @@ -155,7 +211,7 @@ if ( $store ) { $all_data = $this->get_all_data(); - $all_data[ $this->_slug ] = $this->_data; + $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } @@ -171,7 +227,7 @@ $this->_data = array(); $all_data = $this->get_all_data(); - unset( $all_data[ $this->_slug ] ); + unset( $all_data[ $this->_secondary_id ] ); $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } @@ -192,7 +248,7 @@ if ( $store ) { $all_data = $this->get_all_data(); - $all_data[ $this->_slug ] = $this->_data; + $all_data[ $this->_secondary_id ] = $this->_data; $options_manager = $this->get_option_manager(); $options_manager->set_option( $this->_id, $all_data, true ); } @@ -213,6 +269,16 @@ $default; } + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + function get_secondary_id() { + return $this->_secondary_id; + } + /* ArrayAccess + Magic Access (better for refactoring) -----------------------------------------------------------------------------------*/ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-license-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-license-manager.php index 8fa1bc76b..891ecd891 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-license-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-license-manager.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.6 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-option-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-option-manager.php index 19c706964..abc7c4b3d 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-option-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-option-manager.php @@ -1,302 +1,490 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - /** - * 3-layer lazy options manager. - * layer 3: Memory - * layer 2: Cache (if there's any caching plugin and if WP_FS__DEBUG_SDK is FALSE) - * layer 1: Database (options table). All options stored as one option record in the DB to reduce number of DB - * queries. - * - * If load() is not explicitly called, starts as empty manager. Same thing about saving the data - you have to - * explicitly call store(). - * - * Class Freemius_Option_Manager - */ - class FS_Option_Manager { - /** - * @var string - */ - private $_id; - /** - * @var array - */ - private $_options; - /** - * @var FS_Logger - */ - private $_logger; - - /** - * @var FS_Option_Manager[] - */ - private static $_MANAGERS = array(); - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param string $id - * @param bool $load - */ - private function __construct( $id, $load = false ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_opt_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_logger->entrance(); - $this->_logger->log( 'id = ' . $id ); - - $this->_id = $id; - - if ( $load ) { - $this->load(); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param $id - * @param $load - * - * @return FS_Option_Manager - */ - static function get_manager( $id, $load = false ) { - $id = strtolower( $id ); - - if ( ! isset( self::$_MANAGERS[ $id ] ) ) { - self::$_MANAGERS[ $id ] = new FS_Option_Manager( $id, $load ); - } // If load required but not yet loaded, load. - else if ( $load && ! self::$_MANAGERS[ $id ]->is_loaded() ) { - self::$_MANAGERS[ $id ]->load(); - } - - return self::$_MANAGERS[ $id ]; - } - - private function _get_option_manager_name() { -// return WP_FS__SLUG . '_' . $this->_id; - return $this->_id; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param bool $flush - */ - function load( $flush = false ) { - $this->_logger->entrance(); - - $option_name = $this->_get_option_manager_name(); - - if ( $flush || ! isset( $this->_options ) ) { - if ( isset( $this->_options ) ) { - // Clear prev options. - $this->clear(); - } - - if ( ! WP_FS__DEBUG_SDK ) { - $this->_options = wp_cache_get( $option_name, WP_FS__SLUG ); - } - -// $this->_logger->info('wp_cache_get = ' . var_export($this->_options, true)); - -// if ( is_array( $this->_options ) ) { -// $this->clear(); -// } - - $cached = true; - - if ( empty( $this->_options ) ) { - $this->_options = get_option( $option_name ); - - if ( is_string( $this->_options ) ) { - $this->_options = json_decode( $this->_options ); - } + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * 3-layer lazy options manager. + * layer 3: Memory + * layer 2: Cache (if there's any caching plugin and if WP_FS__DEBUG_SDK is FALSE) + * layer 1: Database (options table). All options stored as one option record in the DB to reduce number of DB + * queries. + * + * If load() is not explicitly called, starts as empty manager. Same thing about saving the data - you have to + * explicitly call store(). + * + * Class Freemius_Option_Manager + */ + class FS_Option_Manager { + /** + * @var string + */ + private $_id; + /** + * @var array|object + */ + private $_options; + /** + * @var FS_Logger + */ + private $_logger; + + /** + * @since 2.0.0 + * @var int The ID of the blog that is associated with the current site level options. + */ + private $_blog_id = 0; + + /** + * @since 2.0.0 + * @var bool + */ + private $_is_network_storage; + + /** + * @var array[string]FS_Option_Manager { + * @key string + * @value FS_Option_Manager + * } + */ + private static $_MANAGERS = array(); + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param string $id + * @param bool $load + * @param bool|int $network_level_or_blog_id Since 2.0.0 + */ + private function __construct( $id, $load = false, $network_level_or_blog_id = false ) { + $id = strtolower( $id ); + + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_opt_mngr_' . $id, WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + + $this->_logger->entrance(); + $this->_logger->log( 'id = ' . $id ); + + $this->_id = $id; + + if ( is_multisite() ) { + $this->_is_network_storage = ( true === $network_level_or_blog_id ); + + if ( is_numeric( $network_level_or_blog_id ) ) { + $this->_blog_id = $network_level_or_blog_id; + } + } else { + $this->_is_network_storage = false; + } + + if ( $load ) { + $this->load(); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param string $id + * @param bool $load + * @param bool|int $network_level_or_blog_id Since 2.0.0 + * + * @return FS_Option_Manager + */ + static function get_manager( $id, $load = false, $network_level_or_blog_id = false ) { + $key = strtolower( $id ); + + if ( is_multisite() ) { + if ( true === $network_level_or_blog_id ) { + $key .= ':ms'; + } else if ( is_numeric( $network_level_or_blog_id ) && $network_level_or_blog_id > 0 ) { + $key .= ":{$network_level_or_blog_id}"; + } else { + $network_level_or_blog_id = get_current_blog_id(); + + $key .= ":{$network_level_or_blog_id}"; + } + } + + if ( ! isset( self::$_MANAGERS[ $key ] ) ) { + self::$_MANAGERS[ $key ] = new FS_Option_Manager( $id, $load, $network_level_or_blog_id ); + } // If load required but not yet loaded, load. + else if ( $load && ! self::$_MANAGERS[ $key ]->is_loaded() ) { + self::$_MANAGERS[ $key ]->load(); + } + + return self::$_MANAGERS[ $key ]; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param bool $flush + */ + function load( $flush = false ) { + $this->_logger->entrance(); + + $option_name = $this->get_option_manager_name(); + + if ( $flush || ! isset( $this->_options ) ) { + if ( isset( $this->_options ) ) { + // Clear prev options. + $this->clear(); + } + + $cache_group = $this->get_cache_group(); + + if ( ! WP_FS__DEBUG_SDK ) { + + $this->_options = wp_cache_get( + $option_name, + $cache_group + ); + } + + $cached = true; + + if ( empty( $this->_options ) ) { + if ( $this->_is_network_storage ) { + $this->_options = get_site_option( $option_name ); + } else if ( $this->_blog_id > 0 ) { + $this->_options = get_blog_option( $this->_blog_id, $option_name ); + } else { + $this->_options = get_option( $option_name ); + } + + if ( is_string( $this->_options ) ) { + $this->_options = json_decode( $this->_options ); + } // $this->_logger->info('get_option = ' . var_export($this->_options, true)); - if ( false === $this->_options ) { - $this->clear(); - } - - $cached = false; - } - - if ( ! WP_FS__DEBUG_SDK && ! $cached ) // Set non encoded cache. - { - wp_cache_set( $option_name, $this->_options, WP_FS__SLUG ); - } - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @return bool - */ - function is_loaded() { - return isset( $this->_options ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @return bool - */ - function is_empty() { - return ( $this->is_loaded() && false === $this->_options ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool $flush - */ - function clear( $flush = false ) { - $this->_logger->entrance(); - - $this->_options = array(); - - if ( $flush ) { - $this->store(); - } - } - - /** - * Delete options manager from DB. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.9 - */ - function delete() { - delete_option( $this->_get_option_manager_name() ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param string $option - * - * @return bool - */ - function has_option( $option ) { - return array_key_exists( $option, $this->_options ); - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param string $option - * @param mixed $default - * - * @return mixed - */ - function get_option( $option, $default = null ) { - $this->_logger->entrance( 'option = ' . $option ); - - if ( is_array( $this->_options ) ) { - return isset( $this->_options[ $option ] ) ? $this->_options[ $option ] : $default; - } else if ( is_object( $this->_options ) ) { - return isset( $this->_options->{$option} ) ? $this->_options->{$option} : $default; - } - - return $default; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param string $option - * @param mixed $value - * @param bool $flush - */ - function set_option( $option, $value, $flush = false ) { - $this->_logger->entrance( 'option = ' . $option ); - - if ( ! $this->is_loaded() ) { - $this->clear(); - } - - if ( is_array( $this->_options ) ) { - $this->_options[ $option ] = $value; - } else if ( is_object( $this->_options ) ) { - $this->_options->{$option} = $value; - } - - if ( $flush ) { - $this->store(); - } - } - - /** - * Unset option. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - * - * @param string $option - * @param bool $flush - */ - function unset_option( $option, $flush = false ) { - $this->_logger->entrance( 'option = ' . $option ); - - if ( is_array( $this->_options ) ) { - if ( ! isset( $this->_options[ $option ] ) ) { - return; - } - - unset( $this->_options[ $option ] ); - - } else if ( is_object( $this->_options ) ) { - if ( ! isset( $this->_options->{$option} ) ) { - return; - } - - unset( $this->_options->{$option} ); - } - - if ( $flush ) { - $this->store(); - } - } - - /** - * Dump options to database. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.3 - */ - function store() { - $this->_logger->entrance(); - - $option_name = $this->_get_option_manager_name(); - - if ( $this->_logger->is_on() ) { - $this->_logger->info( $option_name . ' = ' . var_export( $this->_options, true ) ); - } - - // Update DB. - update_option( $option_name, $this->_options ); - - if ( ! WP_FS__DEBUG_SDK ) { - wp_cache_set( $option_name, $this->_options, WP_FS__SLUG ); - } - } - } \ No newline at end of file + if ( false === $this->_options ) { + $this->clear(); + } + + $cached = false; + } + + if ( ! WP_FS__DEBUG_SDK && ! $cached ) { + // Set non encoded cache. + wp_cache_set( $option_name, $this->_options, $cache_group ); + } + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return bool + */ + function is_loaded() { + return isset( $this->_options ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return bool + */ + function is_empty() { + return ( $this->is_loaded() && false === $this->_options ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool $flush + */ + function clear( $flush = false ) { + $this->_logger->entrance(); + + $this->_options = array(); + + if ( $flush ) { + $this->store(); + } + } + + /** + * Delete options manager from DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.9 + */ + function delete() { + $option_name = $this->get_option_manager_name(); + + if ( $this->_is_network_storage ) { + delete_site_option( $option_name ); + } else if ( $this->_blog_id > 0 ) { + delete_blog_option( $this->_blog_id, $option_name ); + } else { + delete_option( $option_name ); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param string $option + * + * @return bool + */ + function has_option( $option ) { + return array_key_exists( $option, $this->_options ); + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param string $option + * @param mixed $default + * + * @return mixed + */ + function get_option( $option, $default = null ) { + $this->_logger->entrance( 'option = ' . $option ); + + if ( ! $this->is_loaded() ) { + $this->load(); + } + + if ( is_array( $this->_options ) ) { + $value = isset( $this->_options[ $option ] ) ? + $this->_options[ $option ] : + $default; + } else if ( is_object( $this->_options ) ) { + $value = isset( $this->_options->{$option} ) ? + $this->_options->{$option} : + $default; + } else { + $value = $default; + } + + /** + * If it's an object, return a clone of the object, otherwise, + * external changes of the object will actually change the value + * of the object in the options manager which may lead to an unexpected + * behaviour and data integrity when a store() call is triggered. + * + * Example: + * $object1 = $options->get_option( 'object1' ); + * $object1->x = 123; + * + * $object2 = $options->get_option( 'object2' ); + * $object2->y = 'dummy'; + * + * $options->set_option( 'object2', $object2, true ); + * + * If we don't return a clone of option 'object1', setting 'object2' + * will also store the updated value of 'object1' which is quite not + * an expected behaviour. + * + * @author Vova Feldman + */ + return is_object( $value ) ? clone $value : $value; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param string $option + * @param mixed $value + * @param bool $flush + */ + function set_option( $option, $value, $flush = false ) { + $this->_logger->entrance( 'option = ' . $option ); + + if ( ! $this->is_loaded() ) { + $this->clear(); + } + + /** + * If it's an object, store a clone of the object, otherwise, + * external changes of the object will actually change the value + * of the object in the options manager which may lead to an unexpected + * behaviour and data integrity when a store() call is triggered. + * + * Example: + * $object1 = new stdClass(); + * $object1->x = 123; + * + * $options->set_option( 'object1', $object1 ); + * + * $object1->x = 456; + * + * $options->set_option( 'object2', $object2, true ); + * + * If we don't set the option as a clone of option 'object1', setting 'object2' + * will also store the updated value of 'object1' ($object1->x = 456 instead of + * $object1->x = 123) which is quite not an expected behaviour. + * + * @author Vova Feldman + */ + $copy = is_object( $value ) ? clone $value : $value; + + if ( is_array( $this->_options ) ) { + $this->_options[ $option ] = $copy; + } else if ( is_object( $this->_options ) ) { + $this->_options->{$option} = $copy; + } + + if ( $flush ) { + $this->store(); + } + } + + /** + * Unset option. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @param string $option + * @param bool $flush + */ + function unset_option( $option, $flush = false ) { + $this->_logger->entrance( 'option = ' . $option ); + + if ( is_array( $this->_options ) ) { + if ( ! isset( $this->_options[ $option ] ) ) { + return; + } + + unset( $this->_options[ $option ] ); + + } else if ( is_object( $this->_options ) ) { + if ( ! isset( $this->_options->{$option} ) ) { + return; + } + + unset( $this->_options->{$option} ); + } + + if ( $flush ) { + $this->store(); + } + } + + /** + * Dump options to database. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + */ + function store() { + $this->_logger->entrance(); + + $option_name = $this->get_option_manager_name(); + + if ( $this->_logger->is_on() ) { + $this->_logger->info( $option_name . ' = ' . var_export( $this->_options, true ) ); + } + + // Update DB. + if ( $this->_is_network_storage ) { + update_site_option( $option_name, $this->_options ); + } else if ( $this->_blog_id > 0 ) { + update_blog_option( $this->_blog_id, $option_name, $this->_options ); + } else { + update_option( $option_name, $this->_options ); + } + + if ( ! WP_FS__DEBUG_SDK ) { + wp_cache_set( $option_name, $this->_options, $this->get_cache_group() ); + } + } + + /** + * Get options keys. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.3 + * + * @return string[] + */ + function get_options_keys() { + if ( is_array( $this->_options ) ) { + return array_keys( $this->_options ); + } else if ( is_object( $this->_options ) ) { + return array_keys( get_object_vars( $this->_options ) ); + } + + return array(); + } + + #-------------------------------------------------------------------------------- + #region Migration + #-------------------------------------------------------------------------------- + + /** + * Migrate options from site level. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + function migrate_to_network() { + $site_options = FS_Option_Manager::get_manager($this->_id, true, false); + + $options = is_object( $site_options->_options ) ? + get_object_vars( $site_options->_options ) : + $site_options->_options; + + if ( ! empty( $options ) ) { + foreach ( $options as $key => $val ) { + $this->set_option( $key, $val, false ); + } + + $this->store(); + } + } + + #endregion + + #-------------------------------------------------------------------------------- + #region Helper Methods + #-------------------------------------------------------------------------------- + + /** + * @return string + */ + private function get_option_manager_name() { + return $this->_id; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + * + * @return string + */ + private function get_cache_group() { + $group = WP_FS__SLUG; + + if ( $this->_is_network_storage ) { + $group .= '_ms'; + } else if ( $this->_blog_id > 0 ) { + $group .= "_s{$this->_blog_id}"; + } + + return $group; + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plan-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plan-manager.php index ddd9015ba..639de43e3 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plan-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plan-manager.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.6 */ diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plugin-manager.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plugin-manager.php index b56d92da1..cf88a8808 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plugin-manager.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/class-fs-plugin-manager.php @@ -1,154 +1,220 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.6 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - class FS_Plugin_Manager { - /** - * @var string - */ - protected $_slug; - /** - * @var FS_Plugin - */ - protected $_plugin; - - /** - * @var FS_Plugin_Manager[] - */ - private static $_instances = array(); - /** - * @var FS_Logger - */ - protected $_logger; - - /** - * @param string $slug - * - * @return FS_Plugin_Manager - */ - static function instance( $slug ) { - if ( ! isset( self::$_instances[ $slug ] ) ) { - self::$_instances[ $slug ] = new FS_Plugin_Manager( $slug ); - } - - return self::$_instances[ $slug ]; - } - - protected function __construct( $slug ) { - $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $slug . '_' . 'plugins', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); - - $this->_slug = $slug; - $this->load(); - } - - protected function get_option_manager() { - return FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); - } - - protected function get_all_plugins() { - return $this->get_option_manager()->get_option( 'plugins', array() ); - } - - /** - * Load plugin data from local DB. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - */ - function load() { - $all_plugins = $this->get_all_plugins(); - $this->_plugin = isset( $all_plugins[ $this->_slug ] ) ? - $all_plugins[ $this->_slug ] : - null; - } - - /** - * Store plugin on local DB. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param bool|FS_Plugin $plugin - * @param bool $flush - * - * @return bool|\FS_Plugin - */ - function store( $plugin = false, $flush = true ) { - $all_plugins = $this->get_all_plugins(); - - if ( false !== $plugin ) { - $this->_plugin = $plugin; - } - - $all_plugins[ $this->_slug ] = $this->_plugin; - - $options_manager = $this->get_option_manager(); - $options_manager->set_option( 'plugins', $all_plugins, $flush ); - - return $this->_plugin; - } - - /** - * Update local plugin data if different. - * - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param \FS_Plugin $plugin - * @param bool $store - * - * @return bool True if plugin was updated. - */ - function update( FS_Plugin $plugin, $store = true ) { - if ( ! ( $this->_plugin instanceof FS_Plugin ) || - $this->_plugin->slug != $plugin->slug || - $this->_plugin->public_key != $plugin->public_key || - $this->_plugin->secret_key != $plugin->secret_key || - $this->_plugin->parent_plugin_id != $plugin->parent_plugin_id || - $this->_plugin->title != $plugin->title - ) { - $this->store( $plugin, $store ); - - return true; - } - - return false; - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @param FS_Plugin $plugin - * @param bool $store - */ - function set( FS_Plugin $plugin, $store = false ) { - $this->_plugin = $plugin; - - if ( $store ) { - $this->store(); - } - } - - /** - * @author Vova Feldman (@svovaf) - * @since 1.0.6 - * - * @return bool|\FS_Plugin - */ - function get() { - return isset( $this->_plugin ) ? - $this->_plugin : - false; - } - - +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.6 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + class FS_Plugin_Manager { + /** + * @since 1.2.2 + * + * @var string|number + */ + protected $_module_id; + /** + * @since 1.2.2 + * + * @var FS_Plugin + */ + protected $_module; + + /** + * @var FS_Plugin_Manager[] + */ + private static $_instances = array(); + /** + * @var FS_Logger + */ + protected $_logger; + + /** + * Option names + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + const OPTION_NAME_PLUGINS = 'plugins'; + const OPTION_NAME_THEMES = 'themes'; + + /** + * @param string|number $module_id + * + * @return FS_Plugin_Manager + */ + static function instance( $module_id ) { + $key = 'm_' . $module_id; + + if ( ! isset( self::$_instances[ $key ] ) ) { + self::$_instances[ $key ] = new FS_Plugin_Manager( $module_id ); + } + + return self::$_instances[ $key ]; + } + + /** + * @param string|number $module_id + */ + protected function __construct( $module_id ) { + $this->_logger = FS_Logger::get_logger( WP_FS__SLUG . '_' . $module_id . '_' . 'plugins', WP_FS__DEBUG_SDK, WP_FS__ECHO_DEBUG_SDK ); + $this->_module_id = $module_id; + + $this->load(); + } + + protected function get_option_manager() { + return FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true, true ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @param string|bool $module_type "plugin", "theme", or "false" for all modules. + * + * @return array + */ + protected function get_all_modules( $module_type = false ) { + $option_manager = $this->get_option_manager(); + + if ( false !== $module_type ) { + return $option_manager->get_option( $module_type . 's', array() ); + } + + return array( + self::OPTION_NAME_PLUGINS => $option_manager->get_option( self::OPTION_NAME_PLUGINS, array() ), + self::OPTION_NAME_THEMES => $option_manager->get_option( self::OPTION_NAME_THEMES, array() ), + ); + } + + /** + * Load plugin data from local DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + */ + function load() { + $all_modules = $this->get_all_modules(); + + if ( ! is_numeric( $this->_module_id ) ) { + unset( $all_modules[ self::OPTION_NAME_THEMES ] ); + } + + foreach ( $all_modules as $modules ) { + /** + * @since 1.2.2 + * + * @var $modules FS_Plugin[] + */ + foreach ( $modules as $module ) { + $found_module = false; + + /** + * If module ID is not numeric, it must be a plugin's slug. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + */ + if ( ! is_numeric( $this->_module_id ) ) { + if ( $this->_module_id === $module->slug ) { + $this->_module_id = $module->id; + $found_module = true; + } + } else if ( $this->_module_id == $module->id ) { + $found_module = true; + } + + if ( $found_module ) { + $this->_module = $module; + break; + } + } + } + } + + /** + * Store plugin on local DB. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param bool|FS_Plugin $module + * @param bool $flush + * + * @return bool|\FS_Plugin + */ + function store( $module = false, $flush = true ) { + if ( false !== $module ) { + $this->_module = $module; + } + + $all_modules = $this->get_all_modules( $this->_module->type ); + $all_modules[ $this->_module->slug ] = $this->_module; + + $options_manager = $this->get_option_manager(); + $options_manager->set_option( $this->_module->type . 's', $all_modules, $flush ); + + return $this->_module; + } + + /** + * Update local plugin data if different. + * + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param \FS_Plugin $plugin + * @param bool $store + * + * @return bool True if plugin was updated. + */ + function update( FS_Plugin $plugin, $store = true ) { + if ( ! ($this->_module instanceof FS_Plugin ) || + $this->_module->slug != $plugin->slug || + $this->_module->public_key != $plugin->public_key || + $this->_module->secret_key != $plugin->secret_key || + $this->_module->parent_plugin_id != $plugin->parent_plugin_id || + $this->_module->title != $plugin->title + ) { + $this->store( $plugin, $store ); + + return true; + } + + return false; + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @param FS_Plugin $plugin + * @param bool $store + */ + function set( FS_Plugin $plugin, $store = false ) { + $this->_module = $plugin; + + if ( $store ) { + $this->store(); + } + } + + /** + * @author Vova Feldman (@svovaf) + * @since 1.0.6 + * + * @return bool|\FS_Plugin + */ + function get() { + return isset( $this->_module ) ? + $this->_module : + false; + } + + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/managers/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/managers/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/Exceptions/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/Exceptions/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/Exceptions/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusBase.php b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusBase.php index eccb632d8..2e4fc9113 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusBase.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusBase.php @@ -154,35 +154,62 @@ } /** - * Base64 encoding that does not need to be urlencode()ed. - * Exactly the same as base64_encode except it uses - * - instead of + - * _ instead of / + * Base64 decoding that does not need to be urldecode()-ed. + * + * Exactly the same as PHP base64 encode except it uses + * `-` instead of `+` + * `_` instead of `/` * No padded = * - * @param string $input base64UrlEncoded string + * @param string $input Base64UrlEncoded() string * * @return string */ protected static function Base64UrlDecode( $input ) { - return base64_decode( strtr( $input, '-_', '+/' ) ); + /** + * IMPORTANT NOTE: + * This is a hack suggested by @otto42 and @greenshady from + * the theme's review team. The usage of base64 for API + * signature encoding was approved in a Slack meeting + * held on Tue (10/25 2016). + * + * @todo Remove this hack once the base64 error is removed from the Theme Check. + * + * @since 1.2.2 + * @author Vova Feldman (@svovaf) + */ + $fn = 'base64' . '_decode'; + return $fn( strtr( $input, '-_', '+/' ) ); } /** * Base64 encoding that does not need to be urlencode()ed. - * Exactly the same as base64_encode except it uses - * - instead of + - * _ instead of / + * + * Exactly the same as base64 encode except it uses + * `-` instead of `+ + * `_` instead of `/` * * @param string $input string * - * @return string base64Url encoded string + * @return string Base64 encoded string */ protected static function Base64UrlEncode( $input ) { - $str = strtr( base64_encode( $input ), '+/', '-_' ); + /** + * IMPORTANT NOTE: + * This is a hack suggested by @otto42 and @greenshady from + * the theme's review team. The usage of base64 for API + * signature encoding was approved in a Slack meeting + * held on Tue (10/25 2016). + * + * @todo Remove this hack once the base64 error is removed from the Theme Check. + * + * @since 1.2.2 + * @author Vova Feldman (@svovaf) + */ + $fn = 'base64' . '_encode'; + $str = strtr( $fn( $input ), '+/', '-_' ); $str = str_replace( '=', '', $str ); return $str; } - } diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusWordPress.php b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusWordPress.php new file mode 100644 index 000000000..99fbdb05b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/FreemiusWordPress.php @@ -0,0 +1,704 @@ +<?php + /** + * Copyright 2016 Freemius, Inc. + * + * Licensed under the GPL v2 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://choosealicense.com/licenses/gpl-v2/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + require_once dirname( __FILE__ ) . '/FreemiusBase.php'; + + if ( ! defined( 'FS_SDK__USER_AGENT' ) ) { + define( 'FS_SDK__USER_AGENT', 'fs-php-' . Freemius_Api_Base::VERSION ); + } + + if ( ! defined( 'FS_SDK__SIMULATE_NO_CURL' ) ) { + define( 'FS_SDK__SIMULATE_NO_CURL', false ); + } + + if ( ! defined( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE' ) ) { + define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE', false ); + } + + if ( ! defined( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL' ) ) { + define( 'FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL', false ); + } + + if ( ! defined( 'FS_SDK__HAS_CURL' ) ) { + if ( FS_SDK__SIMULATE_NO_CURL ) { + define( 'FS_SDK__HAS_CURL', false ); + } else { + $curl_required_methods = array( + 'curl_version', + 'curl_exec', + 'curl_init', + 'curl_close', + 'curl_setopt', + 'curl_setopt_array', + 'curl_error', + ); + + $has_curl = true; + foreach ( $curl_required_methods as $m ) { + if ( ! function_exists( $m ) ) { + $has_curl = false; + break; + } + } + + define( 'FS_SDK__HAS_CURL', $has_curl ); + } + } + + $curl_version = FS_SDK__HAS_CURL ? + curl_version() : + array( 'version' => '7.37' ); + + if ( ! defined( 'FS_API__PROTOCOL' ) ) { + define( 'FS_API__PROTOCOL', version_compare( $curl_version['version'], '7.37', '>=' ) ? 'https' : 'http' ); + } + + if ( ! defined( 'FS_API__LOGGER_ON' ) ) { + define( 'FS_API__LOGGER_ON', false ); + } + + if ( ! defined( 'FS_API__ADDRESS' ) ) { + define( 'FS_API__ADDRESS', '://api.freemius.com' ); + } + if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { + define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' ); + } + + if ( class_exists( 'Freemius_Api_WordPress' ) ) { + return; + } + + class Freemius_Api_WordPress extends Freemius_Api_Base { + private static $_logger = array(); + + /** + * @param string $pScope 'app', 'developer', 'user' or 'install'. + * @param number $pID Element's id. + * @param string $pPublic Public key. + * @param string|bool $pSecret Element's secret key. + * @param bool $pSandbox Whether or not to run API in sandbox mode. + */ + public function __construct( $pScope, $pID, $pPublic, $pSecret = false, $pSandbox = false ) { + // If secret key not provided, use public key encryption. + if ( is_bool( $pSecret ) ) { + $pSecret = $pPublic; + } + + parent::Init( $pScope, $pID, $pPublic, $pSecret, $pSandbox ); + } + + public static function GetUrl( $pCanonizedPath = '', $pIsSandbox = false ) { + $address = ( $pIsSandbox ? FS_API__SANDBOX_ADDRESS : FS_API__ADDRESS ); + + if ( ':' === $address[0] ) { + $address = self::$_protocol . $address; + } + + return $address . $pCanonizedPath; + } + + #---------------------------------------------------------------------------------- + #region Servers Clock Diff + #---------------------------------------------------------------------------------- + + /** + * @var int Clock diff in seconds between current server to API server. + */ + private static $_clock_diff = 0; + + /** + * Set clock diff for all API calls. + * + * @since 1.0.3 + * + * @param $pSeconds + */ + public static function SetClockDiff( $pSeconds ) { + self::$_clock_diff = $pSeconds; + } + + /** + * Find clock diff between current server to API server. + * + * @since 1.0.2 + * @return int Clock diff in seconds. + */ + public static function FindClockDiff() { + $time = time(); + $pong = self::Ping(); + + return ( $time - strtotime( $pong->timestamp ) ); + } + + #endregion + + /** + * @var string http or https + */ + private static $_protocol = FS_API__PROTOCOL; + + /** + * Set API connection protocol. + * + * @since 1.0.4 + */ + public static function SetHttp() { + self::$_protocol = 'http'; + } + + /** + * @since 1.0.4 + * + * @return bool + */ + public static function IsHttps() { + return ( 'https' === self::$_protocol ); + } + + /** + * Sign request with the following HTTP headers: + * Content-MD5: MD5(HTTP Request body) + * Date: Current date (i.e Sat, 14 Feb 2016 20:24:46 +0000) + * Authorization: FS {scope_entity_id}:{scope_entity_public_key}:base64encode(sha256(string_to_sign, + * {scope_entity_secret_key})) + * + * @param string $pResourceUrl + * @param array $pWPRemoteArgs + * + * @return array + */ + function SignRequest( $pResourceUrl, $pWPRemoteArgs ) { + $auth = $this->GenerateAuthorizationParams( + $pResourceUrl, + $pWPRemoteArgs['method'], + ! empty( $pWPRemoteArgs['body'] ) ? $pWPRemoteArgs['body'] : '' + ); + + $pWPRemoteArgs['headers']['Date'] = $auth['date']; + $pWPRemoteArgs['headers']['Authorization'] = $auth['authorization']; + + if ( ! empty( $auth['content_md5'] ) ) { + $pWPRemoteArgs['headers']['Content-MD5'] = $auth['content_md5']; + } + + return $pWPRemoteArgs; + } + + /** + * Generate Authorization request headers: + * + * Content-MD5: MD5(HTTP Request body) + * Date: Current date (i.e Sat, 14 Feb 2016 20:24:46 +0000) + * Authorization: FS {scope_entity_id}:{scope_entity_public_key}:base64encode(sha256(string_to_sign, + * {scope_entity_secret_key})) + * + * @author Vova Feldman + * + * @param string $pResourceUrl + * @param string $pMethod + * @param string $pPostParams + * + * @return array + * @throws Freemius_Exception + */ + function GenerateAuthorizationParams( + $pResourceUrl, + $pMethod = 'GET', + $pPostParams = '' + ) { + $pMethod = strtoupper( $pMethod ); + + $eol = "\n"; + $content_md5 = ''; + $content_type = ''; + $now = ( time() - self::$_clock_diff ); + $date = date( 'r', $now ); + + if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) && ! empty( $pPostParams ) ) { + $content_md5 = md5( $pPostParams ); + $content_type = 'application/json'; + } + + $string_to_sign = implode( $eol, array( + $pMethod, + $content_md5, + $content_type, + $date, + $pResourceUrl + ) ); + + // If secret and public keys are identical, it means that + // the signature uses public key hash encoding. + $auth_type = ( $this->_secret !== $this->_public ) ? 'FS' : 'FSP'; + + $auth = array( + 'date' => $date, + 'authorization' => $auth_type . ' ' . $this->_id . ':' . + $this->_public . ':' . + self::Base64UrlEncode( hash_hmac( + 'sha256', $string_to_sign, $this->_secret + ) ) + ); + + if ( ! empty( $content_md5 ) ) { + $auth['content_md5'] = $content_md5; + } + + return $auth; + } + + /** + * Get API request URL signed via query string. + * + * @since 1.2.3 Stopped using http_build_query(). Instead, use urlencode(). In some environments the encoding of http_build_query() can generate a URL that once used with a redirect, the `&` querystring separator is escaped to `&` which breaks the URL (Added by @svovaf). + * + * @param string $pPath + * + * @throws Freemius_Exception + * + * @return string + */ + function GetSignedUrl( $pPath ) { + $resource = explode( '?', $this->CanonizePath( $pPath ) ); + $pResourceUrl = $resource[0]; + + $auth = $this->GenerateAuthorizationParams( $pResourceUrl ); + + return Freemius_Api_WordPress::GetUrl( + $pResourceUrl . '?' . + ( 1 < count( $resource ) && ! empty( $resource[1] ) ? $resource[1] . '&' : '' ) . + 'authorization=' . urlencode( $auth['authorization'] ) . + '&auth_date=' . urlencode( $auth['date'] ) + , $this->_isSandbox ); + } + + /** + * @author Vova Feldman + * + * @param string $pUrl + * @param array $pWPRemoteArgs + * + * @return mixed + */ + private static function ExecuteRequest( $pUrl, &$pWPRemoteArgs ) { + $start = microtime( true ); + + $response = wp_remote_request( $pUrl, $pWPRemoteArgs ); + + if ( FS_API__LOGGER_ON ) { + $end = microtime( true ); + + $has_body = ( isset( $pWPRemoteArgs['body'] ) && ! empty( $pWPRemoteArgs['body'] ) ); + $is_http_error = is_wp_error( $response ); + + self::$_logger[] = array( + 'id' => count( self::$_logger ), + 'start' => $start, + 'end' => $end, + 'total' => ( $end - $start ), + 'method' => $pWPRemoteArgs['method'], + 'path' => $pUrl, + 'body' => $has_body ? $pWPRemoteArgs['body'] : null, + 'result' => ! $is_http_error ? + $response['body'] : + json_encode( $response->get_error_messages() ), + 'code' => ! $is_http_error ? $response['response']['code'] : null, + 'backtrace' => debug_backtrace(), + ); + } + + return $response; + } + + /** + * @return array + */ + static function GetLogger() { + return self::$_logger; + } + + /** + * @param string $pCanonizedPath + * @param string $pMethod + * @param array $pParams + * @param null|array $pWPRemoteArgs + * @param bool $pIsSandbox + * @param null|callable $pBeforeExecutionFunction + * + * @return object[]|object|null + * + * @throws \Freemius_Exception + */ + private static function MakeStaticRequest( + $pCanonizedPath, + $pMethod = 'GET', + $pParams = array(), + $pWPRemoteArgs = null, + $pIsSandbox = false, + $pBeforeExecutionFunction = null + ) { + // Connectivity errors simulation. + if ( FS_SDK__SIMULATE_NO_API_CONNECTIVITY_CLOUDFLARE ) { + self::ThrowCloudFlareDDoSException(); + } else if ( FS_SDK__SIMULATE_NO_API_CONNECTIVITY_SQUID_ACL ) { + self::ThrowSquidAclException(); + } + + if ( empty( $pWPRemoteArgs ) ) { + $user_agent = 'Freemius/WordPress-SDK/' . Freemius_Api_Base::VERSION . '; ' . + home_url(); + + $pWPRemoteArgs = array( + 'method' => strtoupper( $pMethod ), + 'connect_timeout' => 10, + 'timeout' => 60, + 'follow_redirects' => true, + 'redirection' => 5, + 'user-agent' => $user_agent, + 'blocking' => true, + ); + } + + if ( ! isset( $pWPRemoteArgs['headers'] ) || + ! is_array( $pWPRemoteArgs['headers'] ) + ) { + $pWPRemoteArgs['headers'] = array(); + } + + if ( in_array( $pMethod, array( 'POST', 'PUT' ) ) ) { + if ( is_array( $pParams ) && 0 < count( $pParams ) ) { + $pWPRemoteArgs['headers']['Content-type'] = 'application/json'; + $pWPRemoteArgs['body'] = json_encode( $pParams ); + } + } + + $request_url = self::GetUrl( $pCanonizedPath, $pIsSandbox ); + + $resource = explode( '?', $pCanonizedPath ); + + if ( FS_SDK__HAS_CURL ) { + // Disable the 'Expect: 100-continue' behaviour. This causes cURL to wait + // for 2 seconds if the server does not support this header. + $pWPRemoteArgs['headers']['Expect'] = ''; + } + + if ( 'https' === substr( strtolower( $request_url ), 0, 5 ) ) { + $pWPRemoteArgs['sslverify'] = false; + } + + if ( false !== $pBeforeExecutionFunction && + is_callable( $pBeforeExecutionFunction ) + ) { + $pWPRemoteArgs = call_user_func( $pBeforeExecutionFunction, $resource[0], $pWPRemoteArgs ); + } + + $result = self::ExecuteRequest( $request_url, $pWPRemoteArgs ); + + if ( is_wp_error( $result ) ) { + /** + * @var WP_Error $result + */ + if ( self::IsCurlError( $result ) ) { + /** + * With dual stacked DNS responses, it's possible for a server to + * have IPv6 enabled but not have IPv6 connectivity. If this is + * the case, cURL will try IPv4 first and if that fails, then it will + * fall back to IPv6 and the error EHOSTUNREACH is returned by the + * operating system. + */ + $matches = array(); + $regex = '/Failed to connect to ([^:].*): Network is unreachable/'; + if ( preg_match( $regex, $result->get_error_message( 'http_request_failed' ), $matches ) ) { + /** + * Validate IP before calling `inet_pton()` to avoid PHP un-catchable warning. + * @author Vova Feldman (@svovaf) + */ + if ( filter_var( $matches[1], FILTER_VALIDATE_IP ) ) { + if ( strlen( inet_pton( $matches[1] ) ) === 16 ) { +// error_log('Invalid IPv6 configuration on server, Please disable or get native IPv6 on your server.'); + // Hook to an action triggered just before cURL is executed to resolve the IP version to v4. + add_action( 'http_api_curl', 'Freemius_Api_WordPress::CurlResolveToIPv4', 10, 1 ); + + // Re-run request. + $result = self::ExecuteRequest( $request_url, $pWPRemoteArgs ); + } + } + } + } + + if ( is_wp_error( $result ) ) { + self::ThrowWPRemoteException( $result ); + } + } + + $response_body = $result['body']; + + if ( empty( $response_body ) ) { + return null; + } + + $decoded = json_decode( $response_body ); + + if ( is_null( $decoded ) ) { + if ( preg_match( '/Please turn JavaScript on/i', $response_body ) && + preg_match( '/text\/javascript/', $response_body ) + ) { + self::ThrowCloudFlareDDoSException( $response_body ); + } else if ( preg_match( '/Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect./', $response_body ) && + preg_match( '/squid/', $response_body ) + ) { + self::ThrowSquidAclException( $response_body ); + } else { + $decoded = (object) array( + 'error' => (object) array( + 'type' => 'Unknown', + 'message' => $response_body, + 'code' => 'unknown', + 'http' => 402 + ) + ); + } + } + + return $decoded; + } + + + /** + * Makes an HTTP request. This method can be overridden by subclasses if + * developers want to do fancier things or use something other than wp_remote_request() + * to make the request. + * + * @param string $pCanonizedPath The URL to make the request to + * @param string $pMethod HTTP method + * @param array $pParams The parameters to use for the POST body + * @param null|array $pWPRemoteArgs wp_remote_request options. + * + * @return object[]|object|null + * + * @throws Freemius_Exception + */ + public function MakeRequest( + $pCanonizedPath, + $pMethod = 'GET', + $pParams = array(), + $pWPRemoteArgs = null + ) { + $resource = explode( '?', $pCanonizedPath ); + + // Only sign request if not ping.json connectivity test. + $sign_request = ( '/v1/ping.json' !== strtolower( substr( $resource[0], - strlen( '/v1/ping.json' ) ) ) ); + + return self::MakeStaticRequest( + $pCanonizedPath, + $pMethod, + $pParams, + $pWPRemoteArgs, + $this->_isSandbox, + $sign_request ? array( &$this, 'SignRequest' ) : null + ); + } + + /** + * Sets CURLOPT_IPRESOLVE to CURL_IPRESOLVE_V4 for cURL-Handle provided as parameter + * + * @param resource $handle A cURL handle returned by curl_init() + * + * @return resource $handle A cURL handle returned by curl_init() with CURLOPT_IPRESOLVE set to + * CURL_IPRESOLVE_V4 + * + * @link https://gist.github.com/golderweb/3a2aaec2d56125cc004e + */ + static function CurlResolveToIPv4( $handle ) { + curl_setopt( $handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); + + return $handle; + } + + #---------------------------------------------------------------------------------- + #region Connectivity Test + #---------------------------------------------------------------------------------- + + /** + * If successful connectivity to the API endpoint using ping.json endpoint. + * + * - OR - + * + * Validate if ping result object is valid. + * + * @param mixed $pPong + * + * @return bool + */ + public static function Test( $pPong = null ) { + $pong = is_null( $pPong ) ? + self::Ping() : + $pPong; + + return ( + is_object( $pong ) && + isset( $pong->api ) && + 'pong' === $pong->api + ); + } + + /** + * Ping API to test connectivity. + * + * @return object + */ + public static function Ping() { + try { + $result = self::MakeStaticRequest( '/v' . FS_API__VERSION . '/ping.json' ); + } catch ( Freemius_Exception $e ) { + // Map to error object. + $result = (object) $e->getResult(); + } catch ( Exception $e ) { + // Map to error object. + $result = (object) array( + 'error' => array( + 'type' => 'Unknown', + 'message' => $e->getMessage() . ' (' . $e->getFile() . ': ' . $e->getLine() . ')', + 'code' => 'unknown', + 'http' => 402 + ) + ); + } + + return $result; + } + + #endregion + + #---------------------------------------------------------------------------------- + #region Connectivity Exceptions + #---------------------------------------------------------------------------------- + + /** + * @param \WP_Error $pError + * + * @return bool + */ + private static function IsCurlError( WP_Error $pError ) { + $message = $pError->get_error_message( 'http_request_failed' ); + + return ( 0 === strpos( $message, 'cURL' ) ); + } + + /** + * @param WP_Error $pError + * + * @throws Freemius_Exception + */ + private static function ThrowWPRemoteException( WP_Error $pError ) { + if ( self::IsCurlError( $pError ) ) { + $message = $pError->get_error_message( 'http_request_failed' ); + + #region Check if there are any missing cURL methods. + + $curl_required_methods = array( + 'curl_version', + 'curl_exec', + 'curl_init', + 'curl_close', + 'curl_setopt', + 'curl_setopt_array', + 'curl_error', + ); + + // Find all missing methods. + $missing_methods = array(); + foreach ( $curl_required_methods as $m ) { + if ( ! function_exists( $m ) ) { + $missing_methods[] = $m; + } + } + + if ( ! empty( $missing_methods ) ) { + throw new Freemius_Exception( array( + 'error' => (object) array( + 'type' => 'cUrlMissing', + 'message' => $message, + 'code' => 'curl_missing', + 'http' => 402 + ), + 'missing_methods' => $missing_methods, + ) ); + } + + #endregion + + // cURL error - "cURL error {{errno}}: {{error}}". + $parts = explode( ':', substr( $message, strlen( 'cURL error ' ) ), 2 ); + + $code = ( 0 < count( $parts ) ) ? $parts[0] : 'http_request_failed'; + $message = ( 1 < count( $parts ) ) ? $parts[1] : $message; + + $e = new Freemius_Exception( array( + 'error' => array( + 'code' => $code, + 'message' => $message, + 'type' => 'CurlException', + ), + ) ); + } else { + $e = new Freemius_Exception( array( + 'error' => array( + 'code' => $pError->get_error_code(), + 'message' => $pError->get_error_message(), + 'type' => 'WPRemoteException', + ), + ) ); + } + + throw $e; + } + + /** + * @param string $pResult + * + * @throws Freemius_Exception + */ + private static function ThrowCloudFlareDDoSException( $pResult = '' ) { + throw new Freemius_Exception( array( + 'error' => (object) array( + 'type' => 'CloudFlareDDoSProtection', + 'message' => $pResult, + 'code' => 'cloudflare_ddos_protection', + 'http' => 402 + ) + ) ); + } + + /** + * @param string $pResult + * + * @throws Freemius_Exception + */ + private static function ThrowSquidAclException( $pResult = '' ) { + throw new Freemius_Exception( array( + 'error' => (object) array( + 'type' => 'SquidCacheBlock', + 'message' => $pResult, + 'code' => 'squid_cache_block', + 'http' => 402 + ) + ) ); + } + + #endregion + } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/sdk/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php b/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php index 69b70be63..96da5dfc5 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/fs-essential-functions-1.1.7.1.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7 */ @@ -11,7 +11,7 @@ } /** - * Find the plugin main file path based on any give file inside the plugin's folder. + * Find the plugin main file path based on any given file inside the plugin's folder. * * @author Vova Feldman (@svovaf) * @since 1.1.7.1 @@ -27,7 +27,7 @@ * will catch it. */ if ( ! function_exists( 'get_plugins' ) ) { - require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); + require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); diff --git a/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/index.php b/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/includes/supplements/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/index.php b/wp-content/plugins/nextgen-gallery/freemius/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.mo index 5c54b1a8a9ace1c47fb48557bd7d326f324c71af..76ec97cb756f6237de715ea61a197f2d896c515c 100644 GIT binary patch literal 243 zcmca7#4?qEfq{XMfq_AWfq_8<#9?4y&_SY)GB7acg7^VN`B|ySCAyv|x?!nB#hLke zRtj7}sRj8(CAz-F>6t0IPNnI^x*_>i3S0sHA-c{*sfi_-`FXl7i6yCEG2NilvP_Uh zn2=9mafxn7QDR<kPGU)Zk(C0MPhwtrX<|A^J&dUvlA4%nrNHH!pI4HaSE3tIS&(X_ xP?B0vqF<1cn3-pdkO7&LmRh9inwOlPl9`tdvNfl)C^1LZEx#zY*h+zm0RY2OMe6_n literal 25892 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 T+*1UVbjURz1A{*_!!Q5<RVPEJ diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.po index ca32b8ca3..fbc3cc027 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.po +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-da_DK.po @@ -1,1661 +1,12 @@ -# Copyright (C) 2016 freemius -# This file is distributed under the same license as the freemius package. -# Translators: -# Joachim Jensen <jv@intox.dk>, 2016 msgid "" msgstr "" -"Project-Id-Version: WordPress SDK\n" -"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" -"PO-Revision-Date: 2016-12-07 01:29+0000\n" -"Last-Translator: Vova Feldman <vova@freemius.com>\n" -"Language-Team: Danish (Denmark) (http://www.transifex.com/freemius/wordpress-sdk/language/da_DK/)\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: da_DK\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2\n" -"X-Poedit-SearchPath-0: .\n" -"X-Poedit-SearchPathExcluded-0: *.js\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: includes/i18n.php41, includes/i18n.php:55 -msgid "Yes - I'm in!" -msgstr "Ja - jeg er med!" - -#: includes/i18n.php43, includes/i18n.php:57 -msgid "Not today" -msgstr "Ikke i dag" - -#: includes/i18n.php:69 -msgid "Account" -msgstr "Konto" - -#: includes/i18n.php:71 -msgid "Add On" -msgstr "Tilføjelse" - -#: includes/i18n.php:73 -msgid "Contact Us" -msgstr "Kontakt os" - -#: includes/i18n.php:75 -msgid "Contact Support" -msgstr "Kontakt support" - -#: includes/i18n.php:77 -msgid "Change Ownership" -msgstr "Skift ejerskab" - -#: includes/i18n.php:79 -msgid "Support" -msgstr "Support" - -#: includes/i18n.php:81 -msgid "Support Forum" -msgstr "Supportforum" - -#: includes/i18n.php:83 -msgid "Add Ons" -msgstr "Tilføjelser" - -#: includes/i18n.php:85 -msgctxt "verb" -msgid "Upgrade" -msgstr "Opgrader" - -#: includes/i18n.php:87 -msgid "Awesome" -msgstr "Sejt" - -#: includes/i18n.php:89 -msgctxt "noun" -msgid "Pricing" -msgstr "Priser" - -#: includes/i18n.php:91 -msgctxt "noun" -msgid "Price" -msgstr "Pris" - -#: includes/i18n.php:93 -msgid "Unlimited Updates" -msgstr "Ubegrænsede opdateringer" - -#: includes/i18n.php:95 -msgctxt "verb" -msgid "Downgrade" -msgstr "Nedgrader" - -#: includes/i18n.php:97 -msgid "Cancel Trial" -msgstr "Annuller prøveperiode" - -#: includes/i18n.php:99 -msgid "Free Trial" -msgstr "Gratis prøveperiode" - -#: includes/i18n.php:101 -msgid "Start my free %s" -msgstr "Start min gratis %s" - -#: includes/i18n.php:103 -msgid "No commitment for %s - cancel anytime" -msgstr "Ingen bindinger ved %s - annuller når som helst" - -#: includes/i18n.php:105 -msgid "After your free %s, pay as little as %s" -msgstr "Efter din gratis %s er prisen kun %s" - -#: includes/i18n.php:107 -msgid "Details" -msgstr "Detaljer" - -#: includes/i18n.php:109 -msgid "Account Details" -msgstr "Kontodetaljer" - -#: includes/i18n.php:111 -msgctxt "verb" -msgid "Delete" -msgstr "Slet" - -#: includes/i18n.php:113 -msgctxt "verb" -msgid "Show" -msgstr "Vis" - -#: includes/i18n.php:115 -msgctxt "verb" -msgid "Hide" -msgstr "Skjul" - -#: includes/i18n.php:117 -msgctxt "verb" -msgid "Edit" -msgstr "Rediger" - -#: includes/i18n.php:119 -msgctxt "verb" -msgid "Update" -msgstr "" - -#: includes/i18n.php:121 -msgid "Date" -msgstr "Dato" - -#: includes/i18n.php:123 -msgid "Amount" -msgstr "Beløb" - -#: includes/i18n.php:125 -msgid "Invoice" -msgstr "Faktura" - -#: includes/i18n.php:127 -msgid "Billing" -msgstr "Betaling" - -#: includes/i18n.php:129 -msgid "Payments" -msgstr "Betalinger" - -#: includes/i18n.php:131 -msgid "Delete Account" -msgstr "Slet konto" - -#: includes/i18n.php:133 -msgctxt "as close a window" -msgid "Dismiss" -msgstr "Fjern" - -#: includes/i18n.php:135 -msgctxt "as product pricing plan" -msgid "Plan" -msgstr "Plan" - -#: includes/i18n.php:137 -msgid "Change Plan" -msgstr "Skift plan" - -#: includes/i18n.php:139 -msgctxt "as download professional version" -msgid "Download %s Version" -msgstr "" - -#: includes/i18n.php:141 -msgctxt "as download professional version now" -msgid "Download %s version now" -msgstr "" - -#: includes/i18n.php:145 -msgctxt "as download latest version" -msgid "Download Latest" -msgstr "Download seneste" - -#: includes/i18n.php:147 -msgctxt "E.g. you have a professional license." -msgid "You have a %s license." -msgstr "Du har en %s licens." - -#: includes/i18n.php:151 -msgid "New" -msgstr "Ny" - -#: includes/i18n.php:153 -msgid "Free" -msgstr "Gratis" - -#: includes/i18n.php:155 -msgctxt "as trial plan" -msgid "Trial" -msgstr "Prøveperiode" - -#: includes/i18n.php:157 -msgctxt "as starting a trial plan" -msgid "Start Trial" -msgstr "" - -#: includes/i18n.php:159 -msgctxt "verb" -msgid "Purchase" -msgstr "Køb" - -#: includes/i18n.php:161 -msgid "Purchase License" -msgstr "Køb licens" - -#: includes/i18n.php:163 -msgctxt "verb" -msgid "Buy" -msgstr "Køb" - -#: includes/i18n.php:165 -msgid "Buy License" -msgstr "Køb licens" - -#: includes/i18n.php:167 -msgid "Single Site License" -msgstr "" - -#: includes/i18n.php:169 -msgid "Unlimited Licenses" -msgstr "Ubegrænsede licenser" - -#: includes/i18n.php:171 -msgid "Up to %s Sites" -msgstr "Op til %s websteder" - -#: includes/i18n.php:173 -msgid "%sRenew your license now%s to access version %s features and support." -msgstr "" - -#: includes/i18n.php:177 -msgid "" -"Enter the email address you've used for the upgrade below and we will resend" -" you the license key." -msgstr "" - -#: includes/i18n.php:181 -msgctxt "e.g. Professional Plan" -msgid "%s Plan" -msgstr "%s Plan" - -#: includes/i18n.php:183 -msgid "You are just one step away - %s" -msgstr "Du mangler kun ét skridt - %s" - -#: includes/i18n.php:185 -msgctxt "%s - plugin name. As complete \"Jetpack\" activation now" -msgid "Complete \"%s\" Activation Now" -msgstr "Færdiggør aktivering af \"%s\" nu" - -#: includes/i18n.php:189 -msgid "We made a few tweaks to the plugin, %s" -msgstr "" - -#: includes/i18n.php:191 -msgid "Opt-in to make \"%s\" Better!" -msgstr "" - -#: includes/i18n.php:193 -msgid "Error" -msgstr "Fejl" - -#: includes/i18n.php:195 -msgid "" -"Freemius SDK couldn't find the plugin's main file. Please contact " -"sdk@freemius.com with the current error." -msgstr "" - -#: includes/i18n.php:203 -msgctxt "as expiration date" -msgid "Expiration" -msgstr "" - -#: includes/i18n.php:205 -msgctxt "as software license" -msgid "License" -msgstr "Licens" - -#: includes/i18n.php:207 -msgid "not verified" -msgstr "ikke verificeret" - -#: includes/i18n.php:209 -msgid "Verify Email" -msgstr "Verificer e-mail" - -#: includes/i18n.php:211 -msgctxt "e.g. expires in 2 months" -msgid "Expires in %s" -msgstr "Udløber om %s" - -#: includes/i18n.php:213 -msgctxt "e.g. auto renews in 2 months" -msgid "Auto renews in %s" -msgstr "" - -#: includes/i18n.php:215 -msgid "No expiration" -msgstr "Udløber ikke" - -#: includes/i18n.php:217 -msgid "Expired" -msgstr "Udløbet" - -#: includes/i18n.php:219 -msgid "Cancelled" -msgstr "Annulleret" - -#: includes/i18n.php:221 -msgctxt "e.g. In 2 hours" -msgid "In %s" -msgstr "Om %s" - -#: includes/i18n.php:223 -msgctxt "e.g. 2 min ago" -msgid "%s ago" -msgstr "%s siden" - -#: includes/i18n.php:225 -msgctxt "as plugin version" -msgid "Version" -msgstr "Version" - -#: includes/i18n.php:227 -msgid "Name" -msgstr "Navn" - -#: includes/i18n.php:229 -msgid "Email" -msgstr "E-mail" - -#: includes/i18n.php:231 -msgid "Email address" -msgstr "E-mailadresse" - -#: includes/i18n.php:233 -msgid "Verified" -msgstr "Verificeret" - -#: includes/i18n.php:235 -msgid "Plugin" -msgstr "Plugin" - -#: includes/i18n.php:237 -msgid "Plugins" -msgstr "Plugins" - -#: includes/i18n.php:239 -msgid "Themes" -msgstr "Temaer" - -#: includes/i18n.php:241 -msgctxt "as file/folder path" -msgid "Path" -msgstr "Sti" - -#: includes/i18n.php:243 -msgid "Title" -msgstr "Titel" - -#: includes/i18n.php:245 -msgid "Free version" -msgstr "Gratis version" - -#: includes/i18n.php:247 -msgid "Premium version" -msgstr "" - -#: includes/i18n.php:249 -msgctxt "as WP plugin slug" -msgid "Slug" -msgstr "Kortnavn" - -#: includes/i18n.php:251 -msgid "ID" -msgstr "ID" - -#: includes/i18n.php:253 -msgid "Users" -msgstr "Brugere" - -#: includes/i18n.php:255 -msgid "Plugin Installs" -msgstr "Plugin-installationer" - -#: includes/i18n.php:257 -msgctxt "like websites" -msgid "Sites" -msgstr "Websteder" - -#: includes/i18n.php:259 -msgid "User ID" -msgstr "Bruger-ID" - -#: includes/i18n.php:261 -msgid "Site ID" -msgstr "Websteds-ID" - -#: includes/i18n.php:263 -msgid "Public Key" -msgstr "Offentlig nøgle" - -#: includes/i18n.php:265 -msgid "Secret Key" -msgstr "Privat nøgle" - -#: includes/i18n.php:267 -msgctxt "as secret encryption key missing" -msgid "No Secret" -msgstr "Ingen privat nøgle" - -#: includes/i18n.php:269 -msgid "No ID" -msgstr "Intet ID" - -#: includes/i18n.php:271 -msgctxt "as synchronize license" -msgid "Sync License" -msgstr "Synkroniser licens" - -#: includes/i18n.php:273 -msgctxt "as synchronize" -msgid "Sync" -msgstr "Synkroniser" - -#: includes/i18n.php:275 -msgid "Activate License" -msgstr "Aktiver licens" - -#: includes/i18n.php:277 -msgid "Activate Free Version" -msgstr "Aktiver gratis version" - -#: includes/i18n.php:279 -msgid "" -"Please enter the license key that you received in the email right after the " -"purchase:" -msgstr "" - -#: includes/i18n.php:283 -msgid "Activating license..." -msgstr "Aktiverer licens..." - -#: includes/i18n.php:285 -msgid "Change License" -msgstr "Skift licens" - -#: includes/i18n.php:287 -msgid "Update License" -msgstr "Opdater licens" - -#: includes/i18n.php:289 -msgid "Deactivate License" -msgstr "Deaktiver licens" - -#: includes/i18n.php:291 -msgid "Activate" -msgstr "Aktiver" - -#: includes/i18n.php:293 -msgid "Deactivate" -msgstr "Deaktiver" - -#: includes/i18n.php:295 -msgid "Skip & Deactivate" -msgstr "Spring over & deaktiver" - -#: includes/i18n.php:297 -msgid "No - just deactivate" -msgstr "Nej - bare deaktiver" - -#: includes/i18n.php:299 -msgid "Yes - do your thing" -msgstr "" - -#: includes/i18n.php:301 -msgctxt "active mode" -msgid "Active" -msgstr "Aktiv" - -#: includes/i18n.php:303 -msgctxt "is active mode?" -msgid "Is Active" -msgstr "Er aktiv" - -#: includes/i18n.php:305 -msgid "Install Now" -msgstr "Installer nu" - -#: includes/i18n.php:307 -msgid "Install Update Now" -msgstr "Installer opdatering nu" - -#: includes/i18n.php:309 -msgid "More information about %s" -msgstr "Mere information om %s" - -#: includes/i18n.php:311 -msgid "Localhost" -msgstr "Localhost" - -#: includes/i18n.php:313 -msgctxt "as activate Professional plan" -msgid "Activate %s Plan" -msgstr "Aktiver plan %s" - -#: includes/i18n.php:315 -msgctxt "as 5 licenses left" -msgid "%s left" -msgstr "%s tilbage" - -#: includes/i18n.php:317 -msgid "Last license" -msgstr "" - -#: includes/i18n.php:319 -msgid "What is your %s?" -msgstr "" - -#: includes/i18n.php:321 -msgid "Activate this add-on" -msgstr "Aktiver denne tilføjelse" - -#: includes/i18n.php:323 -msgid "" -"Deactivating your license will block all premium features, but will enable " -"you to activate the license on another site. Are you sure you want to " -"proceed?" -msgstr "" - -#: includes/i18n.php:327 -msgid "" -"Deleting the account will automatically deactivate your %s plan license so " -"you can use it on other sites. If you want to terminate the recurring " -"payments as well, click the \"Cancel\" button, and first \"Downgrade\" your " -"account. Are you sure you would like to continue with the deletion?" -msgstr "" - -#: includes/i18n.php:331 -msgid "" -"Deletion is not temporary. Only delete if you no longer want to use this " -"plugin anymore. Are you sure you would like to continue with the deletion?" -msgstr "" - -#: includes/i18n.php:335 -msgid "" -"Downgrading your plan will immediately stop all future recurring payments " -"and your %s plan license will expire in %s." -msgstr "" - -#: includes/i18n.php:339 -msgid "" -"Cancelling the trial will immediately block access to all premium features. " -"Are you sure?" -msgstr "" - -#: includes/i18n.php:343 -msgid "" -"You can still enjoy all %s features but you will not have access to plugin " -"updates and support." -msgstr "" - -#: includes/i18n.php:347 -msgid "" -"Once your license expire you can still use the Free version but you will NOT" -" have access to the %s features." -msgstr "" - -#: includes/i18n.php:351 -msgid "Are you sure you want to proceed?" -msgstr "" - -#: includes/i18n.php:357 -msgid "Add Ons for %s" -msgstr "Tilføjelser til %s" - -#: includes/i18n.php:359 -msgid "" -"We could'nt load the add-ons list. It's probably an issue on our side, " -"please try to come back in few minutes." -msgstr "" - -#: includes/i18n.php:365 -msgid "Anonymous feedback" -msgstr "Anonym feedback" - -#: includes/i18n.php:367 -msgid "Quick feedback" -msgstr "Hurtig feedback" - -#: includes/i18n.php:369 -msgid "If you have a moment, please let us know why you are deactivating" -msgstr "" - -#: includes/i18n.php:373 -msgid "Yes - Deactivate" -msgstr "Ja - deaktiver" - -#: includes/i18n.php:375 -msgid "Submit & Deactivate" -msgstr "Send & deaktiver" - -#: includes/i18n.php:377 -msgid "Cancel" -msgstr "Annuller" - -#: includes/i18n.php:379 -msgid "I no longer need the plugin" -msgstr "" - -#: includes/i18n.php:381 -msgid "I found a better plugin" -msgstr "Jeg har fundet et bedre plugin" - -#: includes/i18n.php:383 -msgid "I only needed the plugin for a short period" -msgstr "" - -#: includes/i18n.php:385 -msgid "The plugin broke my site" -msgstr "Pluginnet ødelagde mit websted" - -#: includes/i18n.php:387 -msgid "The plugin suddenly stopped working" -msgstr "Pluginnet virker ikke længere" - -#: includes/i18n.php:389 -msgid "I can't pay for it anymore" -msgstr "Jeg kan ikke længere betale for det" - -#: includes/i18n.php:391 -msgid "It's a temporary deactivation. I'm just debugging an issue." -msgstr "" - -#: includes/i18n.php:395 -msgctxt "" -"the text of the \"other\" reason for deactivating the plugin that is shown " -"in the modal box." -msgid "Other" -msgstr "Andet" - -#: includes/i18n.php:399 -msgid "Kindly tell us the reason so we can improve." -msgstr "" - -#: includes/i18n.php:401 -msgid "What's the plugin's name?" -msgstr "" - -#: includes/i18n.php:403 -msgid "What price would you feel comfortable paying?" -msgstr "" - -#: includes/i18n.php:405 -msgid "I couldn't understand how to make it work" -msgstr "" - -#: includes/i18n.php:407 -msgid "" -"The plugin is great, but I need specific feature that you don't support" -msgstr "" - -#: includes/i18n.php:411 -msgid "The plugin is not working" -msgstr "Pluginnet virker ikke" - -#: includes/i18n.php:413 -msgid "It's not what I was looking for" -msgstr "" - -#: includes/i18n.php:415 -msgid "The plugin didn't work as expected" -msgstr "" - -#: includes/i18n.php:417 -msgid "What feature?" -msgstr "" - -#: includes/i18n.php:419 -msgid "Kindly share what didn't work so we can fix it for future users..." -msgstr "" - -#: includes/i18n.php:423 -msgid "What you've been looking for?" -msgstr "" - -#: includes/i18n.php:425 -msgid "What did you expect?" -msgstr "Hvad forventede du?" - -#: includes/i18n.php:427 -msgid "The plugin didn't work" -msgstr "Pluginnet virkede ikke" - -#: includes/i18n.php:429 -msgid "I don't like to share my information with you" -msgstr "" - -#: includes/i18n.php:431 -msgid "" -"You might have missed it, but you don't have to share any data and can just " -"%s the opt-in." -msgstr "" - -#: includes/i18n.php:441 -msgctxt "greeting" -msgid "Hey %s," -msgstr "Hey %s," - -#: includes/i18n.php:443 -msgctxt "a greeting. E.g. Thanks John!" -msgid "Thanks %s!" -msgstr "Tak %s!" - -#: includes/i18n.php:445 -msgid "" -"Never miss an important update - opt-in to our security and feature updates " -"notifications, and non-sensitive diagnostic tracking with %4$s." -msgstr "" - -#: includes/i18n.php:449 -msgid "" -"Please help us improve %1$s! If you opt-in, some data about your usage of " -"%1$s will be sent to %4$s. If you skip this, that's okay! %1$s will still " -"work just fine." -msgstr "" - -#: includes/i18n.php:453 -msgid "" -"You should receive an activation email for %s to your mailbox at %s. Please " -"make sure you click the activation button in that email to %s." -msgstr "" - -#: includes/i18n.php:455 -msgid "complete the install" -msgstr "" - -#: includes/i18n.php:457 -msgid "start the trial" -msgstr "" - -#: includes/i18n.php:459 -msgid "" -"Thanks for purchasing %s! To get started, please enter your license key:" -msgstr "" - -#: includes/i18n.php:463 -msgid "" -"The plugin will be periodically sending data to %s to check for plugin " -"updates and verify the validity of your license." -msgstr "" - -#: includes/i18n.php:467 -msgid "What permissions are being granted?" -msgstr "Hvilke tilladelser bliver givet?" - -#: includes/i18n.php:469 -msgid "Your Profile Overview" -msgstr "Overblik af din profil" - -#: includes/i18n.php:471 -msgid "Name and email address" -msgstr "Navn og e-mailadresse" - -#: includes/i18n.php:473 -msgid "Your Site Overview" -msgstr "Overblik af dit websted" - -#: includes/i18n.php:475 -msgid "Site URL, WP version, PHP info, plugins & themes" -msgstr "" - -#: includes/i18n.php:479 -msgid "Current Plugin Events" -msgstr "Nuværende plugin-begivenheder" - -#: includes/i18n.php:481 -msgid "Activation, deactivation and uninstall" -msgstr "Aktivering, deaktivering og afinstallering" - -#: includes/i18n.php:483 -msgid "Plugins & Themes" -msgstr "Plugins & Temaer" - -#: includes/i18n.php:485 -msgid "Titles, versions and state." -msgstr "Titler, versioner og tilstand." - -#: includes/i18n.php:487 -msgid "Admin Notices" -msgstr "" - -#: includes/i18n.php:489 -msgid "Newsletter" -msgstr "Nyhedsbrev" - -#: includes/i18n.php:491 -msgid "Updates, announcements, marketing, no spam" -msgstr "" - -#: includes/i18n.php:493 -msgid "Privacy Policy" -msgstr "Privatlivspolitik" - -#: includes/i18n.php:495 -msgid "Terms of Service" -msgstr "Servicevilkår" - -#: includes/i18n.php:497 -msgctxt "as activating plugin" -msgid "Activating" -msgstr "Aktiverer" - -#: includes/i18n.php:499 -msgctxt "as in the process of sending an email" -msgid "Sending email" -msgstr "Sender e-mail" - -#: includes/i18n.php:503 -msgctxt "button label" -msgid "Allow & Continue" -msgstr "Tillad & Fortsæt" - -#: includes/i18n.php:505 -msgctxt "button label" -msgid "Agree & Activate License" -msgstr "Accepter & aktiver licens" - -#: includes/i18n.php:507 -msgctxt "verb" -msgid "Skip" -msgstr "Spring over" - -#: includes/i18n.php:509 -msgid "Click here to use the plugin anonymously" -msgstr "Klik her for at benytte pluginnet anonymt" - -#: includes/i18n.php:511 -msgid "Re-send activation email" -msgstr "Gensend e-mail om aktivering" - -#: includes/i18n.php:513 -msgid "License key" -msgstr "Licensnøgle" - -#: includes/i18n.php:515 -msgid "Send License Key" -msgstr "Send licensnøgle" - -#: includes/i18n.php:517 -msgid "Sending license key" -msgstr "Sender licensnøgle" - -#: includes/i18n.php:519 -msgid "Have a license key?" -msgstr "Har du en licensnøgle?" - -#: includes/i18n.php:521 -msgid "Don't have a license key?" -msgstr "Har du ikke en licensnøgle?" - -#: includes/i18n.php:523 -msgid "Can't find your license key?" -msgstr "Kan du ikke finde din licensnøgle?" - -#: includes/i18n.php:525 -msgid "" -"We couldn't find your email address in the system, are you sure it's the " -"right address?" -msgstr "" - -#: includes/i18n.php:529 -msgid "" -"We can't see any active licenses associated with that email address, are you" -" sure it's the right address?" -msgstr "" - -#: includes/i18n.php:533 -msgid "Opt In" -msgstr "" - -#: includes/i18n.php:535 -msgid "Opt Out" -msgstr "" - -#: includes/i18n.php:537 -msgid "On second thought - I want to continue helping" -msgstr "" - -#: includes/i18n.php:541 -msgid "Opting out..." -msgstr "" - -#: includes/i18n.php:543 -msgid "Opting in..." -msgstr "" - -#: includes/i18n.php:545 -msgid "" -"We appreciate your help in making the %s better by letting us track some " -"usage data." -msgstr "" - -#: includes/i18n.php:549 -msgid "" -"Usage tracking is done in the name of making %s better. Making a better user" -" experience, prioritizing new features, and more good things. We'd really " -"appreciate if you'll reconsider letting us continue with the tracking." -msgstr "" - -#: includes/i18n.php:553 -msgid "" -"By clicking \"Opt Out\", we will no longer be sending any data from %s to " -"%s." -msgstr "" - -#: includes/i18n.php:563 -msgid "Screenshots" -msgstr "Skærmbilleder" - -#: includes/i18n.php:565 -msgid "Click to view full-size screenshot %d" -msgstr "" - -#: includes/i18n.php:573 -msgid "Freemius Debug" -msgstr "Freemius Debug" - -#: includes/i18n.php:575 -msgctxt "as turned on" -msgid "On" -msgstr "Til" - -#: includes/i18n.php:577 -msgctxt "as turned off" -msgid "Off" -msgstr "Fra" - -#: includes/i18n.php:579 -msgctxt "as code debugging" -msgid "Debugging" -msgstr "Fejlfinding" - -#: includes/i18n.php:581 -msgid "Freemius State" -msgstr "Freemius tilstand" - -#: includes/i18n.php:583 -msgctxt "as connection was successful" -msgid "Connected" -msgstr "Forbundet" - -#: includes/i18n.php:585 -msgctxt "as connection blocked" -msgid "Blocked" -msgstr "Blokeret" - -#: includes/i18n.php:587 -msgctxt "as application program interface" -msgid "API" -msgstr "API" - -#: includes/i18n.php:589 -msgctxt "as software development kit versions" -msgid "SDK" -msgstr "SDK" - -#: includes/i18n.php:591 -msgctxt "as software development kit versions" -msgid "SDK Versions" -msgstr "SDK-versioner" - -#: includes/i18n.php:595 -msgctxt "as plugin folder path" -msgid "Plugin Path" -msgstr "Plugin-sti" - -#: includes/i18n.php:597 -msgctxt "as sdk path" -msgid "SDK Path" -msgstr "SDK-sti" - -#: includes/i18n.php:599 -msgid "Add Ons of Plugin %s" -msgstr "Tilføjelser til plugin %s" - -#: includes/i18n.php:601 -msgid "Are you sure you want to delete all Freemius data?" -msgstr "" - -#: includes/i18n.php:605 -msgid "Actions" -msgstr "Handlinger" - -#: includes/i18n.php:607 -msgid "Delete All Accounts" -msgstr "Slet alle konti" - -#: includes/i18n.php:609 -msgid "Start Fresh" -msgstr "Start forfra" - -#: includes/i18n.php:611 -msgid "Clear API Cache" -msgstr "Ryd API-cache" - -#: includes/i18n.php:613 -msgid "Sync Data From Server" -msgstr "Synkroniser data fra server" - -#: includes/i18n.php:615 -msgid "Scheduled Crons" -msgstr "Planlagte cron jobs" - -#: includes/i18n.php:617 -msgid "Plugins & Themes Sync" -msgstr "Synkronisering af plugins og temaer" - -#: includes/i18n.php:625 -msgctxt "as congratulations" -msgid "Congrats" -msgstr "Tillykke" - -#: includes/i18n.php:627 -msgctxt "exclamation" -msgid "Oops" -msgstr "Ups" - -#: includes/i18n.php:629 -msgctxt "interjection expressing joy or exuberance" -msgid "Yee-haw" -msgstr "" - -#: includes/i18n.php:633 -msgctxt "" -"(especially in electronic communication) used to express elation, " -"enthusiasm, or triumph." -msgid "W00t" -msgstr "" - -#: includes/i18n.php:637 -msgctxt "a positive response" -msgid "Right on" -msgstr "Sådan" - -#: includes/i18n.php:639 -msgctxt "" -"something somebody says when they are thinking about what you have just " -"said. " -msgid "Hmm" -msgstr "Hmm" - -#: includes/i18n.php:643 -msgid "O.K" -msgstr "O.K" - -#: includes/i18n.php:645 -msgctxt "exclamation" -msgid "Hey" -msgstr "Hey" - -#: includes/i18n.php:647 -msgctxt "advance notice of something that will need attention." -msgid "Heads up" -msgstr "Se her" - -#: includes/i18n.php:657 -msgid "Seems like you got the latest release." -msgstr "" - -#: includes/i18n.php:659 -msgid "You are all good!" -msgstr "Det var det!" - -#: includes/i18n.php:661 -msgid "" -"Sorry, we could not complete the email update. Another user with the same " -"email is already registered." -msgstr "" - -#: includes/i18n.php:665 -msgid "" -"If you would like to give up the ownership of the plugin's account to %s " -"click the Change Ownership button." -msgstr "" - -#: includes/i18n.php:669 -msgid "" -"Your email was successfully updated. You should receive an email with " -"confirmation instructions in few moments." -msgstr "" - -#: includes/i18n.php:673 -msgid "Your name was successfully updated." -msgstr "Dit navn er blevet opdateret." - -#: includes/i18n.php:675 -msgid "You have successfully updated your %s." -msgstr "Opdatering af %s blev gennemført." - -#: includes/i18n.php:677 -msgid "Please provide your full name." -msgstr "Indtast venligst dit fulde navn." - -#: includes/i18n.php:679 -msgid "" -"Verification mail was just sent to %s. If you can't find it after 5 min, " -"please check your spam box." -msgstr "" - -#: includes/i18n.php:683 -msgid "" -"Just letting you know that the add-ons information of %s is being pulled " -"from an external server." -msgstr "" - -#: includes/i18n.php:687 -msgid "No credit card required" -msgstr "Betalingskort ikke påkrævet" - -#: includes/i18n.php:689 -msgid "Premium plugin version was successfully activated." -msgstr "" - -#: includes/i18n.php:693 -msgid "The upgrade of %s was successfully completed." -msgstr "" - -#: includes/i18n.php:695 -msgid "Your account was successfully activated with the %s plan." -msgstr "" - -#: includes/i18n.php:699 -msgid "Download the latest %s version now" -msgstr "Download den seneste version af %s nu" - -#: includes/i18n.php:701 -msgid "Please follow these steps to complete the upgrade" -msgstr "" - -#: includes/i18n.php:705 -msgid "Download the latest %s version" -msgstr "Download den seneste version af %s" - -#: includes/i18n.php:707 -msgid "Deactivate the free version" -msgstr "Deaktiver den gratis version" - -#: includes/i18n.php:709 -msgid "Upload and activate the downloaded version" -msgstr "Upload og aktiver den downloadede version" - -#: includes/i18n.php:711 -msgid "How to upload and activate?" -msgstr "Upload og aktivering, hvordan?" - -#: includes/i18n.php:713 -msgctxt "%s - product name, e.g. Facebook add-on was successfully..." -msgid "%s Add-on was successfully purchased." -msgstr "Betalingen for tilføjelsen %s blev gennemført." - -#: includes/i18n.php:717 -msgid "Your %s Add-on plan was successfully upgraded." -msgstr "" - -#: includes/i18n.php:721 -msgid "Your email has been successfully verified - you are AWESOME!" -msgstr "" - -#: includes/i18n.php:725 -msgid "Your plan was successfully upgraded." -msgstr "Din plan er blevet opgraderet." - -#: includes/i18n.php:727 -msgid "Your plan was successfully changed to %s." -msgstr "Din plan er blevet ændret til %s." - -#: includes/i18n.php:729 -msgid "" -"Your license has expired. You can still continue using the free plugin " -"forever." -msgstr "" - -#: includes/i18n.php:733 -msgid "" -"Your license has been cancelled. If you think it's a mistake, please contact" -" support." -msgstr "" - -#: includes/i18n.php:737 -msgid "Your trial has been successfully started." -msgstr "Din prøveperiode er begyndt." - -#: includes/i18n.php:739 -msgid "Your license was successfully activated." -msgstr "Din licens er blevet aktiveret." - -#: includes/i18n.php:741 -msgid "It looks like your site currently doesn't have an active license." -msgstr "Det ser ud til, at dit websted endnu ikke har en aktiv licens." - -#: includes/i18n.php:745 -msgid "" -"Your license was successfully deactivated, you are back to the %s plan." -msgstr "" - -#: includes/i18n.php:749 -msgid "It looks like the license deactivation failed." -msgstr "Det ser ud til, at licens-deaktiveringen mislykkedes." - -#: includes/i18n.php:753 -msgid "It looks like the license could not be activated." -msgstr "Det ser ud til, at licensen ikke kunne aktiveres." - -#: includes/i18n.php:757 -msgid "Error received from the server:" -msgstr "Fejl modtager fra serveren:" - -#: includes/i18n.php:759 -msgid "" -"Your trial has expired. You can still continue using all our free features." -msgstr "Din prøveperiode er udløbet. Du kan fortsat bruge alle vores gratis funktioner." - -#: includes/i18n.php:763 -msgid "" -"Your plan was successfully downgraded. Your %s plan license will expire in " -"%s." -msgstr "" - -#: includes/i18n.php:767 -msgid "" -"Seems like we are having some temporary issue with your plan downgrade. " -"Please try again in few minutes." -msgstr "" - -#: includes/i18n.php:771 -msgid "" -"It looks like you are not in trial mode anymore so there's nothing to cancel" -" :)" -msgstr "" - -#: includes/i18n.php:775 -msgid "Your %s free trial was successfully cancelled." -msgstr "" - -#: includes/i18n.php:779 -msgctxt "%s - numeric version number" -msgid "Version %s was released." -msgstr "Version %s er blevet udgivet." - -#: includes/i18n.php:783 -msgid "Please download %s." -msgstr "Download venligst %s." - -#: includes/i18n.php:785 -msgctxt "%s - plan name, as the latest professional version here" -msgid "the latest %s version here" -msgstr "den seneste version af %s her" - -#: includes/i18n.php:789 -msgid "" -"How do you like %s so far? Test all our %s premium features with a %d-day " -"free trial." -msgstr "" - -#: includes/i18n.php:793 -msgctxt "call to action" -msgid "Start free trial" -msgstr "Start gratis prøveperiode" - -#: includes/i18n.php:795 -msgid "Starting trial" -msgstr "" - -#: includes/i18n.php:797 -msgid "Please wait" -msgstr "" - -#: includes/i18n.php:799 -msgid "" -"Seems like we are having some temporary issue with your trial cancellation. " -"Please try again in few minutes." -msgstr "" - -#: includes/i18n.php:803 -msgid "You already utilized a trial before." -msgstr "Du har allerede brugt din prøveperiode." - -#: includes/i18n.php:805 -msgid "You are already running the plugin in a trial mode." -msgstr "" - -#: includes/i18n.php:809 -msgid "Plan %s do not exist, therefore, can't start a trial." -msgstr "" - -#: includes/i18n.php:813 -msgid "Plan %s does not support a trial period." -msgstr "Plan %s understøtter ikke en prøveperiode." - -#: includes/i18n.php:815 -msgid "None of the plugin's plans supports a trial period." -msgstr "" - -#: includes/i18n.php:819 -msgid "" -"Unexpected API error. Please contact the plugin's author with the following " -"error." -msgstr "" - -#: includes/i18n.php:823 -msgid "No commitment for %s days - cancel anytime!" -msgstr "Ingen bindinger i %s dage - annuller når som helst!" - -#: includes/i18n.php:825 -msgid "" -"Your license has expired. You can still continue using all the %s features, " -"but you'll need to renew your license to continue getting updates and " -"support." -msgstr "" - -#: includes/i18n.php:829 -msgid "Couldn't activate %s." -msgstr "Kunne ikke aktivere %s." - -#: includes/i18n.php:831 -msgid "Please contact us with the following message:" -msgstr "Kontakt os venligst med følgende besked:" - -#: includes/i18n.php:833 -msgid "" -"It looks like you are still on the %s plan. If you did upgrade or change " -"your plan, it's probably an issue on our side - sorry." -msgstr "" - -#: includes/i18n.php:837 -msgid "Please contact us here" -msgstr "Kontakt os her" - -#: includes/i18n.php:839 -msgid "" -"I have upgraded my account but when I try to Sync the License, the plan " -"remains %s." -msgstr "" - -#: includes/i18n.php:847 -msgid "From unknown reason, the API connectivity test failed." -msgstr "" - -#: includes/i18n.php:851 -msgid "" -"It's probably a temporary issue on our end. Just to be sure, with your " -"permission, would it be o.k to run another connectivity test?" -msgstr "" - -#: includes/i18n.php:855 -msgid "" -"We use PHP cURL library for the API calls, which is a very common library " -"and usually installed out of the box. Unfortunately, cURL is not installed " -"on your server." -msgstr "" - -#: includes/i18n.php:859 -msgid "" -"From unknown reason, CloudFlare, the firewall we use, blocks the connection." -msgstr "" - -#: includes/i18n.php:863 -msgctxt "as pluginX requires an access to our API" -msgid "%s requires an access to our API." -msgstr "" - -#: includes/i18n.php:867 -msgid "" -"It looks like your server is using Squid ACL (access control lists), which " -"blocks the connection." -msgstr "" - -#: includes/i18n.php:871 -msgid "I don't know what is Squid or ACL, help me!" -msgstr "" - -#: includes/i18n.php873, includes/i18n.php:887 -msgid "" -"We'll make sure to contact your hosting company and resolve the issue. You " -"will get a follow-up email to %s once we have an update." -msgstr "" - -#: includes/i18n.php:877 -msgid "I'm a system administrator" -msgstr "Jeg er en system-administrator" - -#: includes/i18n.php:879 -msgid "" -"Great, please whitelist the following domains: %s. Once you done, deactivate" -" the plugin and activate it again." -msgstr "" - -#: includes/i18n.php:883 -msgid "I don't know what is cURL or how to install it, help me!" -msgstr "" - -#: includes/i18n.php:891 -msgid "" -"Great, please install cURL and enable it in your php.ini file. To make sure " -"it was successfully activated, use 'phpinfo()'. Once activated, deactivate " -"the plugin and reactivate it back again." -msgstr "" - -#: includes/i18n.php:895 -msgid "" -"We are sure it's an issue on our side and more than happy to resolve it for " -"you ASAP if you give us a chance." -msgstr "" - -#: includes/i18n.php:899 -msgid "" -"Sorry for the inconvenience and we are here to help if you give us a chance." -msgstr "" - -#: includes/i18n.php:903 -msgid "Yes - I'm giving you a chance to fix it" -msgstr "Ja - jeg giver jer en chance for at rette det" - -#: includes/i18n.php:905 -msgid "" -"We will do our best to whitelist your server and resolve this issue ASAP. " -"You will get a follow-up email to %s once we have an update." -msgstr "" - -#: includes/i18n.php:909 -msgid "Let's try your previous version" -msgstr "Lad os prøve din forrige version" - -#: includes/i18n.php:911 -msgid "Uninstall this version and install the previous one." -msgstr "Afinstaller denne version og installer den forrige." - -#: includes/i18n.php:915 -msgid "That's exhausting, please deactivate" -msgstr "" - -#: includes/i18n.php:917 -msgid "" -"We feel your frustration and sincerely apologize for the inconvenience. Hope" -" to see you again in the future." -msgstr "" - -#: includes/i18n.php:921 -msgid "" -"Thank for giving us the chance to fix it! A message was just sent to our " -"technical staff. We will get back to you as soon as we have an update to %s." -" Appreciate your patience." -msgstr "" - -#: includes/i18n.php:925 -msgctxt "%1s - plugin title, %2s - API domain" -msgid "" -"Your server is blocking the access to Freemius' API, which is crucial for " -"%1s synchronization. Please contact your host to whitelist %2s" -msgstr "" - -#: includes/i18n.php:929 -msgid "" -"It seems like one of the authentication parameters is wrong. Update your " -"Public Key, Secret Key & User ID, and try again." -msgstr "" - -#: includes/i18n.php:937 -msgid "" -"Please check your mailbox, you should receive an email via %s to confirm the" -" ownership change. From security reasons, you must confirm the change within" -" the next 15 min. If you cannot find the email, please check your spam " -"folder." -msgstr "" - -#: includes/i18n.php:941 -msgid "" -"Thanks for confirming the ownership change. An email was just sent to %s for" -" final approval." -msgstr "" - -#: includes/i18n.php:945 -msgid "%s is the new owner of the account." -msgstr "%s er den nye ejer af kontoen." - -#: includes/i18n.php:949 -msgctxt "addonX cannot run without pluginY" -msgid "%s cannot run without %s." -msgstr "%s virker ikke uden %s." - -#: includes/i18n.php:953 -msgctxt "addonX cannot run..." -msgid "%s cannot run without the plugin." -msgstr "%s virker ikke uden pluginnet." - -#: includes/i18n.php:957 -msgctxt "pluginX activation was successfully..." -msgid "%s activation was successfully completed." -msgstr "Aktivering af %s blev gennemført." - -#: includes/i18n.php:961 -msgctxt "Plugin installer section title" -msgid "Features & Pricing" -msgstr "Funktioner og priser" - -#: includes/i18n.php:965 -msgid "Add-on must be deployed to WordPress.org or Freemius." -msgstr "" - -#: includes/i18n.php:969 -msgid "Paid add-on must be deployed to Freemius." -msgstr "" - -#: includes/i18n.php:977 -msgid "" -"%s is a premium only add-on. You have to purchase a license first before " -"activating the plugin." -msgstr "" - -#: includes/i18n.php:981 -msgid "" -"%s free trial was successfully cancelled. Since the add-on is premium only " -"it was automatically deactivated. If you like to use it in the future, " -"you'll have to purchase a license." -msgstr "" - -#: includes/i18n.php:993 -msgctxt "as every month" -msgid "Monthly" -msgstr "Månedligt" - -#: includes/i18n.php:995 -msgctxt "as monthly period" -msgid "mo" -msgstr "md" - -#: includes/i18n.php:997 -msgctxt "as once a year" -msgid "Annual" -msgstr "Årligt" - -#: includes/i18n.php:999 -msgctxt "as once a year" -msgid "Annually" -msgstr "Årligt" - -#: includes/i18n.php:1001 -msgctxt "as once a year" -msgid "Once" -msgstr "Engangsbeløb" - -#: includes/i18n.php:1003 -msgctxt "as annual period" -msgid "year" -msgstr "år" - -#: includes/i18n.php:1005 -msgid "Lifetime" -msgstr "" - -#: includes/i18n.php:1007 -msgctxt "e.g. the best product" -msgid "Best" -msgstr "Bedste" - -#: includes/i18n.php:1009 -msgctxt "e.g. billed monthly" -msgid "Billed %s" -msgstr "" - -#: includes/i18n.php:1011 -msgctxt "as a discount of $5 or 10%" -msgid "Save %s" -msgstr "Spar %s" - -#: includes/i18n.php:1015 -msgid "View details" -msgstr "Vis detaljer" - -#: includes/i18n.php:1023 -msgctxt "button label" -msgid "Approve & Start Trial" -msgstr "" - -#: includes/i18n.php:1027 -msgid "" -"You are 1-click away from starting your %1$s-day free trial of the %2$s " -"plan." -msgstr "" - -#: includes/i18n.php:1031 -msgid "" -"For compliance with the WordPress.org guidelines, before we start the trial " -"we ask that you opt-in with your user and non-sensitive site information, " -"allowing the plugin to periodically send data to %s to check for version " -"updates and to validate your trial." -msgstr "" - -#: includes/i18n.php:1043 -msgid "Business name" -msgstr "" - -#: includes/i18n.php:1045 -msgid "Tax / VAT ID" -msgstr "" - -#: includes/i18n.php:1047 -msgid "Address Line %d" -msgstr "" - -#: includes/i18n.php:1049 -msgid "Country" -msgstr "" - -#: includes/i18n.php:1051 -msgid "Select Country" -msgstr "" - -#: includes/i18n.php:1053 -msgid "City" -msgstr "" - -#: includes/i18n.php:1055 -msgid "Town" -msgstr "" - -#: includes/i18n.php:1057 -msgid "State" -msgstr "" - -#: includes/i18n.php:1059 -msgid "Province" -msgstr "" - -#: includes/i18n.php:1061 -msgid "ZIP / Postal Code" -msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language: \n" +"Language-Team: \n" +"Content-Type: \n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.mo index fea49bce36f1583480f4c5f505566878d56475d7..be81534cbca7ba9f0eb111fb6f05626a3a138761 100755 GIT binary patch literal 48279 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 literal 34518 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	pxz&d65pvpcpFDElMvm_N> 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 az#Ew0dzZl5mOuw6LJ$992!&i`!T<olc6Xit diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.po index 76df2e2c5..8a23a1a54 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.po +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-en.po @@ -1,1522 +1,2205 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. msgid "" msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" +"Project-Id-Version: freemius\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" -"Last-Translator: \n" +"Last-Translator: Vova Feldman <vova@freemius.com>\n" "Language: \n" -"Language-Team: \n" -"Content-Type: \n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Language-Team: Freemius Team <admin@freemius.com>\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Error" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "I found a better %s" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "What's the %s's name?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "It's a temporary %s. I'm just debugging an issue." + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Deactivation" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Theme Switch" + +#: includes/class-freemius.php:1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Other" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "I no longer need the %s" + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "I only needed the %s for a short period" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "The %s broke my site" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "The %s suddenly stopped working" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "I can't pay for it anymore" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "What price would you feel comfortable paying?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "I don't like to share my information with you" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "The %s didn't work" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "I couldn't understand how to make it work" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "The %s is great, but I need specific feature that you don't support" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "What feature?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "The %s is not working" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Kindly share what didn't work so we can fix it for future users..." + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "It's not what I was looking for" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "What you've been looking for?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "The %s didn't work as expected" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "What did you expect?" + +#: includes/class-freemius.php:2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Freemius Debug" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "I don't know what is cURL or how to install it, help me!" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Yes - do your thing" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "No - just deactivate" + +#: includes/class-freemius.php:3566, includes/class-freemius.php:4066, includes/class-freemius.php:5127, includes/class-freemius.php:10941, includes/class-freemius.php:14205, includes/class-freemius.php:14257, includes/class-freemius.php:14319, includes/class-freemius.php:16448, includes/class-freemius.php:16458, includes/class-freemius.php:17014, includes/class-freemius.php:17032, includes/class-freemius.php:17130, includes/class-freemius.php:17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Oops" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s cannot run without %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s cannot run without the plugin." + +#: includes/class-freemius.php:4176, includes/class-freemius.php:4201, includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Unexpected API error. Please contact the %s's author with the following error." + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "Premium %s version was successfully activated." + +#: includes/class-freemius.php:4827, includes/class-freemius.php:6660 +msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)." +msgid "W00t" +msgstr "W00t" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "You have a %s license." + +#: includes/class-freemius.php:4846, includes/class-freemius.php:13626, includes/class-freemius.php:13637, includes/class-freemius.php:16376, includes/class-freemius.php:16676, includes/class-freemius.php:16741, includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Yee-haw" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s is a premium only add-on. You have to purchase a license first before activating the plugin." + +#: includes/class-freemius.php:5123, templates/add-ons.php:99, templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "More information about %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "Purchase License" + +#: includes/class-freemius.php:6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "start the trial" + +#: includes/class-freemius.php:6040, templates/connect.php:165 +msgid "complete the install" +msgstr "complete the install" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "You are just one step away - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "Complete \"%s\" Activation Now" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "We made a few tweaks to the %s, %s" + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Opt in to make \"%s\" Better!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "The upgrade of %s was successfully completed." + +#: includes/class-freemius.php:8384, includes/class-fs-plugin-updater.php:581, includes/class-fs-plugin-updater.php:733, includes/class-fs-plugin-updater.php:739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Add-On" + +#: includes/class-freemius.php:8386, templates/debug.php:349, templates/debug.php:510 +msgid "Plugin" +msgstr "Plugin" + +#: includes/class-freemius.php:8387, templates/debug.php:349, templates/debug.php:510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Theme" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "We couldn't find your email address in the system, are you sure it's the right address?" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "We can't see any active licenses associated with that email address, are you sure it's the right address?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Account is pending activation." + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "%s activation was successfully completed." + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Your account was successfully activated with the %s plan." + +#: includes/class-freemius.php:13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "Your trial has been successfully started." + +#: includes/class-freemius.php:14203, includes/class-freemius.php:14255, includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "Couldn't activate %s." + +#: includes/class-freemius.php:14204, includes/class-freemius.php:14256, includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Please contact us with the following message:" + +#: includes/class-freemius.php:14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Upgrade" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Start Trial" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Pricing" + +#: includes/class-freemius.php:14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Affiliation" + +#: includes/class-freemius.php:14756, includes/class-freemius.php:14758, templates/account.php:146, templates/debug.php:314 +msgid "Account" +msgstr "Account" + +#: includes/class-freemius.php:14769, includes/class-freemius.php:14771, includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Contact Us" + +#: includes/class-freemius.php:14781, includes/class-freemius.php:14783, includes/class-freemius.php:18939, templates/account.php:96, templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Add-Ons" + +#: includes/class-freemius.php:14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Pricing" + +#: includes/class-freemius.php:15009, includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Support Forum" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Your email has been successfully verified - you are AWESOME!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Right on" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Your %s Add-on plan was successfully upgraded." + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "%s Add-on was successfully purchased." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Download the latest version" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" + +#: includes/class-freemius.php:16447, includes/class-freemius.php:16862, includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Error received from the server:" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." + +#: includes/class-freemius.php:16639, includes/class-freemius.php:16867, includes/class-freemius.php:16910 +msgctxt "something somebody says when they are thinking about what you have just said." +msgid "Hmm" +msgstr "Hmm" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." + +#: includes/class-freemius.php:16653, templates/account.php:98, templates/add-ons.php:130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Trial" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "I have upgraded my account but when I try to Sync the License, the plan remains %s." + +#: includes/class-freemius.php:16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Please contact us here" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Your plan was successfully upgraded." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Your plan was successfully changed to %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Your license has expired. You can still continue using the free %s forever." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "Your license has been cancelled. If you think it's a mistake, please contact support." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "Your free trial has expired. You can still continue using all our free features." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "It looks like the license could not be activated." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "Your license was successfully activated." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "It looks like your site currently doesn't have an active license." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "It looks like the license deactivation failed." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "Your license was successfully deactivated, you are back to the %s plan." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "O.K" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Your plan was successfully downgraded. Your %s plan license will expire in %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "You are already running the %s in a trial mode." + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "You already utilized a trial before." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "Plan %s do not exist, therefore, can't start a trial." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "Plan %s does not support a trial period." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "None of the %s's plans supports a trial period." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "It looks like you are not in trial mode anymore so there's nothing to cancel :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Your %s free trial was successfully cancelled." + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "Version %s was released." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "Please download %s." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "the latest %s version here" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "New" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Seems like you got the latest release." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "You are all good!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Site successfully opted in." + +#: includes/class-freemius.php:17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Awesome" + +#: includes/class-freemius.php:17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "We appreciate your help in making the %s better by letting us track some usage data." + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "Thank you!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "We will no longer be sending any usage data of %s on %s to %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Thanks for confirming the ownership change. An email was just sent to %s for final approval." + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s is the new owner of the account." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Congrats" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Sorry, we could not complete the email update. Another user with the same email is already registered." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Change Ownership" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Please provide your full name." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Your name was successfully updated." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "You have successfully updated your %s." -# Copyright (C) 2016 freemius -# This file is distributed under the same license as the freemius package. -#: includes/i18n.php:41, includes/i18n.php:55 -msgid "Yes - I'm in!" -msgstr "Yes - I'm in!" +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Just letting you know that the add-ons information of %s is being pulled from an external server." -#: includes/i18n.php:43, includes/i18n.php:57 -msgid "Not today" -msgstr "Not today" +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Heads up" -#: includes/i18n.php:69 -msgid "Account" -msgstr "Account" +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Hey" -#: includes/i18n.php:71 -msgid "Add On" -msgstr "Add On" +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "How do you like %s so far? Test all our %s premium features with a %d-day free trial." -#: includes/i18n.php:73 -msgid "Contact Us" -msgstr "Contact Us" +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "No commitment for %s days - cancel anytime!" -#: includes/i18n.php:75 -msgid "Contact Support" -msgstr "Contact Support" +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "No credit card required" -#: includes/i18n.php:77 -msgid "Change Ownership" -msgstr "Change Ownership" +#: includes/class-freemius.php:18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Start free trial" -#: includes/i18n.php:79 -msgid "Support" -msgstr "Support" +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" -#: includes/i18n.php:81 -msgid "Support Forum" -msgstr "Support Forum" +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Learn more" -#: includes/i18n.php:83 -msgid "Add Ons" -msgstr "Add Ons" +#: includes/class-freemius.php:18963, templates/account.php:394, templates/account.php:497, templates/connect.php:169, templates/connect.php:408, templates/forms/license-activation.php:24, templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Activate License" -#: includes/i18n.php:85 -msgctxt "verb" -msgid "Upgrade" -msgstr "Upgrade" +#: includes/class-freemius.php:18964, templates/account.php:457, templates/account.php:496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Change License" -#: includes/i18n.php:87 -msgid "Awesome" -msgstr "Awesome" +#: includes/class-freemius.php:19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Opt Out" -#: includes/i18n.php:89 -msgctxt "noun" -msgid "Pricing" -msgstr "Pricing" +#: includes/class-freemius.php:19048, includes/class-freemius.php:19053, templates/account/partials/site.php:43, templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Opt In" -#: includes/i18n.php:91 -msgctxt "noun" -msgid "Price" -msgstr "Price" +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Please follow these steps to complete the upgrade" -#: includes/i18n.php:93 -msgid "Unlimited Updates" -msgstr "Unlimited Updates" +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Download the latest %s version" -#: includes/i18n.php:95 -msgctxt "verb" -msgid "Downgrade" -msgstr "Downgrade" +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Upload and activate the downloaded version" -#: includes/i18n.php:97 -msgid "Cancel Trial" -msgstr "Cancel Trial" +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "How to upload and activate?" -#: includes/i18n.php:99 -msgid "Free Trial" -msgstr "Free Trial" +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sClick here%s to choose the sites where you'd like to activate the license on." -#: includes/i18n.php:101 -msgid "Start my free %s" -msgstr "Start my free %s" +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "Auto installation only works for opted-in users." -#: includes/i18n.php:103 -msgid "No commitment for %s - cancel anytime" -msgstr "No commitment for %s - cancel anytime" +#: includes/class-freemius.php:19555, includes/class-freemius.php:19588, includes/class-fs-plugin-updater.php:713, includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "Invalid module ID." -#: includes/i18n.php:105 -msgid "After your free %s, pay as little as %s" -msgstr "After your free %s, pay as little as %s" +#: includes/class-freemius.php:19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Premium version already active." -#: includes/i18n.php:107 -msgid "Details" -msgstr "Details" +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "You do not have a valid license to access the premium version." -#: includes/i18n.php:109 -msgid "Account Details" -msgstr "Account Details" +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Plugin is a \"Serviceware\" which means it does not have a premium code version." -#: includes/i18n.php:111 -msgctxt "verb" -msgid "Delete" -msgstr "Delete" +#: includes/class-freemius.php:19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Premium add-on version already installed." -#: includes/i18n.php:113 -msgctxt "verb" -msgid "Show" -msgstr "Show" +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "View paid features" -#: includes/i18n.php:115 -msgctxt "verb" -msgid "Hide" -msgstr "Hide" +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Thank you so much for using %s and its add-ons!" -#: includes/i18n.php:117 -msgctxt "verb" -msgid "Edit" -msgstr "Edit" +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "Thank you so much for using %s!" -#: includes/i18n.php:119 -msgctxt "verb" -msgid "Update" -msgstr "Update" +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving the %s." -#: includes/i18n.php:121 -msgid "Date" -msgstr "Date" +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "Thank you so much for using our products!" -#: includes/i18n.php:123 -msgid "Amount" -msgstr "Amount" +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving them." -#: includes/i18n.php:125 -msgid "Invoice" -msgstr "Invoice" +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%s and its add-ons" -#: includes/i18n.php:127 -msgid "Billing" -msgstr "Billing" +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Products" -#: includes/i18n.php:129 -msgid "Payments" -msgstr "Payments" +#: includes/class-freemius.php:20298, templates/connect.php:259 +msgid "Yes" +msgstr "Yes" -#: includes/i18n.php:131 -msgid "Delete Account" -msgstr "Delete Account" +#: includes/class-freemius.php:20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "send me security & feature updates, educational content and offers." -#: includes/i18n.php:133 -msgctxt "as close a window" -msgid "Dismiss" -msgstr "Dismiss" +#: includes/class-freemius.php:20300, templates/connect.php:265 +msgid "No" +msgstr "No" -#: includes/i18n.php:135 -msgctxt "as product pricing plan" -msgid "Plan" -msgstr "Plan" +#: includes/class-freemius.php:20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "do %sNOT%s send me security & feature updates, educational content and offers." -#: includes/i18n.php:137 -msgid "Change Plan" -msgstr "Change Plan" +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" -#: includes/i18n.php:139 -msgctxt "as download professional version" -msgid "Download %s Version" -msgstr "Download %s Version" +#: includes/class-freemius.php:20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "License key is empty." + +#: includes/class-fs-plugin-updater.php:184, includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRenew your license now%s to access version %s security & feature updates, and support." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Installing plugin: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Unable to connect to the filesystem. Please confirm your credentials." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "The remote plugin package does not contain a folder with the desired slug and renaming did not work." + +#: includes/fs-plugin-info-dialog.php:336, templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Purchase" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Start my free %s" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Install Free Version Now" + +#: includes/fs-plugin-info-dialog.php:381, templates/auto-installation.php:111, templates/account/partials/addon.php:267, templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Install Now" -#: includes/i18n.php:141 -msgctxt "as download professional version now" -msgid "Download %s version now" -msgstr "Download %s version now" +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Download Latest Free Version" -#: includes/i18n.php:145 +#: includes/fs-plugin-info-dialog.php:393, templates/account.php:80, templates/account/partials/addon.php:21 msgctxt "as download latest version" msgid "Download Latest" msgstr "Download Latest" -#: includes/i18n.php:147 -msgctxt "E.g. you have a professional license." -msgid "You have a %s license." -msgstr "You have a %s license." +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Install Free Version Update Now" -#: includes/i18n.php:151 -msgid "New" -msgstr "New" +#: includes/fs-plugin-info-dialog.php:404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Install Update Now" -#: includes/i18n.php:153 -msgid "Free" -msgstr "Free" +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Newer Free Version (%s) Installed" -#: includes/i18n.php:155 -msgctxt "as trial plan" -msgid "Trial" -msgstr "Trial" +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Newer Version (%s) Installed" -#: includes/i18n.php:157 -msgctxt "as starting a trial plan" -msgid "Start Trial" -msgstr "Start Trial" +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "Latest Free Version Installed" -#: includes/i18n.php:159 -msgctxt "verb" -msgid "Purchase" -msgstr "Purchase" +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Latest Version Installed" -#: includes/i18n.php:161 -msgid "Purchase License" -msgstr "Purchase License" +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Description" -#: includes/i18n.php:163 -msgctxt "verb" -msgid "Buy" -msgstr "Buy" +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installation" -#: includes/i18n.php:165 -msgid "Buy License" -msgstr "Buy License" +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" -#: includes/i18n.php:167 -msgid "Single Site License" -msgstr "Single Site License" +#: includes/fs-plugin-info-dialog.php:583, templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Screenshots" -#: includes/i18n.php:169 -msgid "Unlimited Licenses" -msgstr "Unlimited Licenses" +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Changelog" -#: includes/i18n.php:171 -msgid "Up to %s Sites" -msgstr "Up to %s Sites" +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Reviews" -#: includes/i18n.php:173 -msgid "%sRenew your license now%s to access version %s features and support." -msgstr "%sRenew your license now%s to access version %s features and support." +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Other Notes" -#: includes/i18n.php:177 -msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." -msgstr "Enter the email address you've used for the upgrade below and we will resend you the license key." +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Features & Pricing" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Plugin Install" -#: includes/i18n.php:181 +#: includes/fs-plugin-info-dialog.php:683 msgctxt "e.g. Professional Plan" msgid "%s Plan" msgstr "%s Plan" -#: includes/i18n.php:183 -msgid "You are just one step away - %s" -msgstr "You are just one step away - %s" +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "Best" -#: includes/i18n.php:185 -msgctxt "%s - plugin name. As complete \"Jetpack\" activation now" -msgid "Complete \"%s\" Activation Now" -msgstr "Complete \"%s\" Activation Now" +#: includes/fs-plugin-info-dialog.php:715, includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Monthly" -#: includes/i18n.php:189 -msgid "We made a few tweaks to the plugin, %s" -msgstr "We made a few tweaks to the plugin, %s" +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Annual" -#: includes/i18n.php:191 -msgid "Opt-in to make \"%s\" Better!" -msgstr "Opt-in to make \"%s\" Better!" +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "Lifetime" -#: includes/i18n.php:193 -msgid "Error" -msgstr "Error" +#: includes/fs-plugin-info-dialog.php:735, includes/fs-plugin-info-dialog.php:737, includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "Billed %s" -#: includes/i18n.php:195 -msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." -msgstr "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Annually" -#: includes/i18n.php:203 -msgctxt "as expiration date" -msgid "Expiration" -msgstr "Expiration" +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Once" -#: includes/i18n.php:205 -msgctxt "as software license" -msgid "License" -msgstr "License" +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Single Site License" -#: includes/i18n.php:207 -msgid "not verified" -msgstr "not verified" +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Unlimited Licenses" -#: includes/i18n.php:209 -msgid "Verify Email" -msgstr "Verify Email" +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "Up to %s Sites" -#: includes/i18n.php:211 -msgctxt "e.g. expires in 2 months" -msgid "Expires in %s" -msgstr "Expires in %s" +#: includes/fs-plugin-info-dialog.php:759, templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "mo" -#: includes/i18n.php:213 -msgctxt "e.g. auto renews in 2 months" -msgid "Auto renews in %s" -msgstr "Auto renews in %s" +#: includes/fs-plugin-info-dialog.php:766, templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "year" -#: includes/i18n.php:215 -msgid "No expiration" -msgstr "No expiration" +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Price" -#: includes/i18n.php:217 -msgid "Expired" -msgstr "Expired" +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Save %s" -#: includes/i18n.php:219 -msgid "Cancelled" -msgstr "Cancelled" +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "No commitment for %s - cancel anytime" -#: includes/i18n.php:221 -msgctxt "e.g. In 2 hours" -msgid "In %s" -msgstr "In %s" +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "After your free %s, pay as little as %s" -#: includes/i18n.php:223 -msgctxt "e.g. 2 min ago" -msgid "%s ago" -msgstr "%s ago" +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Details" -#: includes/i18n.php:225 -msgctxt "as plugin version" +#: includes/fs-plugin-info-dialog.php:896, templates/account.php:87, templates/debug.php:191, templates/debug.php:228, templates/debug.php:442, templates/account/partials/addon.php:28 +msgctxt "product version" msgid "Version" msgstr "Version" -#: includes/i18n.php:227 -msgid "Name" -msgstr "Name" +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Author" -#: includes/i18n.php:229 -msgid "Email" -msgstr "Email" +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Last Updated" -#: includes/i18n.php:231 -msgid "Email address" -msgstr "Email address" +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "%s ago" -#: includes/i18n.php:233 -msgid "Verified" -msgstr "Verified" +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Requires WordPress Version" -#: includes/i18n.php:235 -msgid "Plugin" -msgstr "Plugin" +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s or higher" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatible up to" -#: includes/i18n.php:237 -msgid "Plugins" -msgstr "Plugins" +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Downloaded" -#: includes/i18n.php:239 -msgid "Themes" -msgstr "Themes" +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "%s time" -#: includes/i18n.php:241 -msgctxt "as file/folder path" -msgid "Path" -msgstr "Path" +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s times" -#: includes/i18n.php:243 -msgid "Title" -msgstr "Title" +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "WordPress.org Plugin Page" -#: includes/i18n.php:245 -msgid "Free version" -msgstr "Free version" +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Plugin Homepage" -#: includes/i18n.php:247 -msgid "Premium version" -msgstr "Premium version" +#: includes/fs-plugin-info-dialog.php:972, includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Donate to this plugin" -#: includes/i18n.php:249 -msgctxt "as WP plugin slug" -msgid "Slug" -msgstr "Slug" +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Average Rating" -#: includes/i18n.php:251 -msgid "ID" -msgstr "ID" +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "based on %s" -#: includes/i18n.php:253 -msgid "Users" -msgstr "Users" +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s rating" -#: includes/i18n.php:255 -msgid "Plugin Installs" -msgstr "Plugin Installs" +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s ratings" -#: includes/i18n.php:257 -msgctxt "like websites" -msgid "Sites" -msgstr "Sites" +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%s star" -#: includes/i18n.php:259 -msgid "User ID" -msgstr "User ID" +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s stars" -#: includes/i18n.php:261 -msgid "Site ID" -msgstr "Site ID" +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Click to see reviews that provided a rating of %s" -#: includes/i18n.php:263 -msgid "Public Key" -msgstr "Public Key" +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Contributors" -#: includes/i18n.php:265 -msgid "Secret Key" -msgstr "Secret Key" +#: includes/fs-plugin-info-dialog.php:1062, includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Warning" -#: includes/i18n.php:267 -msgctxt "as secret encryption key missing" -msgid "No Secret" -msgstr "No Secret" +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "This plugin has not been tested with your current version of WordPress." -#: includes/i18n.php:269 -msgid "No ID" -msgstr "No ID" +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "This plugin has not been marked as compatible with your version of WordPress." -#: includes/i18n.php:271 -msgctxt "as synchronize license" -msgid "Sync License" -msgstr "Sync License" +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Paid add-on must be deployed to Freemius." -#: includes/i18n.php:273 -msgctxt "as synchronize" -msgid "Sync" -msgstr "Sync" +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "Add-on must be deployed to WordPress.org or Freemius." -#: includes/i18n.php:275 -msgid "Activate License" -msgstr "Activate License" +#: templates/account.php:81, templates/account/partials/addon.php:22, templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." -#: includes/i18n.php:277 -msgid "Activate Free Version" -msgstr "Activate Free Version" +#: templates/account.php:82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "Cancelling the trial will immediately block access to all premium features. Are you sure?" -#: includes/i18n.php:279 -msgid "Please enter the license key that you received in the email right after the purchase:" -msgstr "Please enter the license key that you received in the email right after the purchase:" +#: templates/account.php:83, templates/account/partials/addon.php:24, templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "You can still enjoy all %s features but you will not have access to %s updates and support." -#: includes/i18n.php:283 -msgid "Activating license..." -msgstr "Activating license..." +#: templates/account.php:84, templates/account/partials/addon.php:25, templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Once your license expires you can still use the Free version but you will NOT have access to the %s features." -#: includes/i18n.php:285 -msgid "Change License" -msgstr "Change License" +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php:86, templates/account/partials/activate-license-button.php:31, templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Activate %s Plan" -#: includes/i18n.php:287 -msgid "Update License" -msgstr "Update License" +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php:89, templates/account/partials/addon.php:30, templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Auto renews in %s" -#: includes/i18n.php:289 -msgid "Deactivate License" -msgstr "Deactivate License" +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php:91, templates/account/partials/addon.php:32, templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Expires in %s" -#: includes/i18n.php:291 -msgid "Activate" -msgstr "Activate" +#: templates/account.php:92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Sync License" -#: includes/i18n.php:293 -msgid "Deactivate" -msgstr "Deactivate" +#: templates/account.php:93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Cancel Trial" -#: includes/i18n.php:295 -msgid "Skip & Deactivate" -msgstr "Skip & Deactivate" +#: templates/account.php:94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Change Plan" -#: includes/i18n.php:297 -msgid "No - just deactivate" -msgstr "No - just deactivate" +#: templates/account.php:95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Upgrade" -#: includes/i18n.php:299 -msgid "Yes - do your thing" -msgstr "Yes - do your thing" +#: templates/account.php:97, templates/account/partials/addon.php:38, templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Downgrade" -#: includes/i18n.php:301 -msgctxt "active mode" -msgid "Active" -msgstr "Active" +#: templates/account.php:99, templates/add-ons.php:126, templates/plugin-info/features.php:72, templates/account/partials/addon.php:40, templates/account/partials/site.php:31 +msgid "Free" +msgstr "Free" -#: includes/i18n.php:303 -msgctxt "is active mode?" -msgid "Is Active" -msgstr "Is Active" +#: templates/account.php:100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Activate" -#: includes/i18n.php:305 -msgid "Install Now" -msgstr "Install Now" +#: templates/account.php:101, templates/debug.php:361, includes/customizer/class-fs-customizer-upsell-control.php:106, templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Plan" -#: includes/i18n.php:307 -msgid "Install Update Now" -msgstr "Install Update Now" +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Free Trial" -#: includes/i18n.php:309 -msgid "More information about %s" -msgstr "More information about %s" +#: templates/account.php:165 +msgid "Account Details" +msgstr "Account Details" -#: includes/i18n.php:311 -msgid "Localhost" -msgstr "Localhost" +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" -#: includes/i18n.php:313 -msgctxt "as activate Professional plan" -msgid "Activate %s Plan" -msgstr "Activate %s Plan" +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" -#: includes/i18n.php:315 -msgctxt "as 5 licenses left" -msgid "%s left" -msgstr "%s left" +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Delete Account" -#: includes/i18n.php:317 -msgid "Last license" -msgstr "Last license" +#: templates/account.php:192, templates/account/partials/addon.php:155, templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Deactivate License" -#: includes/i18n.php:319 -msgid "What is your %s?" -msgstr "What is your %s?" +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "Are you sure you want to proceed?" -#: includes/i18n.php:321 -msgid "Activate this add-on" -msgstr "Activate this add-on" +#: templates/account.php:210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Cancel Subscription" -#: includes/i18n.php:323 -msgid "Deactivating your license will block all premium features, but will enable you to activate the license on another site. Are you sure you want to proceed?" -msgstr "Deactivating your license will block all premium features, but will enable you to activate the license on another site. Are you sure you want to proceed?" +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Sync" -#: includes/i18n.php:327 -msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" -msgstr "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +#: templates/account.php:253, templates/debug.php:477 +msgid "Name" +msgstr "Name" -#: includes/i18n.php:331 -msgid "Deletion is not temporary. Only delete if you no longer want to use this plugin anymore. Are you sure you would like to continue with the deletion?" -msgstr "Deletion is not temporary. Only delete if you no longer want to use this plugin anymore. Are you sure you would like to continue with the deletion?" +#: templates/account.php:259, templates/debug.php:478 +msgid "Email" +msgstr "Email" -#: includes/i18n.php:335 -msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." -msgstr "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +#: templates/account.php:266, templates/debug.php:360, templates/debug.php:516 +msgid "User ID" +msgstr "User ID" -#: includes/i18n.php:339 -msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" -msgstr "Cancelling the trial will immediately block access to all premium features. Are you sure?" +#: templates/account.php:274 +msgid "Site ID" +msgstr "Site ID" -#: includes/i18n.php:343 -msgid "You can still enjoy all %s features but you will not have access to plugin updates and support." -msgstr "You can still enjoy all %s features but you will not have access to plugin updates and support." +#: templates/account.php:277 +msgid "No ID" +msgstr "No ID" -#: includes/i18n.php:347 -msgid "Once your license expire you can still use the Free version but you will NOT have access to the %s features." -msgstr "Once your license expire you can still use the Free version but you will NOT have access to the %s features." +#: templates/account.php:282, templates/debug.php:233, templates/debug.php:362, templates/debug.php:443, templates/debug.php:480, templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Public Key" -#: includes/i18n.php:351 -msgid "Are you sure you want to proceed?" -msgstr "Are you sure you want to proceed?" +#: templates/account.php:288, templates/debug.php:363, templates/debug.php:444, templates/debug.php:481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Secret Key" -#: includes/i18n.php:357 -msgid "Add Ons for %s" -msgstr "Add Ons for %s" +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "No Secret" -#: includes/i18n.php:359 -msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." -msgstr "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +#: templates/account.php:310, templates/account/partials/site.php:112, templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Trial" -#: includes/i18n.php:365 -msgid "Anonymous feedback" -msgstr "Anonymous feedback" +#: templates/account.php:329, templates/debug.php:521, templates/account/partials/site.php:248 +msgid "License Key" +msgstr "License Key" -#: includes/i18n.php:367 -msgid "Quick feedback" -msgstr "Quick feedback" +#: templates/account.php:359 +msgid "not verified" +msgstr "not verified" -#: includes/i18n.php:369 -msgid "If you have a moment, please let us know why you are deactivating" -msgstr "If you have a moment, please let us know why you are deactivating" +#: templates/account.php:416 +msgid "Premium version" +msgstr "Premium version" -#: includes/i18n.php:373 -msgid "Yes - Deactivate" -msgstr "Yes - Deactivate" +#: templates/account.php:418 +msgid "Free version" +msgstr "Free version" -#: includes/i18n.php:375 -msgid "Submit & Deactivate" -msgstr "Submit & Deactivate" +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Verify Email" -#: includes/i18n.php:377 -msgid "Cancel" -msgstr "Cancel" +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Download %s Version" -#: includes/i18n.php:379 -msgid "I no longer need the plugin" -msgstr "I no longer need the plugin" +#: templates/account.php:455, templates/account.php:636, templates/account/partials/site.php:237, templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Show" -#: includes/i18n.php:381 -msgid "I found a better plugin" -msgstr "I found a better plugin" +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "What is your %s?" -#: includes/i18n.php:383 -msgid "I only needed the plugin for a short period" -msgstr "I only needed the plugin for a short period" +#: templates/account.php:477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Edit" -#: includes/i18n.php:385 -msgid "The plugin broke my site" -msgstr "The plugin broke my site" +#: templates/account.php:490 +msgid "Sites" +msgstr "Sites" -#: includes/i18n.php:387 -msgid "The plugin suddenly stopped working" -msgstr "The plugin suddenly stopped working" +#: templates/account.php:501 +msgid "Search by address" +msgstr "Search by address" -#: includes/i18n.php:389 -msgid "I can't pay for it anymore" -msgstr "I can't pay for it anymore" +#: templates/account.php:510, templates/account.php:558, templates/debug.php:226, templates/debug.php:354, templates/debug.php:439, templates/debug.php:476, templates/debug.php:514, templates/debug.php:587, templates/account/payments.php:35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" -#: includes/i18n.php:391 -msgid "It's a temporary deactivation. I'm just debugging an issue." -msgstr "It's a temporary deactivation. I'm just debugging an issue." +#: templates/account.php:511, templates/debug.php:357 +msgid "Address" +msgstr "Address" -#: includes/i18n.php:395 -msgctxt "the text of the \"other\" reason for deactivating the plugin that is shown in the modal box." -msgid "Other" -msgstr "Other" +#: templates/account.php:512 +msgid "License" +msgstr "License" -#: includes/i18n.php:399 -msgid "Kindly tell us the reason so we can improve." -msgstr "Kindly tell us the reason so we can improve." +#: templates/account.php:513 +msgid "Plan" +msgstr "Plan" -#: includes/i18n.php:401 -msgid "What's the plugin's name?" -msgstr "What's the plugin's name?" +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "License" -#: includes/i18n.php:403 -msgid "What price would you feel comfortable paying?" -msgstr "What price would you feel comfortable paying?" +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Hide" -#: includes/i18n.php:405 -msgid "I couldn't understand how to make it work" -msgstr "I couldn't understand how to make it work" +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" -#: includes/i18n.php:407 -msgid "The plugin is great, but I need specific feature that you don't support" -msgstr "The plugin is great, but I need specific feature that you don't support" +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Add Ons for %s" -#: includes/i18n.php:411 -msgid "The plugin is not working" -msgstr "The plugin is not working" +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." -#: includes/i18n.php:413 -msgid "It's not what I was looking for" -msgstr "It's not what I was looking for" +#: templates/add-ons.php:135 +msgid "View details" +msgstr "View details" -#: includes/i18n.php:415 -msgid "The plugin didn't work as expected" -msgstr "The plugin didn't work as expected" +#: templates/admin-notice.php:13, templates/forms/license-activation.php:208, templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Dismiss" -#: includes/i18n.php:417 -msgid "What feature?" -msgstr "What feature?" +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s sec" -#: includes/i18n.php:419 -msgid "Kindly share what didn't work so we can fix it for future users..." -msgstr "Kindly share what didn't work so we can fix it for future users..." +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Automatic Installation" -#: includes/i18n.php:423 -msgid "What you've been looking for?" -msgstr "What you've been looking for?" +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." -#: includes/i18n.php:425 -msgid "What did you expect?" -msgstr "What did you expect?" +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." -#: includes/i18n.php:427 -msgid "The plugin didn't work" -msgstr "The plugin didn't work" +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Cancel Installation" -#: includes/i18n.php:429 -msgid "I don't like to share my information with you" -msgstr "I don't like to share my information with you" +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Checkout" -#: includes/i18n.php:431 -msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." -msgstr "You might have missed it, but you don't have to share any data and can just %s the opt-in." +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "PCI compliant" -#: includes/i18n.php:441 +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 msgctxt "greeting" msgid "Hey %s," msgstr "Hey %s," -#: includes/i18n.php:443 -msgctxt "a greeting. E.g. Thanks John!" +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Allow & Continue" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Re-send activation email" + +#: templates/connect.php:160 msgid "Thanks %s!" msgstr "Thanks %s!" -#: includes/i18n.php:445 -msgid "Never miss an important update - opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." -msgstr "Never miss an important update - opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +#: templates/connect.php:170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "Agree & Activate License" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Thanks for purchasing %s! To get started, please enter your license key:" -#: includes/i18n.php:449 -msgid "Please help us improve %1$s! If you opt-in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that's okay! %1$s will still work just fine." -msgstr "Please help us improve %1$s! If you opt-in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that's okay! %1$s will still work just fine." +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." -#: includes/i18n.php:453 -msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." -msgstr "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." -#: includes/i18n.php:455 -msgid "complete the install" -msgstr "complete the install" +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "We're excited to introduce the Freemius network-level integration." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "During the update process we detected %d site(s) that are still pending license activation." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%s's paid features" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "During the update process we detected %s site(s) in the network that are still pending your attention." + +#: templates/connect.php:251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "License key" -#: includes/i18n.php:457 -msgid "start the trial" -msgstr "start the trial" +#: templates/connect.php:254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "Can't find your license key?" -#: includes/i18n.php:459 -msgid "Thanks for purchasing %s! To get started, please enter your license key:" -msgstr "Thanks for purchasing %s! To get started, please enter your license key:" +#: templates/connect.php:302, templates/connect.php:617, templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Skip" -#: includes/i18n.php:463 -msgid "The plugin will be periodically sending data to %s to check for plugin updates and verify the validity of your license." -msgstr "The plugin will be periodically sending data to %s to check for plugin updates and verify the validity of your license." +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Delegate to Site Admins" -#: includes/i18n.php:467 -msgid "What permissions are being granted?" -msgstr "What permissions are being granted?" +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "If you click it, this decision will be delegated to the sites administrators." -#: includes/i18n.php:469 +#: templates/connect.php:333 msgid "Your Profile Overview" msgstr "Your Profile Overview" -#: includes/i18n.php:471 +#: templates/connect.php:334 msgid "Name and email address" msgstr "Name and email address" -#: includes/i18n.php:473 +#: templates/connect.php:339 msgid "Your Site Overview" msgstr "Your Site Overview" -#: includes/i18n.php:475 +#: templates/connect.php:340 msgid "Site URL, WP version, PHP info, plugins & themes" msgstr "Site URL, WP version, PHP info, plugins & themes" -#: includes/i18n.php:479 -msgid "Current Plugin Events" -msgstr "Current Plugin Events" +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Admin Notices" + +#: templates/connect.php:346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Updates, announcements, marketing, no spam" -#: includes/i18n.php:481 +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Current %s Events" + +#: templates/connect.php:352 msgid "Activation, deactivation and uninstall" msgstr "Activation, deactivation and uninstall" -#: includes/i18n.php:483 -msgid "Plugins & Themes" -msgstr "Plugins & Themes" +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Newsletter" -#: includes/i18n.php:485 -msgid "Titles, versions and state." -msgstr "Titles, versions and state." +#: templates/connect.php:378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." -#: includes/i18n.php:487 -msgid "Admin Notices" -msgstr "Admin Notices" +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "What permissions are being granted?" -#: includes/i18n.php:489 -msgid "Newsletter" -msgstr "Newsletter" +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "Don't have a license key?" -#: includes/i18n.php:491 -msgid "Updates, announcements, marketing, no spam" -msgstr "Updates, announcements, marketing, no spam" +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Activate Free Version" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "Have a license key?" -#: includes/i18n.php:493 +#: templates/connect.php:415 msgid "Privacy Policy" msgstr "Privacy Policy" -#: includes/i18n.php:495 +#: templates/connect.php:417 msgid "Terms of Service" msgstr "Terms of Service" -#: includes/i18n.php:497 -msgctxt "as activating plugin" -msgid "Activating" -msgstr "Activating" - -#: includes/i18n.php:499 +#: templates/connect.php:750 msgctxt "as in the process of sending an email" msgid "Sending email" msgstr "Sending email" -#: includes/i18n.php:503 -msgctxt "button label" -msgid "Allow & Continue" -msgstr "Allow & Continue" - -#: includes/i18n.php:505 -msgctxt "button label" -msgid "Agree & Activate License" -msgstr "Agree & Activate License" - -#: includes/i18n.php:507 -msgctxt "verb" -msgid "Skip" -msgstr "Skip" +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Activating" -#: includes/i18n.php:509 -msgid "Click here to use the plugin anonymously" -msgstr "Click here to use the plugin anonymously" +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contact" -#: includes/i18n.php:511 -msgid "Re-send activation email" -msgstr "Re-send activation email" +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Off" -#: includes/i18n.php:513 -msgid "License key" -msgstr "License key" +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "On" -#: includes/i18n.php:515 -msgid "Send License Key" -msgstr "Send License Key" +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" -#: includes/i18n.php:517 -msgid "Sending license key" -msgstr "Sending license key" +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Debugging" -#: includes/i18n.php:519 -msgid "Have a license key?" -msgstr "Have a license key?" +#: templates/debug.php:54, templates/debug.php:238, templates/debug.php:364, templates/debug.php:482 +msgid "Actions" +msgstr "Actions" -#: includes/i18n.php:521 -msgid "Don't have a license key?" -msgstr "Don't have a license key?" +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Are you sure you want to delete all Freemius data?" -#: includes/i18n.php:523 -msgid "Can't find your license key?" -msgstr "Can't find your license key?" +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Delete All Accounts" -#: includes/i18n.php:525 -msgid "We couldn't find your email address in the system, are you sure it's the right address?" -msgstr "We couldn't find your email address in the system, are you sure it's the right address?" +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "Clear API Cache" -#: includes/i18n.php:529 -msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" -msgstr "We can't see any active licenses associated with that email address, are you sure it's the right address?" +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Clear Updates Transients" -#: includes/i18n.php:533 -msgid "Opt In" -msgstr "Opt In" +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Sync Data From Server" -#: includes/i18n.php:535 -msgid "Opt Out" -msgstr "Opt Out" +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Load DB Option" -#: includes/i18n.php:537 -msgid "On second thought - I want to continue helping" -msgstr "On second thought - I want to continue helping" +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Set DB Option" -#: includes/i18n.php:541 -msgid "Opting out..." -msgstr "Opting out..." +#: templates/debug.php:170 +msgid "Key" +msgstr "Key" -#: includes/i18n.php:543 -msgid "Opting in..." -msgstr "Opting in..." +#: templates/debug.php:171 +msgid "Value" +msgstr "Value" -#: includes/i18n.php:545 -msgid "We appreciate your help in making the %s better by letting us track some usage data." -msgstr "We appreciate your help in making the %s better by letting us track some usage data." +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "SDK Versions" -#: includes/i18n.php:549 -msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." -msgstr "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "SDK Path" -#: includes/i18n.php:553 -msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." -msgstr "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +#: templates/debug.php:193, templates/debug.php:232 +msgid "Module Path" +msgstr "Module Path" -#: includes/i18n.php:563 -msgid "Screenshots" -msgstr "Screenshots" +#: templates/debug.php:194 +msgid "Is Active" +msgstr "Is Active" -#: includes/i18n.php:565 -msgid "Click to view full-size screenshot %d" -msgstr "Click to view full-size screenshot %d" +#: templates/debug.php:222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Plugins" -#: includes/i18n.php:573 -msgid "Freemius Debug" -msgstr "Freemius Debug" +#: templates/debug.php:222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Themes" -#: includes/i18n.php:575 -msgctxt "as turned on" -msgid "On" -msgstr "On" +#: templates/debug.php:227, templates/debug.php:359, templates/debug.php:441, templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Slug" -#: includes/i18n.php:577 -msgctxt "as turned off" -msgid "Off" -msgstr "Off" +#: templates/debug.php:229, templates/debug.php:440 +msgid "Title" +msgstr "Title" -#: includes/i18n.php:579 -msgctxt "as code debugging" -msgid "Debugging" -msgstr "Debugging" +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" -#: includes/i18n.php:581 +#: templates/debug.php:231 msgid "Freemius State" msgstr "Freemius State" -#: includes/i18n.php:583 +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Network Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Network User" + +#: templates/debug.php:273 msgctxt "as connection was successful" msgid "Connected" msgstr "Connected" -#: includes/i18n.php:585 +#: templates/debug.php:274 msgctxt "as connection blocked" msgid "Blocked" msgstr "Blocked" -#: includes/i18n.php:587 -msgctxt "as application program interface" -msgid "API" -msgstr "API" +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simulate Trial" -#: includes/i18n.php:589 -msgctxt "as software development kit versions" -msgid "SDK" -msgstr "SDK" +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simulate Network Upgrade" -#: includes/i18n.php:591 -msgctxt "as software development kit versions" -msgid "SDK Versions" -msgstr "SDK Versions" +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s Installs" -#: includes/i18n.php:595 -msgctxt "as plugin folder path" -msgid "Plugin Path" -msgstr "Plugin Path" +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Sites" -#: includes/i18n.php:597 -msgctxt "as sdk path" -msgid "SDK Path" -msgstr "SDK Path" +#: templates/debug.php:356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "Blog ID" -#: includes/i18n.php:599 -msgid "Add Ons of Plugin %s" -msgstr "Add Ons of Plugin %s" +#: templates/debug.php:421, templates/debug.php:499, templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Delete" -#: includes/i18n.php:601 -msgid "Are you sure you want to delete all Freemius data?" -msgstr "Are you sure you want to delete all Freemius data?" +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Add Ons of module %s" -#: includes/i18n.php:605 -msgid "Actions" -msgstr "Actions" +#: templates/debug.php:472 +msgid "Users" +msgstr "Users" -#: includes/i18n.php:607 -msgid "Delete All Accounts" -msgstr "Delete All Accounts" +#: templates/debug.php:479 +msgid "Verified" +msgstr "Verified" -#: includes/i18n.php:609 -msgid "Start Fresh" -msgstr "Start Fresh" +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licenses" -#: includes/i18n.php:611 -msgid "Clear API Cache" -msgstr "Clear API Cache" +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "Plugin ID" -#: includes/i18n.php:613 -msgid "Sync Data From Server" -msgstr "Sync Data From Server" +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "Plan ID" -#: includes/i18n.php:615 -msgid "Scheduled Crons" -msgstr "Scheduled Crons" +#: templates/debug.php:518 +msgid "Quota" +msgstr "Quota" -#: includes/i18n.php:617 -msgid "Plugins & Themes Sync" -msgstr "Plugins & Themes Sync" +#: templates/debug.php:519 +msgid "Activated" +msgstr "Activated" -#: includes/i18n.php:625 -msgctxt "as congratulations" -msgid "Congrats" -msgstr "Congrats" +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Blocking" -#: includes/i18n.php:627 -msgctxt "exclamation" -msgid "Oops" -msgstr "Oops" +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Expiration" -#: includes/i18n.php:629 -msgctxt "interjection expressing joy or exuberance" -msgid "Yee-haw" -msgstr "Yee-haw" +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Debug Log" -#: includes/i18n.php:633 -msgctxt "(especially in electronic communication) used to express elation, enthusiasm, or triumph." -msgid "W00t" -msgstr "W00t" +#: templates/debug.php:549 +msgid "All Types" +msgstr "All Types" -#: includes/i18n.php:637 -msgctxt "a positive response" -msgid "Right on" -msgstr "Right on" +#: templates/debug.php:556 +msgid "All Requests" +msgstr "All Requests" -#: includes/i18n.php:639 -msgctxt "something somebody says when they are thinking about what you have just said. " -msgid "Hmm" -msgstr "Hmm" +#: templates/debug.php:561, templates/debug.php:590, templates/debug/logger.php:25 +msgid "File" +msgstr "File" -#: includes/i18n.php:643 -msgid "O.K" -msgstr "O.K" +#: templates/debug.php:562, templates/debug.php:588, templates/debug/logger.php:23 +msgid "Function" +msgstr "Function" -#: includes/i18n.php:645 -msgctxt "exclamation" -msgid "Hey" -msgstr "Hey" +#: templates/debug.php:563 +msgid "Process ID" +msgstr "Process ID" -#: includes/i18n.php:647 -msgctxt "advance notice of something that will need attention." -msgid "Heads up" -msgstr "Heads up" +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" -#: includes/i18n.php:657 -msgid "Seems like you got the latest release." -msgstr "Seems like you got the latest release." +#: templates/debug.php:565, templates/debug.php:589, templates/debug/logger.php:24 +msgid "Message" +msgstr "Message" -#: includes/i18n.php:659 -msgid "You are all good!" -msgstr "You are all good!" +#: templates/debug.php:567 +msgid "Filter" +msgstr "Filter" -#: includes/i18n.php:661 -msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." -msgstr "Sorry, we could not complete the email update. Another user with the same email is already registered." +#: templates/debug.php:575 +msgid "Download" +msgstr "Download" -#: includes/i18n.php:665 -msgid "If you would like to give up the ownership of the plugin's account to %s click the Change Ownership button." -msgstr "If you would like to give up the ownership of the plugin's account to %s click the Change Ownership button." +#: templates/debug.php:586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Type" -#: includes/i18n.php:669 -msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." -msgstr "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +#: templates/debug.php:591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Timestamp" -#: includes/i18n.php:673 -msgid "Your name was successfully updated." -msgstr "Your name was successfully updated." +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Secure HTTPS %s page, running from an external domain" -#: includes/i18n.php:675 -msgid "You have successfully updated your %s." -msgstr "You have successfully updated your %s." +#: includes/customizer/class-fs-customizer-support-section.php:55, templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Support" -#: includes/i18n.php:677 -msgid "Please provide your full name." -msgstr "Please provide your full name." +#: includes/debug/class-fs-debug-bar-panel.php:48, templates/debug/api-calls.php:54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" -#: includes/i18n.php:679 -msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." -msgstr "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Requests" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Update" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Billing" + +#: templates/account/billing.php:44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Business name" + +#: templates/account/billing.php:45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "Tax / VAT ID" + +#: templates/account/billing.php:48, templates/account/billing.php:48, templates/account/billing.php:49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Address Line %d" + +#: templates/account/billing.php:52, templates/account/billing.php:52 +msgid "City" +msgstr "City" + +#: templates/account/billing.php:52, templates/account/billing.php:52 +msgid "Town" +msgstr "Town" + +#: templates/account/billing.php:53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "ZIP / Postal Code" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "Country" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Select Country" + +#: templates/account/billing.php:317, templates/account/billing.php:318 +msgid "State" +msgstr "State" + +#: templates/account/billing.php:317, templates/account/billing.php:318 +msgid "Province" +msgstr "Province" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Payments" -#: includes/i18n.php:683 -msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." -msgstr "Just letting you know that the add-ons information of %s is being pulled from an external server." +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Date" -#: includes/i18n.php:687 -msgid "No credit card required" -msgstr "No credit card required" +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Amount" -#: includes/i18n.php:689 -msgid "Premium plugin version was successfully activated." -msgstr "Premium plugin version was successfully activated." +#: templates/account/payments.php:38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Invoice" -#: includes/i18n.php:693 -msgid "The upgrade of %s was successfully completed." -msgstr "The upgrade of %s was successfully completed." +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" -#: includes/i18n.php:695 -msgid "Your account was successfully activated with the %s plan." -msgstr "Your account was successfully activated with the %s plan." +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Method" -#: includes/i18n.php:699 -msgid "Download the latest %s version now" -msgstr "Download the latest %s version now" +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Code" -#: includes/i18n.php:701 -msgid "Please follow these steps to complete the upgrade" -msgstr "Please follow these steps to complete the upgrade" +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Length" -#: includes/i18n.php:705 -msgid "Download the latest %s version" -msgstr "Download the latest %s version" +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Path" -#: includes/i18n.php:707 -msgid "Download the latest version" -msgstr "Download the latest version" +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Body" -#: includes/i18n.php:709 -msgid "Deactivate the free version" -msgstr "Deactivate the free version" +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Result" -#: includes/i18n.php:711 -msgid "Upload and activate the downloaded version" -msgstr "Upload and activate the downloaded version" +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Start" -#: includes/i18n.php:713 -msgid "How to upload and activate?" -msgstr "How to upload and activate?" +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "End" -#: includes/i18n.php:715 -msgctxt "%s - product name, e.g. Facebook add-on was successfully..." -msgid "%s Add-on was successfully purchased." -msgstr "%s Add-on was successfully purchased." +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" -#: includes/i18n.php:719 -msgid "Your %s Add-on plan was successfully upgraded." -msgstr "Your %s Add-on plan was successfully upgraded." +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php:18, templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "In %s" -#: includes/i18n.php:723 -msgid "Your email has been successfully verified - you are AWESOME!" -msgstr "Your email has been successfully verified - you are AWESOME!" +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php:20, templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "%s ago" -#: includes/i18n.php:727 -msgid "Your plan was successfully upgraded." -msgstr "Your plan was successfully upgraded." +#: templates/debug/plugins-themes-sync.php:21, templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "sec" -#: includes/i18n.php:729 -msgid "Your plan was successfully changed to %s." -msgstr "Your plan was successfully changed to %s." +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Plugins & Themes Sync" -#: includes/i18n.php:731 -msgid "Your license has expired. You can still continue using the free plugin forever." -msgstr "Your license has expired. You can still continue using the free plugin forever." +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Total" -#: includes/i18n.php:735 -msgid "Your license has been cancelled. If you think it's a mistake, please contact support." -msgstr "Your license has been cancelled. If you think it's a mistake, please contact support." +#: templates/debug/plugins-themes-sync.php:29, templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Last" -#: includes/i18n.php:739 -msgid "Your trial has been successfully started." -msgstr "Your trial has been successfully started." +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Scheduled Crons" -#: includes/i18n.php:741 -msgid "Your license was successfully activated." -msgstr "Your license was successfully activated." +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Module" -#: includes/i18n.php:743 -msgid "It looks like your site currently doesn't have an active license." -msgstr "It looks like your site currently doesn't have an active license." +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Module Type" -#: includes/i18n.php:747 -msgid "Your license was successfully deactivated, you are back to the %s plan." -msgstr "Your license was successfully deactivated, you are back to the %s plan." +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Cron Type" -#: includes/i18n.php:751 -msgid "It looks like the license deactivation failed." -msgstr "It looks like the license deactivation failed." +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Next" -#: includes/i18n.php:755 -msgid "It looks like the license could not be activated." -msgstr "It looks like the license could not be activated." +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Non-expiring" -#: includes/i18n.php:759 -msgid "Error received from the server:" -msgstr "Error received from the server:" +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Apply to become an affiliate" -#: includes/i18n.php:761 -msgid "Your trial has expired. You can still continue using all our free features." -msgstr "Your trial has expired. You can still continue using all our free features." +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." -#: includes/i18n.php:765 -msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." -msgstr "Your plan was successfully downgraded. Your %s plan license will expire in %s." +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." -#: includes/i18n.php:769 -msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." -msgstr "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Your affiliation account was temporarily suspended." -#: includes/i18n.php:773 -msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" -msgstr "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." -#: includes/i18n.php:777 -msgid "Your %s free trial was successfully cancelled." -msgstr "Your %s free trial was successfully cancelled." +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." -#: includes/i18n.php:781 -msgctxt "%s - numeric version number" -msgid "Version %s was released." -msgstr "Version %s was released." +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Like the %s? Become our ambassador and earn cash ;-)" -#: includes/i18n.php:785 -msgid "Please download %s." -msgstr "Please download %s." +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Refer new customers to our %s and earn %s commission on each successful sale you refer!" -#: includes/i18n.php:787 -msgctxt "%s - plan name, as the latest professional version here" -msgid "the latest %s version here" -msgstr "the latest %s version here" +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Program Summary" -#: includes/i18n.php:791 -msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." -msgstr "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%s commission when a customer purchases a new license." -#: includes/i18n.php:795 -msgctxt "call to action" -msgid "Start free trial" -msgstr "Start free trial" +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Get commission for automated subscription renewals." -#: includes/i18n.php:797 -msgid "Starting trial" -msgstr "Starting trial" +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s tracking cookie after the first visit to maximize earnings potential." -#: includes/i18n.php:799 -msgid "Please wait" -msgstr "Please wait" +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Unlimited commissions." -#: includes/i18n.php:801 -msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." -msgstr "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%s minimum payout amount." -#: includes/i18n.php:805 -msgid "You already utilized a trial before." -msgstr "You already utilized a trial before." +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Payouts are in USD and processed monthly via PayPal." -#: includes/i18n.php:807 -msgid "You are already running the plugin in a trial mode." -msgstr "You are already running the plugin in a trial mode." +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." -#: includes/i18n.php:811 -msgid "Plan %s do not exist, therefore, can't start a trial." -msgstr "Plan %s do not exist, therefore, can't start a trial." +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Affiliate" -#: includes/i18n.php:815 -msgid "Plan %s does not support a trial period." -msgstr "Plan %s does not support a trial period." +#: templates/forms/affiliation.php:165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "Email address" -#: includes/i18n.php:817 -msgid "None of the plugin's plans supports a trial period." -msgstr "None of the plugin's plans supports a trial period." +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Full name" -#: includes/i18n.php:821 -msgid "Unexpected API error. Please contact the plugin's author with the following error." -msgstr "Unexpected API error. Please contact the plugin's author with the following error." +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "PayPal account email address" -#: includes/i18n.php:825 -msgid "No commitment for %s days - cancel anytime!" -msgstr "No commitment for %s days - cancel anytime!" +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Where are you going to promote the %s?" -#: includes/i18n.php:827 -msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." -msgstr "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Enter the domain of your website or other websites from where you plan to promote the %s." -#: includes/i18n.php:831 -msgid "Couldn't activate %s." -msgstr "Couldn't activate %s." +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Add another domain" -#: includes/i18n.php:833 -msgid "Please contact us with the following message:" -msgstr "Please contact us with the following message:" +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Extra Domains" -#: includes/i18n.php:835 -msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." -msgstr "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Extra domains where you will be marketing the product from." -#: includes/i18n.php:839 -msgid "Please contact us here" -msgstr "Please contact us here" +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Promotion methods" -#: includes/i18n.php:841 -msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." -msgstr "I have upgraded my account but when I try to Sync the License, the plan remains %s." +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Social media (Facebook, Twitter, etc.)" -#: includes/i18n.php:849 -msgid "From unknown reason, the API connectivity test failed." -msgstr "From unknown reason, the API connectivity test failed." +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Mobile apps" -#: includes/i18n.php:853 -msgid "It's probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?" -msgstr "It's probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?" +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Website, email, and social media statistics (optional)" -#: includes/i18n.php:857 -msgid "We use PHP cURL library for the API calls, which is a very common library and usually installed out of the box. Unfortunately, cURL is not installed on your server." -msgstr "We use PHP cURL library for the API calls, which is a very common library and usually installed out of the box. Unfortunately, cURL is not installed on your server." +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." -#: includes/i18n.php:861 -msgid "From unknown reason, CloudFlare, the firewall we use, blocks the connection." -msgstr "From unknown reason, CloudFlare, the firewall we use, blocks the connection." +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "How will you promote us?" -#: includes/i18n.php:865 -msgctxt "as pluginX requires an access to our API" -msgid "%s requires an access to our API." -msgstr "%s requires an access to our API." +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Please provide details on how you intend to promote %s (please be as specific as possible)." -#: includes/i18n.php:869 -msgid "It looks like your server is using Squid ACL (access control lists), which blocks the connection." -msgstr "It looks like your server is using Squid ACL (access control lists), which blocks the connection." +#: templates/forms/affiliation.php:223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Cancel" -#: includes/i18n.php:873 -msgid "I don't know what is Squid or ACL, help me!" -msgstr "I don't know what is Squid or ACL, help me!" +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Become an affiliate" -#: includes/i18n.php:875, includes/i18n.php:889 -msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." -msgstr "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Please enter the license key that you received in the email right after the purchase:" -#: includes/i18n.php:879 -msgid "I'm a system administrator" -msgstr "I'm a system administrator" +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Update License" -#: includes/i18n.php:881 -msgid "Great, please whitelist the following domains: %s. Once you done, deactivate the plugin and activate it again." -msgstr "Great, please whitelist the following domains: %s. Once you done, deactivate the plugin and activate it again." +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Opt Out" -#: includes/i18n.php:885 -msgid "I don't know what is cURL or how to install it, help me!" -msgstr "I don't know what is cURL or how to install it, help me!" +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Opt In" -#: includes/i18n.php:893 -msgid "Great, please install cURL and enable it in your php.ini file. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the plugin and reactivate it back again." -msgstr "Great, please install cURL and enable it in your php.ini file. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the plugin and reactivate it back again." +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." -#: includes/i18n.php:897 -msgid "We are sure it's an issue on our side and more than happy to resolve it for you ASAP if you give us a chance." -msgstr "We are sure it's an issue on our side and more than happy to resolve it for you ASAP if you give us a chance." +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." -#: includes/i18n.php:901 -msgid "Sorry for the inconvenience and we are here to help if you give us a chance." -msgstr "Sorry for the inconvenience and we are here to help if you give us a chance." +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "There is a new version of %s available." -#: includes/i18n.php:905 -msgid "Yes - I'm giving you a chance to fix it" -msgstr "Yes - I'm giving you a chance to fix it" +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr " %sRenew your license now%s to access version %s security & feature updates, and support." -#: includes/i18n.php:907 -msgid "We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update." -msgstr "We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update." +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "New Version Available" -#: includes/i18n.php:911 -msgid "Let's try your previous version" -msgstr "Let's try your previous version" +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Renew license" -#: includes/i18n.php:913 -msgid "Uninstall this version and install the previous one." -msgstr "Uninstall this version and install the previous one." +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Dismiss" -#: includes/i18n.php:917 -msgid "That's exhausting, please deactivate" -msgstr "That's exhausting, please deactivate" +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Send License Key" -#: includes/i18n.php:919 -msgid "We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future." -msgstr "We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future." +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Enter the email address you've used for the upgrade below and we will resend you the license key." -#: includes/i18n.php:923 -msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." -msgstr "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." -#: includes/i18n.php:927 -msgctxt "%1s - plugin title, %2s - API domain" -msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" -msgstr "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." -#: includes/i18n.php:931 -msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." -msgstr "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" -#: includes/i18n.php:939 -msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." -msgstr "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Activate license on all sites in the network." -#: includes/i18n.php:943 -msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." -msgstr "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Apply on all sites in the network." -#: includes/i18n.php:947 -msgid "%s is the new owner of the account." -msgstr "%s is the new owner of the account." +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Activate license on all pending sites." -#: includes/i18n.php:951 -msgctxt "addonX cannot run without pluginY" -msgid "%s cannot run without %s." -msgstr "%s cannot run without %s." +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Apply on all pending sites." -#: includes/i18n.php:955 -msgctxt "addonX cannot run..." -msgid "%s cannot run without the plugin." -msgstr "%s cannot run without the plugin." +#: templates/partials/network-activation.php:36, templates/partials/network-activation.php:68 +msgid "allow" +msgstr "allow" -#: includes/i18n.php:959 -msgctxt "pluginX activation was successfully..." -msgid "%s activation was successfully completed." -msgstr "%s activation was successfully completed." +#: templates/partials/network-activation.php:38, templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "delegate" -#: includes/i18n.php:963 -msgctxt "Plugin installer section title" -msgid "Features & Pricing" -msgstr "Features & Pricing" +#: templates/partials/network-activation.php:41, templates/partials/network-activation.php:73 +msgid "skip" +msgstr "skip" -#: includes/i18n.php:967 -msgid "Add-on must be deployed to WordPress.org or Freemius." -msgstr "Add-on must be deployed to WordPress.org or Freemius." +#: templates/plugin-info/description.php:72, templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Click to view full-size screenshot %d" -#: includes/i18n.php:971 -msgid "Paid add-on must be deployed to Freemius." -msgstr "Paid add-on must be deployed to Freemius." +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Unlimited Updates" -#: includes/i18n.php:979 -msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." -msgstr "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Localhost" -#: includes/i18n.php:983 -msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." -msgstr "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "%s left" -#: includes/i18n.php:995 -msgctxt "as every month" -msgid "Monthly" -msgstr "Monthly" +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Last license" -#: includes/i18n.php:997 -msgctxt "as monthly period" -msgid "mo" -msgstr "mo" +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Cancelled" -#: includes/i18n.php:999 -msgctxt "as once a year" -msgid "Annual" -msgstr "Annual" +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Expired" -#: includes/i18n.php:1001 -msgctxt "as once a year" -msgid "Annually" -msgstr "Annually" +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "No expiration" -#: includes/i18n.php:1003 -msgctxt "as once a year" -msgid "Once" -msgstr "Once" +#: templates/account/partials/addon.php:259, templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Activate this add-on" -#: includes/i18n.php:1005 -msgctxt "as annual period" -msgid "year" -msgstr "year" +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Owner Name" -#: includes/i18n.php:1007 -msgid "Lifetime" -msgstr "Lifetime" +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "Owner Email" -#: includes/i18n.php:1009 -msgctxt "e.g. the best product" -msgid "Best" -msgstr "Best" +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "Owner ID" -#: includes/i18n.php:1011 -msgctxt "e.g. billed monthly" -msgid "Billed %s" -msgstr "Billed %s" +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Subscription" -#: includes/i18n.php:1013 -msgctxt "as a discount of $5 or 10%" -msgid "Save %s" -msgstr "Save %s" +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Sorry for the inconvenience and we are here to help if you give us a chance." -#: includes/i18n.php:1017 -msgid "View details" -msgstr "View details" +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Contact Support" -#: includes/i18n.php:1025 -msgctxt "button label" -msgid "Approve & Start Trial" -msgstr "Approve & Start Trial" +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Anonymous feedback" -#: includes/i18n.php:1029 -msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." -msgstr "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Deactivate" -#: includes/i18n.php:1033 -msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt-in with your user and non-sensitive site information, allowing the plugin to periodically send data to %s to check for version updates and to validate your trial." -msgstr "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt-in with your user and non-sensitive site information, allowing the plugin to periodically send data to %s to check for version updates and to validate your trial." +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Activate %s" -#: includes/i18n.php:1045 -msgid "Business name" -msgstr "Business name" +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Quick feedback" -#: includes/i18n.php:1047 -msgid "Tax / VAT ID" -msgstr "Tax / VAT ID" +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "If you have a moment, please let us know why you are %s" -#: includes/i18n.php:1049 -msgid "Address Line %d" -msgstr "Address Line %d" +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "deactivating" -#: includes/i18n.php:1051 -msgid "Country" -msgstr "Country" +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "switching" -#: includes/i18n.php:1053 -msgid "Select Country" -msgstr "Select Country" +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Submit & %s" -#: includes/i18n.php:1055 -msgid "City" -msgstr "City" +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "Kindly tell us the reason so we can improve." -#: includes/i18n.php:1057 -msgid "Town" -msgstr "Town" +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Yes - %s" -#: includes/i18n.php:1059 -msgid "State" -msgstr "State" +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Skip & %s" -#: includes/i18n.php:1061 -msgid "Province" -msgstr "Province" +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Click here to use the plugin anonymously" -#: includes/i18n.php:1063 -msgid "ZIP / Postal Code" -msgstr "ZIP / Postal Code" +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "You might have missed it, but you don't have to share any data and can just %s the opt-in." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.mo new file mode 100644 index 0000000000000000000000000000000000000000..afbe69c8fa13a6cc4307b1f13cf6d422f404f8ad GIT binary patch literal 51453 zcmca7#4?qEfq_AQiGe|efq`L;0EoxHAft$&BN-SNWEB}0)-o_Klq)hY1T!!&s46iq zs4_4xR4Oqra5FG4%!ksel^7T_85kJ0D={#zF)%PZRAOKdVqjo+p~S#o#=yYvTZw^T z3j+g#kun2AJOcy6b7ckwWd;TYcNGQ(Nd^XnY!wCu9tH-6Ruu*YP6h^sNh%BsTp)L; zK+IdN!oa}Jz`(Fhg@J*Cfq`Kgl)oR!Kd!>S;K9Jaa6tuPucRsigFgcUgN`Z#Lj(f@ zLyal}12Y2y!&Oy?IX6`q82CZ%RApe0V_;zT2o)DlgP1R&2JxSw8Uq6;Xmr&W7(^Ku z80?_@5H$t{H3kNTR5b<$T?Ph*9yJCA5e5c^U1|{bpNGodRAXS^0|lu%M4n$A;yx91 zh`-F$A?~qLXJ9a8U|?{A@@v!~?rTwJVBlq7V3?u~F?W$V#9eFD85q<V7#Mb_GcZUn zFfcq&hlJlxs5&+ch`R+e7#Q*y7#I{aAofkvU|^WXz`!s=1L6*IO$G*O1_lN%O$G)f z1_p*SO-Op^)MQ{VVqjocrpdqnN)k6U85j~l@u<nbV8Fn@5Ua(&AjrVL(5J<~AjZJJ zus{pq&+S?e{~Xg|U=U_tU^oZmKhlDP>nkY#vlasb3&=bzi2oS085q177#R4pA@)aU zL)=@g4Kb$<N>9>;_;Z;yBs?~2GcbVC>0WJ!{o*<hf2-+0!pU3*Vz09f#6BM#NVo>- zK*B9ihk-$Zfq|h)hk?P6fq`MM4kUeFg{uDzH4hZYp!6rG3(+sB3rU}vx)Ar6=t9zm zqb|h%;kpp_#p^=CDN`3>e>GHJgDxceyLA~DrZ6xt%!8U^tOwEOpvS-<4vH5&h`*Bb zAmLD`$G{-N$iUF5$H36fz`(FbA7Y=80VE$;89>|-V!*&q%D}*oWdQO20|SWumj;mZ z{?`B!?=prEe^?kYFzjMrU~o2MV3^Lp!0^wIfgzfKfnk~v149}E1H&gH1_o9J28Kvu zNPNW`L-JFuF(mv8jUnmdv@t}Tt_cH!JOcxRu?fU|!6p!W(NH?mgn_{tRIZpn!ez4w zB))f;FfjaMU|`q}72jtHao=H6NI0K^(zi_^;qt<ifgy{5f#ExppJWCJzd|#JzpKp{ z7>pSh7+TC27#tZH7<QOJ!r_-W14A7sy;(r~(QCoL5X!*7Fwp`MF3&9>>4VvlfkBFa zfkDO+Qofm6GB8*$Ffb%qLh}7AONe<VEFtCN9ZN{O8CXH`r-u~-0}}%SLxB|ogD(RE zL$MVDgE<2O!$B(shI9r7hM!gp3<V(btRdlc$r@ts4QojFeYA$8V?i58dXcq(#IFIA z?`8uD-$)yXzY}dB={VblfkBUffnlx<q#QhB!@y7v@`o)0gCnS1wPj$aWME*pXA4mu zVF$6V%MKEctLz}*!eh_C-~_5C>=_tz7#J9W?IH2iU=N9pRwzBmo`FFYR3F$w+`rcz z5^vY+A@Taq9^%dy_7MMkfYN{LA^zcTfW()a0|SEz0|SG)10;T993cM6c7V92)B$2% zr31vg1}MM70b*`Hls_BFUj(JsIY9EqE(eJFuQ));t(y)Ie|&(_e;pVYPB1Vqa5*wC zEMs6`xa`Ql@Dx-&I59AEGcYhDI78g=#u?)756+PCk<A5CZfUqc{O#%ju_wR<691tt zkn%sm1rpD>E|7Aj*o6U9^fAnIfux(GE|7e3*9GFP*DeeU`V0&VKU^U8YPd2m<bvuo zS4cR_a)pG$LRUz-UFixj|EMb@JWjhp!u7f<#9a?uA?Ck!g{0@7t`K)CyFt`BxIx0- z(+%SOIyXqY)a(W+CwIC*?0e+K!0?QLf#H=KBpffgL-NB5cSwE^^MK?hEe}X|Hh4hN znWrZt-&K1;%9mfBkn$+Z3*w(rFG%@X;{}QL9xq5bnC1nsf2kJ(gBGY>@q*M>KfNI4 z%6LP<(a#$qU*!#{pO<<wF!(VrFr4v*xLeu>5^u^r5Wb}kB%e6?K*FQI2V(y$A4q;! z1yy&-2jY%PK9F#H=mQC_H&FFoeIVsLt1m=c+!vxw!52~=Y5PL-+xSA_$J-Z@PXc`z z7{Wp2v@axH4ng%_@P(8+H+>=D^2HYt|G%N~|9v6u=kSBLSHKSv-wJ*Zcj)**?6>oS z#Gj`h149M_14F$Z149m|UFHV~pHP2@yK4L)?(Fu5xMPk##C@xv@`wE)@p{Q0V(&A5 zNIT%2KP27B2SEH~9RP_p#{fwB@eY946A-|_-~%e}10eOu5vY3YK#02y10nX?213m7 zgNla)Lh?aEAjIC>K#2QF10nI)43(b=)xRu|fnhxZ1H<+}1_n?AH$8}fVHyJi!`~oC zKAI8?iPs~+kobNQ3<)Q`5C|<9!oU#2z`&pq0%=b+hA=R+F)%Qk3W4O`z)(mzoE8d6 zx0Rs`49=kTR4BwfcS0fNe+p$_Xk}nv5DH^pNCC-*LGs7nFo^%O!y*1M42Q(8T{xt^ za1Dpl6S?6G4DJjJ47<Z2;mI5U(Z>s=g(D#0D+%SxLHQ~X3=FOe3=EnPkaV9P0deoX z2uQlP7y-$zk0T)Q{tHTTMndw9L?k4fouPd1NCt*G3=9lqQ1Rd>h&!U8bYc|5f9X+> zbblra;;*Ywko5Bi%Kse&aR)~<#NE=-5PKA&85lws7#K9785lAd7#M1!85r_F{ex&o zz6gtf<nwhg3=DP*3=9`z7#NyC^-(OOUYZgM>0exrg~ShE93*`x$3fDQVH~8N;S>i6 z|Fk$rJvAi`5?`C*AnEf&9Hf4D9|y^2obeF<@Ww;Zy;wX0g9-x!gH}8we*EJh;W;-R zlCIXrL*o5@JfvLv9}jVFbOI#2XC*-F*_gn<5XHd2a3g_%p$pVLN`&}-Um^oT5Ca2) za1x|EN`ul<lOXOqk^~9ATS*KImJAFGZ<8SAs3$|(H%-Y53^t&CQ8J{x|2dg~A&G&3 zAvuMCA%KB_;aCc!JQh!d^uKab85m|UFfg1=g|xdf(jevQmNZDZyPF0HH`R1VKJiS4 zq^II^NH`pVia$?>go9uPv>wTTwCfx)An{U@0SSlA8IW}IDFafj{m6iXmvAP;f5w>* zb3HR5@sO7ZDOWn6^pZ?SydB7dgyX$TNP1<>g0!a$vLNA{kp)p#p9M*ObF(1fvn>mf zK3-)(?E9Yusc%KIA@Qr54ROC?HpJYxY)HM*nGJErZm7EJ*^qE~4Hf6lf%soL2T~5( z=0M6b-yDelB6A?_s?34dKOqN_KbGb|($}UONVx9Kfs`j)xe)hj=0d{BJr`nbQZ6Jt z7eVRfT!{Oo<U;H@mJ9L6GpPDsxe$A}@*w4!cpikWln3#*ejdb~?s<^%D>x65FQ?~0 z?3<GZDR<W7LENz|50d^aLiIh#gOnd1pz8iZY0i9zxx)Dn`{eT>`B5hyVxAS0c7dw% zgQ|;y(&_mO47-^b7)tUX^^`#|1H*ApJGK}S@2MpafA^F?!ed_v#Gdmdkn;0R38Y+M zDTTx{Pbnn7D3vlW9AIEzh$&@Y$OesTltJRLvkVgNYs(<vbgB$u?$t6#ygn;~l+QoP zApZJa2C<L39Fm?T$|3P6R}RgO<&gB!R1PV>=9NSI@vR(Et|V7L%uBC;xG%2)lJ8n7 zAm*&CfVh8K1;jo3Dj@N3vI3GXZdO3t_qhU6?yyus$_tZ9NP17MgqTxP2`TSdD<SD_ zb0x%GC!qW%l@R~@tc3W7wF=TN5UPUM8&U;{_xLJ^y;W5ZbEi~6^v$h;<g1lcko0=D z3S!UiDu{apsv&%ZY6gZP1_lPxYKZ<7)eH<v7#J8fRzv(BRs)IGoEk`bcybNIyqz_W za^pHwT&xz-ezB>Alut`*A?f&SEyUlfb&&KgR|j#wQ5__lZ0jKY^Mi^<*FoH$RtJfP zqB@8>E9)Tnpsx<nj=WR{aqqu6h&$QqA+&5gBpi+FA?ew_o`InX)Gw}w*mtEK;*O{F z5PN^tL(&Ob1H?X_28g?b8zAMKb^|1R1~fp*%`PZ?tO1e^m>MDGay3HSBi#r|mnw}A z^UWF|`OCQxVs2m~#J)_Ze10RO{HcM8Pi};S&&)=MJC`&<+DkhcA^AC@31V(}6C{7M zG(pT?(F6(SZA}aex{M4A=bIQ9CV<*i%@B9>wLt3W=`9d*ceOAuRD;^-Ef9IHR!H~- zw=ys&FfcG=wnE~$s}<s&6|D>m4;UC2Hn%b`>;#Q>wL$u)e(jKPj1%n;bL~1H{jH!5 zNPa5mfQ;`|bU^yI7ds&S5A1~G>+nv9{Ux0cf7NzE{MpqBsh?(cLc;k%CnSDubTTkl zGcqvThw`PnA@Qx$4GDL<ZiqPn-4JtPyCLzP(+x@Y&!P19Ziv0?Jq!$Pp!P}+1A`SK z14DQZq`aQg3+V@K>V^2ju#bVE43tm$Ansn%2g!dY`ylD$NgpIWIQt>_PPZSDzZ3f* z`Ln+tQm?P<hoooD36TD}+yqGf(|ZD>ec?9&;+};QAm!4F36O9Lod^lHs}mvi+@1)j z_y13X_)~KdB)%*rLE<rN62#t|Ns#bsn*<4$zDbb!bM_=iKl0cl$oRwWNem1<3=9n3 zlNlInLG7Q(kZ~`uDUfl-)l(q;zBdKZe)&BG;-2iO3=9bj3=D-+A^n(3Qz7<oOoOCr zfoYKZp*{`bZi{J<aEqA+Nmu35Ao0)yrMss=;&BR;UN#MqZg)V{-<}3(S3a8t2}jN8 zkbG`89THC-(;?}^XF9|k!B9GSIwYKuq5Puh5O-Bghop<{=@56#hU(uo9THA^r$fr4 z7f}6QrZX_SXJBApp25Jdje&vT^9%+Centj{RWl*u@VjO~!X;xiB>eMcL(2b-*^u&c z`)r7R@6Lv}``K(r{C}7YiMP+QA@1j#14;h^b0Foc`y5C(w9SF!_mxn3`y5EQbaW2H z|BQ1P7-|?87+B{*+}$)6qP}k~B%RKg3u#9joC}GMV{;+xhF5bT@%0zV7nuiXx2eyA zl(+HoApYu}$H3qM8i$()G3VMmNPGJ>RGsF0h`pin85lGe85k1hL-J?W0!V*!*#d|? z*B3zQi+2kk<x2QMNV>CF#K6!3>d!2K^f!Jlg19?%F(h2N7DMz;TnzEoip7xl+qM`| z{v2BjN$0l~L&D?vVo1EchKjQ-fw)h22}GUz5=ehiX9*;|bS{CocOsO(b_pauZ(Rb3 z$CpbW=|*BHM4jeRh`U^uLdtiarI2)%vJ?`(#Y-XSw00@P-IJi=E1~K(FNK(Q2&(S# zQb;(zSPBXEcS{)<N*EXzq?SSa*S`#sZx%0ul(XxWLF~D(4C3Eg%OL)`2UYia86-b_ zTLy6l$8tzIlU)u8KjY<)_L}2zNcmR0oPnVNG;XvUQtv0Pfavd90jXc+tbpj>x&l(( zoL&J5-<ME6%Swp-N-H7#9sQLMcjl~wgj3&2Ncc}(2}wT-S3>Mrwi410I=d1wE+DrG zqJGONNV|LYDoA?01r`6d3StiHYKVP;t0D0xw;GZj)K){(o2`b#N7QPFyE9iaFx&=> zv#e%dn9sn#5WNP{-ub--QXVc?3vut&wUBW6z7`VRn(H9pWwH*^|8-gi>Bnze$G|WX zG`_tK5<e5yL*jGkdPsS>Z9M~cJooZ?h&x0#K+?0y28ce-4UqQk;|-Af;lB|QE)5$Y z{%YL_Ne`1YLfWA-HbTZ}4sL|Bhxj%@;y-8;#Q!myAnH?~;#r#@>9k}M#M}v+7#PAB z7#OB*f|T2DHbK&b?`B9mCT)g<Q|)F*I8NRS@z3JTko3Q0GbB77Z-%tz-)&}K_`txx zAhrb(KI~f|<(ueMh&$xAGBDJF#%s1h^ex&7NjGbu^y#e-f4<xbDKEcmg}75-8`PX_ zkbbe;HU@^-3=9k<+aUdNf$a<o6B!s7W^adto9+(CxPROZNIzow4oJBav6F$p6Esh@ z6XKr_J0bZLG?@aLACuSx2_LOp5OdsiLBgRNDn4l!B>k=11xZh5cR|YQkGmk@{bd)# z+&{Y@^##vvNIh=88<HNnc0<Bx-foCJ$96;N&quo<^;pmzh<m2)fuxJIdm!@;m-a9) zEM{O}u-Xgp|Gm8sb4~U^(rNoXNWHvgAEf+#zYmg6nf62K4Uzqjbn3kyQjYK14@rlg z_A@Z_F)%Qg9Ds~dA3gvXA2K`$DQ~A8WMD`J&4(UhU|7k(z>snX(mvoj4Dm<YVTd_x zhau_l#9>JO{dgGCZjm?w$v^Q&AmQ0~1d{GI9f8FE!6T6N)tMs@eQ%CH(y#DQNPNp4 zh49s&w82qGdaybQDc|g&;?7Xo_b8+s2#4~Mp>*z1NV+aR3bCi>C?vi%L*;iv%{_V) zl21<^g~aRgqmXp_>L|p$AE5evL)9}MgM>53F-UrsItFpK#xaOH439zVwLJzgC+HZ& z-iTume<d7)r1z|2knk*riqAg=N&hRM@`s`NE*yiThZ|77!*PgykK+(~LytqkCGI#R zoRW@1>`RC8^N&NqyW}{eJe_hJ;?LQ~A?}|C6<-6TH$%<c1vU5ZaR!Ds1_p-XP<gcz zko=%~0^%Q^6Oix=I{``G#U~*4^q+vZZyJ<8{{+Nc%T7STY268k{kx#zC!q8NsQMcx zAmM)>O22~2e+5ncD5w?(rRJrUD^%u}7AfRpCa2~Vrz+&-m#Y>ll;kTUCMTyB7b}#d z78Pga=P9TbD-@?DmlkD~R4S+`q@^a7loq8bloq5UmZTQzC?w{kC={0#6yz6`=rO1o z7Axo~6y%hqXXYuCWR~Ql>L{ohfy5jGJQY&%a}zW3SRz5T7N-`Kr4}h<7Aqv><R@om z=A|o?WTe9EF3DGLD@skx%`7ceS8xpQ)KMtU$V|=vDNimcP0mcrQAo=#QUF<3T$z`g zQIwyTS(R9lnV+Yp5Rj9aSe&YmoS#>cm|Oz!V@7^)3CL^Z8JQ)iIhn;JAXhP{f*b~Q zY+hn+s-A*lu|jfwZb43JNveWU0N5K5N(za|C7ESl(?Nm6;tW@zTCAkth>-NlF9(_F zn3AHKpQlisSgcT73J%M((wv-1g@V$e<c!4P)D%6CD$l&)lEj>xVi4O05(Qv3l4Tes zz}yBgAu&B4q!|<enI**viC}BNW+dn5=4KXyW3N0THBTW?A-S};BtJK`2=0htg+v8V z5`e}&*hy(csi_JjMWE2dv^p^_IW;FIHAPP$I5RIf6%t!uD?zbRPy~vsT!s9+oJxhv z60qkJOH1-|6H79a6G6UDNrn0hWQ1oLC|(qDGP6@b(NbER3ep5hGa0E0X{DePrUO!; zo|B`Hkyr*+1PeZeL|BpqJ315O6BO$q0imZ5nO}-WvqD;CQE`bvQfgX$5h&e3q8OSC zA&CNJJ}6;=!YaQ!FSSS^KMmsd<mCL)JW!f1R>;lF%gim!RVYZT%r7lbNX&)H<QFMq zWTt1N7J*`_D6u3nFCD=G$5nA^GDxJjBoV9zM1#dkGILWw5+E8PP?QMCC&~Hw*_o*d ziD@ONMPR2ud{UNKoC!|kxrr5-xtUd|3aN=jd6{|X#R>)aC8>EOnTa_dAE_5B6eMP* zz;ZIkZ0DTJ<ZOkE)S^^K36PwTpI;1#;^NGb)MABlkQ_KdQs9vWi%zf;pvg!fKM!OD zjY=2C08a)-NU+0b1((#4#LS#xI6t#kp&&IcB{MG_DckBXfO2Vm9!MEDo>RdBWr-!J z3aSV}P*E3<lbDB)1QkLGVUU6lAqvf|2myre6%uoD;0^$X9mH<1RcOk<(hAT-pO;!v zo?n!Wq`D*nl(fM)3~o~jjFp+6r=tMRQlMfQR1B2nWkO072FH{X1^>KaNGVwi=jNv= z<mRW8=0LoilA@59mtT^RS_CbcLF#n<^Pm)18>l49Ed^&3g_P8Soczkv6i}88&o4>| zC`v6Z*2^zSSI94dm)CkA-5?1Vt>BZHm#Uze!r+*ao0+HJmtT^ZoLbD_n3k5AlbKkO z3TI{J=P@{f6E(PA0+&Xr#X6u|rI1*xkds+bl9LKzfubxOR930MO5aokc%0<qC<LVz zmZlb$6f-#H<S2wx7JzKa$;mHQP*ZTu&nwByD@|o^%qdAN%1bQCEKAL)1eY}m$%%Oi z#o3t!prQy=yX57UgKIae2|XvVB(+Ef6nkLDsurskD?sB=Hz&0$HAexOQWXjk(^K^r z9KmG*gJYfov{+0{QAo)z&&$bA1jRy%0yO3z)l7aGC@pG$^C`3*)>KF<%FhJ}muKeW zD1gd|5|H((#d-?R;<P-!GzXDCQ}RI`$xX~F1((0N3d!JH4l2x&A%!`_uB6hElKebS z&8ElTn3tbdnVVl)tdN$Pnv#^5oXy}^P>@rpke`P&Wh2YsNX}p-CHV?Tsmb}dsS1gC z3W<oAFG>X!DhkD*7DZ)#sX}>T9=HfgNd;HIpv(lyf}nPQLP}yuqCJBnE-eK``N^rN zDfSGG#R}!A3Pq{l7KVbcfkH}RB_t!ji$R5=)U?vPlwuu_%6w3jRghQ-s`;U{X0bv^ zMq-IVVo|C>eohLwlugWo8KuYISXz>g7GEGUK=~J9QGP*5YKm@Vo<eDHYEdy%LlLOS zRSbzTuo2+8Q32Wx0LKM`V_9lZVtT4V5TvGXEKe=Y&rM};!V-2)nK?P2+QbRkd}46Q z$xm1CbYXDHPpM>ZDlN{;1GVBn?HUHBN=W2`N<}6Af)WM)(h?=G=fP<yFJB=iKQBGC zNFgazp%_+r=2e1&9G>h-@)cBz^%$HJ^VCZe(lYZ>Kv9QiK4zy@+JhvMQ*)pcs@I&s zX-*-yG^sebD6;_6R)eVv0W~?GoSf7Y7z^ZDP-=y?NI<DRGdDLi1ypF{R6^Q~NDW3% zVu7^-psmzmJq6_SV$a~5k(if`C@i2{e^9+%oRL`olLuD<&Kar6+4-d<49=M)l?=`~ zsfk6Prl^8*Vsb_*lphLd1uKLUCFT`prskCtGa%|xP%#N=*?{~2X;6TQTS)%O0htJ@ zbW8FTic>+!wJbBW9GdP5it@`cQ&LkD5)~j#22h(r6=rlvz5+<C0;o}`TMVk_i<65| zQ}c>5@=HL)taE-!Dg&sEnpl#Vlmlw1E0p9jfC|3E<PsRI5DaOu!}+1bU}jNfQfWzk z5r|WolLCrqc<Bd@d{D!tsFK0CC_fKevNAZA78RxDm4M16*D`PbxPZ!Z7kF!r0l|b9 z(r_VA6obo8Sk(wlkKi5wq`ZMPD`D}eqmWcuq5xKunwJRj9n^UsgFxX7GY3>&L8~@U zxrCYyKnWLK)WFLPgroBF7+g}5O4Aj5^3xeyQgc$%K@EkHe1+i5l2iq7HC7B32l1fo z5s)$vHwRwuLzTc>mIzS@aXhpRz-StSTvh}M%YvN5JXkYVp*SBT4z8a-=_#`WR2)O< zZII`XDgbElS&~|mo0$i8bOtDGC6^Wzf!tA$SeXloBTyw;o|==R11T23EjT4e22}!u za0#e&0cub{T9!&K`Q>@(MTse?N+5?6fifK^Az%wtlqx70TH7j=XO?7uZ2=eTnfZD4 zknjUFTr!Il^72a*N>XzR@{1CSD)kinL8U2JWvW6Zq^E!=qF_}7C?vp5B-LVtL{O$G z0`=c8Y6lYB18GRQ<bzT@xYGgeXefXSH<x@!kmf6Z?S*7%23XjD!WW#B!BGcJqR6FH zaY=pwI7vf#Hws0dE;U-Dz=~AWVg;}vu*3{DEVZH_vnUl(edvL01vMSu3{awhHB>=P z0!e~H9Mn(&^>^VNdW05mh5_~BOJJRSxLj%qgG(v6+XYet>inn{yM`*br{<*=CFUr& zB$gy91Qg|$q$Yz3a)qGO^wJz~6{eu!?h+8BsS52#XM#$7g`(8L(#)b%NZQLR0d*Lm zLMf1%7F72`OFc*mORXr#$xO~H0d?bxQ}ar66cW=DGxKyn{IpC^>IRJ$B!av5ka{{V zDL=6&Md8EznN2XKmu2Qd9hIM^02*|FwLCz{4wOeA4S<x?WN>L)k`GUWneh4r9Hq$m zp!rx2*64zyl)Op>aGNtTKM&MmMIC~G50AK%f@2&Mq>%9w1#sz83~sTcq=G^-HAO)+ zMFEtpHHtMMfdguW6qkUiKUmKOmM~z2AE?(wq}j!Avr#)9xU7QszXaTW1X<&no0yry z046~r4&a8qYhDV2YaXmO3K``ARas!Y<*7*^-+;OZkRl5zPz-5Uz<ZXEBwvyb3X<IX z5=ie8ROcW}P6gQwvlWz1)XP#qO{^4fHwO}`;9^Q4DHYV*2bEyusgM#E)E<Q7FG#L{ zjJSX@wjP6PQBi&ogaqZw)XcKf6o~6UW`f(1MOF;1;0%}orC|*@*NT#&L<JY{$W}1} zga-)$q+T<`2}!96xrs&Dsh~jsup<hJ@>5EaOTbp?F}P*sq=JZ&)FKAA{31|uv>*qP zf8fO@YOgE3G&3bN2h`5ffsJF7r$T!MAeTcMPM|(hHY9#Q`7FNx+;0Gz363F9BNg1y z$;;2vEl$lV&II*}!0ALGGcPT_2-Hvo*9f3a6sVj784ejKC`c{J%uj*VW1yxZq|FF! zD}vfT$)H9QIC`Mn7}&re*g{ZKCNU=yG?EC4&LYU*lO6-8%?~CNAWcIMA6`U(IN%Ne zXgC1Q0aw^yJz%+D7jK1RP}vVE%)yOSkeeYzwtBGwXdF@@Ei)$-W4N$5CEEei^8}fq zmz<xAsJcLvD5#~A3Q8>yH-Z!?1ebssJZ_~qISSy$wp(c)xKLzpPX!fU@R2xBml9g< zr-Ft|5$#|FaMvI)r&y1{y(l%YL`R_jQh;Padh-g&p+P?20E0GqKt*UCB*Y3b3iLAb zGNGRF%mZbQOi-DuqfnfhSd^Rr4t$X3)l)KyK~1LkG^hiM)fG}Qi$EoK8Ms~nCkABm zz*ZKe=H{1y`fZg8Py<pFa#Kq(@>7Z-Nez@Bz==scxwI%JUR_TiBwrynF*_B~t%D8* zqKt$>%dOND9Z>dFP%p?R03|dHO?6P^p9~+411W$Ha==OisH<RRfI7LLjw+;r&|~lb z4Hu%-+#acwpbS@(s-uvS3GTNjWP^J5;9j0;u|h^7s11SWn1afn^rFOEdsrb48K}$v z4V!?19o!Uyc4)!%N^VkOadBcwei7Jlpm8?^P{&OnIk7lHk-;N3m%$^yTp<P0jsqJ8 z8dc9%NJ}iTR|rWhE&(?UKt_S;ezZm}Bnc)esHW(qBvvYbQYS2<fJ`mPS12t2SNEXu z4i+r-U>m_L2T-OjD9Q&Hs-?yD44xq8tCuK%`n;e-nOOpBK!K!SnWi)^CAFxy1Y~AL zemN*FgX0two%u!C44~0`P~HNEV>zg|oLLM>r=THEhz3~l%`DMT$Vkm8P{>VHglhzc z0;u<s0jl3}E0K#Dh>t7tOBp;B((+65Ks}+P)Dln)qgu@12^rNbEdZDGDGIrjum&lp z?Ft&J%v11GC@HE0IXbv9FBuf~u)c>5m;-KJ6@luLykc;#)>8q|!putr4RL`Zo52$@ zq74#)3xac0qC#;-eo=`6qyS{_bYXxF!azn@Kwbv75<!g%$Ur=(0#8a+0JUpD{R!|W z8Yo|aYDduMJ!lZQxTGi%)cw+fnFeWHDCFjY+D`CtAt$v&p|lv1hRZW5!ATMnilD%O zw3ktbg3>cV6=ea~>)=6bP-hoZLxb!G4_!f9HJ}g!HQnGNMd&?bPzaZR+5r&Xsw0M* zAnkE*4$03`D9Hc~AcMUIcXcYbi2yETU=5h;)Jmkf8WMCMH$hV|sGSBGp3-CR1kFS- zKu1f!qm8hESq0F%3swn8_Z&qYSuLhCs4Rn25>}vrVb8oWQ1t{GGxc-<IioB;GdY#P zvlue=n9AT;qL7oHpA8zI1kGk-q{91c;0g%bxk*AQ()94?fERWkpQj~eg63P$l!J0J zD6T<$CQuU&G<E`VAh?Lm1<hp?gE}awMX8_>$^4QGke^EOL3utoHAlfp6Nh<_7A83A zz>x^bBJf5osMLh!H&8<^88VClj!KX^9fiyi(6mBPeo|smP9<oNFSEF~G!@)WEiF<g z&P+*F&{ZhTFDj};_deJVP(o3FR<Jph3Mu)i#h}6klKS%?Bl+-f1)ETunwkp@^8CD1 zSXxdjEy)1QbR<LiA_a*>iMgpIsYS)0E=PG$eqOqs0yNga_6C$D<zyx+c&AqCC<Lb_ z7p0bf*a~V2p~b013Z5>I=}k~k0`7i*Y*q)&H^Dorpu$7JQ$1H93p7Ta0va_)2L*Uy zo&q=opgKU21ui5#!82o^^a4_qmS4o+1=5(4S^{nrf+81OqJnECa83YE0DxMX@P-)3 zv#MYpC8dH)DJTWa%PD||hZFM@QY*kC+c^r5hN~WfcWNbrcV=EnPNhOIxUdDgBqb9( zyaO7v1Pw5hr-D+5LRw}8s6qu*3($@#sC8JZr>6%qq9ipZ2UPfg99NW@Se&1Sq&+hi z)Qd~iWAI5VE&&tJ;7);Xp!uG`2h!^Vwcg;l7@C7qK}t(NRU))I3mZlRNq}osP$FmW zNzF?y$zXsD`$K6^?7_r9ZF^)kC<&zI7L-)#G5BPrrGn<w7<|AJkl>=;UI9AF3aW(@ zu~g`wx?I6pSChd9G-U7Mq~H%3#PrEePRs#KFf)LLi+u9a(^HEWd{c{y6Vp=}e8DXx z2H*UoOwim#K|wKtFL(k5N+|>+mSn)#A(aKG48EW&3~CKQo81bDNuW7J)nW#}#N1Rc z0cm6)cZL}JAk#+*pg~|b2b72z{8B;l?4W^daJB>uvXp>^iJ%=&T?J@=pd=sMMaDhV z4=Ttq(=s7h3p(+S+G9w`Oia(qFD}VURw#i@R)SlGswOIkK`QVROG!p%F{mm|1eF{4 z*@=~k3aW-G#gL8?q$mQXOmMbJ%gjsFqn$@mQ%WJ8O3VQbFMztbItuw|X{kkI_;QFi zQvp(cL*~2a7#X1EBy=zr-V@BrFQFt|G5DpHgD|`xaV$&B%mMXuK%%LTnMt^$hH9}U zQi<Z1TAo^jN3s}HGN%?X_@!2qF!<#&_~k3;!peGRBPA6i=;;C?!RszcKutAp8xg#| z1TxnKYGH#*9KU=}$38a`MHP64N*7cBgR1Dnyh@N#MX-rQsVSgQFwoEzY{(2G4jv5z zS8@z~`FXlvE@(E$52-Q)H|#*wGiV(Oc!3VM>H;?yAk9`i27f(o27l0U4sdk{EuIy? z#-$d6+m+y1QSj&!tc3?IwPD?P(0Dwk)&lo5{QN^8ZFA@nBG8B$xNwCpHqc`LO+R_& zfhqse5-<&F#z4D_N}we*PT;1#B7;9@YMKE&JEH&|ae}fvU7!qbi5TGQ2?|p1SV;*( z0BC6gWCe%<ws~ui<3ZhaJ%)h9%7DZic-H~c8OQ<kp20&}0nm|hkgEJr(CQk<*lTF8 z3%K-!j@zZCDCFknm1N{pDwJg=DnN|XV*t+|fe6s3Y)U?;<Wxwl$Sf`a6?v&e;3X$I zpy*aFf%Ksj5@9_$gsxP`xHxq15T*j!;eglyn(l)wcLEQzfMXF<F(l<zKqj?|Ge8|W z*svC;3V?VN<Xp%QPI7)8XhapQa{y`L=_$B@CY|AxLJ_#aFNPQm4qjy45Ix||8z@RM zQWf%2D@qg$O+gD};BCp|#5_=Q2tFtSb`QLh02wd>`=huZF;^iCJOK;xF3PH|(qiy( z6$Y5^p^LprK{W_;sv#{OHe8hpsf?{)s^RnQpy5TR36RbSs8IvU1faeNxETgY-bJa& zkYPcn$H0zOD9TLFC_!3?16!g5w<#?(H3!;Z2M=t5ru9HYfkIJgPHGvb8itOBf?CzZ z`QU|Z;2BO(vM9*}Ri(u`3aNVOdhm2snwMEvnhF`6126e0)=|hS%}s)=OoF(p7&6J4 z1g^m#;Q(f)mL%&bXuyU<vr|(+UBXP%#w9pHQ$UUA#2ig{xI+v9rIBLL2xDpic%>k0 zJsL<{0op%+1u}9U6*7qf>nxT+^}^TZfeTA`8pE>25Niz$s!H;clM_L`>%<&rg$)mR zP&*XV>qvpD4+8Z>K*JcIxXjEeNzDUyzhR>ys>KQ#&>=TaPpw#?xF9tdR40KZ$_ny} zi$N2qh`@lE4Nj$?X;|>UA1JIq>mC^(>jo7(@^e!`Yd>IoPZu}~GOP#VLWfCGi$Lov zK|^<tm6I%xzIRT3Iw6HFsfa0csO7lKbaM<OWSUzlc!g)Nf|^1=QD!ozRv}<0wB-(| zjtHm)m+7EIK&i!q91@fYn&(C+1Jzzi!Kp=MnaQc;iAAYO&_$uSsfl^Tpk528+Xyae zA^k=L*lK{}{FGGK@G&fwV8(*H8IqBjn_8>@8Y*H4fDFFDXixzTtLn<p7j(iJ04aKK z<<Oc3rX?|_C^az!G`0m^><L=>3AF&`9=J|)Enve_K_)}vpeVB}F}YG9AU`KFxso9O zwA`h*7+eEDrV)xkVxUn=h2YZM+{7ZVn%sPFf`Sg%f>e}&R&O#OI=&16&}FHx5i*9r zQqaN#_yVB7()^M{hM-i?)IbWPD-Mon1#nrz5R{shS_EE73R`0e&fcJ26nJJf1-uLq z6prB5Q86gHf^uVOVsZx3`dEeH#2m<CpdyfgiVTo7gwVp60luUQ#K<g4EmnX}g}_>G z3_+>Ir8y-G!7kn)4Cz?~gGPf@iy4BGGg3k8-cl4mOBX<V*pi82hG57zc~T|3_D2i_ zFa(3<X;T$ELP7$9L7o8RXdQ*3(mc@0O3XetWa@_@7%@6go(i6y%t$N)_0_?n!idoW z@E8HO!UVOoiXd}fpy~-cv<aV_fDb@`rhn5?%R%*NX-R6a9@!Q_riLJGQ^*`CX_kS? z(R9$PJ!rTK(wPTUX^F+DAUEZtCYLBUgO&&sRWbyF3R~p<d2nip0;2mIoS6%nI!;x9 zbzwsx<GKuR3CJ8!aAsb5PAX&x2GleL@OlhS7YH31<fEey9stW&Itl?E0pLMpP}>4j zFoUvs2{@}mG@wjLfR}73WajCC<%$`CK??!ZK!bq6Ii=|g!N_&9hFfBCYEpiFwvIwb zc_wIBT1Np?wQ4d1gGRW()fuQIk(rmApI4TemzfG`VT0-`SYk*m0?)032gM<kqXJ}% z7F5Q8no-H1a0D3!UZsT?NJOb|!5I+RjnY$agsyi14cI`E6vz$5iMgqeoC+HMfR#r@ zsp*-;C8<TA0x7s8v8aRrOhTvIAnaV|R0AmYfTy^EOOtXlOB5i10%>7DMnGU|iJ-KC zTYgb#E(54Ig)9^Rw;@3VcWMzsNMeP8zCxH|2&m)=NiE7P1`TI{BtfI9AsLBz+2HU? z&jjZeP+K7*RRIztpwVf_0F|PGqXM*52OdxZ4-<ga34oM<ik_0x<cvJfv?Qn@m6oQb z5DuLOPERdS08bZ{Kqg~AWqLknwGem?9#V1SLBkYe7-)H=V?jYtYBFfq88nwBmVl#F zj{)LdP-Xy)m?eVNI)ZXJhy!v3Y~4UAY(hy#p%gTsT2cyHNdj7TTAm7;!v;+ffY*DK zK$n)}XF}FN7Nur^vJ$wV0Wv)kGEjj%uR@nPlH;oKRM1NMB5;KZ@guC=l!92Y0BOvd zK-N=&Q!{8v13f^&13qb`MWDVLIQv1zv5=iroUf2u3Z0q+EmTYgm8>8Wk@hhtA_Xos z_4wsMp%0y2FGf-cWrF5>;7m|tfg8QBRVAqkh&d8a!b=A&EXspsB2Xg$CAFzSmVBmV z=7Bns1)#PeXq`PcWk95$y#i3eP%Tyj&5nY?47`9BG{FgNctScL;FyM1dY}PJD~1qI z2O2&!mXr$Z0D{ssXh0XbS`)N57Mxs-RKV3Qq#FhD8oXT%3SYFL7s&8-S!z*c8hC<K z0X*FS+US!Ho<@SN?gT|1cvc{(C_g(DG~)&uv4^;=7&NB}8m$Kn*kKU@wV_ih3R06x zQd3~knZ*j}keP1K_<^SaXnqaR=!Urx-up@cugQY;gpteu^&>&Hg4(FyZ~~2Vq@<*R z){lV}Tot6IC?Ly2Tg8y(3$zOlp8SPI2DodVn^>t(0-C-~R6wd~L4gY^eBs%zJTbFG zp){`~GY8cC%q&(&0S&+CDnPsZMX6~;sl}j$Z=hWX;AP+-SAu5LOHyIGqzV#~vq4LK z;f+_&qPfIO(54+o-xpDqr=%8V7J=3d<dmj^om!NdmzWDmSD^VBSYSZn3fdb36|Snq z;4%`Wx`TNo1*|$Z6%?qssS3g6nI*{?5Kb|O0*!ir>Lkz#Fjxx}vN$~vHp&Jv0pvgM zZYgkRf?Sf6nwke$?vesZ03iFI>ruf41UQ`|83=F9;V}&~DFBL4&{{&Ue&~b|ti}iV z71^B3+|=Td#M}ag5YR?6hLHS{#2ki@{PH{oNQ)u_G~6BvSw;$)Aj{9o0~NN=K`YSe zkmAbXlGI#ybVExCNCBB#lnU)77wa*E=D|`pc!@A%i3s{mG*ER69+LyjQsoyR;uX@l z2E`*pBSUCjPG)XqNooqLO<s&71ew1=7C|(uK~5<EB~{g8a7(F}0iqga4wMTX*Url? z%}a)?$<u+v6le-c2Q(258hK%WwZlR&7Z-s0`=DkjXxTw(3M>K`LP2vLh_QcIhJcQl zfL6zV;wU!}yxmW=SOGGpuczP(5lMs!fEI-mfd(N{i@^1)jzU3EW`0p-NoEx&kU(h> zT10?7lA-{b5mHFc&j+n01Z{W%Rrl&C3Pq{loeznK>KoG5g4A`%`FWsu$sz^N5HHBw zQqY=3$o3FK+`uL>^cX<1DWFCRh%RObOUx-vWe5WmozO}dw5TWtoYT<i2jr12*wT5> znhWq&7x35^sD%m{-a?Gxf#N_RDZfGwYDsDegi#3{3Wd#%L31~>^_`-}5SE!*t^lpR zAsp~F5?F{agc}%?FoZ+4hB1VvDj)?9I9EX$rJ&3UjwVQ|g~d!#C30|q0|&Cwr4$_X zplV1DWN0#YmjGyGdtx4Fc?Nhz8MIz2R!A%ck9C0(IJh(b7xa+UY+_0ZXaH6R+-U+e ztiXFiz|+ehmq16{Ad2k4Hi5=B)$>4;@QI-KPX+bjbo28-lf%U&dJ3MP8Kwe!Gt=<U z2X(W+1wn2qq>Y%Fhg=0fJO;83RNH~aFTnwZ;&4z84dhTr(Lua7auZWh6(BWENqK5w zHn<iC83ft^rCJQ~DR_t-u}lSRuLdFlKzU5H7}Upx4Df<RIm5vXJn#x0aDaln2_Jwf zQUJ|gg7N^koCd{M9w_@1=jVX-US_01C$qs@D#6YGwO|qzAO)9hX#uox1X=c%59;ld zr$T1}V2x=|=&2W_Dx_8<gG)B>7Mc?9&;?{=7i?r6Z5tJ6v@RXA4Fa_4BpkAsR0m=o zr1=6)N;wMX!=?%v`QYA3VvZ(5IB0zmsE!0BC`d_d4-tgs3MelVJmmpefDaWY04<~k z4_Oq06C`B9J-sL~uLQK!2yAXaQD$<g0%XAr$b9gaZ*qQaT7FRpXckJLAh9wtFCA)P zWqv8B#Sg9?k(L2KWYs|%KtSy*(9(^>+*FV#sH+HC?*TG8Js%WD7;9wh84%STXg3~o z2rd9L0UeoI%n+Fh+UTqbV?dUnfwqo<+D)KcvaoJpX-Q^IW)*nj31ol(vO89f0j#Jf zRl!gfvPLJd9J~-MKNr-!DgxCTkV+9Whl{pI4U`(e=@`^91<ghwOatxM0hQW{aPwgf zfsL<#HG;;c;nN?v`6;Og6Tl@csLfSel3Jhuc9kxu&kk}gV&W<_FDt(iyuuFDSceU7 zf?A%SKn15~P?H7H`2%m*hE}1a(Cs~-rZcql39%d6z=P<3w3^|oeh@q8L9U05K|<R) z5baQXs-Q9oy!jqU7^Rs8aR7M5A}Cctl;whF9l&OQru9=(6hN!ZVBUeWmBF&`)pejU z7*sTa8;ziF0f!r?bjU~r&Hw9y#yvn`hB;dV9)^T8m?7mHs80dX3GO}@fh)bF{0fCc z&=w$gO9@fXfI=9OW<a5VWEx~$7o@mMEP-TbNU(!_3Cbj})Bqlv0d1#)u2BFNb-Lin zCo?Y{b~XU0-YN#IOaaepKvtrFvkRyLRZM+DbHPS}qD29^;~$i|!3_YkI0O&or680e zR&Zjfh7QSr24=wLBm@-YgIb~r{$-$n@6>WoRw)9v?a+i^EBHViR22K6VGe6KgQ5Yn z$TTN059%VsC<W3Gg90?3K}%!7g%xN@7qqQW5wt4`9Bt4PfTX=BHBlk41hjMx&FD<f z2n%cjRAMp8K8xbgV$i+@xQ`*p3~n!qU%*|}%+wSGT~K)gE|ML?U4#97UBP8Y5i}WL zgaI@kLCyrgOym$N!A%ip8y}M5LH)&|Qt)bSa3KWl4}zCsLef(abZ!qkr4Dj2Wa2zU z54@NK+JFY_tW^aSe$YA>wEb8CGU@@23uExImy!(7Dj!f~S5#CAuDA$U0m`qSybM__ z1L`#*nG7mgL1Q4`qz0|zU<N{)Vc@PBIBF4TP64_s1hi@}8?vY`Q6V?87}OtzH<LhC zflk&yE)n4)1z=NY5e&$#hMP|?48S1_+RY4^(}L_D1l7Ty)%xIdzWI>V_n`EI@C0&H zr9;=|LDCRtp*U#uK6pI^G?kO?G?25vQ3I-w@{2%Aw9w4LNW$=JOh_So4Jl}F2~_-o zS`V-xPmsl^xgXps!>|qFSy-8cy<mfkje#dpK}}3>afMwasH+Gq1VK$maG42K2@5%J z9Sn(8P|-rbIOy00%yp2a3Ml)5Q!`3|0Ug-UV~Fw$P|#Nh$Op~CDS)@gCMp!<L$|sV zr4|?D=M|^21c9s8{5*!ll$89u2+$G@P|KjGG!NV(1Z7dk^594o&@ySrN(N+EkjpXj z>gnm>P!5U?h=F<xi792^&2pgSP|4sGt)R&wP)>wybpr<yc%&>5z8{OlBQ-IlSfR9l zArZ9Nfg!P2!4%dKDOSiyO)CM}45C3&&@=?96(P2=fX>AL9c`1B4wlaY9Tor`VPvUH zO)LV77J&BRK}y7eqI~caBe<YSOH58>0qw#`ELKR)0WJ7WR4C8POUW;1amg$OwM{_U z!LzUMm9Z?~jXIz;vJg4YzS0uV1Q2NF9E)>4m|qN)1C7Ukst)jm;M5cr@Lu=S6f{}X z#0xS5qz|GDl=47>6bjI7kkDor3w(>D4|wtlWFnDDQI?*A^no&OC1iO9i!Wp`5Lg(r zT?`Uvp#4oO;O%2zK1dc+r|Uz<_X-kAGFZUtKoh~W3^-9hr+4$ykT&E)YBv_pgc>Lc z!L=61FxV0#$f7Qm+<cHAxEGeF0E$EwM{vAi7tN_e7YD5e1BpS$&q0GPpj80i$w?N_ z`XrEKF=VxLYF=_tCAhi*jaGxIisH<?bQZsS=yGbX()_d%(0si@3g}#n`~vX$xa>^$ zrqf~;&~7d0cm_D?i(xvT<pYZkWV;^NH28T>sVtx=CNwcv;s?vYhrK{ejtuyaD`fnQ z#j&&`BOjc?OG=CKQd2-nNLc*S(m*D{MDket^B9s6i$SvB4G5saj6ls)P*%#%V}VSS zfs1l*F~oo)AAtJR;3F+Skqc^8B<AEWz)NaSKMb}ngdqiV&VrwR2xx~8XzDZ<bS4At z^S7|9jR80FAq!ab7{H5%K&{ABa6dLNM*$Rtpi%)uL!^^3!7Iq2>4*h%v;=4$YB59> z<m4pKf^2AlU~x(<E@4QmNX|)w><nb_NUcQS`{x%FGk{KL0rd<)vI?rjIt<`412mrn z%F?M71)y;rP&x*6&hkOyeWgjMMW7;(B{DTtHzTo}ArrFyA|5o^5Dy*FicikZ0nIOG z=I1eh_Ygr>P!+R)W`m0vazW=}6sIQV=cN?0<Q6l4%5PY+kpVR3$pTu{l8Ru00w3x# z*gz%=G%+&3%qdPyW&rPQq%bl-Yo8gwbrN_86_R9%!GrD~XMjQ)T2QIN_iIBIx`CC# zN@mFTby;dr5)0(q0R{*gwoM<xbxp}Efv`L>Q&J%;=;}+bau6G|1QX1Gtpb543(m+d zhqAIW3m`1WNHUC_4mu8ip+Yw?Js*^oKxdH!6y<|rSJyK|7aD$6NUJo0UA(!1QbEVW z>G~F@XQt>nm8KW#hU8l*WR#Q?6kF-*r)QRAlqP{TUFyTeg7nMti&DS|MYlL5TOYh! zqL?edKSb9VG<}qrpQj5tZo*1|E5KhDv|b3bx&$g@WMF8aYhbEtWTIebVP$BjZD3$v zzy;cvpbI{(BL}q8%1XgGu_!0MSivVhFFmm+H78NQCK)W^06G!{ETWfMYRBc1n3rCf zn4W5-kXjt?8Vu*_hNLFuS}6n<B<5unXDDa{7bIrpX)0)dJY}V?UtV6WR{}m9BrUZ9 z>@`qX0a}2H=CvHC`TAhv^)<Ob2X>_9mFR|47NlA!l%!Ua=ojQ9X69LgCc}%0Q%h`1 zOVV^L5b8j-q@@<=y5=S4gU-LQQm{zMEa3{sDJ@FO(RIr&$}P51$SVMIi*1dp6(CGo zjXVWKTLnW+Yc5|;Uspub8R{8uMd$|PgBBp`IwcmTg6b(N1wB24sCQ~5D1wSXC+b-# zq^Fj|gWMUPnFrdGY@Jq&&P`3u$VZY*El!TlDn=7XEGa3%CWJ+AMoDfCno_V3vQoIC zDxfN@40Vi>;cmka1?$BWEl!RHI}EE#R&hKoaoom%U5Zs3SO!xgBG@4dmO#;=Yha~- z6dwo)Q0ZKnl9~ciprw~pjHEfgv?w_>IU^C2hO87qL)>&NxIhQZ1*PVdrj{itl$1j1 z(B#ZSg~W{fqD0W-JZL8sXsL86=rp86g`7l4QF(YXs8UoYPE9W@%1lX2QK(b^8&a&0 zoLH2YT#{OJcr9oVYhtlNr9yE&DEFu8F@%(Y_a<e6_RFRgmmFRQI?Jc9G&M0VC0`*m z2W(GqKIojkMDTQ4N-DU~1<Ex#pko#kQi~N}$3TJ|mXoMZoSBylIR!E~6XdEC=yoxX zFH{YS^%Mf~ixkol%kqnK6bkb5N>UY4^T4}35|bgFJ&?aaqu>f)6G2OCbMh4u4{uCN z0UcSTPz(x{;*vy#q@2XO<V5iKk)T6%a#BkYi$LK4Y7mqq!Yv0cWCsTygDYrT3FuHs zP{RjQxhrIV+?xX42~bd!2xb%&r6!jof>fk}PSAsHQAkYA%+E^&9nlAA$|Pqdf;q^R zfzP@G8DDaEGss5@hgVi)mgMU(WF#ho#*#sCTd7bCp4|c|1KE)eHYGVfH?tTVTFIs0 zurJL69S8$ji2z<vUzDg&nwJQPQFxlrW5`KVC@3mTO-fV%jmwv2mLw{qfGko-D+O;N zOHR#6Oi4s`ib4SBJhpsD+@Xd>YOzA`;mtXq)zOd>B#S{?WQ)NbJiHllSlZ!*phF}< z?oI`rKB-Vxnwbh(0tgwd29?&J$ONsl2Av$44>}kxDYfYELeP9(Zb4CE5!f5xwq$Z< zA~<+cixohg1)t;zGB{u1@UFbf<b04%phLEL3L%-Pd8x%<SA*Jb=mvor#<{6Q`3j)f zfMSqNu&Wb`Kxr7#zk=D7ngb5Se1(+K)WaLWw&Z{g<xI^hfw(6*F|P!ifpQP8&CAS9 zR7eD!8<$uFHUP9YqB0+RJY;fWP9|s%7C4=OViq9)ODM&u;3Fnei%W`9b8-?vieT(w z233W!)GClrSt{rdKF~leY^N6VSjm*s;)2q{E5ZH&$8=_HYEhy>8R&FLkfVwc6`%)9 zg42DmLV99eVjd`ALXMdPtziePOa%9j(aM07RFJRo8B~iQr(`7-mL6UUFJ3?gEoBxd zfNEn<zdXNKp*TOOC>1OK%8w<f3hAYw#?#@oiO_YZ;GBmNvGgm&KpkJ_Qcw&sxTJ!P za!rMWSu#Y_2NuH$kU|bL$_Y9n43xm3?uSI9V=^?GLwe&y&_f<U!z6Gfc(?>~@FDoP z*&;;o3(JFWm9XGoa0GYTp@UkWaxgVdp(H;gzZe{%&>)683U&-80rjAAHBq4`6?PJ3 z5y*3(({|xS3)CSg`A`PfkDxpW$<)vyvQh!GngzTN9wNd3DNVtd5p+T+xZXh(Oi9gA z$UVF{r8EariZVEY3g^rsh5VADe9!@wnR%I@bIuSBK{gS+6i!J^N>#{&sRdPrpfUt? z9xWdv1Z#@wF}Q#Z%K-a^!RPSWyi{<pmy-xNL<1}iI)2TuEVDQtoDvd2=Urxkw)BG~ z863d}UV_2}%zy~GAZ54WQcwf`@Y?*8d|1&6@+jy8%yiI}4{$lDTFl@A+D%@XS_GQN zgC-<ItTBY-r+`k&OavW-T9OG(St0Ov56LXZFJ=e;O>CBA7Ab&^Jp`|LNGw7+6BAMq z=_nMGrlx>O=){~7a4`$6&=jB(`r!NzuNOe^2`)HvK%rJr3eMJt7p7<Cfx`)sCqRb| zgHGH86_((|r_RuFk0BJStT;KbC_NEU>L-?DR)Ok~N>J?z=`ur73P>|(#|C&T2U^z` zB&O$ULM1@wOy*T379Cy)atUYwXK*IG&Hz=4MLD1n6*SZZN^PK>=^2Stpqeikq#-p& zAt}EEYA$4G9Ad8?C^dredr@XSXc+kL=Df_@{9<@MBb2?M*%6yE<Xn|n0BTWyTOnY_ z7K4uZ1s#=|lFx8xzbm-C1a5Fa>eH0e;?zWiRM3K<yu>1;44#r$0!fFk6l@RE4m!{~ zy|f6TA6A)ym&2u`7TJS*nXiyokds)In44b=KKAnPT2OLIEP{-gg3jGbNiECIDTSmi z9at5fm=4wfX;*;iBXHdb+9IBks*nq+kW*6O=7BbeLr>9!gfAr8A(cJUM9@(+nfZCp zdZ)CwG!Y#3pxPiY85~fcRRQ4hIEzyA@<Ht{u(he6W-0Wr2u#BnoRMo$$jSi*&%ETK z)Wd6&a#9&Q5|dMlkb~VVF}b9)2x1WEoK0w3mBG^mbespM^_tG$T$)-`0NNm$3#zjq z5t^C{>boX_49rXgHEuyOp`bLT<dRwp+TB&8q@z%o2wHNLnpc*Y2wE8kDV^bw2iijc zI%I(1(0;#sSbj_eEi5kqwMR-y6_Rs6dmKO(f(FTwGZSIQa3&T(Ptr^*LJ4PtXmKfc z;}E1If}H=CScE8pK-D$4p$F5ElFtCD)Iei2Igro*`@aCx%m)=(a1Ed!0R<8$4`$|p zmu5g4x1hEWXetrhzAu3nRnUk|ErxB{(Nln?by#8r`6@Rl6IAFx{mI~*2oWeK$}h-F zEdiwsxEOeFD<Cl)6bPB6DTyfzPWeTk5KB%>&N#dhR8-`EdlxWqNG~0HIwEK#PI5_U zVoqiitO4!;Eg-TLAZ-?K_Jp-RL4Ja?_dv#i&uLId%mWt>pty$?EnqF6z4)L84!Dd0 zyBO3+%>y@3%Mx?)p@|G+4*bARgvLaL<ir9{N(9LlB<6uy9iXOSNn&mys96bWrRJo9 zR^g;DI3M1el9>*v5TPqCGZKqS62ZrOf;v4gMq&}HX9gBIyfC>WF)tr<0%%TRQa-4A zQj}T@+H+i-3Q2$PDhD*#5s-LzZ7~C=QUSRM)CFSzp92ahdO)cc9FnQU3~r!KCxc5W zv>8x@#DrHO430UVdIZ*vM(&Ct(h5e`653!_C{9I6cX>LXgq#na<VniR$t(d^2nG4z z4lJ}0g=~Im9;6`wZWm#sK5#(>D=I+~pqY84iAA7OETP_k<RPE@bWkvW=QzM8T&5=$ zDI_W&S^_EgppFZuAp^DtmiQpGBaDaSRd7qP7?kUvB|O+3kR9;;15$t;UWi<VLMk_K z$2B<>)ItYogSI0Py<AWgpQr#!$~lRk;tABE0v{BZnO_X<ag~5_+ToRXAiGjQsStD- z04OWwgPLmTATqTm6O`hT^NV#9G7{4hvDBx~BSsU8loTq#t%QOiQ0GD+r!+mWNJl}* zB^5NP2$C)?Re%HuC?bMEqYIGA3S8NNa}4Md??licd3m7b0dnBjV}w>-K4`=My6Y-O zPazoGkOJvByf!Z}CtsmB6Iu#G&4+~sq;0EO46eICP65}xuo4NJCcrvCeO-JGg7ps| zg*a&Q2)O?V3L}iN8+6JjD9xl6!`Fy2Km!I;gOrql=V3q#JX7;hz@1#Q0=5L+)B`n& zia}eyA!qca7DKL9$OjF^ASZoLa)hM|@FXlatAOiJJy0$MH_G4)q`n8ZEedI~fqP<y zcjc6TI<N4S86gF5LsRlWNA6~(Ku3MRgGitjB;;UGNTP=wKAMsWJ$e)(oRSLKWdtd2 zauO9nT@?^#kb;U@@UaQSnb5`%XnjY1Q7*WzotF;^9Z0Uu1IH#v1k^JqR!9N0rAk2& z3))tcnG5Q;<%8BF=Nw*}oLQ0&>d-*?^zbuD!9ysZrU|&a2k8PNLz?N3Q%O^k;2s1Y zO$v8^9%y)^D8E>t<nT(+E)<Ao62aYs6mW)01+~P$+k`+yB<19TYggDhnjA=02Q>!3 z1qLXiLv(|!fMj9FU`Aq2I%rI%peQxHG_NEPG#CaQ7X$gVBr&-JJm6Cd>Qli7>|9F0 zD;~l19C%_9Jc0pg6hZ4qP-{5@>PFBhrim%}s^C*hGxI^mn1TW&@$jxZP<}eRFb{G; z0%({C97s8^-aOc`Ah*N1uzCzc*$g>372Na$O`3s@KLpvD3N9Kz8zw;Zg9_C$(8vKe zcF^5WQmT+x0xBdAZ_Wd?^NWg7K|_(L$t6XgdOSHFsrLtRVRAmE3b)KW2G2a$lGfB5 zSf3Q6zN8eiV?Q%rp*%H70UUbBWh_`UB|i_;e#%MAO9eHyK?nAMn%9Y-VE{b_S5Qk0 zv^hN~F)JTb<bjWFgohXw_ka^LXjMch=ww1jfe#64Sjz?!Yn2KmpcA5zo1a*UC5$st zGr>t2RB(V!nF5XES}`~$f)3J2$%isP6$vQ+=YtNm%P$6<OI4J};DW*h)h8*bplvfC zuOqw+>MEq>fOgG+4oJ<{V{j}=&d4mw2cM5xl+O?V>WZZ1C?uEW7Jzy_sd**fK+Q=6 z?M4C(rGggaf>RetmmaiY7<8XW3TRJcL24CrtPZpN3MzY3Q$XE2a4>>98=z5V(D`Vk z3eb*-0_fOGaB~k54|$-o-1ESP1%TVd;3^&zx8SBoZYHSU2bXZF#R`xB2c4FRTzMu! zGBRSw9n_)&tz8G5p{9_L2<~~qq7U5Df$eOE#3iJu2s*P4R5>FJ(u0E+G-eArVl=TN z6FdR{8EJq^!N(jx8x0`i!id4808jWBJgB5DO-FEH{YwSVG=3halL8vXhj&px1NxBI z0}YtwC1(~Sf*N@_p!uitOwff*u#tI036!XSaSm&8ejcd&0q>9jwLnWjyX;(xOF+Zt zFc&cR<%4@)pil#~gBd_)v4RG;8T^w<K+PAVo@qgT5oqNXqR$9Dn-x6h08Tle#02jl zfdX5P!96uEGcgCb(1Z?5K#snwRLDq7%FH>uwgl9wNCi6>bOvi?S-t}FU{yT@$COl1 zR~WPutvDGxl>*MnC7ET33fRtQ#cGTK=)7sr$a`{WVh*?lQ^-BM5>)kr(<{iIsd-h9 zL3sGNtl(Ue2p&5~EGhvHLxM_1P)`@sAV!%!(1A4xQBP+D4bzmRR)HcQvn(+MTn$27 zz@XSs1vM>-Kxh9SUJL5ZfQmj)U7oMUaA-etI2}~|VCl1ZfX?7Mw7)np2|U;Uau{fI z8dPh6hU%dUkHBL|kg6>uzt~>k(8AzMPzeSe7zQ;MK+Rc5MlDM%D#-+SGc^xXQG;u= z)ZC=RtVGbfQzdxZx=0}<GcUC$A96<Pq5XlShgX7(D@X)w_&vNCWFolN1epo5R|o+2 zhe4w(iN#P;6G6?YJWx@M=)Hpc4H^K?hxF{QO_wO7=%#>t3JMwL!<%#S6^cufGC@OA z;7p!b1{!b!4cR#7=YmcU0`-jZbMry=fSPB;_Mk2q$hY~RF?En)g%oHt4N6`LC7GZD z^+Ae2XSqN|AHddt2bFU26`)=2#3GQI;=?Ny3PGL+g&pX$;e3T;uxe=fF3QQ*Q8=_P zvGVY)ltj=mu73FnxzO==@LW+MD6kcBGhthPAtfTXr<9)0-~pO$193pzNl<j=re=Ze zZz~4Lz}pci`5*%z4S#TvnXdqym;x;w0TuCxSw3)k6V^`90i``~3${2DJW>i7Z2|R9 zBf+C9d7#;j%o0$Q4%!|7=>R|l6O+K15VR^XA2d^>kepux+F}8%6hKG224^aOLJhRa zEi*Y=2h@xKCB$Ut>{&5rvI$h;r>27jEEB=w>zI8$urRnz03F<r35p@m^ipXa^mx~N zq;dsxP%)@63M!?b@lpb+6jNZ`XHZ`Nv@<^wRE2^X3`MDVrJzn8sPB-I2s%QhG$#=< zDGM4Kg3m=jrs}{o44zTX+@wr!g<6scTAT+q26Qq4d>9qpLjqT2pa20)*MM4H#h^=( zV2vP<^TCs@pxIT7Os|j#Zp?s6O~@EYHmJ>jGX4q~2>>T1JqB0gQ9W=1fOj-t6%{0( z!bbkUYT(HWYznNBgU)RuRDy@Lk+|St3-ACCsA@%#1%*9iya%+@oxw8&l-*$y6M6Xx zWrr8$WTxcnF+j%+8Nl5}NSO(4yQC(kf{W=K=sDG($r*6tL7|`&)Ib20#-O>s08lXm zR|=1Nh(|!N3LOapO(>@&=Hw)TEJe};9a;np8G~9Jpkrdeu?i`VbQBVc53dC~BrhM_ zxX1$~Ur@;l9ri8)9T$sa9%>sJY$T|a2D+;RI?N6aY*6nNbm%N-gbu`p_FF+)Il+g- zf;XOmR<?oWm_ZG_q@2`TP^N;Fs-OmI321B{)ISFmVY&ImphMe0Cvkz@3~y3H?1Z$O z^70|s3Ot|&D;^*rpNOKnG!GmSpblaIs65S0Edh1FKtq3}pc5c7lc58gsh~BP;O2F5 zNxmNF&|gUV3z4D=4(|e;BAW=hO$F4Qhb)auR7h0-j}N1?7D26$lGGfq-O!5B6}}xJ z2Q<(N8=WXF$p_7m6@be0lzdQ`3EIR63M4&Hft?B(CkBTDXp?hNqC!$>aWbd}$^a?c zQVy@o0uAHA%41MP2#VR9M3@LX6+v1{pzwqAJ3)P@R8W=%O`w3TH>d>H9x16HN5Go< zpyqsPQC_|tgEMISnE`2e1;{*b`yvN2Xp;x8YYuM)#cCqh*#-G2;2v9IQBi7o4!HgT zw_ZUp0zP^+AGDbVGT;w7eiq4sl*4O5Wn&KLdZa2)?gVQD`3`0%xOxHQpu@93BNF)x z5E|UkghU_M_i$lYN`VVt7A(+;FeMRF4MHk75p)h4sQzUDEhx(@DNTVKL7SYJ2ni@q zQ31CN9CRompy72;cp?izqoOP^`S4m$B2F#JP0R!Jo<VIYSRJfdY!ABJt}OHL%Ayj` z^`&@PJ<vuE_%K^%(1cr&LVf`_KtR?yxiH{3(l)O+F)Nk97t+oIT?_{r7~5QynUh+q zz~Bp+m}Lkm1+NEz&(y-lhM@%{gD<EagC1}Tu@o}R4?5u%+<b?%;z1V<6s0CZ)TDss zm@)g@p!04)js{IgheD=@U|c`YbuJ18nW;sf`Ov(~Jn+B=q_BXO>zT0ga6u&vxR(cN z41iBwgs!syHT*$Ff}73YVIxqs1QjW;galSm30?#R8z%zwX+ekK9^MRE{RCR*lLzhU zfs1)a9}zr`sQ@_}7uJp~2F<h<gJL`%yc545u{coyR4hZ!#|60}6Ev#=YrTQ$qNL2! zJaC}^>a~*YUvTaL?K*%gECG8b1ynR67IlG&MMQ-NQlX=epO#uw0$JFVnqEq-&p~Aw zdCmrP&q#MQs1cf)2O2~JFPsK9r*o*~8F+VO$V4M(Ssq2PSDIRu&)^4MI0!E@Q!+u@ zX+UQtVvZz$htfe~(x3s=R0Z&HyomA>ylxm&qJxT1oT{Aib5ctVugzl!&P*=_n*%?Z z7qXTN-cl-J2+qs{9ohh*K=o1)XvrI>#{^zpq5wN{7c>r(2kLCV`qJP{e)(YC$lAbt z76ov>O+i=T&_Z}S3AC6H(G!R01|Q%Hx>y_1`AAeKNi51r1(%Kr$wh}(reu~tZ2%3N zfr=K0eQ=&1xXc2#6+pEjsDlGpV+5+9!HX#qLH$e6JQvzf4&-28SZ5tnGbSgdl!9pF zaesJo4%CeV%}9W^f1`~Y!CTe^prvkp{t6|qc?bA3E+{8L%OjZkKo=!|M=Udoic=X} z!0T&LK&L8XB{CdZ=$QwV1Lb_sP#&mvRipr3GwBQJ8G_FKEdotdVwCuxZWgGy2%qo; zx3R!Og>WJ0C=h6L5@l*QKeqrn6ABtk3UKyhKwFv#8VXBH2aVz>fMx-Z*9U=mCa_^9 z<fTBMssY?O1obTu!^I$B$Z5a~0g37P#SA{6VLlK`0kj+<HBSL_k}#;!0C^@kwKy?P zAvZOzxHJ(umJjMVf#%J@u@5l`baZ869>~q0lmHr<08MOxjulRY^c-{Y6-pBGKywq| zQ8@6@9q>dmXq>YYG~```kxpDe<8X<fjumJX0;tnk0&eGF>vHmOFrK2Q3nT^ddm* z;G|M;GYnowgC<9kQbCg|$(c!+uue7lkUDrze_|PQts$uY4N3~237X8JTu_e8QAh^O zJA#7%5|Js1DUg-CMTu3QS_l-(pehmEL510h-2~9UJV-e>ClwvuTmc^3g`G_toC)$i zG#?<ASAd3?F-Q7AGd{Tp-zO&)6~MAJL@~H;QJf0yj)B(kgJ)GB3kN_cFE76sJo=Al zG=oPzVKeU_4ro9FG?oD_-M}d$F)P&yNkd91WZn(bWk3ic_q{<A#28IUP!Rwc+DZZ) z{|8Fb*nOywm;*jNCli!%KnCT5*3nuq1ZN&znFnrO=43*bxqu=jzX)897J*vjpzcTt zeARbKDkyz`2R%Ro;R^W*$j5c)C=}?WX6Zo}mli|T;3gJ>{ac!tlL|W8`0%b=P{9Lg zkU&<elt8D@LE|*&NeXo773fwpkP^t5j0zgLpyj!FDUh`_AlIRGfWWCG1vK>oIw=IH zmjMcXa5o5?b3tqRzzro(b%4C+8`cUuycsn61G)+gG@T5d7A^*NbV@)iSMX6Q;0ZFY zAxN!IjAV>hLk}-gK?x3YXfeFmQUV%Lu7o$i@?obSrxqin5gmmTa1Ri)aViJYMhEB5 zT<}tBP$3Q;u7nRMg31#OP^kkRuK@+50%(~WsIi_3Iu7~p+BDGmXix$IWs}5WP2^;k zk_n3Yl2U~{a1$OpBnTRT2bEc%vo{$6pi2Qk^IzbC8GKwAqDTQNf*d3aT7m?T4FVri z30mC=T38MmlL9S%1l1jo?g|6wIAdqbodyM<B%WUk8_fatAQ=2hia=ww`6Y?PpwpYc zOKm`b4=GSV_JdXll;$a*o-qvV#1?0!=Ye|!;5bDYW<a!iQbB{Jpj9^t&?PA_?-zq= zcF^J&aE5}69f5|*OHy+aLFe{@m%fA6Ex^r!9TN<`oeXq=PCls10UC3M4C=!c`NLaG zpg@JBO>j>h<^s^d26+2Q578cjIuJtuq#iQp20D5;H90e%As`<#qmh{m9-S!wA43do ztRQOM<kaGP(AmP^$+}{O;L=>sS}a&q4caiA2<tY2XI8-HZbM=v0Cd-J9-?~;8%%*z zFrc;wbc_om0AGArba-JwW(sJL67+Cl=yV#6ni%3Ch=qq1y5@oAfkEjNJOYClW>82} zfQ~+amfb2qrU*d!0+Ml{qrIS}9%!5lblY*FLNRDEEe*7uswfjOumLhSBe60ORQ;u; z7G<X7gAX&#F9Uf7G2q7#kP2U&>j!HgBJZn7Nk#0QgPv`in34}V+8EKt2Ay^6UYb}0 zTCD(DFIEIP_X;*u0uCR@dND|-Ll=yJE(cErWwLzG^arem4IQ3<4qn0YE4X$|gr9#5 zs$+{GBS9&UnOxXF5NJ*oHm(UOWphEx8Ng@Xf<`oR(m~Vzun{cyx&?4mS5m5w0$KS3 zjv-Jb4QgWODTI}#g3g};jaY$(<iKM@sh}2bez8JsW?pFt+K3>@)<T=_2y4N!JEU6- zn%D&m$R#QqMq2>`Jq;OBJt`D{7t6VVmwGB-42LtoViGnOlbWaC1UlRpbU<<uDElMT zHK0%e4SGOMNyfTp6TE2}G_(w^a!T_c)hlSVQ%Pn%tmFk(%?zL!A5Z}T=7B0|9mEC$ zP&y32cA7G1=>Vws3I+}PE2MxXVnO2sIVGSH3S~bNSVb{IFlcZCwB%g17@UNOJyqEy zvpBglrvNfClbfHDT3nI|9(aI7IHYL>_GV&bX$pAou^7~%D^>uF{eWg1!QG|OJW#=< z$KV5M;^&osT7ZyImi!cO-3%!|LCdc(7fOK30F3U4o<d|Ic<3B*qB3}T3)HrQ5Bh@I zd#S}Jn*?x}#Ne5i2`X-#LA^&%y9+e54xNMo#WtkD2`L6a(z%(4j$e9FVo51zehWOi z1DbCD6&28gRtcW+f;67MNu41W92%*hYi7ZXYv@8Blu8P=0vVLsQz4g$ftGnd4{-K7 zyen71Gt7}81bM|0cyJixheHe9K`U87>sUaAOd_~tn3Jdgwigl$ATJ@teiaoQlM|D` z1Hz!S8IT+Tni)$44?2SO4M5gNf&5&Y4?1hN<nYR5(3UMd1wT*=Eg#;*L*3U`l9>+f z7J>R%pee*;&~$1^Y93^%Iw)x%HO4?g58xowQ*Z<~BET*J&0QoWgN~vE?H)t+St4{z zKVr=ktndYU58T!TFW>@?cb1fbM)E+_Gw34HRM@ni0&L|}a%Kvsg;xYxC<}^VkiFna z0<<UzWdkF)oB~+^uE9X<c+la`km+O++=p0T20Hq=I1$oDMz$6{r;OHZGJy_)fXV=c zGSD%B5WS$R4{qy1*JgtKoeP~xNlXDH@I27MjYA84OOrv1lhTpW3G$>O=8i>0211$$ zsemuDgKqcFF9zv=h8Gf3LA6+s0V=EjY7&F{2zdLX!JrB5vdqJqL31S7S|Q*GS8xec zT&j==stBQh0zNoej{!BufC?heVs+4Y(co1Zskz|QN}#Fd<f6<ZaIXrZ0<mHMoxcal zA&{lGiQuFLU21fAA#?;9w0Bhnv~0Hs6j`7P`;x#dlVao=2GlSHr7v*x4=OZ4m&~M= zA=Wy8*BF8J233M;3UJF9JlhIBK{~Yxq!($Z3A~LlBT=C!zXUwT53XlG+Yk|RLy1Y? zt%^tjpiTs6<!(W05mYj@SRoy@0teJ7gwEiDX2(E_l2LXW!rJMOvhDD~Oz@UhB;!HW zr-0VJ6@cbaKvSqGsi3tXAg4onUWrBE&H-Y{BeW$AE=55)prb3`jaZ;wQ7UMR57Zbd z1+@a9Z4^-U1Vt#g*H{d?avHYa2^5_m-+>OzDuJ{fi&GWADFSq+q%LSo0$MsHr-Ek% z5)}#{9VtDq%MuGqL32HzaVv0-Ndc4#OF+v-KrJh9vjjX73LByT*G4%Cpeqd^>juCs z2aN&12U?&VI7C1l-VENU19b;zM+Cf-1g*G-`V3|9kRC%wYHlI}Y<~u*mjf0lX7EU? z1Um>+ZlNwuQw6QugN+-5);og6220a(GV?&80NXL0n^=?#YG{B<agfzW19~N;pri;{ zxCUyp<QJs`fX*0!83qX<@KiUXLj}%-;N91Gpiv5V-wWbZP&z;?9%Kl~gdZn;cx_2( zPCoQNY2Q*%wOs(}Ct+09u*C-X;7KshR0pWfoex<dn4F&n+VTzFXq2M>+71Mr0Eey^ zL*26uD}oeCKpVM>Kxa?GcG`lkuU7zF0}o0|DWDoX2efZqPa)v&W^6m%K`Zh~OF$Jf zc-wYnUP@;2;e~lA`8lbm<4)kkcA)DrA^Qi46*57KElUzp62ZGgVa-u+Vd068as~~u zgEy`#Ac=Z_cAtQHQ{c=GHUPB932E;K`V3Pdcts0n{c~<&QFbcmFc}@tMt=p+*~p;X zr4R>zwmB7nHd??JPJ!0P!ebLQQkIek$}*+JknjN&Y_K`2V$fN&$>3ockWTPoBS;np zZCeA4M?)6jDu50h0gYxRDu5@LLCe7*M^tBm`^L~^p`bMmpyR5mK-2M{4kf7A#Mra~ z+IU$E9_z{ijaKO?1f{~peiI>0kD|kC!OaiQkPGav>cnDD3W9Fl1eGzM`7H2W6i|i- z#~xxj2RdR4Yl|{KCrF{gAE3~H)>M#1q~Jmv;&1ShK+wV{L}Lt8fq@s2BgU5D<D}sA z42W&x&@-(;*%Q)G0WC~N43dIk4?Ge9wlF0hGzI}?g0^#Dw6IY|ML-iDpvY3lNzAJP z53h!$7J>FcB<AF#7K02@z?h5x?Sg<DdhG~a;hmqy;0W4hl9~)|^Mh7?gZd1Rl?mW@ z1;@5RCAjJbp8#Bv32wj^C4%<UgLd?Q7SV$iOTe~RmKNuOCt%CKM#AQrVe|Z;iWRiF zGZE4r1nt-&s!O1waA-exwK{yqNeW~!5TvgOUN#DeFYH|k$Ovh2Ng`yeAgq%Enehj& zJpvtQ0oDuK2o2ir698Ip3|fu@t`|Y`LV2LZGe`uq|FZ~`q`|8x3qTz$$kYRP&`=>W z54^qwwD>h86{M^TyoDOMG6V+`Xcrb}d;p$+K*cX%??6_<LQ6_2295_f)<CDlgBJhh zD?s*06oXF2&CCTa6#$oTiJ<j4I-t%J_!3X(u4%Ad@bD98DjwErQh<~*pyCd^k46EU zeHcJJ71#n?utreLou3C<NCRF?1<K8!u_SP2E-6)jZXg9!MTt52S&7hXD4;>qN`<0S z@cG=3<0gvo!SMqsM!<6}pmAI92^Sa{3S<~^=?8KdXx<1E$Dj@pp1u*dCIy#CsnC_E zpwk3WK+E7EEB-*oH$aAK!0mcyLjg8#2I|FSmVq`#fSO$?paq2`kS!6Q0d7o(R)W?+ zB%(|vfO8P+ux|~}KnbWXsL23bx(gbqE=nv0Et>@|<wYxXLE_G(i8-Kw-jc(+6jTu^ z!TB6C$X}eQkYAEtl%ALeR-F&p7<70gXgD=F6TG4XydMZuHW!0NdvihiUJDY_L1jHi zLtrVWe1f#qQu5)evOrSKrH2=Stp=S20vRR;_ccLsE{8XRc7K3sibPOEK!X>w_ro4O z76%%kfs7r4nv{sPNq$i}LvSWTaHazI@ar&84CyE&rljV8ral-V;oJK_3-Ped14524 z0Y@(=;Uq%0U&D_3h7=K?1?5GcoC@w`KqkRK=@(MQr$dGyKoucuO3_HA7}T+WtbQy3 z1r+F@sC-4x_your(B(#@C7_Ul<`ZyW!i~gm4#??=#h@E_Rg1yL9Dv4gA$wB6jmNa2 zQqb59XwC`C#$s?-gE~jx<}tW!4C?ZL#;z3-VOwA!XB$A;6`(;o#C$erIT2_vI_TgS z#3(LwttWJYI%q~5yuTFGjDR;lphN9?3`h&$;Z*}@jj~4~$RW@T$KduT(&!mDz>7g) z0olr$1E~T^K<A=>MxH=pEU87HfdlB0Y1rHZWcCSE2}9OqgK8zvAS|ee0#$C%qaE@= z#~eZS(u3y`gHo}SAE0qP@S;>mbp!6lLRS8klqx`Hf5GJ(WOf!@8-SLVrlud>Rg?(X zY5<wzhwXsJwaOQivQxoF8ex_PP;2!-DH=3(kY51a{Q>HsL%a6qi?B+I^L0SeSfC~p zsI>$h9R$TTsF73zX~jX)9}P?epL7L^fE@5@SMa0)Bo8O%fx1qK&;~Dh->H<;^OeBU z1G%Z7?YTLi6rPrugCYcOaf6QCf~>6v*_{Di3kjM}0<BI%PH)gYB4`L6oFEP@3;~T; z<iJ<NCW2R6fM<0;bqQoQ25Q29b=M#(>QWLF6<qU5iokn|OG*_EF9aPF4oXwd0Vq&k zG$j?Zm>LpfXqy;QK&z7>T{h@p;h8Ck@HqtVAO~0<_&`)px4alMj0QRM5!zcs_8@5C zjw@&zwx@4EkZZ7~zn`ODh^rz)Fz8qnNG=4&2(lhf3l=iBp9(sB61pjnnA#Q;oS-%- zXy~A*G#OE-z<P9$kb}=_fJT486B{8&r@_F>M3C=5OL;)vf}Aq$2u(!L1?>vpqsGBG z1=N^;bPY<2!HGOIM?n>I+IVqh9;m673OZ>V;vR7DVJ`VVwGDKz404GJZbTF*Kn({i zCc?TU239c?gDrs<e6S<}or6h91a~fyi&CK{Zb90e;2tQbiHV~h3mb6;Cq!_|5Hy#F zVH2%_4B0mbJBSG=P?CU-GQsK?X!#AAng{Re1{GS6Q%%6NF5E6~<U#`<G|>%O{t236 zgCzt=l!8|Ffrr~62kyajXMje^AR9IHK<Bc7#_*tqL1Pj$?*LlT4~;l*u?4Xcw56yB z%{<VdZ;<&_@R@H&nFci$K<eP@^3aunjtnSPC@W3P0o|SfYd=6z40J#Wq#ssbLPmhl ztpb-=psE8jmW7dnLCsvSi@?f2ra>ni!4+;E?9@Dk5YRz?kns*ss|2hX61AXZw~$H> zRFr}x!2M*TA_Hy=NCmtBfXKbzkp_iK(1;Pl4+ss=^EyD4Jm{V>r_9tmg$&Rskf3o& z@Ty@*OGg3PY69&D1ufeG53S;q2gfC7ZG#>Ir1uM2rUGv3mSh$&6qcrfPB(-fE0&j% z&j30|gaLH68R%B&#G;Z!&_Ny0T?h<rsX3X+pyA-uV%Rx2p#8p(ku2~Ye#ojM@K7*x zE)>4UA6XDFQU^_Ci44Aw<!_MP!yr2#bA;eYEKt`9I#z*P{xamIGB|?Hae|QGngD!~ z6zGsU@Ch*Bb)Vo>P_T(@@PY|&e-1Qx4x1xIp87&&BaKdhM$8x-K~4RXd<NINWYEov zDfytop+QjzP8f*EIZ(Lc84g5*Eu?t>YPN!RW`K^ThfEAGz%vUdRv@QCgN^|7^9P+r z0iJF+yfzi7;Rwz4poLPP12aG&h_RFiHfj&*Z{b-`1X{KNUK0r0!2~{&8Z=-89v@)< zo%akr<Jlt>G`Xn55SCb(Nbs~~=qxb!OlDC0gU5VQKnq78%S=FJ8F(-VJcP>tI>#^- zyi_9>Q87c$;{g@-ph640?vH$5f|qF*F+fN0AsuOqSYrS$LIhQypp!45i5ld7uronr z1bF%xbfg-5btQD0s5_)jln*`F1$K@{5d-LG=ENcf|Kw88!D^s&N}yRCENf*!N7xl5 Z7BTqdgU*pFf=;0$kA1@H|04K-p8)+0jVk~E literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.po new file mode 100644 index 000000000..74c2e91e7 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-es_ES.po @@ -0,0 +1,2299 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +# Carlos Longarela <carlos@longarela.eu>, 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-24 18:11+0000\n" +"Last-Translator: Carlos Longarela <carlos@longarela.eu>\n" +"Language: es_ES\n" +"Language-Team: Spanish (Spain) (http://www.transifex.com/freemius/wordpress-sdk/language/es_ES/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK no pudo encontrar el archivo principal del plugin. Por favor contacta a sdk@freemius.com con el error actual." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Error" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "He encontrado un mejor %s" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "¿Cuál es el nombre de %s?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "Es temporal %s. Sólo estoy depurando un problema." + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Desactivación" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Cambiar tema" + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Otra" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "Ya no necesito el %s" + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "Sólo necesitaba la %s por un corto período" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "%s ha roto mi sitio" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "%s de repente ha dejado de funcionar" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "No puedo pagarlo durante más tiempo" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "¿Con qué precio te sentirías cómodo pagando?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "No me gusta compartir mi información contigo" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "%s no funcionaba" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "No entiendo cómo hacerlo funcionar" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "%s es genial, pero necesito una característica que no soportáis" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "¿Qué característica?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "%s no funciona" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Por favor, comparte lo que no funcionó para que podamos arreglarlo para los futuros usuarios..." + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "No es lo que estaba buscando" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "¿Que has estado buscando?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "%s no funciona como esperaba" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "¿Qué esperas?" + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Debug Freemius" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "No sé qué es cURL o cómo instalarlo, ¡ayúdame!" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "Nos aseguraremos de ponernos en contacto con tu empresa de alojamiento web y resolver el problema. Recibirás un correo electrónico de seguimiento a %s tan pronto tengamos una actualización." + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Genial, por favor instala cURL y habilítalo en el archivo php.ini. Además, busca la directiva 'disable_functions' en el archivo php.ini y quita cualquier método que comienza con 'curl_'. Para asegurarte de que se activó con éxito, utiliza 'phpinfo()'. Una vez activado, desactiva el %s y reactívalo de nuevo." + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Vamos, adelante" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "No - sólo desactivar" + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Oops" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "¡Gracias por darnos la oportunidad de arreglarlo! Acabamos de enviar un mensaje a nuestro personal técnico. Nos pondremos en contacto contigo tan pronto como tengamos una actualización de %s. Apreciamos tu paciencia." + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s no se puede ejecutar sin %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s no se puede ejecutar sin el plugin." + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Error inesperado del API. Pónte en contacto con el autor de %s indicándole el siguiente error." + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "La versión Premium %s ha sido activada con éxito." + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "W00t" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "Tienes una licencia %s." + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Vaya" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "la prueba gratuita de %s fue cancelada con éxito. Puesto que el complemento es sólo premium se desactivó automáticamente. Si quieres utilizarlo en el futuro, deberás comprar una licencia." + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s es un complemento único de premium. Tienes que comprar una licencia primero antes de activar el plugin." + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "Más información sobre %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "Comprar licencia" + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "Recibirás un correo de activación para %s en tu buzón en %s. Por favor, asegúrate de hacer clic en el botón de activación en ese correo electrónico para %s." + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "comenzar el período de prueba" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "completar la instalación" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "Estás a sólo un paso - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "Completar la activación de \"%s\" ahora" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "Hemos realizado algunas optimizaciones al %s, %s" + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "¡Inscribirte para hacer \"%s\" Mejor!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "La actualización de %s se completó con éxito." + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Complemento" + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "Plugin" + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Tema" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "No podemos encontrar tu dirección de correo electrónico en el sistema, ¿estás seguro de que es la dirección de correo electrónico correcta?" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "No vemos ninguna licencia activa asociada a esa dirección de correo electrónico, ¿estás seguro de que es la dirección de correo electrónico correcta?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "La cuenta está pendiente de activación" + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "%s activación se completó con éxito." + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Tu cuenta se ha activado correctamente con el plan %s." + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "Tu versión de prueba se ha iniciado con éxito." + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "No se puede activar %s." + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Por favor contáctanos con el siguiente mensaje:" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Actualizar" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Comenzar el período de prueba" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Precio" + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Afiliación" + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "Cuenta" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Contáctanos" + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Complementos" + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Precio" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Foro de soporte" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Tu email ha sido verificado correctamente - ¡Eres IMPRESIONANTE!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Bien hecho" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Tu complemento %s del plan se actualizó con éxito." + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "El complemento %s ha sido comprado correctamente." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Descargar la última versión" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Tu servidor está bloqueando el acceso a la API de Freemius, que es crucial para la sincronización de licencia %1s. Por favor, ponte en contacto con tu host para que lo añadan a su lista blanca %2s" + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Error recibido del servidor:" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "Parece que uno de los parámetros de autenticación es incorrecto. Actualiza tu clave pública, clave secreta e ID de usuario e inténtelo de nuevo." + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "Hmm" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "Parece que todavía estás en el plan %s. Si actualizaste o cambiaste tu plan, probablemente sea un problema de nuestra parte - lo sentimos." + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Período de Prueba Gratuito" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "He actualizado mi cuenta, pero cuando intento sincronizar la licencia, el plan sigue siendo %s." + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Contacta aquí con nosotros" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Tu plan se actualizó con éxito." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Tu plan se cambió correctamente a %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Tu licencia ha caducado. Puedes seguir usando el plan gratuito %s para siempre." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Tu licencia ha caducado. %1$sActualiza ahora %2$s para continuar usando el %3$s sin interrupciones." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "Tu licencia ha sido cancelada. Si crees que es un error, ponte en contacto con el servicio de asistencia." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Tu licencia ha caducado. Todavía puedes seguir usando todas las funciones de %s, pero tendrás que renovar tu licencia para seguir recibiendo actualizaciones y soporte." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "Tu período de prueba ha caducado. Todavía puedes seguir usando todas nuestras funciones gratuitas." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Tu período de prueba ha caducado. %1$sActualiza ahora %2$s para continuar usando el %3$s sin interrupciones." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "Parece que la licencia no se pudo activar." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "Tu licencia fue activada correctamente." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "Parece que tu sitio actualmente no tiene una licencia activa." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "Parece que la desactivación de licencia ha fallado." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "Tu licencia fue desactivada correctamente, has vuelto al plan %s." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "O.K" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Tu plan fue degradado con éxito. Tu licencia %s plan caducará en %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Parece que estamos teniendo algún problema temporal con tu degradación de plan. Vuelve a intentarlo en unos minutos." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "Estás ejecutando %s en modo de prueba." + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "Ya utilizaste un período de prueba antes." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "El plan %s no existe, por lo tanto, no puedes comenzar un período de prueba." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "El plan %s no admite un período de prueba." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "Ninguno de los planes de %s soportan un período de prueba." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "Parece que ya no estás en modo de prueba, así que no hay nada que cancelar :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Tu prueba gratuita de %s fue cancelada con éxito." + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "Parece que estamos teniendo algún problema temporal con tu cancelación de prueba. Vuelve a intentarlo en unos minutos." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "La versión %s se ha lanzado." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "Por favor descarga %s." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "la última versión %s aquí" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "Nuevo" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Parece que tienes la última versión." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "¡Está todo listo!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "El correo de verificación se acaba de enviar a %s. Si no puedes encontrarlo después de 5 min, comprueba tu carpeta de spam." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Sitio dado de alta correctamente." + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Increíble" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "Agradecemos tu ayuda para mejorar %s y por permitirnos rastrear algunos datos de uso." + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "¡Gracias!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "No continuaremos enviando datos de uso de %s en %s a %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Comprueba tu buzón de correo, debes recibir un correo electrónico a través de %s para confirmar el cambio de propiedad. Por razones de seguridad, debes confirmar el cambio dentro de los próximos 15 min. Si no puedes encontrar el correo electrónico, comprueba tu carpeta de correo no deseado." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Gracias por confirmar el cambio de propiedad. Se envió un correo electrónico a %s para su aprobación final." + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s es el nuevo dueño de la cuenta." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Felicidades" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Lo sentimos, no podemos completar la actualización de correo electrónico. Ya hay registrado otro usuario con esa dirección de correo electrónico." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "Si deseas renunciar a la titularidad de la cuenta de %s a %s haz clic en el botón de cambio de titularidad." + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Cambiar propietario" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Se actualizó correctamente tu correo electrónico. Recibirás un correo electrónico con las instrucciones de confirmación en unos momentos." + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Por favor, dinos tu nombre completo." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Tu nombre fue actualizado correctamente." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "Has actualizado correctamente tu %s." + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Sólo déjanos informarte que la información de complementos de %s se está extrayendo de un servidor externo." + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Atención" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Hey" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "¿Qué te pareció %s hasta ahora? Prueba todas nuestras funciones premium de %s con una prueba gratuita de % d-días." + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "Sin compromiso por %s días - ¡cancelar en cualquier momento!" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "No se necesita tarjeta de crédito" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Comenzar el período de prueba gratuito" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Hey, ¿sabías que %s tiene un programa de afiliados? ¡Si te gusta %s puedes convertirte en nuestro embajador y ganar dinero!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Saber más" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Activar licencia" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Cambiar licencia" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Darse de baja" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Inscribirse" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Por favor, sigue estos pasos para completar la actualización" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Descargar la última versión %s" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Cargar y activar la versión descargada" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "¿Cómo subirlo y activarlo?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sClick aquí %s para elegir los sitios sobre los que te gustaría activar la licencia." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "La instalación automática sólo funciona para usuarios que aceptaron." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "Id de módulo no válido." + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Versión premium ya activa." + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "No tienes una licencia válida para acceder a la versión premium." + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "El plugin es un \"Serviceware\" lo que significa que no tiene una versión de código premium." + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Versión del complemento premium ya instalada." + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "Ver las funciones de pago" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "¡Muchas gracias por utilizar %s y sus complementos!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "¡Muchas gracias por utilizar %s!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "Ya has optado por nuestro seguimiento de uso, lo que nos ayuda a seguir mejorando %s." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "¡Muchas gracias por utilizar nuestros productos!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "Ya has optado por nuestro seguimiento de uso, lo que nos ayuda a seguir mejorando." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%s y sus complementos" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Productos" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "Si" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "envíame actualizaciones de seguridad y nuevas funcionalidades, contenido educativo y ofertas." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "No" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "%sNO%s me envíes actualizaciones de seguridad y nuevas funcionalidades, contenido educativo y ofertas." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Debido a la nueva %s Regulación General de Protección de Datos de la UE (GDPR)%s los requisitos de conformidad nos requieren que nos debes dar tu consentimiento explícito, de nuevo, confirmando que estás de acuerdo 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Indica si deseas que te contactemos para actualizaciones de seguridad y nuevas funciones, contenido educativo y ofertas ocasionales:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "La clave de licencia está vacía." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%s Renueva tu licencia ahora %s para acceder a la versión %s seguridad y nuevas características y soporte." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Instalando plugin: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "No es posible conectarse al sistema de archivos. Por favor, confirma tus credenciales." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "El paquete de plugin remoto no contiene una carpeta con el Slug deseado y el cambio de nombre no funcionó." + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Comprar" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Comenzar mi período gratuito de %s" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Instalar la versión gratuita ahora" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Instalar ahora" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Descargar la última versión gratuita" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "Descargar la última" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Instalar la actualización gratuita ahora" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Instalar actualización ahora" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Versión gratuita más reciente (%s) instalada" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Versión más reciente (%s) instalada" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "Última versión gratuita instalada" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Última versión instalada" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Descripción" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Instalación" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Capturas de pantalla" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Registro de cambios" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Valoraciones" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Otras notas" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Características y precios" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Instalar plugin" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "Plan %s" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "El mejor" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Mensual" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Anual" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "Permanente" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "Facturado %s" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Anualmente" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Una vez" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Licencia para un único sitio" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Licencias ilimitadas" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "Hasta %s sitios" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "me" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "año" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Precio" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Guardar %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "Sin compromiso para %s - cancelar en cualquier momento" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "Después de su período gratuito %s, pague sólo %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Detalles" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "Versión" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Autor" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Última actualización" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "hace %s" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Necesita la versión de WordPress" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s o mayor" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatible hasta" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Descargado" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "% vez" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s veces" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "Página del plugin en WordPress.org" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Página web del plugin" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Donar a este plugin" + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Calificación media" + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "basado en %s" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s calificación" + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s calificaciones" + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%s estrella" + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s estrellas" + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Haz clic para ver los comentarios con una valoración de %s" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Colaboradores" + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Atencion" + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "Este plugin no ha sido probado con tu versión actual de WordPress." + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "Este puglin no ha sido marcado como compatible con tu versión de WordPress." + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "El complemento de pago se debe implementar en Freemius." + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "El complemento debe implementarse en WordPress.org o en Freemius." + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Degradando tu plan detendrás inmediatamente todos los pagos recurrentes futuros y tu licencia del plan %s expirará en %s." + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "La cancelación del período de prueba bloqueará inmediatamente el acceso a todas las funciones premium. ¿Estás seguro?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "Todavía puedes disfrutar de todas las funciones de %s pero no tienes acceso a soporte y actualizaciones de %s." + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Una vez que caduque tu licencia todavía puedes utilizar la versión gratuita pero NO tendrás acceso a las funciones de %s." + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Activar plan %s" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Auto renovaciones en %s" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Caduca en %s" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Sincronizar licencia" + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Cancelar período de prueba" + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Cambiar Plan" + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Actualizar" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Degradar" + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "Gratis" + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Activar" + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Plan" + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Período de prueba gratuito" + +#: templates/account.php:165 +msgid "Account Details" +msgstr "Detalles de la cuenta" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "La eliminación de la cuenta desactivará automáticamente su licencia de plan %s para que pueda utilizarla en otros sitios. Si también desea cancelar los pagos periódicos, haga clic en el botón \"Cancelar\" y, en primer lugar, \"Degradar\" su cuenta. ¿Seguro que deseas continuar con la eliminación?" + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "La eliminación no es temporal. Sólo elimínalo si ya no deseas utilizar este %s más. ¿Estás seguro que desea continuar con la eliminación?" + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Borrar cuenta" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Desactivar licencia" + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "¿Estás seguro que quieres proceder?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Cancelar suscripción" + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Sincronizar" + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "Nombre" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "Correo electrónico" + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "ID de usuario" + +#: templates/account.php:274 +msgid "Site ID" +msgstr "ID del sitio" + +#: templates/account.php:277 +msgid "No ID" +msgstr "Sin ID" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Clave pública" + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Clave secreta" + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "Sin clave secreta" + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Período de prueba gratuito" + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "Clave de licencia" + +#: templates/account.php:359 +msgid "not verified" +msgstr "no verificado" + +#: templates/account.php:416 +msgid "Premium version" +msgstr "Versión premium" + +#: templates/account.php:418 +msgid "Free version" +msgstr "Versión gratuita" + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Verificar correo electrónico" + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Descargar versión %s" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Mostrar" + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "¿Cual es tú %s?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Editar" + +#: templates/account.php:490 +msgid "Sites" +msgstr "Sitios" + +#: templates/account.php:501 +msgid "Search by address" +msgstr "Buscar por dirección" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "Dirección" + +#: templates/account.php:512 +msgid "License" +msgstr "Licencia" + +#: templates/account.php:513 +msgid "Plan" +msgstr "Plan" + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "Licencia" + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Ocultar" + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Al desactivar tu licencia todas las características premium se bloquearán, pero posibilitará poder activar tu licencia en otro sitio. ¿Estás seguro que quieres continuar?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Complementos para %s" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "No podemos cargar la lista de complementos. Probablemente es un problema por nuestro parte, por favor inténtalo de nuevo en unos minutos." + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "Ver detalles" + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Descartar" + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s seg" + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Instalación automática" + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "Una descarga automatizada y la instalación de %s (versión de pago) de %s comenzará en %s. Si quieres hacerlo manualmente - haz clic en el botón de cancelación." + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "El proceso de instalación ha comenzado y puede tardar unos minutos en completarse. Por favor, espera hasta que se finalice - no actualices esta página." + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Cancelar instalación" + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Pagar" + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "Compatible con PCI" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "Hey %s," + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Permitir y continuar" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Reenviar correo electrónico de activación" + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "¡Gracias %s!" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "De acuerdo y activar licencia" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "¡Gracias por comprar %s! Para empezar, escribe tu clave de licencia:" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "No te pierdas ninguna actualización importante - acepta para notificaciones de seguridad y de actualizaciones, ofertas y seguimiento de diagnóstico con datos no sensibles con %4$s." + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "No te pierdas ninguna actualización importante - acepta para notificaciones de seguridad y de actualizaciones y seguimiento de diagnóstico con datos no sensibles con %4$s." + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "No te pierdas ninguna actualización importante - acepta las notificaciones de seguridad y de actualizaciones, contenido educacional, ofertas y seguimiento de diagnóstico con datos no sensibles con %4$s. ¡Si te saltas esto, no pasa nada! %1$s seguirá funcionando bien." + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "No te pierdas ninguna actualización importante - acepta las notificaciones de seguridad y de actualizaciones y seguimiento de diagnóstico con datos no sensibles con %4$s. ¡Si te saltas esto, no pasa nada! %1$s seguirá funcionando bien." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "Estamos emocionados de introducir la integración de Freemius a nivel de red." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "Durante el proceso de actualización hemos detectado%d sitio(s) que aún están pendientes de la activación de licencia." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "Si quieres utilizar %s en estos sitios, introduce por favor tu clave de licencia abajo y haz click en el botón de activación." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%s características de pago" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Alternativamente, puedes saltarlo ahora y activar la licencia después, en tu %s página de cuenta a nivel de red." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "Durante el proceso de actualización detectamos %s sitio(s) en la red que todavía están pendientes de tu atención." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "Clave de licencia" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "¿No puedes encontrar tu clave de licencia?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Saltar" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Delegar a administradores del sitio" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "Si haces click, esta decisión será delegada a los administradores de los sitios." + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "Resumen del perfil" + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "Nombre y dirección de correo electrónico" + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "Resumen del sitio" + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "URL del sitio web, versión de WP, PHP info, plugins y temas" + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Avisos de administración" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Actualizaciones, anuncios, marketing, sin spam" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Eventos de %s actuales" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "Activación, desactivación y desinstalación" + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Boletín" + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "%1$s periódicamente enviará datos a %2$s para comprobar las actualizaciones de seguridad, nuevas funcionalidades y verificar la validez de tu licencia." + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "¿Qué permisos se otorgan?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "¿No tienes una clave de licencia?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Activar versión gratuita" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "¿Tienes una clave de licencia?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "Política de privacidad" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "Términos de servicio" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "Enviando correo electrónico" + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Activando" + +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contacto" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Apagado" + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "Encendido" + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Depurando" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "Acciones" + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "¿Está seguro que desea eliminar todos los datos de Freemius?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Borrar todas las cuentas" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "Borrar caché de la API" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Borrar transients de actualizaciones" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Sincronizar datos desde el servidor" + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Cargar opción de BD" + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Guardar opción en BD" + +#: templates/debug.php:170 +msgid "Key" +msgstr "Clave" + +#: templates/debug.php:171 +msgid "Value" +msgstr "Valor" + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "Versiones SDK" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "Ruta del SDK" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Ruta del módulo" + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "Está activo" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Plugins" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Temas" + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Ruta" + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "Título" + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "Estado Freemius" + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Blog de red" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Usuario de red" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "Conectado" + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "Bloqueado" + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simular período de prueba" + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simular actualización de red" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s Instalaciones" + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Sitios" + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "ID del blog" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Borrar" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Complementos del módulo %s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "Usuarios" + +#: templates/debug.php:479 +msgid "Verified" +msgstr "Verificado" + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licencias" + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "ID del plugin" + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "ID del plan" + +#: templates/debug.php:518 +msgid "Quota" +msgstr "Cuota" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "Activado" + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Bloqueando" + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Caducidad" + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Log de Debug" + +#: templates/debug.php:549 +msgid "All Types" +msgstr "Todos los Tipos" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "Todas las peticiones" + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "Archivo" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "Función" + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "ID del proceso" + +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "Mensaje" + +#: templates/debug.php:567 +msgid "Filter" +msgstr "Filtro" + +#: templates/debug.php:575 +msgid "Download" +msgstr "Descarga" + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Tipo" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Timestamp" + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Página segura HTTPS %s, desde un dominio externo" + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Soporte" + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "API Freemius" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Peticiones" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Actualizar" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Facturación" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Nombre de la empresa" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "Tax / Núm IVA" + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Línea de la dirección %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "Ciudad" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "Municipio" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "Código postal" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "País" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Seleccionar país" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "Estado" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "Provincia" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Pagos" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Fecha" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Cantidad" + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Factura" + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Método" + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Código" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Longitud" + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Ruta" + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Cuerpo" + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Resultado" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Inicio" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "Fin" + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "En %s" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "hace %s" + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "seg" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Sincronizar plugins y temas" + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Total" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Último" + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Crons programados" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Módulo" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Tipo de módulo" + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Tipo de cron" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Siguiente" + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Sin caducidad" + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Aceptar para hacerse afiliado" + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "¡Tu aplicación al programa de afiliación para %s ha sido aceptada! Entra en tu área de afiliado desde: %s." + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Gracias por aplicar a nuestro programa de afiliados, revisaremos tu petición durante los próximos 14 días y te volveremos a contactar con información adicional." + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Tu cuenta de afiliado ha sido suspendida temporalmente." + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Gracias por aplicar a nuestro programa de asociados, infortunadamente, de momento hemos decidido rechazar tu petición. Por favor, prueba de nuevo en 30 días." + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Debido a la violación de nuestros términos de afiliados, hemos decidido bloquear temporalmente tu cuenta de afiliación. Si tienes alguna pregunta, por favor contacta nuestro soporte." + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "¿Te gusta %s? Conviértete en nuestro embajador y gana dinero ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "¡Envíanos nuevos usuarios a nuestro %s y gana %s de comisión en cada venta satisfactoria que nos hayas referido!" + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Sumario del programa" + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%s comisión cuando un cliente compra una nueva licencia." + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Obtén comisiones por renovaciones automatizadas de las suscripciones." + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s tracking cookie después de la primera visita para maximizar las ganancias potenciales." + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Comisiones Ilimitadas" + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%s cantidad mínima a pagar." + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Los pagos son en USD y se procesan mensualmente por medio de PayPal." + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "Como aplazamos 30 días para posible devoluciones, sólo pagamos comisiones que son de más de 30 días." + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Afiliado" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "Dirección de correo electrónico" + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Nombre completo" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "Dirección de correo electrónico de PayPal" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "¿Dónde vas a promocionar %s?" + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Introduce el dominio de tu sitio web o de otros sitios web donde planeas promocionar %s." + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Añadir otro dominio" + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Dominios extra" + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Dominios extra desde donde promocionarás el producto." + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Métodos de promoción" + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Social media (Facebook, Twitter, etc.)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Apps móviles " + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Sitio web, correo electrónico y estadísticas de social media (opcional)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Siéntete libre de proporcionarnos estadísticas de tu sitio web o social media, p.ej. visitas únicas mensuales, número de suscriptores de correo electrónico, seguidores, etc. (mantendremos esta información confidencial)" + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "¿Como nos promocionarás?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Por favor, danos detalles de como pretendes promocionar %s (por favor, se lo más específico que puedas)" + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Cancelar" + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Hacerse afiliado" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Por favor, introduce la clave de licencia que recibiste en el correo electrónico al realizar la compra:" + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Activar licencia" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Darse de baja" + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Inscribirse" + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "El uso del seguimiento se hace con la intención de mejorar %s. Crear una mejor experiencia de usuario, priorizando nuevas características y cosas mejores. Realmente apreciaríamos que considerases permitirnos continuar con el seguimiento." + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "Haciendo clic en \"Desistir\", ya no enviaremos los datos de %s a %s." + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "Hay una nueva versión de %s disponible." + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%s Renueva tu licencia ahora %s para acceder a la versión %s seguridad y nuevas características y soporte." + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "Nueva versión disponible" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Renovar la licencia" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Descartar" + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Enviar clave de licencia" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Escribe abajo la dirección de correo electrónico que has usado para la actualización y te reenviaremos la clave de licencia." + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "Estás a sólo 1-click de comenzar tu %1$s días de prueba gratuita del plan %2$s." + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "Para el cumplimiento de las directrices de WordPress.org, antes de empezar el período de prueba te pedimos que aceptes con tu usuario e información no sensible del sitio web, permitiendo a %s enviar datos periódicamente a %s para comprobar si hay actualizaciones de versión y para validar la versión de prueba." + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Activar licencia en todos los sitios de la red" + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Aplicar en todos los sitios de la red" + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Aplicar licencia en todos los sitios pendientes" + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Aplicar en todos los sitios pendientes" + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "permitir" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "delegar" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "saltar" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Click para ver la captura de pantalla a tamaño completo %d" + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Actualizaciones Ilimitadas" + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Localhost" + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "quedan %s" + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Última licencia" + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Cancelado" + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Caducado" + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "Sin caducidad" + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Activar este complemento" + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Nombre del propietario" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "Correo electrónico del propietario" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "ID del propietario" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Suscripción" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Disculpa las molestias y estamos aquí para ayudarte si nos das una oportunidad." + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Contactar soporte" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Comentarios anónimos" + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Desactivar" + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Activar %s" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Comentarios rápidos" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "Si tienes un momento, por favor, dinos por qué estás desactivando %s" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "desactivando" + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "cambiando" + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Enviar y %s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "Por favor, dínos la razón para que podamos mejorar." + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Si - %s" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Saltar y %s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Haz click aquí para utilizar el plugin de forma anónima" + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "Es posible que te lo hayas perdido, pero no tienes que compartir ningún dato y puedes solo aceptar %s." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe5435185cca1070c42b1266669861a7ac99bcb7 GIT binary patch literal 52553 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 BZlVAH literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.po new file mode 100644 index 000000000..6aa3c6f9a --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-fr_FR.po @@ -0,0 +1,2299 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +# Boris Colombier <transifex.com@wba.fr>, 2018 +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-24 15:20+0000\n" +"Last-Translator: Boris Colombier <transifex.com@wba.fr>\n" +"Language: fr_FR\n" +"Language-Team: French (France) (http://www.transifex.com/freemius/wordpress-sdk/language/fr_FR/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Le SDK Freemius ne trouve pas le fichier principal du plugin. Merci de contacter sdk@freemius.com en indiquant l'erreur." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Erreur" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "J'ai trouvé un meilleur %s" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "Quel est le nom du %s ?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "C'est une %s temporaire. Je corrige un problème." + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Désactivation" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Changement de Thème" + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Autre" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "Je n'ai plus besoin du %s" + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "Je n'ai besoin de %s que pour une courte période" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "Le %s a cassé mon site" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "Le %s a soudainement arrêté de fonctionner" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "Je ne peux plus payer pour ça" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "Quel prix seriez-vous prêt à payer ?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "Je ne veux pas partager mes informations avec vous" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "Le %s n'a pas fonctionné" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "Je ne comprends pas comment le faire fonctionner" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "Le %s est bien mais j'ai besoin de fonctionnalités spécifiques que vous ne proposez pas" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "Quelle fonctionnalité ?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "Le %s ne fonctionne pas" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Merci de nous indiquer ce qui ne fonctionne pas afin que nous puissions le corriger pour les futurs utilisateurs..." + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "Ce n'est pas ce que je recherche" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "Que recherchez-vous ?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "Le %s n'a pas fonctionné comme prévu" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "À quoi vous attendiez-vous ?" + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Débuggage Freemius" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "Je ne sais pas ce qu'est cURL ou comment l'installer, aidez moi !" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "Nous allons contacter votre hébergeur afin de résoudre le problème. Vous recevrez un email à propos de %s dès que nous aurons des nouvelles." + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Parfait, merci d'installer cURL et de l'activer dans votre fichier php.ini. De plus, recherchez l'instruction 'disable_functions' de votre fichier php.ini et désactivez les commandes commençant par 'curl_'. Pour vérifier la bonne activation, utilisez la fonction 'phpinfo()'. Une fois activé, désactivez le %s et réactivez le à nouveau." + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Oui - allez-y" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "Non - désactivation seulement" + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Oups" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Merci de nous permettre de corriger ça. Un message vient d'être envoyé à notre service technique. Nous reviendrons vers vous dès que nous aurons des nouvelles à propos de %s." + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s ne peut pas fonctionner sans %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s ne peut pas fonctionner sans le plugin." + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Une erreur est survenue dans l'API. Merci de contacter l'auteur du %s en lui indiquant l'erreur." + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "La version premium de %s a été activée avec succès." + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "Génial" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "Vous avez une license pour %s." + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Youpi" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "La période d'essai du %s a bien été annulé. L'add-on a été désactivé car il ne fonctionne qu'avec la version premium. Si vous souhaitez l'utiliser ultérieurement, vous devrez acheter une licence." + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%sest un add-on pour la version premium. Vous devez acheter une licence avant d'activer le plugin." + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "Plus d'informations à propos de %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "Acheter une licence" + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "Vous devriez recevoir un email d'activation pour %s sur votre boîte %s. Merci de cliquer sur le bouton d'activation dans l'email pour %s." + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "commencer la période d'essai" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "compléter l'installation" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "Il ne reste qu'une étape - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "Compléter \"%s\" Activer Maintenant" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "Nous avons fait quelques modifications au %s, %s" + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Cochez la case pour améliorer \"%s\"" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "La mise à jour du %s s'est terminée avec succès " + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Add-On" + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "Plugin" + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Thème" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "Nous ne trouvons pas votre adresse mail dans notre système, êtes-vous qu'il s'agit de la bonne adresse ?" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "Nous ne trouvons aucune licence active associée avec cette adresse email, êtes-vous qu'il s'agit de la bonne adresse ?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Compte en cours d'activation." + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "L'activation de %s s'est terminée avec succès." + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Votre compte a été activé avec succès avec la formule %s." + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "Votre période d'essai a bien démarré." + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "Impossible d'activer %s." + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Merci de nous contacter avec le message suivant :" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Mise à jour" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Essai gratuit" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Tarifs" + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Affiliation" + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "Compte" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Contactez Nous" + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Add-Ons" + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Tarifs" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Forum de Support" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Votre email a été vérifié avec succès - vous êtes FORMIDABLE !" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Directement" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Votre Add-on %s a bien été mis à jour." + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "L'Add-on %s a bien été acheté." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Télécharger la dernière version" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Votre serveur bloque l'accès à l4API Freemius qui est indispensable pour la synchronisation %1s. Merci de contacter votre hébergeur pour mettre %2s dans la liste blanche " + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Une erreur a été reçu depuis le serveur :" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "Il semble que l'un des paramètres d'authentification soit faux. Veuillez mettre à jour votre Public Key, votre Secret Key ainsi que vote User ID et essayez à nouveau." + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "Hmm" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "Il semble que vous soyez encore sur la formule %s. Si vous avez mis à jour ou changer vote formule, le problème est probablement de votre côté - désolé." + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Période d'essai" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "J'ai mis à jour mon compte mais quand j'essaie de synchroniser la licence, la formule est toujours %s." + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Merci de nous contacter ici" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Votre formule a bien été mise à jour." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Votre formule a bien été modifié vers %s. " + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Votre licence a expiré. Vous pouvez toujours utiliser la version gratuite indéfiniment." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Votre licence a expiré.%1$sFaites la mise à jour maintenant%2$s pour continuer à utiliser le %3$s sans interruption." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "Votre licence a été annulé. Si vous pensez qu'il s'agit d'une erreur, merci de contacter le support." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Votre licence a expiré. Vous pouvez toujours utiliser les fonctionnalités %s mais vous devrez renouveler votre licence pour recevoir les mises à jour et une assistance." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "Votre période d'essai gratuite est terminée. Vous pouvez continuer à utiliser toutes nos fonctionnalités gratuites." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Votre période d'essai gratuite est terminée. %1$sFaites la mise à jour maintenant%2$s pour continuer à utiliser le %3$s sans interruption." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "Il semble que la licence ne puisse être activée." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "Votre licence a bien été activée." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "Il semble que votre site n'ait pas de licence active." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "Il semble que la désactivation de la licence a échoué." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "Votre licence a bien été désactivé, vous utilisez à présent la formule %s." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "O.K" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "La formule a bien été rétrogradé. La licence de votre formule expirera dans %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Il semble que nous ayons un problème temporaire pour rétrograder votre formule. Merci de réessayer dans quelques minutes." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "Vous utilisez déjà le %s en période d'essai. " + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "Vous avez déjà utilisé la période d'essai." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "La formule %s n'existe pas, il n'est pas possible de commencer une période d'essai." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "La formule %s ne propose pas de période d'essai." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "Aucune formule du %s ne propose de période d'essai." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "Il semble que vous ne soyez plus en période d'essai donc il n'y a rien à annuler :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Votre période d'essai %s a bien été annulé." + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "Il semble que nous ayons un problème temporaire pour annuler votre période d'essai. Merci de réessayer dans quelques minutes." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "La version %s vient d'être publiée." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "Merci de télécharger %s." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "la dernière version de %s ici" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "Nouveau" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Il semble que vous ayez la dernière version." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "Vous êtes tout bon !" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "Un email de vérification vient d'être envoyé sur %s. Si vous ne le recevez pas d'ici 5 minutes, merci de vérifier dans vos spams." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Site ajouté avec succès." + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Formidable" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "Nous vous remercions de votre aide pour améliorer le %s en nous permettant de recevoir des informations concernant son usage." + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "Merci !" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "Nous n'enverrons plus d'information d'utilisation de %s sur %s à %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Merci de vérifier votre messagerie, vous devriez recevoir un email via %s pour confirmer le changement de propriétaire. Pour des raisons de sécurité, vous devez confirmer le changement dans les prochaines 15 minutes. Vérifiez vos spams si vous ne recevez pas le message." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Merci pour la confirmation du changement de propriétaire. Un email vient d'être envoyé à %s pour la validation finale." + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s est le nouveau propriétaire du compte." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Félicitations" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Désolé, nous ne pouvons pas mettre à jour l'email. Il existe déjà un autre utilisateur avec cette adresse." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "Si vous voulez transférer la propriété du compte de %s à %s cliquez sur le bouton Changement De Propriétaire" + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Changement De Propriétaire" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Votre email a été mis à jour. Vous allez recevoir un message avec les instructions de confirmation." + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Merci d'indiquer vos prénom et nom." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Votre nom a été mis à jour." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "Votre %s a bien été mis à jour." + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Sachez que les informations de l'add-ons de %s sont issus d'un serveur externe." + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Avertissement" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Hey" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "Que pensez-vous de %s ? Testez nos %s fonctionnalités premium avec %d jours d'essai gratuit." + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "Pas d'engagement durant %s jours - annuler quand vous voulez !" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "Pas besoin de carte bancaire" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Commencer l'essai gratuit" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Dites, savez-vous que %s propose un système de affiliation ? Si vous aimez le %s vous pouvez devenir notre ambassadeur et gagner de l'argent !" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "En savoir plus" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Activer la licence" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Changer la licence" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Désinscription" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Inscription" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Merci de suivre ces étapes pour finaliser la mise à jour" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Télécharger la dernière version %s" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Téléverser et activer la version téléchargée" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "Comment téléverser et activer ?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sCliquez ici %s pour choisir les sites sur lesquels vous souhaitez activer la licence." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "L'installation automatique ne fonctionne que pour les utilisateurs qui se sont inscrits." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "ID du module non valide." + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Version premium déjà active." + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "Vous n'avez pas de licence valide pour accéder à la version premium." + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Le plugin est un \"Serviceware\" ce qui veut dire qu'il n'a pas de version premium de code." + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "La version premium de l'add-on est déjà installée." + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "Voir les fonctionnalités payantes" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Merci beaucoup d'utiliser %s et ses add-ons !" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "Merci beaucoup d'utiliser %s !" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "Vous avez déjà validé notre suivi d'utilisation qui nous permet de continuer à améliorer le %s." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "Merci beaucoup d'utiliser nos produits !" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "Vous avez déjà validé notre suivi d'utilisation qui nous permet de continuer à les améliorer." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%s et ses add-ons" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Produits" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "Oui" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "envoyez moi des mises à jour de sécurité et des fonctionnalités, du contenu instructif et des offres." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "Non" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "ne %sPAS%s m'envoyer de mises à jour de sécurité ou de fonctionnalités, ni de contenu instructif, ni d'offre." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Suite au exigences de conformité du %sRèglement européen Général sur la Protection des Données (GDPR)%s il est nécessaire que vous donniez, à nouveau, votre consentement explicite pour confirmer que vous êtes avec nous 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Merci de nous indiquer si vous souhaitez que nous vous contactions pour les mises à jour de sécurité et de fonctionnalités, du contenu instructif et des offres spéciales :" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "La clé de licence est vide." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%s Renouveler votre licence maintenant %s pour accéder aux mise à jour de sécurité et de fonctionnalités de la version %s ainsi qu'au support." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Installation du plugin : %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Impossible de se connecter au système de fichiers. Merci de confirmer vos autorisations." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "Le package du plugin à télécharger ne contient pas de dossier avec le bon slug et iln'a pas été possible de le renommer." + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Acheter" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Commencer ma %s gratuite" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Installer la version gratuite maintenant" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Installer maintenant" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Télécharger la dernière version gratuite" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "Télécharger la dernière version" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Installer la dernière mise à jour gratuite maintenant" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Installer la mise à jour maintenant" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "La nouvelle version gratuite ( %s ) a été installé" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Nouvelle Version (%s) Installée" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "La dernière version gratuite a été installé" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Dernière Version Installée" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Description" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installation" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Captures d'écran" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Changelog" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Commentaires" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Autres Informations" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Fonctionnalités & Tarifs" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Installation du Plugin" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "Formule %s" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "Best" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Mensuel" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Annuel" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "À vie" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "%s Facturé" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Annuel" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Une fois" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Licence 1 site" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Licences sites illimités" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "Jusqu'à %s Sites" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "mois" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "année" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Tarif" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Économisez %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "Pas d'engagement durant %s - annuler quand vous voulez" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "Après vos %s gratuits, payez seulement %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Détails" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "Version" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Auteur" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Dernière mise à jour" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "Il y a %s" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Version de WordPress requise" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s ou plus" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatible jusqu'à" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Téléchargé" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "%s fois" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s fois" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "Page WordPress.org du plugin" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Site Web du plugin" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Faire une donation pour ce plugin" + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Note moyenne" + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "Basé sur %s" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s notation" + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%snotations " + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%s étoile" + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s étoiles" + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Cliquez pour voir les avis avec une notation de %s" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Contributeurs" + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Attention" + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "Ce plugin n'a pas été testé avec votre actuelle version de WordPress" + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "Ce plugin n'a pas été indiqué comme étant compatible avec votre version actuelle de WordPress" + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Les add-ons payant doivent être déposés sur Freemius" + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "Les add-ons doivent être déposés sur WordPress.org ou Freemius." + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Rétrograder votre formule arrêtera immédiatement tous les futurs paiements récurrents et votre licence de la formule %s expirera dans %s." + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "Annuler la période d'essai va immédiatement bloquer les fonctionnalités premium. Souhaitez-vous continuer ?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "Vous pouvez toujours bénéficier de toutes les fonctionnalités %s mais vous n'aurez pas accès aux mises à jour et au support %s." + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Une fois la licence expirée vous pourrez toujours utiliser la version gratuite mais vous n'aurez PAS accès aux fonctionnalités de %s." + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Activer la formule %s" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Renouvellements automatique dans %s" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Expire dans %s" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Synchroniser la licence" + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Annuler la période d'essai" + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Changer de formule" + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Mise à jour" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Rétrograder" + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "Gratuit" + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Activer" + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Formule" + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Essai gratuit" + +#: templates/account.php:165 +msgid "Account Details" +msgstr "Détails du compte" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "Supprimer le compte désactivera automatiquement la licence de votre formule %s afin que vous puissiez l'utiliser sur d'autres sites. Si vous voulez aussi annuler le paiement récurrent, cliquez sur le bouton \"Annuler\" et commencez par \"Rétrograder\" votre compte. Êtes-vous sûr de vouloir poursuivre la suppression ? " + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "La suppression est permanente. Ne faites cette suppression que si vous ne souhaitez plus utiliser le %s. Êtes-vous sûr de vouloir poursuivre la suppression ?" + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Supprimer le compte" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Désactiver la licence" + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "Êtes-vous de vouloir continuer ?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Annuler l'abonnement" + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Synchroniser" + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "Nom" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "Email" + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "User ID" + +#: templates/account.php:274 +msgid "Site ID" +msgstr "Site ID" + +#: templates/account.php:277 +msgid "No ID" +msgstr "ID manquant" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Clef publique" + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Clef secrête" + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "Clef secrète manquante" + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Période d'essai" + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "Clef de licence" + +#: templates/account.php:359 +msgid "not verified" +msgstr "Non vérifié" + +#: templates/account.php:416 +msgid "Premium version" +msgstr "Version premium" + +#: templates/account.php:418 +msgid "Free version" +msgstr "Version gratuite" + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Vérifier l'email" + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Télécharger la version %s" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Afficher" + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "Quel est votre %s ?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Éditer" + +#: templates/account.php:490 +msgid "Sites" +msgstr "Sites" + +#: templates/account.php:501 +msgid "Search by address" +msgstr "Recherche par adresse" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "Adresse" + +#: templates/account.php:512 +msgid "License" +msgstr "Licence" + +#: templates/account.php:513 +msgid "Plan" +msgstr "Formule" + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "Licence" + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Cacher" + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Désactiver la licence bloquera toutes les fonctionnalités premium mais vous permettra d'activer la licence sur un autre site. Êtes-vous sûr de vouloir continuer ?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Add Ons pour %s" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "Nous n'avons pas pu charger la liste des add-ons. C'est probablement une difficulté de notre côté, merci de d'essayer à nouveau dans quelques minutes." + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "Voir les détails" + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Fermer" + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s sec" + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Installation automatique" + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "Un téléchargement et une installation automatique de %s (version premium) de %s va commencer dans %s. Si vous voulez le faire manuellement, cliquez sur le bouton d'annulation maintenant." + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "L'installation a commencé et peut prendre quelques minutes pour se finir. Merci de patienter jusqu'à ce qu'elle soit terminée - veuillez ne pas rafraichir cette page." + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Annuler l'installation" + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Paiement" + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "Compatible PCI" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "Hey %s," + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Autoriser & Continuer" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Renvoyer l'email d'activation" + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "Merci %s !" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "Valider & Activer la licence" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Merci d'avoir acheté %s ! Pour commencer, veuillez indiquer votre clef de licence :" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Ne ratez jamais une mise à jour importante - acceptez nos notifications de mises à jour de sécurité et de fonctionnalités, de contenu instructif, d'offres ainsi que le suivi d'activité non sensible avec %4$s." + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Ne manquez jamais une mise à jour importante - optez pour nos notifications de mises à jour de sécurité et de fonctionnalités, et un suivi diagnostique non sensible avec %4$s." + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Ne ratez jamais une mise à jour importante - acceptez nos notifications de mises à jour de sécurité et de fonctionnalités, de contenu instructif, d'offres ainsi que le suivi d'activité non sensible avec %4$s. Dans le cas contraire, pas de problème ! %1$s fonctionnera parfaitement aussi." + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Ne ratez jamais une mise à jour importante - acceptez nos notifications de mises à jour de sécurité et de fonctionnalités ainsi que le suivi d'activité non sensible avec %4$s. Dans le cas contraire, pas de problème ! %1$s fonctionnera parfaitement aussi." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "Nous sommes impatient de vous présenter l'intégration Freemius au niveau réseau." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "Durant le processus de mise à jour nous avons détecté %d site(s) toujours en attente d'activation de la licence." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "Si vous voulez utiliser le %s sur ces sites, merci d'indiquer votre clé de licence ci-dessous et de cliquer sur le bouton d'activation." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "Fonctionnalités payantes de %s" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Éventuellement, vous pouvez l'ignorer pour l'instant et activer la licence plus tard, sur votre page de compte du réseau %s." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "Durant le processus de mise à jour nous avons détecté %s site(s) dans le réseau que vous devez vérifier." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "Clef de licence" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "Vous ne trouvez pas votre clef de licence ?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Passer" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Déléguer aux administrateurs du site" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "Si vous cliquez, cette décision sera déléguée aux administrateurs des sites." + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "Résumé de votre profil" + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "Nom et adresse email" + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "Résumé de votre site" + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "Site URL, WP version, PHP info, plugins & themes" + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Notifications Administrateur" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Mises à jour, annonces, marketing, pas de spam" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Évènements du %s actuel" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "Activation, désactivation et désintallation" + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Newsletter" + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "Le %1$s va régulièrement envoyer des données à %2$s pour vérifier les mises à jour de sécurité et de fonctionnalités ainsi que pour vérifier la validité de votre licence." + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "Quelles autorisations sont accordées ?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "Vous n'avez pas de clef de licence ?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Activez la version gratuite" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "Vous avez une clef de licence ?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "Politique de confidentialité" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "Conditions générales de service" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "Email en cours d'envoi" + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Activation en cours" + +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contact" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Off" + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "On" + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Debuggage" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "Actions" + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Êtes-vous sûr de vouloir supprimer toutes les données de Freemius ?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Supprimer tous les comptes" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "Vider le cache API" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Vider les transients de mise à jour" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Synchronisation des données depuis le serveur" + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Chargement des options de la base de données" + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Mise en place des options de la base de données" + +#: templates/debug.php:170 +msgid "Key" +msgstr "Clef" + +#: templates/debug.php:171 +msgid "Value" +msgstr "Valeur" + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "Versions du SDK" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "Chemin d'accès du SDK" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Chemin d'accès du module" + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "Est actif" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Plugins" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Thèmes" + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Slug" + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "Titre" + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "État de Freemius" + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Réseau de Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Réseau d'Utilisateur" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "Connecté" + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "Bloqué" + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simuler l'essai" + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simuler la mise à jour du réseau" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s Installations" + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Sites" + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "Blog ID" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Supprimer" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Add Ons du module %s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "Utilisateurs" + +#: templates/debug.php:479 +msgid "Verified" +msgstr "Vérifié" + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licences" + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "ID du plugin" + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "ID de la formule" + +#: templates/debug.php:518 +msgid "Quota" +msgstr "Quota" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "Activé" + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Bloquant" + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Expiration" + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Debug Log" + +#: templates/debug.php:549 +msgid "All Types" +msgstr "Tous les types" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "Toutes les demandes" + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "Fichier" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "Fonction" + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "ID du processus" + +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "Message" + +#: templates/debug.php:567 +msgid "Filter" +msgstr "Filter" + +#: templates/debug.php:575 +msgid "Download" +msgstr "Téléchargement" + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Type" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Timestamp" + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Page %s sécurisée HTTPS, s'exécutant sur un domaine externe" + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Support" + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "API Freemius" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Demandes" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Mise à jour" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Facturation" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Raison sociale" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "Code TVA" + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Adresse ligne %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "Ville" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "Ville" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "Code postal" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "Pays" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Choisir le pays" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "État" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "Région" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Paiements" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Date" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Montant" + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Facture" + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Méthode" + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Code" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Longueur" + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Chemin" + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Body" + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Résultat" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Début" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "Fin" + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "Dans %s" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "Il y a %s" + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "sec" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Synchronisation des plugin et des thèmes" + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Total" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Dernier" + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Crons programmés" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Module" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Type de module" + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Type de Cron" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Suivant" + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Sans expiration" + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Postuler pour devenir un affilié" + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "Votre dossier d'affiliation pour %s a été accepté ! Identifiez-vous dans votre espace affilié sur : %s." + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Merci d'avoir postulé à notre programme d'affiliation, nous regarderons votre dossier durant les 14 prochains jours et nous reviendrons vers vous avec d'autres informations." + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Votre compte affilié a été suspendu temporairement." + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Merci d'avoir postulé à notre programme d'affiliation, malheureusement, nous avons décidé pour le moment de décliner votre dossier. Merci d'essayer à nouveau d'ici 30 jours." + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Suite à une violation de nos conditions d'affiliation, nous avons décidé de bloquer temporairement votre compte d'affilié. Si vous avez la moindre question, merci de contacter le support." + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Vous aimez %s ? Devenez notre ambassadeur et gagnez du cash ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Parrainez des nouveaux clients pour notre %s et gagnez une commission de %s sur chaque vente réussie que vous affiliez." + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Sommaire du programme" + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "Commission de %s quand un client achète une nouvelle licence." + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Obtenez des commissions pour les renouvellements automatiques d'abonnement." + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "Cookie de tracking de %s après la première visite pour maximiser les potentiels de gain." + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Commissions illimitées." + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "Montant de paiement minimum %s." + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Les paiements se font en Dollars US et sont effectués mensuellement via PayPal." + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "Comme nous bloquons sur 30 jours pour les remboursements éventuels, seules sont payées les commissions de plus de 30 jours." + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Affiliation" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "Adresse email" + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Nom complet" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "Adresse email du compte PayPal" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Où allez-vous faire la promotion du %s ? " + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Indiquez l'adresse de votre site ou d'autres sites sur lesquels vous pensez faire la promotion du %s" + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Ajouter une autre adresse" + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Adresses supplémentaires" + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Adresses supplémentaires depuis lesquelles vous ferez la promotion du produit." + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Méthodes de promotion" + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Réseaux sociaux (Facebook, Twitter, etc.)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Applications mobiles" + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Statistiques du site web, de l'adresse email et des réseaux sociaux (optionnel)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "N'hésitez pas à indiquer des statistiques pertinentes concernant votre site ou vos réseaux sociaux telles que le nombre de visiteurs mensuel, le nombre d'abonnés, de followers, etc... (C'est informations resteront confidentielles)" + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "Comment allez-vous faire de la promotion ?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Merci d'indiquer en détail comment vous allez faire la promotion du %s (en étant aussi précis que possible)" + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Annuler" + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Devenir un affilié" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Merci d'indiquer le code de licence que vous avez reçu par email juste après l'achat :" + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Mettre à jour la licence" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Désinscription" + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Inscription" + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Le suivi d'utilisation de %s nous permet de l'améliorer. Apporter une meilleure expérience pour l'utilisateur, définir quelles seront les nouvelles fonctionnalités, ce genre de choses. Aussi nous vous serions reconnaissant si vous acceptiez de nous permettre de continuer à récupérer des informations." + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "En cliquant \"Désincription\", nous n'enverrons plus d'informations de %s à %s." + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "Il y a une nouvelle version disponible de %s. " + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRenouveler votre licence maintenant%s pour accéder aux mise à jour de sécurité et de fonctionnalités de la version %s ainsi qu'au support." + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "Une nouvelle version est disponible" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Renouvelez votre licence" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Fermer" + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Envoyer le code de la licence" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Indiquez ci-dessous l'adresse email que vous avez utilisez pour la mise à jour et nous allons vous renvoyer le code de la licence." + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "Vous êtes à 1 clic de commencer votre période d'essai gratuite de %1$s jours de la formule %2$s." + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "Pour être en accord avec les directives de WordPress.org, avant que nous commencions la période d'essai, nous vous demandons de nous permettre de récupérer votre nom d'utilisateur et des informations non sensibles du site afin de permettre au %s de communiquer avec %s pour vérifier les mises à jour et valider votre période d'essai." + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Activer la licence sur tous les sites du réseau." + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Effectuer sur tous les sites dans le réseau." + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Activer la licence sur tous les sites en attente." + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Activer sur tous les sites en attente." + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "autoriser" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "déléguer" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "passer" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Cliquez pour voir la capture d'écran %d en pleine taille" + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Mises à jour illimitées" + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Localhost" + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "%s restante(s)" + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Dernière licence" + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Annulé" + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Expiré" + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "Pas d'expiration" + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Activer cet add-on" + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Nom du propriétaire" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "Email du propriétaire" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "ID du propriétaire" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Inscription" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Désolé pour le dérangement et nous sommes là pour vous aider si vous nous le permettez." + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Contacter l'Assistance" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Commentaire anonyme" + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Désactiver" + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Activer %s" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Commentaire rapide" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "Si vous avez un instant, merci de nous indiquer pourquoi %s" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "Désactivation" + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "Changement" + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Envoyer & %s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "S'il vous plait, dites nous pourquoi afin que nous puissions nous améliorer." + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Oui - %s" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Zapper & %s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Cliquer ici pour utiliser le plugin anonymement" + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "Peut-être que cela vous a échappé mais vous n'êtes pas obligé de partager la moindre information et vous pouvez juste %s l'enregistrement." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.mo new file mode 100644 index 0000000000000000000000000000000000000000..8afad6ec4c97cfe9355ff8167d1efe080dc8bd13 GIT binary patch literal 51365 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 BqWAy+ literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.po new file mode 100644 index 000000000..d9d65b8f7 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-he_IL.po @@ -0,0 +1,2300 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +# Rami Yushuvaev <r_a_m_i@hotmail.com>, 2017 +# Vova Feldman <vova@freemius.com>, 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-27 16:16+0000\n" +"Last-Translator: Vova Feldman <vova@freemius.com>\n" +"Language: he_IL\n" +"Language-Team: Hebrew (Israel) (http://www.transifex.com/freemius/wordpress-sdk/language/he_IL/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "שגיאה" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "מצאתי %s יותר טוב" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "What's the %s's name?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "It's a temporary %s. I'm just debugging an issue." + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "דיאקטיבציה" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "החלפת תֵמָה" + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "אחר" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "I no longer need the %s" + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "I only needed the %s for a short period" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "ה%s הרס לי את האתר" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "ה%s הפסיק פתאום לעבוד" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "אני לא יכול/ה להמשיך לשלם על זה" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "מה המחיר שכן תרגיש\\י בנוח לשלם?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "אני לא אוהב את הרעיון של שיתוף מידע איתכם" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "ה%s לא עבד" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "לא הצלחתי להבין איך לגרום לזה לעבוד" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "The %s is great, but I need specific feature that you don't support" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "איזה פיטצ'ר?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "ה%s לא עובד" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "אנא שתפ\\י מה לא עבד כדי שנוכל לתקן זאת עבור משתמשים עתידיים..." + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "חיפשתי משהו אחר" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "מה חיפשת?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "ה%s לא עבד כמצופה" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "למה ציפית?" + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "ניפוי תקלות פרימיוס" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "אין לי מושג מה זה cURL או איך להתקין אותו - אשמח לעזרה!" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "כן - בצעו את מה שצריך" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "לא - פשוט כבה" + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "אופס" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s לא יכול לעבוד ללא %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "ההרחבה %s אינה יכולה לפעול ללא התוסף." + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Unexpected API error. Please contact the %s's author with the following error." + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "Premium %s version was successfully activated." + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "יש" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "יש לך רישיון %s." + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "יששש" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s is a premium only add-on. You have to purchase a license first before activating the plugin." + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "מידע נוסף אודות %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "קניית רישיון" + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "התחל תקופת ניסיון" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "השלם התקנה" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "You are just one step away - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "השלם הפעלת \"%s\" עכשיו" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "We made a few tweaks to the %s, %s" + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Opt in to make \"%s\" Better!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "The upgrade of %s was successfully completed." + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Add-On" + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "תוסף" + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "תבנית" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "We couldn't find your email address in the system, are you sure it's the right address?" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "We can't see any active licenses associated with that email address, are you sure it's the right address?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Account is pending activation." + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "הפעלת %s הושלמה בהצלחה." + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "חשבונך הופעל בהצלחה עם חבילת %s." + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "הניסיון שלך הופעל בהצלחה." + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "לא ניתן להפעיל את %s." + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "אנא צור איתנו קשר יחד עם ההודעה הבאה:" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "שדרג" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "התחל תקופת ניסיון" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "מחירון" + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "אפיליאציה" + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "חשבון" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "יצירת קשר" + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Add-Ons" + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "מחירון" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "פורום תמיכה" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Your email has been successfully verified - you are AWESOME!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "מעולה" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "חבילת ההרחבה %s שודרגה בהצלחה." + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "ההרחבה %s נרכשה בהצלחה." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "הורד את הגרסה האחרונה" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "הוחזרה שגיאה מהשרת:" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "אממ" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "ניסיון" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "שידרגתי את החשבון שלי אבל כשאני מנסה לבצע סנכרון לרישיון החבילה נשארת %s." + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "אנא צור איתנו קשר כאן" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "החבילה שודרגה בהצלחה." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "החבילה עודכנה בהצלחה אל %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Your license has expired. You can still continue using the free %s forever." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "רשיונך בוטל. אם לדעתך זו טעות, נא ליצור קשר עם התמיכה." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "תקופת הניסיון שלך הסתיימה. הפיטצ'רים החינאמיים עדיין ניתנים לשימוש." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "נראה שלא ניתן להפעיל את הרישיון." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "הרישיון הופעל בהצלחה." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "נראה לאתר עדיין אין רישיון פעיל." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "נראה שניתוק הרישיון נכשל." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "רישיונך נותק בהצלחה, חזרת לחבילת %s" + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "אוקיי" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Your plan was successfully downgraded. Your %s plan license will expire in %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "You are already running the %s in a trial mode." + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "הניסיון כבר נוצל בעבר." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "החבילה %s אינה קיימת, לכן, לא ניתן להתחיל תקופת ניסיון." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "תוכנית %s אינה תומכת בתקופת ניסיון." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "None of the %s's plans supports a trial period." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "It looks like you are not in trial mode anymore so there's nothing to cancel :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "תקופת הניסיון החינמית של %s בוטלה בהצלחה." + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "נראה שיש תקלה זמנית המונעת את ביטול הניסיון. אנא נסו שוב בעוד כמה דקות." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "גרסה %s הושקה." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "נא להוריד את %s." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "גרסת ה-%s האחרונה כאן" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "חדש" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "נראה שיש לך את הגרסה האחרונה." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "את\\ה מסודר!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Site successfully opted in." + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "אדיר" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "We appreciate your help in making the %s better by letting us track some usage data." + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "תודה רבה!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "We will no longer be sending any usage data of %s on %s to %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "תודה על אישור ביצוע החלפת הבעלות. הרגע נשלח מייל ל-%s כדי לקבל אישור סופי." + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s הינו הבעלים החד של חשבון זה." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "מזל טוב" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Sorry, we could not complete the email update. Another user with the same email is already registered." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "עדכון בעלות" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "כתובת הדואל שלך עודכנה בהצלחה. הודעת אישור אמורה להתקבל בדואל שלך ברגעים הקרובים." + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "נא למלא את שמך המלא." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "שמך עודכן בהצלחה." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "עידכנת בהצלחה את ה%s." + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Just letting you know that the add-ons information of %s is being pulled from an external server." + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "לתשמות לבך" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "היי" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "How do you like %s so far? Test all our %s premium features with a %d-day free trial." + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "ללא התחייבות ל-%s ימין - בטלו בכל רגע!" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "לא נדרש כרטיס אשראי" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "התחלת ניסיון חינם" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Learn more" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "הפעלת רישיון" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "שינוי רישיון" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Opt Out" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Opt In" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "נא לבצע את הצעדים הבאים להשלמת השידרוג" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "הורד\\י את גרסת ה-%s העדכנית" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "העלה\\י והפעיל\\י את הגרסה שהורדת" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "איך להעלות ולהפעיל?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sClick here%s to choose the sites where you'd like to activate the license on." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "Auto installation only works for opted-in users." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "מזהה המודול לא תקני." + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "הגרסה בתשלום כבר פעילה." + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "אין ברשותך רישיון בר תוקף לשימוש בגרסת הפרימיום." + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Plugin is a \"Serviceware\" which means it does not have a premium code version." + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Premium add-on version already installed." + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "צפה בפיטצ'רים שבתשלום" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Thank you so much for using %s and its add-ons!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "אנו מודים לך על היותך כמשתמש של %s!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving the %s." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "אנו מודים לך על השימוש במוצרים שלנו!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving them." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%s and its add-ons" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "מוצרים" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "כן" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "תשלחו לי עדכוני אבטחה ופיטצ'רים, תוכן חינוכי, ומידע אודות מבצעים." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "לא" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "%sאל%2$s תשלחו לי עדכוני אבטחה, פיטצ'רים, תוכן חינוכי, ומידע על מבצעים." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "מפתח הרישיון ריק." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRenew your license now%s to access version %s security & feature updates, and support." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Installing plugin: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Unable to connect to the filesystem. Please confirm your credentials." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "The remote plugin package does not contain a folder with the desired slug and renaming did not work." + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "רכישה" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "התחל את %s הניסיון שלי" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "התקן גרסה חינאמית עכשיו" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "התקן עכשיו" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Download Latest Free Version" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "הורד גרסה אחרונה" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "התקן עדכון גרסה חינאמית עכשיו" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "התקן עדכון במיידי" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Newer Free Version (%s) Installed" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "גרסה חדשה (%s) הותקנה" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "גרסה חינאמית עדכנית הותקנה" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "הגרסה האחרונה הותקנה" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "תיאור" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "התקנה" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "שאלות נפוצות" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "צילומי מסך" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "לוג שינויים" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "ביקורות" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "היערות נוספות" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "פיטצ'רים ומחירים" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "התקנת תוסף" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "חבילה %s" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "הכי טוב" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "חודשי" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "שנתי" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "לכל החיים" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "מחוייב על בסיס %s" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "שנתי" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "פעם אחת" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "רשיון לאתר אחד" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "רשיונות ללא הגבלה" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "עד %s אתרים" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "חודשים" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "שנה" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "מחיר" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "שמירת %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "No commitment for %s - cancel anytime" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "After your free %s, pay as little as %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "פרטים" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "גרסה" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Author" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "עודכן לאחרונה" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "לפני %s" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Requires WordPress Version" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s ומעלה" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatible up to" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Downloaded" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "פעם %s" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s פעמים" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "WordPress.org Plugin Page" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "עמוד התוסף" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "תרום לתוסף" + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "דירוג ממוצע" + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "מבוסס על %s" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "דרוג %s" + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s דרוגים" + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "כוכב %s" + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s כוכבים" + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Click to see reviews that provided a rating of %s" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "תורמים" + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Warning" + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "תוסף זה לא נבדק עם גרסת הוורדפרס שלך." + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "התוסף לא סומן כתואם לגרסת הוורדפרס שלך." + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Paid add-on must be deployed to Freemius." + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "Add-on must be deployed to WordPress.org or Freemius." + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "ביטול הניסיון יחסום מייד את הפיטצ'רים שהינם בתשלום. האם ברצונך בכל זאת להמשיך?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "You can still enjoy all %s features but you will not have access to %s updates and support." + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Once your license expires you can still use the Free version but you will NOT have access to the %s features." + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "הפעל חבילה %s" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "עדכן אוטומטית בעוד %s" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "פג תוקף בעוד %s" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "סינכרן רישיון" + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "ביט" + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "שינוי חבילה" + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "שדרג" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "שנמך" + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "חינם" + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "הפעלה" + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "חבילה" + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "ניסיון חינם" + +#: templates/account.php:165 +msgid "Account Details" +msgstr "פרטי חשבון" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "מחיקת חשבון" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "שיחרור רישיון" + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "האם את/ה בטוח רוצה להמשיך?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "בטל מנוי" + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "סינכרון" + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "שם" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "דוא\"ל" + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "מזהה משתמש" + +#: templates/account.php:274 +msgid "Site ID" +msgstr "מזהה אתר" + +#: templates/account.php:277 +msgid "No ID" +msgstr "אין מזהה" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "מפתח פומבי" + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "מפתח סודי" + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "אין מפתח סודי" + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "ניסיון" + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "License Key" + +#: templates/account.php:359 +msgid "not verified" +msgstr "לא מאומת" + +#: templates/account.php:416 +msgid "Premium version" +msgstr "גירסת פרימיום" + +#: templates/account.php:418 +msgid "Free version" +msgstr "גירסה חינאמית" + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "אמת כתובת דוא\"ל" + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "הורד גרסת %s" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "הצג" + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "מה ה%s שלך?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "ערוך" + +#: templates/account.php:490 +msgid "Sites" +msgstr "אתרים" + +#: templates/account.php:501 +msgid "Search by address" +msgstr "חפש לפי כתובת" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "מזהה" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "כתובת" + +#: templates/account.php:512 +msgid "License" +msgstr "רישיון" + +#: templates/account.php:513 +msgid "Plan" +msgstr "חבילה" + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "רישיון" + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "הסתר" + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "ביטול הרישיון יחסום את כל הפיטצ'רים שבתשלום אך יאפשר להפעיל את הרישיון על אתר אחר. האם תרצו להמשיך בכל זאת?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "הרחבות עבור %s" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "פרטים נוספים" + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "סגירה" + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s שניות" + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "התקנה אוטומטית" + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "הורדה והתקנה אוטומטית של %s (גרסה בתשלום) מ-%2$s תתחיל בעוד %3$s. אם ברצונך לבצע את ההתקנה ידנית - לחץ על כפתור הביטול עכשיו." + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "תהליך ההתקנה התחיל ויכול לקחת מספר דקות לסיום. אנא המתינו בסבלנות עד לסיום מבלי לרענן את הדפדפן." + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "בטל התקנה" + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Checkout" + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "עומד בתקן PCI" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "היי %s," + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "אפשר\\י והמשכ\\י" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "שליחה חוזרת של מייל האקטיבציה" + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "תודה %s!" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "הסכמה והפעלת רישיון" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Thanks for purchasing %s! To get started, please enter your license key:" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "We're excited to introduce the Freemius network-level integration." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "During the update process we detected %d site(s) that are still pending license activation." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%s's paid features" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "During the update process we detected %s site(s) in the network that are still pending your attention." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "מפתח רישיון" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "האם אינך מוצא את מפתח הרישיון?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "דלג" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "האצלה למנהלי האתרים" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "If you click it, this decision will be delegated to the sites administrators." + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "פרטים כלליים על הפרופיל" + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "שם וכתובת דו\"אל" + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "פרטים כלליים על האתר" + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "כתובת אתר, גרסת וורדפרס, פרטי PHP, תוספים ותבניות" + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "התראות מנהל" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "עדכונים, הכרזות, הודעות שיווקיות, ללא דואר זבל" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Current %s Events" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "הפעלה, כיבוי והסרה" + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "ניוסלטר" + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "מהן ההרשאות המוענקות?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "האם אין ברשותך מפתח רישיון?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "הפעלת גירסה חינאמית" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "האם ברשותך רישיון?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "מדיניות פרטיות" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "תנאי השירות" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "שולח דוא\"ל" + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "מפעיל" + +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contact" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "כבוי" + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "דלוק" + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "דיבוג" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "פעולות" + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Are you sure you want to delete all Freemius data?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "מחיקת כל החשבונות" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "ניקוי מטמון ה-API" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Clear Updates Transients" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "סנכרון מידע מהשרת" + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Load DB Option" + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Set DB Option" + +#: templates/debug.php:170 +msgid "Key" +msgstr "Key" + +#: templates/debug.php:171 +msgid "Value" +msgstr "Value" + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "גרסאות SDK" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "מיקום SDK" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Module Path" + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "האם פעיל" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "תוספים" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "תבניות" + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "מזהה כתובת" + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "כותרת" + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "מצב פרימיוס" + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Network Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "משתמש רשת" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "מחובר" + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "חסום" + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simulate Trial" + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "סמלוץ עדכון לרשת" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s התקנות" + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "אתרים" + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "מזהה בלוג" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "מחק" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Add Ons of module %s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "משתמשים" + +#: templates/debug.php:479 +msgid "Verified" +msgstr "מאומת" + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licenses" + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "Plugin ID" + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "Plan ID" + +#: templates/debug.php:518 +msgid "Quota" +msgstr "Quota" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "Activated" + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Blocking" + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "תפוגה" + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Debug Log" + +#: templates/debug.php:549 +msgid "All Types" +msgstr "כל הסוגים" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "כל הבקשות" + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "קובץ" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "פונקציה" + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "Process ID" + +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "הודעה" + +#: templates/debug.php:567 +msgid "Filter" +msgstr "פילטר" + +#: templates/debug.php:575 +msgid "Download" +msgstr "הורדה" + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "סוג" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Timestamp" + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Secure HTTPS %s page, running from an external domain" + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "תמיכה" + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Requests" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "עדכן" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "בילינג" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "שם עסק" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "ח.פ." + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "כתובת %s" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "עיר" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "כפר" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "מיקוד / תא דואר" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "מדינה" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "בחר מדינה" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "מחוז/מדינה" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "פרובינציה" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "תשלומים" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "תאריך" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "סכום" + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "חשבונית" + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Method" + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Code" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Length" + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "נתיב" + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Body" + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Result" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Start" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "End" + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "בעוד %s" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "לפני %s" + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "sec" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Plugins & Themes Sync" + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Total" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Last" + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Scheduled Crons" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "מודול" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "סוג מודול" + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Cron Type" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Next" + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Non-expiring" + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Apply to become an affiliate" + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Your affiliation account was temporarily suspended." + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Like the %s? Become our ambassador and earn cash ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Refer new customers to our %s and earn %s commission on each successful sale you refer!" + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Program Summary" + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%s commission when a customer purchases a new license." + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Get commission for automated subscription renewals." + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s tracking cookie after the first visit to maximize earnings potential." + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Unlimited commissions." + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%s minimum payout amount." + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Payouts are in USD and processed monthly via PayPal." + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Affiliate" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "כתובת דוא\"ל" + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Full name" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "PayPal account email address" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Where are you going to promote the %s?" + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Enter the domain of your website or other websites from where you plan to promote the %s." + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Add another domain" + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Extra Domains" + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Extra domains where you will be marketing the product from." + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Promotion methods" + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Social media (Facebook, Twitter, etc.)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Mobile apps" + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Website, email, and social media statistics (optional)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "How will you promote us?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Please provide details on how you intend to promote %s (please be as specific as possible)." + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "בטל" + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Become an affiliate" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "אנא הזן את הרישיון שקיבלת לתיבת הדואל שלך לאחר השלמת הרכישה." + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "עדכון רישיון" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Opt Out" + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Opt In" + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "יש גרסה חדשה עבור ה%s." + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr " %sRenew your license now%s to access version %s security & feature updates, and support." + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "יש גרסה חדשה" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "חידוש רישיון" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "סגירה" + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "שליחת מפתח רישיון" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "הזן את כתובת הדואל שאיתה שידרגת כדי לקבל את הרישיון שוב." + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "הפעלת רישיון על כל האתרים ברשת." + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "יישום על כל האתרים ברשת." + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "הפעלת רישיון על כל האתרים התלויים והעומדים." + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "יישום על כל האתרים התלויים והעומדים." + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "אפשר" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "האצל" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "דלג" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Click to view full-size screenshot %d" + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "עדכונים ללא הגבלה" + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "שרת לוקאלי" + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "נשארו %s" + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "רישיון אחרון" + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "בוטל" + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "פג תוקף" + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "ללא תפוגה" + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "הפעל את ההרחבה" + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "שם הבעלים" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "מייל הבעלים" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "מזהה הבעלים" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "מנוי" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "מצטערים על חוסר הנעימות, אנחנו כאן כדי לעזור אם תאפשר\\י זאת." + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "צור קשר" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "פידבק אנונימי" + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "כיבוי" + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Activate %s" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "פידבק זריז" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "If you have a moment, please let us know why you are %s" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "deactivating" + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "switching" + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Submit & %s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "אנא שתף את הסיבה כדי שנוכל להשתפר." + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Yes - %s" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "דלג ו%s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Click here to use the plugin anonymously" + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "אולי פספסת את זה אבל אינך חייב\\ת לשתף כל מידע איתנו, ביכולתך %s על שיתוף המידע." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.mo index ee52d58980f66cffa8e53b203efac3ad94ad289a..84e0dcb5c5229af227ae536ea0bfa72177ff0de0 100755 GIT binary patch literal 50788 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 delta 15184 zcmaFT!@OrPQ~f<5mZ=O33=FA^3=A?13=A&ZARYrlju?Vo%fP^pE5^WJ!oa{FEzZCY z#K6E1AkM%L%)r2~Se$_&k%58XyEp^G76t}}NC^gpcm@UrK1l`!Wd;U@JV^!yR|W=# zNs<f<aSRL$HzXMt*cliY%%vC@_!$`L8SJGX0{&7A3>*v$4B=7?45ADS3<**U3<3-c z3}sRb3?d8+4DC?yIZ_M^Y77hvo1_>R*cccXZbJ1xkYZrqV_;x-0agE9ih;qDfq{WX z8f+1RlQaVZF9QQZkTe5>I>>x!kp6lGh7M^41|bFphJI-V1|tRrhDFj042ld43|FNg z4*L$J|3eL6mtkN41(K)?1A{jM1B0RrB;;~sKn5}}bjdI<@GvkiOq5|@;ACK6m?y)) z5Xr#6utEmnKqgs;#{^{=7`W>h7#Ngf85md?7#Q?qAuctRWnj=?U|?{TWnfTcU|`6B zicgYdVBi8dP!<wGYh@u0JPhTZhMMybs_vOA#A6?285pD)7#LXO7#L<UFfb^{K^(G6 zj)9?Gn1O-eq#Of-3?l=>T{#AZ$qWn(zvLkX_bD(iNHQ=mOjBTBC}m(^*r33`AjiPK zpr**cpv1ty;Hn5QI75+v!G?i>p+%8_ft7)Q;h-WUsE;c`(#BP&xVaJogFFKRgRK(8 z{8%N1dIly&28L86NC;#oLwuO43<<&tWr#~#l^Gba7#J9)K>7cb85n#(iA;ro!Hj`{ zAzFojVLvF5sW33)f#O(|fdS;PgQ^S+p`fT#g*a4Oje$Xmfq}tYje$Xvfq@}Ot)78F zn}LC$M~#8Of`NfyhZ+NeE&~I@M>PfpaRvqkd38uCH&=%k(5((pzg!(+&}DT71||ju zhIi@=42~du>I@9o3=9m$8jv(HUjq^at2H1#-lxI9V93D0a7=@NL63of;YYm&1A{*U z1B1FIC@(NDlxsqQ?7Jq!z(_3yhDrtohS^#S4Au+`45HeQAPm%IU}#}rU?|jvsQ;$T zz~IEdz!0Isz@P(CuLB9e6FLy}S9Kr``l<uTWsJIz#97a!3yEV9T}Tw@=`t{Yvc9n{ z14B0h1A~_?0|PSy1H(04NYvcYg=EL4x{$d3r3*=<An$-eQcVvMazT2KG?1moz+lY4 zz)+zFv2cwZ#Jp{K;1H;1*rmt7ki)>h@KTQfoS(z=Awd<Z4+-*AeTYvQ^&tlK=|kdf zjy}XE$Mhlj{JcIS*RUEeFgye0CIg5^L=7QPs$&RA6H$hcG?8Zrii&y$h9iay42u~U z7`_=oQuiz)NKoxGf;i}?5hPolF#>5|V7OxhaUh>DBp-_zL$af~F{J#kHHN4!Foq=F z24jdr`;8$XI0LG0F-RVi|F;-3Fi0>kFdT+zykiV;z#FKBAI1y}84L^z%qEbK$}xeI zfHzGb7J!O5P)W&e3h|)=lr}MiIMl<Gfx!S&WScTD2r@7*G@3$k&ty{uhWa!H28IWw z5DVSSAU+B<gBYA*28rWhGl;>JW)K5=%^*=R)ePeE#b%Hw+6mQv%#49yJp%*7bu$Kr z7*Nq|&cNWoz`*dtoPj}wfq_BS0^;Ey3x;}dV#~IG6evv=3=HlJ3=B&xAc^v=1*8&T zw`5=_XJBB^wuHpxVoONWT(pEZ@P;KMt=zMOB;sF|kV@*mC8W{{vVvs8b}L8-%(8-b zaE(<xgt6O-fkBIbf#DRC{%Xa*a0gUWT0?yN*BW9Gs|^D~3IhWJw+$pt3v3`huY}TV zHVh0Q3=9mDZ5SAGL6wmW14AYQ14EcCq+mK=%fJxMz`&qy2Z_q|dOJv5ez9X<SOThE z?HL%_7#J81*fTIRgGwp~NOn8z015I34v;8%=Ku+r{|=B4QFdftkY!+C2y}#mT)rbj zU8f_YwwvV$(SOJh5|tMmAyHBP#F2r)mw|zS(+LtZ;ZBhJn&|{7IOaM*>hrx$5QoY- zGcZJf+6m4K3|$Ni4D+4A`Ite=1wu!<K+;5q3na+rxiBzTGB7Y~bb-_nuU!}z@);Ny zG+e>iu%2OtD+9wUP!Z}1DG58>Ao=*F8ze0-xkG&F<qpaBdF~7hehdr@Gu$CQcn%fk z@qkpvW*!iaG<iVGnc@Mdp7(k{9CXVAQj)&)0M#A!3=Eo{3=DRl27xD}OrP%wDL8g{ zLK5XgPl(UHctS!%*$d)BXD^5YBE29%Ugrf#gfpP@7B5JYT=0T~+&eEw8WZ(~BuWQw z1_m2Y{x9{0Sh&d>qT!@BBzrvfhC~IZsspuvOne{~d-_0%*mxgET$cMl8Z6yD5QnVw zVPNoLU|=}z1M#_#FC-1=`$8Px;tL6xd|w8JdQfdN!x!T6Q@#)%J@bVa%<TsWdU-zx z-`NimwBde`5-!sZQubH+K^#8c4-#T~{U9Orzz<?EsD=YI=|ue@9?<rOl(dfi4E3OT zgCW5mVnDw?B&gQ<L!#n}Kg6Q<{*cuCA4&@ZK#F3;0Emx+10W8}4S;0F#sElB+Xv;( z3}9dgU|?Wa762(1z6U_e^$M(KU`SwKV2BEY<mcUikdp97Af#Nl5D2NY?nCL9fskzU z8Omo2g2;0RLG+0RK^&kM#K7>3iGe{ch=Ji4sM-#Ngyfx2NR%*yK|)HlJ`9q$9KskF z_AoFo<cEQ?1%pmFB(*n%LmH23!XX6^TLh#);)#F+rAP#%B-Db^h7pjoV-W%IKp<3I zLIfm=%OW7=PJ*hh-vebFj)3^=R0Jf>ZbU%x>)QxOoNGlwEVPM)w19#lAr7gFghWkS zBm;vv0|UeKNJ!kCkAy_QyGTfg{EUQ{%N7N3m~<4lB&=u9ih=}9QxwF&Wl@maur3M` zv`3>LEu-^LjsDS)xQ>g47+e$$34!`(h(p_=AtmCBXa)ucP*W=!VljIR#6dDK5c||) zK=#!$FnGs65?gQ#1GpKU7Xz`lI0j;1Z4AUm{V|XtdR+`8@dU?0f;2gnfx(iIfuTN@ zfnf>*1H;ZZNLuoXhv*BBhqR>1;vu<$DFH$&B``2Zg7Uvp0;FV$Nr1$0egedT(gX&E z1_lO()&z(T*%BcZ@+N{@&cL9V$iU#o$iQHj2(hps2@<rONf3w6fbv%*LE4Htq2hMQ zkRm)FnSr6+g@J)#but6P4h9B>56KJ+RSXOaD^nmLqLK<}c-W^xf^0=9Bx=s2LJFM6 zsgR&%O@oy2#%Ykmm7501&ePK%eZH+}ka9&N9nwOwOow<lCmq!OXJBBcPiJ7TWnf@v zN@oD&42A>gkhm4kfMgey42X{%GaxM)&kRW7tjb_u05xE?XD~2KV_;yA%Y<}Pwq`=i z)6QaGsAFJY$jpLNaxbzN7!(*77|gO680Lfen%VV`qVjt-14A?e1A|iz1A{)O&z1uT z%5ymopWn@a1Sw-KB$o*1Lehw0F2sS_xsbHukqarBeRCoCJ~bB-r8;?##AlQT2|?RD zi2jiJJV<*zE{}o1nSp_!I}cJYoX>+~t5125RLq<YiDQ?1NQc8W9}?sN`H;Bn%7+-p zUjWG+k_C{WS+@XUVQ>M&=UD}ikm)XfsINa+z`zi}z`$_101}rvg$xWgK_y}#Bm_)~ zAO<-XK}xvHB1lM;7D1Zb7mFAe_A)Rquopurm!riHgFh5Q678>INcLkaffP()B@l7_ z5^zY?Gnkb?vWZIx1A{#S14D8N#OI4kATHlh0x|G(2_#osg~~sL^1qcpS~zT_kVK_d z3UR1oDZ~T5rH~#{Oev%ZwyzZ8QQb07l-4saM3+J0EEh_*mO)%Pw+v#?wlYYN9Rh1$ z0JlT~85kIZ${84X85kH+${`kgDu+0nu>z9Xg(@I%Z(aeih=IYj0uqJ(P<})O1A{Cm z|7TS|EbOR&1l7U{28O!~3=G>UAlY$BB_zoCt037jy9$!c+NvNSw4n-8pC7M+<em>u zarbISHjS%hU}$AvU}&g@6wz!oki=?N!@y7v8bWcdfmEYjHISfAsbOG9294d+KoZ%d z8c5Lc)IuC8UkmZEMJ>d~?zND(kEn&DmF8Lo1};VhhLyDt^S0DM;(T8n1H(iH28N?` zklYYn&rlB@vq`Flq}oDgb=+DHX%jxHXJDuX^;jAp`TK7J14BA!9H0?09`L6TQXZr? zF)(ZZwF#RT7*;VbFnBgIFqAMbFnno-givM+BxD;}ARd|80%>QgXsL(9)%g}k8u-!z zDPnnAAwJY-Wni!ZjaIcn3Zx>aczr9RB<pL1IOJd}BysArLDbu{K@xR&8v{cbXauDV zVj*uk14AtX1A|FB149RB5Uai&Qj%GBFff3M;))JP9PjObIOs+PBv*XsfOMe@IvE&h z7#J8TJ0V@GZ=DPb#~BzHg1aCc6X|Y90oKqBDcCl2L)sU=yCJDws|V7)i0FYtS^c^m zNNe<F52Q!J*9+;NSNB5Vs2<Ai>V?E%UoWH}nc54<cH5xp?)5@K=w&Y?aeagGfA>Oy zo}&+vn`HYS@|t~Md+HhV`XB}y^+6JgWgjFco%<l!B^XM_^g$A7Y9Ay{>-!)fH4SR; zMyR^IQ2H2D{5;gc+kKEa<N;Lt1=zlN28J(vki_>7s!^yP;xp-fNd9&1hxp91ACe}* z`oS(|NQH`L_CpLV>xa}8b^Q>ZF6xIkbRAUR(SAsXUg?K;_<lbFgET1rKkJ7$fN26G zj>INF404$O$!-}FAP#AS((Mx<A=3+$pEd#F!1WU#7Vm+|pO^q~=tU@fbpphpH=*V{ zoWQ_P4;rC-J^>OZA16S3_-z8jg{%`HG|xmxr6fENVxZYXhy$%ALL3$cRhKdmVnOyq zNK_V2ggCSoO1DAjeyI8x6B#7I1BUaV5=$q7D+Pvi6B!sLmnm+k&nwMMEy_$*C`&CW z&dkqK$SciFN-bgugK|}i70MHf6^c@GQWJ|)Q}h^AixqSg3UU(j6!H>tQ*{&)ixo;T zQWbI%OHzwV6bg#+(^88;1|{aejm$_bN@YP(q*{!SVooheovfmy!0we=QjnOOJ=t5y zP)QeLPD*KV3Dk~My>vYVx5VVsr2PDBg~XH;-N}JI!rXd#dMv8N3XTxI2xmcQQE~>z zm75KeZ5bykDC*Uxr6!h?7Nr&|B<7_k6qgnh<QJ9bF=(U~7o;X<Cg$W+DrDv<q~@e1 zmlWmaWhN^m=jY~@=4B=)mSpDVX)2T!r=}>B<SV3B6cnWv7b~RZfF*PkQu9hON{cfS zi*t1p@{1HoiZV-c3o`Ur!VL^c7#x$6^GowUG%uK;;F4OBn3+>NnO{wMvb&o4<il#h ze3^Oa3OSj{sd>ezdU|@3Z>Z^UFgT{9DEQ|UPyVka%^i?anx2`bpjyn}IQhS;)Z|2U zrODmul9P9-t4roWjL*x@tIW+WEmlZNO-)HkOwMMQET|_rdB3KudU<Mber_s*Q)W(1 zW?njjQ)zK#9>@crIAd@styJ&<TRoXayK?ec?digqC6x@$IjM<73XTDu3eJhi8L5*i zb&Mz9(~+Mntt&m*Syz^~w5TXGuS5aju*t=`CPJy;s81_OO@&41<hi;&%$512ljBvT zCo}08Z%)x`XJjkL0r_R}Tm8(*IR-V8Sq-)MkkUY2e)(i+L)idVP%KyGmnvi=mZd5r zg3<sYEy03{B@&@PwHO|P46eC}nK=*=lt4hSHTjhB#L4?j;u&=(%bPmG9Fbz$F!`ft zV|`J6u0m;Ec3ysYo<dP-VsU<+j)HSeerbwZPGV824#a1fMXBY9IXMdDsi35wqmY!7 zpPUUz@X7gkd8x^uWTMC5hRrZgf(HdAOkr7ONu>fflcXhP<}jtEOx|YZIJwq52IjKc z=JNIKMX8A;Itm5g+@?^Tky(<OlUZB>aZP?sPJTHk-K6B_CT8XpTPdg(>nZr>C8sKY zf-NOKFI7h&B{ea*B(p5B1QI!rpa&;^xOirXLSlMiW}Y5{2PCASfvb=`IlzEr@<fZG z$ugEvV!?%_nJJ*u?da^IqmYrBQ=pKWsyI2pvJ&oM%d7y11q_}F`FS~&3VEriDWEKq zk*WZZP)N%!Qb<%N&d4t+Q7A|)%FIt;@KnzQ2~`%Cq~<ClrsQVkWfqqdC6?qDF?hO6 zK44|W1NTH`Ui#!8R>m+3b*)V&3)v{JmgQ$Ar%s+@BfYuRMw`(mwWut$NFlRW0hG+s z6(A0GboNouNK8%!CHv(3ypp2)90gEV7HjH&0ya4Vdu&dgWqTgU{`|bj*>?8zo+awV zpahwen3Pkgkf>0Snp==xlvq@$kXc+@nyQeWr;uM-q>!4IqNm_h3W~6Ng``x4;!;pj zD$gv*0L4%dC;)OZ!NsGFLV12^PKrWi2}oVOUN)$hDJsoVNX*MG$w)0yKuI>NpmbwD zd8J*-WI_94cUZD#@JR)^tE8wBYJ5>@Sth7JfEMNqkX)Xskeyn|;FFn_T9TQY%HWfq zoS2i5UtBVIr-S9>BxfZ?-N~)adF;hGsU;<;MU%r_rt_yN<fnlX9V8Yfv$-nS_~n-< zl;o!*Rx<eOc{BLuDHNwB=jWv;lw{<Wre~BW=qh+Blqcqa6oFh{l9^YU3QjhlNYr+f zob2kF&Zs+it*fMDK?x`sXXfeY=`r|2IQgX|pmOkss~&4^YF<h4<R-VI&2QZ1FisBi zGz<r)zS3fa%-n*a{IXO9RYR3xMFr0^kiQl33rch|^K=wIMV>-RVo9PxVp4u-2}rI; zp|m(L9qb#B7KQT6oE%Vq7lTT&lKjcNj&75~yc88cm779&VrB^gq<Di;3Z8kzC5bsX z#gor^DNMHZmJ}?8$`mW8DTHLC=B7?o^pWR*C3aA_Pd=z5I(eQs=j1#eE_RSWW`5q} zi$21WrF;!12l`4*7VwkfNG?h(QSeT!++63Uz$loP0tyazE=;YQe9_-uAUm@_K~2F0 zo}VX|1?+NAa4SkJ&R_^GNh~T+$gNZW7rv^+5CM=WB}JKuIUsIHDnoE-Qf_7miXn@0 z0vRW3hAfUv1f`tRij2h4Vo+qj%N%&tOJxW_<l>~F{OnYaeZ`q2C=w}|DS7H83g!7l z*+}Xq*N4i&^6b1&Cs^=g7AxfCLllE*C4~8te}u}x)L#lwmn{b6hUARY<ZN*H0ZD`k zr3ER8C8@=e)kF0rGluJH6f=ZmmgJ;D$YLE>9R#iHOA<>`^%z3(%kw7ZMQFiHpB15I zm<fqgg_4X+L`wwJKtM>ODipx-Qhr|Q<UJ7@lYd8eZT5{6Wt^N5Rn485TCR`+t<}|| zBLfqQAemhu6BMk8d8oxgab`*?xCqY8F9H?IiFpbci3J6fAYT@x7U$=brGg3qP*Djg z$Q^?n117HuklI`uZNiwDmYSLaNy=$OrQmWB)Jy|8w>UE|IkhMiR3H`P=j5knR;7Z2 z3sm!D<|XInm8IrorsgH5>M3~S7o>u0D^5)XnFT5TL2Vz9+O$$o8%b~S+8Eh-NKos5 z+8yEGN>3rcBS0ZJG{{FGCo>6L;(?qA(gv>FK$!zpo@N#+B!VKL65Nc+&x7j#IkvR8 z6x!Yb=cv>a1yB}+mNH5C6?zJxd1?9eMJ1(qi6yByl{yehp-BcBGay}gAP*EN6oU(W zJ%;d9NTyE72baJ}pjK!}KB$C;R-Kigf*GP390#xf2gg37^acgEo&u<4F*!QcX0mW> z(`5d*b)k^3P%j3zLhTtMQ$bB%M1F({fNHb!%ra2k14Uk<LUKkTs7fx$S4hjOP{=Gn zQkR*hI9W7)8!R!NjW3geSOQDiU>8E$shig)2r*91OghYxnwyw8`9r$I<m<^3C(EQ} zPkx?y5NgKeRcYyrphi*A<nt*WlLa$G!qSUUQ$bl;PXXMb3du;!%Pv;%%FoDCWPx&2 zixn9X6$<i;GfOhdQWc6)iwpAeic?vFGC>7-ejWq3t&pmao1c=(;s|O_q)xWa*fRNN zhHQO!04zHf=ai<i1m~2dGbDmyJ|(j_8PqTZRUIm(poW8?fhtQdsEMIk3|0a%2-GkM zK<*`g`VtU3KvJs33IREZc}U7Z0SgHvu&T{EnF5Td*!mePF8SqoIr)hx3aZ5l(Eba^ zoD`TaHcbk7`Q<1Yp(Qp*d~$l$y?SudRUs`uCndE=p&+p&g9TDUC<G*yWPpr^xDAx< zLERo$#|a@5p-_}sSegmxgeX88Bqfm4>KNb&>cQYqz#QPIH`yUuNgyQ~VtcTQH`waQ zvDqP$JF<fnKs5m<j1ob;ki;Bt-;4!PKZJnlg2~siZTUeAhzvwbD@TQ=w4?--M-!7$ zb66%nP?vN_LKblZH8vI06rA((z%@Aos%!zI9#&I8wkaY<Y4XGz5p8gP%}60PGfyEg zJs;%5#Poayu&8IAf{{W-erZuLizldeGnq42RWq@)BwwK@H7~Wi7*r-1Ddgtom1GpN zIHHQH7Ejj5Rgp`rC;*3MCdeqLN>{kpWar!#?P3L_1Z>aZS*!p_#0)u^*{KTUsY#$} zte7P@vm|vgN1g^7IFchK?^Kdu0d*=TZ&%W)2el?jGC&~<VkPCLR4NoFRu(IiXQbwV znnslhph6#{A{(R#(&Q-5NCdY#AbprDP)o2lF*8L^fyE;?m!TLGS0KHRsA2$>q9v&n zC7>JwVk?20eoEl}2xopCxG+yioot{Ys;^K2GC8vt)RHdG1BDVuLvDUbVvYi+^kne| zwHg`9Qj3yUoJuPvKh86qY?yC0xg<Y(^5=YE7c*T$BV9uy1p^~1Lt||N0|NstpTy!4 z-H@Whyy6^C+uKSZEWa#K!7Vi>B{wlo!KN&~EYShfyvWTgE!IoU&$XMJRgfg;>*?#N z3(Z|t3Wj<HlTR0T^7|y_rI#kAr&=jwmc)C8OcpNGnH*TCTOS{99iM6)pJ!#LV`Lp) z0iu$v<5OXbyb3FmWF3%PYH@OWVo6C+e7rTBnTlXSHGrftN^*0cs=!Q$DlikODn2hh zFF(J)%1}qu$T~i+0>U$fSQH<hmkw&@R+K=54Rwqr-z|!ryr=m1<h0EyGCAs{IVG97 z;ED{Cp;JMn$>Eg>g{6nrOl~R(X7rrwutIusQ>ilJ<j3XOlkF-bB^6Rqb8=90=rOqE z7nP(=j;T-(s>;mI%VcmYDakBLgiw<e4vS2FTp>C+q*6dSxFla85iFUPlCO}H2x;6` zC4ySRIhBT5piu$c{5&WH>Oz1jXUCKj-TXX|#n2A9f@<;P`;~T+)vGinr&Z}ldV)GA zCHV|)(6Iqf$09E?H=kkhhh~w<6KkBU+!FIj5{pYRlk*we5=%--ixNRDO=a-Q&rJmx zoRbKu#|skE^D+||obz)FiePS=tX0=H`DxuL@ywEv!wVQ(b24)?^AZ)3LBj^10ffn4 z>J2C7H#knd+#omkUxSX6YguYuNv1+_K6nTr6J$EH5}EAYs6V-Mf*=!v&*bol@?4-E zc5+5)(cuM?9ed?Pbre7`kqPp3E-2QD4lhthnY_8tX7b4z?#;$c>5S~^sbK3TFK$*d z%2y~(RmjWFQz!=60cv&?B`OqT9^R=?T9TQQSyctfvW2Co#U=SL``<N-PyW!zIk}}- zbh1o~#^kh?p2<S3mXozx6*W8(Gm#<$)Z2!PFfe%LrDPUmR#oLIfU4%4$$#6|ng^tU z8YStVl3pPvRUs!cFEv#my)-i=Q6VK$Aw0h*B>*%kp`%bx1WH~hnF^VCnN^vS{W>M; zL1B}TnVOQBn41q$omre*lv$Qq1QO5BQ^?FwC@IZXC@o3ND@j#IRmcSOaxx(vP0cIL zOv=mwnU)F~pUG56gs3jgEXmhVNX{=lyhb4<5fOr^AZBKMN@j8*sH2stkeCw<4Ggf= zd1aZPP)bQG$y7)LCH?|X#g|_K>63!G(VzhmP`H4`#8UIB!2ZiC1$E1ym1m|xDyRoo zmY9>7GC6mL%4Gd6oyi$p%j!X4RGO!dn_rSymakBpoS&CpoSaz-awziHOJ<Hj8f@q# zIU^Mod7#jNjKL%)g6s!(k-@#`R6PdI9LV5G3MiT7<)wmhRAvb%xuoXgsDs+78Hx1@ zX^A;GnV`r|ErPfr6Uh~sdJF-nMQN!eAooC9oQaTTXle>HkLKhn<fTFaI4v_LRiPlG zKrb^dQ%?cpwbbI`R8U7CGr6<~9FK`*sYN-k>|K&y4+<59;!^OSM7|EFZ>peFkWrAC zmzJ-gsRU{QCn}WX=YV>!AonMhfJ`Y)EGa2V1SJA!QzI4OmXu5dP{`*ayF4*HJ+m|~ z9h4Aq5|J9hnF=n&sp+NQoS2di8g+pTAcf|^ECq#iMq;KyS|T_IQZhkSXQJ6XxwJ=r zvPy5y<fFZTqL87Md<F0jQDSCkNn&oM;^e=*#r#mW=4PhnWaby8POk3Ds^6uMlv$jg zo(J-kLLqWCWN<7?Ez3tpr-Irspg}{0;{2R^P>NM3%~MD!N-cvW-+YGP{JeaSXmKWJ zAStuBB$2_>g&{aq0pta6Dg&kOd>w^?{F0*7;*!jIg_O*qWN=}UoN;)iLQXzdDcqYS z`Su{~Wu^I<3dyM{ps36N4?`9dWu}%KUI;3-a?}$cqq`suEZcyyNpenRa&n?VajAlH zVs27qqC!AXK1AaJJqGYN!sIOzRM{X!?PiIIjf{!lE{sBPNoFD_DS(Q9NO*#Wu0Uf| z;A{(udFTLEPQF4)YI;s4v>BPH36d);P0UFJ4`yLxi^(mMj`6|$2QJ<x`%I3Se0PiH z<dR8(^@voPm#R<<O17DZ;8I9Q1cg>+4k-9@Q;Uni(UzJ9${?knBBC@;p){uiG^PjY z)q*-+ka`fDFG1-Sl>h7%7<^I{Kq<T^7hJ()DioK3y^xYJdH-bN$v-Dg2!~ZHi3|Zn z`DLJd4$djab!tITDkx6!N>Uk|GcrM)ij+)PRml)iT2cZo63Q}55|IYDq^H?TE}o`U zub`^{DN-{_z|pTzl$o4b28!Uk{F2PHOi;ovE>!^Koctot7&)l6Dgux8mqGIpICN60 zsuC4a!C4MI<ejObke^dh1S&@rN{SMblQY5PDmbuGG85DD@{4s#GLsWgifeHBsGw@1 zQmn_|SDIgz&)}C@4jX`5HtV!{DmYauB<3WS<|!0pCW7(|B2$3eo1d0elsGxCQ>0#x z!4EY4n4X@=;P1`goT-qJuTYd(keXMV2r9|S@<CY;6riAnJSgH4K`qO?%%W6K^2yE2 zR{-VQd<H~8P@J5YQVI!C@TgQ(qK-mwBB=5$$S(%hH=yy1<ou#Uh0+oZSj{@QaDo_b zF2tjWWksnasgot=$S|d3PBxjN91H456lErrW)>%dDwd+uJa7(EQY}_efRz%844$Bx z51ddzZQSJiqT+neAfYp;OP!Mg3t3Q+4vtW;N>EGb&>VZtfW&mLg3QU4b2~P3%`0b| zthd0d-VszRf$fA^0}2ArXrQ7(aH>K{CM;>_KtdZ@xfW%nmnIgaB!W@`y#59I6dbc4 z{h&TyQDR<RzCtFb(uCBPpeO~ITb!6vk_js09Kel@#NuLb>e2xxgJku?E5O6aIjOmc zir~>qg|yN<ux~)2T$)~*m;)-kQuP=DCOfPVnH;oGOx3ZZ1QKY_F-S<Ml9L0?R*-(_ z<oye!L?BG4GKEyoaCPS7$VCcrK1i+9fTGmg%+g$>f^72M14;tWwmo<R3?x5UX0gQN zg2mR8H!jwgJadVxKrt)>7N@2crIsX4u3xG@*=Ok=(Y&(Ee1&AR%sF||vNVB2P?eUd z056Fq2QGi8=?QB7B!b!|$%zH|3{Y-PqC##as6d4XfC{|H4l88DgG&-iK#IyT6F~!- zu&QZu=ZZka$%|H>sXyGIkXl@lnpc{bR|1*`fvL#J2el2L)lmkhm0AkQ7qH+5Wp4#g z9ssqMkW_+Nk<chf#32l79;YhgW-25W7o-Z6lq8lRTXlHl<k+>E^$QiibB$@B5&)EK zLFOJ_37d;d1XWt_x(+0V#m<aGg<^R53zIKOMRFA={iT8u4!G3@nP!2s?@UTSQ)#Nj zpfVg>1Qg}xK-zE6A_m%i11C;c(Kq?_8okMX)>(UGGK6H7<mco=s7&|}E2x2242lpv z2ItI@lEjqEyhH}qq9V}nW@a8JI7&dWpri$EdrdyjB_@}n4(jI@f%_J)nzJYqG$Wgs zmy$nu{{~TWm&{^#y9?YtKuWHlN(4M~m<Y;Mp#B!TN|=0cgZ^ZRjozCJH##v+-nD6s za9Ad2xDnLg2MyDfB&O$NPCmIgv7R9qT)BV?^GpR$d=!H!-#mr9{Nj?Ld|09Y74pSk zmEg_;NL^ZLPG)i@sD)gV2_CTpHS9o5V^9F+D1g<08pI{}khWj}xW!yhln<)4K(#|s zQf8u5E@~SG)T&PgjlAU*Pqx{ru-S7<9HXXlVgcCdoJ56^(nJO5s4uu|0JW<@EmqLf zb8i0R#N{IOdJ4gy_=a{IK)r?(aK8c6ECiQ^pm0+F5Ao*fF*t%;k(;lO2%ZTCwJ*Un z40xmuS`UJUkU&i@@E~v~q~8Q{5NHfIwFuO>fsP8-gA-OxDmdTgf=2KXK~Vz^&O}gO zP){Kc)X)Rf@JU5rt%p}A<mTs;<b$$LX<n*AYKp?)6$-F;F9CNak`jwk^%R2B@*(5F zP>+Czp+T7hTzaO0CUNRh;q7tA7_T0KTVhcvs2i1<1B=yMP@4(TiiGqc!4)4wJ*b*N z%(JE{z+xAyq@XB22~<Rb>Pbkq4PO80DL9rDC1zTJTA;|82UK9?<m4-Wvj?a_kednW zvw^0k6%uoD)H7jS$H}bQswT5--=Yn#*6kUBGZl0dTwo;^L-64>3c3oQ`XdFDManWK zv#-?T1qtgYBxiyo6eqLoIIj+BqJf97K%N1Q34vN(ptK4arAt&uFG?&a%`BPxa)&x^ zVjj5KE>0^dEh(9NVZW*!C_ocIeu1_s^FcjG=ooZ9D0V=(2d!<C0(bQ0TRU|anbe9W zPu~4~a@}5q$)S7KPTqDvaPpIV9+M~SKQVdIezVD$`+0>Bj)XcVfAgXPvl$JLtE7}n zP!23h1SJS)8$?ebI8&jZ^zbG~aw#mGylcO*F*tpt!s^USm=9C+7@Qpg7~DZa8K8k1 zMNn8l##|C7yBrFYQY}^h^}h2!ogfDA&~;E|aY15HZsz0-6$+EL9!j0e(kd>1RP3l0 zE94hVHaZ+opIQWNj(`d^Xz|4Wt1B76<|c!>@TuSg0qNm^A{^8l0?pch^8!Nvs3iyL zWkQS!cJXHLOD!%g1&yA7D^3QG5Y*UA1rP^3hg+4%zy_%xCkJ+lPUb(tIeGPAWl$HR z3?99S;AS9rC@CM}=lsbNt7KK2!39i7CSou*k--r>ehVt*z=IH=b|lzTbW7xqNQ$Ty zE2JedfJbW~?gtGu_18*?Lb@`bLIgAcnVgscDrzR5Jff_9cm=eJ$`G7clF0x{VP&aB ypaKR|i3b#=R#oLQfT_&MA4*iXLNjt9)jixH+>SXVMfs3nr^#=Rs!cXLrV9Wp(MD<j diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.po index 6f4f9cedb..b877e6eb7 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.po +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-it_IT.po @@ -1,1668 +1,2302 @@ -# Copyright (C) 2016 freemius +# Copyright (C) 2018 freemius # This file is distributed under the same license as the freemius package. # Translators: -# Pelly Benassi <plasmax@gmail.com>, 2016 -# Daniele Scasciafratte Mte90 <mte90net@gmail.com>, 2015 -# Pelly Benassi <plasmax@gmail.com>, 2016 +# Alessandro Pelly Benassi <plasmax@gmail.com>, 2016 +# Daniele Scasciafratte Mte90 <mte90net@gmail.com>, 2015-2018 +# Alessandro Pelly Benassi <plasmax@gmail.com>, 2016-2017 # Vova Feldman <vova@freemius.com>, 2015-2016 msgid "" msgstr "" "Project-Id-Version: WordPress SDK\n" "Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" -"PO-Revision-Date: 2016-12-12 02:13+0000\n" -"Last-Translator: Vova Feldman <vova@freemius.com>\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-25 22:15+0000\n" +"Last-Translator: Daniele Scasciafratte Mte90 <mte90net@gmail.com>\n" +"Language: it_IT\n" "Language-Team: Italian (Italy) (http://www.transifex.com/freemius/wordpress-sdk/language/it_IT/)\n" -"MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"MIME-Version: 1.0\n" "X-Poedit-Basepath: ..\n" -"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.js\n" "X-Poedit-SourceCharset: UTF-8\n" -#: includes/i18n.php41, includes/i18n.php:55 -msgid "Yes - I'm in!" -msgstr "Sì, ci sto!" - -#: includes/i18n.php43, includes/i18n.php:57 -msgid "Not today" -msgstr "Non oggi" - -#: includes/i18n.php:69 -msgid "Account" -msgstr "Account" +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "L'SDK di Freemius non è riuscito a trovare il file principale del plugin. Per favore contatta sdk@freemius.com riportando l'errore." -#: includes/i18n.php:71 -msgid "Add On" -msgstr "Add-on" +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Errore" -#: includes/i18n.php:73 -msgid "Contact Us" -msgstr "Contattaci" +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "Ho trovato un migliore %s" -#: includes/i18n.php:75 -msgid "Contact Support" -msgstr "Contatta il supporto" +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "Qual è il nome di %s?" -#: includes/i18n.php:77 -msgid "Change Ownership" -msgstr "Cambia Proprietario" +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "È una %s temporanea. Sto solo cercando di risolvere un problema." -#: includes/i18n.php:79 -msgid "Support" -msgstr "Supporto" +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Disattivazione" -#: includes/i18n.php:81 -msgid "Support Forum" -msgstr "Forum di supporto" +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Cambio tema" -#: includes/i18n.php:83 -msgid "Add Ons" -msgstr "Add-on" +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Altro" -#: includes/i18n.php:85 -msgctxt "verb" -msgid "Upgrade" -msgstr "Aggiornamento" +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "Non ho più bisogno di %s" -#: includes/i18n.php:87 -msgid "Awesome" -msgstr "Fantastico" +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "Ho avuto bisogno di %s per un breve periodo" -#: includes/i18n.php:89 -msgctxt "noun" -msgid "Pricing" -msgstr "Prezzi" +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "%s ha rotto il mio sito" -#: includes/i18n.php:91 -msgctxt "noun" -msgid "Price" -msgstr "Prezzo" +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "%s ha improvvisamente smesso di funzionare" -#: includes/i18n.php:93 -msgid "Unlimited Updates" -msgstr "Aggiornamenti Illimitati" +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "Non posso piú pagarlo" -#: includes/i18n.php:95 -msgctxt "verb" -msgid "Downgrade" -msgstr "Downgrade" +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "Che prezzo ritieni opportuno pagare?" -#: includes/i18n.php:97 -msgid "Cancel Trial" -msgstr "Annulla prova gratuita" +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "Non voglio condividere i miei dati con te" -#: includes/i18n.php:99 -msgid "Free Trial" -msgstr "Prova gratuita" +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "%s non funziona" -#: includes/i18n.php:101 -msgid "Start my free %s" -msgstr "Inizia la mia %s" +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "Non capisco come farlo funzionare" -#: includes/i18n.php:103 -msgid "No commitment for %s - cancel anytime" -msgstr "Nessun impegno con %s - cancella quando vuoi" +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "%s è ottimo ma ho bisogno di una funzionalità specifica non supportata" -#: includes/i18n.php:105 -msgid "After your free %s, pay as little as %s" -msgstr "Dopo il tuo %s gratuito, paghi solamente %s" +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "Quale funzionalitá?" -#: includes/i18n.php:107 -msgid "Details" -msgstr "Dettagli" +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "%s non funziona" -#: includes/i18n.php:109 -msgid "Account Details" -msgstr "Dettagli dell'account" +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Condividi cosa non ha funzionato in modo da migliorare il prodotto per gli utenti futuri..." -#: includes/i18n.php:111 -msgctxt "verb" -msgid "Delete" -msgstr "Elimina" +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "Non é quello che stavo cercando" -#: includes/i18n.php:113 -msgctxt "verb" -msgid "Show" -msgstr "Mostra" +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "Che cosa stai cercando?" -#: includes/i18n.php:115 -msgctxt "verb" -msgid "Hide" -msgstr "Nascondi" +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "%s non ha funzionato come mi aspettavo" -#: includes/i18n.php:117 -msgctxt "verb" -msgid "Edit" -msgstr "Modifica" +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "Che cosa ti aspettavi?" -#: includes/i18n.php:119 -msgctxt "verb" -msgid "Update" -msgstr "Aggiorna" +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Debug Freemius" -#: includes/i18n.php:121 -msgid "Date" -msgstr "Data" +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "Non ho idea di cosa sia cURL o come installarlo, aiutami!" -#: includes/i18n.php:123 -msgid "Amount" -msgstr "Importo" +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "Contatteremo il tuo hosting e risolveremo il problema. Riceverai un' email a %s non appena ci saranno aggiornamenti." -#: includes/i18n.php:125 -msgid "Invoice" -msgstr "Fattura" +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Installa cURL e abilitalo nel file file php.ini. Inoltre cerca per il parametro 'disable_functions' nel tuo file php.ini e rimuovi ogni metodo disattivato che inizia con 'curl_'. Per verificare che tutti sia attivato usa 'phpinfo()'. Una volta attivato, disattiva 1%s e riattivalo di nuovo." -#: includes/i18n.php:127 -msgid "Billing" -msgstr "Fatturazione" +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Sì - fai pure" -#: includes/i18n.php:129 -msgid "Payments" -msgstr "Pagamenti" +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "No - disattiva e basta" -#: includes/i18n.php:131 -msgid "Delete Account" -msgstr "Elimina Account" +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Ops" -#: includes/i18n.php:133 -msgctxt "as close a window" -msgid "Dismiss" -msgstr "Chiudi" +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Grazie per averci dato la possibilità di risolvere il problema! È stato appena inviato un messaggio al nostro staff tecnico. Ti risponderemo non appena avremo un aggiornamento riguardante %s. Grazie per la tua pazienza." -#: includes/i18n.php:135 -msgctxt "as product pricing plan" -msgid "Plan" -msgstr "Piano" +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s non può funzionare senza %s." -#: includes/i18n.php:137 -msgid "Change Plan" -msgstr "Cambia piano" +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s non può funzionare senza il plugin." -#: includes/i18n.php:139 -msgctxt "as download professional version" -msgid "Download %s Version" -msgstr "Scarica la versione %s" +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Errore API inaspettato. Contatta l'autore di %s con il seguente errore." -#: includes/i18n.php:141 -msgctxt "as download professional version now" -msgid "Download %s version now" -msgstr "Scarica la versione %s ora" +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "La versione 1%s Permium è stata attivata con successo." -#: includes/i18n.php:145 -msgctxt "as download latest version" -msgid "Download Latest" -msgstr "Scarica l'ultima versione" +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "Forte" -#: includes/i18n.php:147 -msgctxt "E.g. you have a professional license." +#: includes/class-freemius.php:4842 msgid "You have a %s license." msgstr "Hai la licenza %s." -#: includes/i18n.php:151 -msgid "New" -msgstr "Nuovo" - -#: includes/i18n.php:153 -msgid "Free" -msgstr "Gratuito" +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Evvai" -#: includes/i18n.php:155 -msgctxt "as trial plan" -msgid "Trial" -msgstr "Prova gratuita" +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "Il periodo di prova gratuito %s è stato annullato con successo. Siccome l'add-on è premium, è stato disattivato automaticamente. Se vorrai usarlo in futuro, dovrai comprare una licenza." -#: includes/i18n.php:157 -msgctxt "as starting a trial plan" -msgid "Start Trial" -msgstr "Inizia il periodo di prova gratuito" +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s è un add-on premium. Devi comprare una licenza prima di poter attivare il plugin." -#: includes/i18n.php:159 -msgctxt "verb" -msgid "Purchase" -msgstr "Acquisto" +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "Ulteriori informazioni su %s" -#: includes/i18n.php:161 +#: includes/class-freemius.php:5124 msgid "Purchase License" msgstr "Acquista licenza" -#: includes/i18n.php:163 -msgctxt "verb" -msgid "Buy" -msgstr "Compra" - -#: includes/i18n.php:165 -msgid "Buy License" -msgstr "Compra licenza" - -#: includes/i18n.php:167 -msgid "Single Site License" -msgstr "Licenza per sito singolo" - -#: includes/i18n.php:169 -msgid "Unlimited Licenses" -msgstr "Licenze illimitate" - -#: includes/i18n.php:171 -msgid "Up to %s Sites" -msgstr "Fino a %s siti" - -#: includes/i18n.php:173 -msgid "%sRenew your license now%s to access version %s features and support." -msgstr "%sRinnova la tua licenza ora%s per accedere a funzionalità e supporto della versione %s." +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "Dovresti ricevere un'email di attivazione di %s all'indirizzo %s. Assicurati di fare clic sul pulsante di attivazione nell'email per %s." -#: includes/i18n.php:177 -msgid "" -"Enter the email address you've used for the upgrade below and we will resend" -" you the license key." -msgstr "Inserisci qui sotto l'indirizzo email che hai usato per registrare l'aggiornamento e ti invieremo di nuovo la chiave di licenza." +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "Inizia il periodo di prova gratuito" -#: includes/i18n.php:181 -msgctxt "e.g. Professional Plan" -msgid "%s Plan" -msgstr "Piano %s" +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "completa l'installazione" -#: includes/i18n.php:183 +#: includes/class-freemius.php:6147 msgid "You are just one step away - %s" msgstr "Sei a un passo dalla fine - %s" -#: includes/i18n.php:185 -msgctxt "%s - plugin name. As complete \"Jetpack\" activation now" +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" msgid "Complete \"%s\" Activation Now" msgstr "Completa l'attivazione di \"%s\" ora" -#: includes/i18n.php:189 -msgid "We made a few tweaks to the plugin, %s" -msgstr "Abbiamo apportato alcune modifiche al plugin, %s" +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "Abbiamo fatto alcune migliore a %s,%s" -#: includes/i18n.php:191 -msgid "Opt-in to make \"%s\" Better!" -msgstr "Contribuisci a rendere \"%s\" migliore!" +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Accetta per rendere \"%s\" migliore!" -#: includes/i18n.php:193 -msgid "Error" -msgstr "Errore" +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "L'aggiornamento di %s è stato completato con successo." -#: includes/i18n.php:195 -msgid "" -"Freemius SDK couldn't find the plugin's main file. Please contact " -"sdk@freemius.com with the current error." -msgstr "L'SDK di Freemius non è riuscito a trovare il file principale del plugin. Per favore contatta sdk@freemius.com riportando l'errore." +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Add-on" -#: includes/i18n.php:203 -msgctxt "as expiration date" -msgid "Expiration" -msgstr "Scadenza" +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "Plugin" -#: includes/i18n.php:205 -msgctxt "as software license" -msgid "License" -msgstr "Licenza" +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Tema" -#: includes/i18n.php:207 -msgid "not verified" -msgstr "non verificato" +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" -#: includes/i18n.php:209 -msgid "Verify Email" -msgstr "Verifica email" +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "Non siamo riusciti a trovare il tuo indirizzo email nel sistema, sei sicuro che sia l'indirizzo giusto?" -#: includes/i18n.php:211 -msgctxt "e.g. expires in 2 months" -msgid "Expires in %s" -msgstr "Scade in %s" +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "Non siamo riusciti a trovare alcuna licenza attiva associata al tuo indirizzo email, sei sicuro che sia l'indirizzo giusto?" -#: includes/i18n.php:213 -msgctxt "e.g. auto renews in 2 months" -msgid "Auto renews in %s" -msgstr "Rinnovo automatico in %s" +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Account in attesa di attivazione." -#: includes/i18n.php:215 -msgid "No expiration" -msgstr "Nessuna scadenza" +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "%s è stato attivato con successo." -#: includes/i18n.php:217 -msgid "Expired" -msgstr "Scaduto" +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Il tuo account è stato attivato correttamente con il piano %s." -#: includes/i18n.php:219 -msgid "Cancelled" -msgstr "Annullato" +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "La versione di prova è stata avviata correttamente." -#: includes/i18n.php:221 -msgctxt "e.g. In 2 hours" -msgid "In %s" -msgstr "In %s" +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "Non é stato possibile attivare %s." -#: includes/i18n.php:223 -msgctxt "e.g. 2 min ago" -msgid "%s ago" -msgstr "%s fa" +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Contattaci con il seguente messaggio:" -#: includes/i18n.php:225 -msgctxt "as plugin version" -msgid "Version" -msgstr "Versione" +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Aggiornamento" -#: includes/i18n.php:227 -msgid "Name" -msgstr "Nome" +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Inizia il periodo di prova gratuito" -#: includes/i18n.php:229 -msgid "Email" -msgstr "Email" +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Prezzi" -#: includes/i18n.php:231 -msgid "Email address" -msgstr "Indirizzo email" +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Affiliazione" -#: includes/i18n.php:233 -msgid "Verified" -msgstr "Verificato" +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "Account" -#: includes/i18n.php:235 -msgid "Plugin" -msgstr "Plugin" +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Contattaci" -#: includes/i18n.php:237 -msgid "Plugins" -msgstr "Plugin" +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Addon" -#: includes/i18n.php:239 -msgid "Themes" -msgstr "Temi" +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Prezzi" -#: includes/i18n.php:241 -msgctxt "as file/folder path" -msgid "Path" -msgstr "Percorso" +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Forum di supporto" -#: includes/i18n.php:243 -msgid "Title" -msgstr "Titolo" +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Il tuo indirizzo email è stato verificato con successo - SEI UN GRANDE!" -#: includes/i18n.php:245 -msgid "Free version" -msgstr "Versione gratuita" +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Sì" -#: includes/i18n.php:247 -msgid "Premium version" -msgstr "Versione premium" +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Il piano del tuo add-on %s è stato aggiornato con successo." + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "L' add-on %s è stato acquistato con successo." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Scarica l'ultima versione" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Il tuo server sta bloccando l'accesso all'API di Freemius. L'accesso è cruciale per quanto riguarda la la sincronizzazione di %1s. Per favore contatta il tuo host per aggiungere %2s alla whitelist." + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Errore ricevuto dal server:" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "Sembra che uno dei parametri di autenticazione sia sbagliato. Aggiorna la tua chiave pubblica, Secret Key & User ID e riprova." + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "Uhm" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "Sembra che tu sia ancora usando il piano %s. Se hai effettuato un upgrade o cambiato il piano, è probabile che ci sia un problema nei nostri sistemi." + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Prova gratuita" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "Ho aggiornato il mio account, ma quando cerco di sincronizzare la licenza, il piano rimane %s." + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Contattaci qui" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Il piano è stato aggiornato con successo." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Il piano è stato cambiato con successo a %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "La tua licenza è scaduta. Puoi continuare ad usare la versione gratuita %s per sempre." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "La tua licenza è scaduta. %1$saggiorna ora %2$sper continuare ad utilizzare %3$s senza interruzioni." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "La tua licenza è stata cancellata. Se credi sia un errore, per favore contatta il supporto." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "La licenza è scaduta. È comunque possibile continuare a utilizzare tutte le funzionalità di %s, ma sarà necessario rinnovare la licenza per continuare a ricevere gli aggiornamenti ed il supporto." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "La tua versione di prova gratuita è scaduta. Puoi continuare ad usare tutte le funzionalità gratuite." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "La tua versione prova è scaduta.%1$s aggiorna ora %2$s per continuare ad usare %3$s senza interruzioni." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "Sembra che la licenza non possa essere attivata." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "La tua licenza è stata attivata correttamente." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "Sembra che il tuo sito non disponga di alcuna licenza attiva." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "Sembra che la disattivazione della licenza non sia riuscita." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "La tua licenza é stata disattivata con successo, sei tornato al piano %s." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "OK" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Il tuo piano è stato declassato con successo. La licenza del piano %s scadrà in %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Stiamo avendo qualche problema temporaneo con il downgrade del piano. Riprova tra qualche minuto." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "Stai già usando %s in modalità prova." + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "Hai già utilizzato una prova gratuita in passato." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "Il piano %s non esiste, per questo motivo non è possibile iniziare il periodo di prova." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "Il piano %s non supporta il periodo di prova." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "Nessuno dei piani di %ssupporta il periodo di prova." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "Sembra che tu non stia più usando la prova gratuita, quindi non c'è niente che tu debba annullare :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Il tuo periodo di prova gratuito %s è stato annullato con successo." + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "Stiamo avendo qualche problema temporaneo con l'annullamento del periodo di prova. Riprova tra qualche minuto." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "La versione %s é stata rilasciata." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "Scarica %s." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "l'ultima versione %s é quì" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "Nuovo" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Sembra che tu abbia la versione più recente." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "Sei fantastico!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "L'email di verifica è stata inviata a %s. Se dopo 5 minuti non è ancora arrivata, per favore controlla nella tua casella di posta indesiderata." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Sito accettato con successo." + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Fantastico" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "Ti ringraziamo per averci concesso di tracciare alcuni dati di utilizzo al fine di migliorare %s." + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "Grazie!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "Non possiamo più inviare i dati di utilizzo di %ssu %sa %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Verifica di aver ricevuto l'email da %s per confermare il cambiamento del proprietario. Per ragioni di sicurezza devi confermare il cambiamento entro 15 minuti. Se non trovi l'email controlla nella posta indesiderata." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Grazie per aver confermato il cambiamento del proprietario. Un' email è stata appena inviata a %s per la conferma finale." + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s è il nuovo proprietario dell'account." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Congratulazioni" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Siamo spiacenti, non siamo riusciti a completare l'aggiornamento via email. Un altro utente con lo stesso indirizzo email è già registrato." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "Puoi abbandonare la proprietà dell'account %s a %scliccando il pulsante Cambia proprietario." + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Cambia Proprietario" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Il tuo indirizzo email è stato aggiornato correttamente. Riceverai un'email con le istruzioni di conferma in pochi istanti." + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Per favore inserisci il tuo nome completo." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Il tuo nome è stato aggiornato correttamente." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "Hai aggiornato con successo il tuo %s." + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Le informazioni sugli add-on di %s vengono scaricate da un server esterno." + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Attenzione" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Hey" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "Come sta andando con %s? Prova tutte le funzionalità premium di %s con una prova gratuita di %d giorni." + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "Nessun impegno per %s giorni - puoi annullare in qualsiasi momento!" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "Nessuna carta di credito richiesta" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Inizia il periodo di prova gratuito" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Ciao, sai che %s ha il programma di affiliazione? Se ti piace %s puoi diventare un nostro ambasciatore e guadagnare denaro!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Scopri altro" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Attiva licenza" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Cambia licenza" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Cancella iscrizione" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Iscriviti" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Segui i passi seguenti per completare l'aggiornamento" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Scarica l'ultima versione di %s" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Carica e attiva la versione scaricata" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "Come faccio a caricare ed attivare?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sClicca qui%s per scegliere i siti dove vuoi attivare la licenza." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "L'installazione automatica funziona solo per gli utenti che hanno dato il consenso." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "ID modulo non valida." + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Versione Premium già attiva." + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "Non disponi di una licenza valida per accedere alla versione Premium." + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Il plugin è un \"Serviceware\", quindi non dispone di una versione del codice Premium." + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Versione Premium dell'add-on già installata." + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "Vedi funzionalità a pagamento" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Grazie per utilizzare %se i suoi addon!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "Grazie per utilizzare %s!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "Hai già accettato il tracciamento d'uso, ci aiuterà a migliorare %s." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "Grazie per utilizzare i nostri prodotti!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "Hai già accettato il tracciamento d'uso che ci aiuta a migliorare." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%se i suoi addon" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Prodotti" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "Si" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "inviami aggiornamenti di funzionalità e sicurezza, contenuti formativi e offerte." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "No" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "%snon %s mi invierà aggiornamenti di funzionalità e sicurezza, contenuti formativi e offerte." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "A causa della nuova %sRegolamento Europeo sulla Privacy (GDPR)%se i suoi requisiti è necessario che accetti esplicitamente il consenso confermando nuovamente che accetti" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Facci sapere se vuoi essere contattato per aggiornamenti di sicurezza e di funzionalità, contenuti formativi e offerte occasionali:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "La chiave licenza è vuota." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRinnova la tua licenza ora%s per accedere alla versione %s con aggiornamenti di sicurezza e funzionalità e supporto." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Installazione plugin: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Impossibile accedere al filesystem. Conferma le tue credenziali." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "Il pacchetto remoto del plugin non contiene una cartella con lo slug desiderato e la rinominazione non ha funzionato." + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Acquisto" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Inizia la mia %s" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Installa la versione gratuita ora" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Installa ora" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Scarica l'ultima versione gratuita" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "Scarica l'ultima versione" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Installa l'ultima versione gratuita" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Installa l'aggiornamento ora" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Nuova versione gratuita (%s) installata" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Versione più recente (%s) installata" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "Ultima versione gratuita installata" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Versione più recente installata" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Descrizione" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installazione" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Screenshot" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Changelog" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Recensioni" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Altre note" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Caratteristiche & prezzi" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Installazione del plugin" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "Piano %s" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "Migliore" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Mensilmente" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Annuale" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "Tutta la vita" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "Fatturato %s" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Annualmente" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Una volta" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Licenza per sito singolo" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Licenze illimitate" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "Fino a %s siti" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "mese" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "anno" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Prezzo" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Risparmia %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "Nessun impegno con %s - cancella quando vuoi" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "Dopo il tuo %s gratuito, paghi solamente %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Dettagli" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "Versione" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Autore" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Ultimo aggiornamento" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "%s fa" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Richiede la versione di WordPress" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s o superiore" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatibile fino a" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Scaricato" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "% volta" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s volte" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "Pagina dei plugin di WordPress.org" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Homepage del plugin" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Fai una donazione a questo plugin" -#: includes/i18n.php:249 -msgctxt "as WP plugin slug" -msgid "Slug" -msgstr "Slug" +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Valutazione media" -#: includes/i18n.php:251 -msgid "ID" -msgstr "ID" +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "basato su %s" -#: includes/i18n.php:253 -msgid "Users" -msgstr "Utenti" +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s valutazione" -#: includes/i18n.php:255 -msgid "Plugin Installs" -msgstr "Installazioni Plugin" +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s valutazioni" -#: includes/i18n.php:257 -msgctxt "like websites" -msgid "Sites" -msgstr "Siti" +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%s stella" -#: includes/i18n.php:259 -msgid "User ID" -msgstr "ID utente" +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s stelle" -#: includes/i18n.php:261 -msgid "Site ID" -msgstr "ID del sito" +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Fai clic per vedere le recensioni che hanno fornito una valutazione di %s" -#: includes/i18n.php:263 -msgid "Public Key" -msgstr "Chiave pubblica" +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Contributori" -#: includes/i18n.php:265 -msgid "Secret Key" -msgstr "Chiave segreta" +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Avviso" -#: includes/i18n.php:267 -msgctxt "as secret encryption key missing" -msgid "No Secret" -msgstr "Nessuna chiave" +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "Questo plugin non è stato testato con la versione corrente di WordPress." -#: includes/i18n.php:269 -msgid "No ID" -msgstr "Nessun ID" +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "Questo plugin non è stato segnato come compatibile con la tua versione di WordPress." -#: includes/i18n.php:271 -msgctxt "as synchronize license" -msgid "Sync License" -msgstr "Sincronizza la licenza" +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Gli add-on a pagamento devono essere distribuiti da Freemius." -#: includes/i18n.php:273 -msgctxt "as synchronize" -msgid "Sync" -msgstr "Sincronizza" +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "L'add-on dev'essere distribuito da WordPress.org o Freemius." -#: includes/i18n.php:275 -msgid "Activate License" -msgstr "Attiva licenza" +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Effettuare il downgrade del piano interromperà immediatamente tutti i futuri pagamenti ricorrenti e la licenza del piano %s scadrà in %s." -#: includes/i18n.php:277 -msgid "Activate Free Version" -msgstr "Attiva versione gratuita" +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "Cancellando il periodo di prova gratuito bloccherai immediatamente l'accesso a tutte le funzionalità premium. Vuoi continuare?" -#: includes/i18n.php:279 -msgid "" -"Please enter the license key that you received in the email right after the " -"purchase:" -msgstr "Per favore inserisci la chiave di licenza che hai ricevuto via mail subito dopo l'acquisto:" +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "Puoi continuare ad usufruire di tutte le funzionalità di %sma non potrai accedere agli aggiornamenti e supporto di %s." -#: includes/i18n.php:283 -msgid "Activating license..." -msgstr "Sto attivando la licenza..." +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Quando la tua licenza scadrà, potrai comunque continuare a usare la versione gratuita, ma NON avrai accesso alle funzionalità %s." -#: includes/i18n.php:285 -msgid "Change License" -msgstr "Cambia licenza" +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Attivare il piano %s" -#: includes/i18n.php:287 -msgid "Update License" -msgstr "Aggiorna licenza" +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Rinnovo automatico in %s" -#: includes/i18n.php:289 -msgid "Deactivate License" -msgstr "Disattiva licenza" +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Scade in %s" -#: includes/i18n.php:291 -msgid "Activate" -msgstr "Attiva" +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Sincronizza la licenza" -#: includes/i18n.php:293 -msgid "Deactivate" -msgstr "Disattiva" +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Annulla prova gratuita" -#: includes/i18n.php:295 -msgid "Skip & Deactivate" -msgstr "Salta e disattiva" +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Cambia piano" -#: includes/i18n.php:297 -msgid "No - just deactivate" -msgstr "No - disattiva e basta" +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Aggiornamento" -#: includes/i18n.php:299 -msgid "Yes - do your thing" -msgstr "Sì - fai pure" +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Downgrade" -#: includes/i18n.php:301 -msgctxt "active mode" -msgid "Active" -msgstr "Attiva" +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "Gratuito" -#: includes/i18n.php:303 -msgctxt "is active mode?" -msgid "Is Active" -msgstr "è attiva" +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Attiva" -#: includes/i18n.php:305 -msgid "Install Now" -msgstr "Installa ora" +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Piano" -#: includes/i18n.php:307 -msgid "Install Update Now" -msgstr "Installa l'aggiornamento ora" +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Prova gratuita" -#: includes/i18n.php:309 -msgid "More information about %s" -msgstr "Ulteriori informazioni su %s" +#: templates/account.php:165 +msgid "Account Details" +msgstr "Dettagli dell'account" -#: includes/i18n.php:311 -msgid "Localhost" -msgstr "Localhost" +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "L'eliminazione dell'account disattiva automaticamente la tua licenza del piano %s quindi è possibile utilizzarlo su altri siti. Se si desidera anche terminare i pagamenti ricorrenti, fare clic sul pulsante \"Annulla\" ed effettuare il \"Downgrade\" del tuo account. Sei sicuro di voler continuare con l'eliminazione?" -#: includes/i18n.php:313 -msgctxt "as activate Professional plan" -msgid "Activate %s Plan" -msgstr "Attivare il piano %s" +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "La cancellazione non è temporanea. Cancella solamente se non vuoi più utilizzare %s. Sei sicuro di voler cancellare questi dati?" -#: includes/i18n.php:315 -msgctxt "as 5 licenses left" -msgid "%s left" -msgstr "%s rimanenti" +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Elimina Account" -#: includes/i18n.php:317 -msgid "Last license" -msgstr "Ultima licenza" +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Disattiva licenza" -#: includes/i18n.php:319 -msgid "What is your %s?" -msgstr "Qual è il tuo %s?" +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "Sei sicuro di voler procedere?" -#: includes/i18n.php:321 -msgid "Activate this add-on" -msgstr "Attivare questo addon" +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Annulla sottoscrizione" -#: includes/i18n.php:323 -msgid "" -"Deactivating your license will block all premium features, but will enable " -"you to activate the license on another site. Are you sure you want to " -"proceed?" -msgstr "La disattivazione della licenza bloccherà tutte le funzionalità premium, ma vi permetterà di attivare la licenza su un altro sito. Sei sicuro di voler procedere?" +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Sincronizza" -#: includes/i18n.php:327 -msgid "" -"Deleting the account will automatically deactivate your %s plan license so " -"you can use it on other sites. If you want to terminate the recurring " -"payments as well, click the \"Cancel\" button, and first \"Downgrade\" your " -"account. Are you sure you would like to continue with the deletion?" -msgstr "L'eliminazione dell'account disattiva automaticamente la tua licenza del piano %s quindi è possibile utilizzarlo su altri siti. Se si desidera anche terminare i pagamenti ricorrenti, fare clic sul pulsante \"Annulla\" ed effettuare il \"Downgrade\" del tuo account. Sei sicuro di voler continuare con l'eliminazione?" +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "Nome" -#: includes/i18n.php:331 -msgid "" -"Deletion is not temporary. Only delete if you no longer want to use this " -"plugin anymore. Are you sure you would like to continue with the deletion?" -msgstr "L'eliminazione non è temporanea. Cancella solo se non si desidera più utilizzare questo plugin. Sei sicuro di voler continuare con l'eliminazione?" +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "Email" -#: includes/i18n.php:335 -msgid "" -"Downgrading your plan will immediately stop all future recurring payments " -"and your %s plan license will expire in %s." -msgstr "Effettuare il downgrade del piano interromperà immediatamente tutti i futuri pagamenti ricorrenti e la licenza del piano %s scadrà in %s." +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "ID utente" -#: includes/i18n.php:339 -msgid "" -"Cancelling the trial will immediately block access to all premium features. " -"Are you sure?" -msgstr "Cancellando il periodo di prova gratuito bloccherai immediatamente l'accesso a tutte le funzionalità premium. Vuoi continuare?" +#: templates/account.php:274 +msgid "Site ID" +msgstr "ID del sito" -#: includes/i18n.php:343 -msgid "" -"You can still enjoy all %s features but you will not have access to plugin " -"updates and support." -msgstr "Puoi ancora sfruttare tutte le funzionalità di %s, ma non avrai accesso al supporto ed agli aggiornamenti del plugin." +#: templates/account.php:277 +msgid "No ID" +msgstr "Nessun ID" -#: includes/i18n.php:347 -msgid "" -"Once your license expire you can still use the Free version but you will NOT" -" have access to the %s features." -msgstr "Una volta scaduta la licenza, sarà possibile ancora utilizzare la versione gratuita ma non avrete accesso alle funzionalità di %s." +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Chiave pubblica" -#: includes/i18n.php:351 -msgid "Are you sure you want to proceed?" -msgstr "Sei sicuro di voler procedere?" +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Chiave segreta" -#: includes/i18n.php:357 -msgid "Add Ons for %s" -msgstr "Add-on per %s" +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "Nessuna chiave" -#: includes/i18n.php:359 -msgid "" -"We could'nt load the add-ons list. It's probably an issue on our side, " -"please try to come back in few minutes." -msgstr "Non siamo riusciti a caricare la lista degli add-on. Si tratta probabilmente di un problema nel nostro sistema, per favore riprova tra qualche minuto." +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Prova gratuita" -#: includes/i18n.php:365 -msgid "Anonymous feedback" -msgstr "Feedback anonimo" +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "Chiave della licenza" -#: includes/i18n.php:367 -msgid "Quick feedback" -msgstr "Feedback veloce" +#: templates/account.php:359 +msgid "not verified" +msgstr "non verificato" -#: includes/i18n.php:369 -msgid "If you have a moment, please let us know why you are deactivating" -msgstr "Se hai un momento, potresti dirci perché lo hai disattivato?" +#: templates/account.php:416 +msgid "Premium version" +msgstr "Versione premium" -#: includes/i18n.php:373 -msgid "Yes - Deactivate" -msgstr "Si - Disattiva" +#: templates/account.php:418 +msgid "Free version" +msgstr "Versione gratuita" -#: includes/i18n.php:375 -msgid "Submit & Deactivate" -msgstr "Invia & Disattiva" +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Verifica email" -#: includes/i18n.php:377 -msgid "Cancel" -msgstr "Annulla" +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Scarica la versione %s" -#: includes/i18n.php:379 -msgid "I no longer need the plugin" -msgstr "Non ho piú bisogno di questo plugin" +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Mostra" -#: includes/i18n.php:381 -msgid "I found a better plugin" -msgstr "Ho trovato un plugin migliore" +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "Qual è il tuo %s?" -#: includes/i18n.php:383 -msgid "I only needed the plugin for a short period" -msgstr "Avevo bisogno del plugin solo per un breve periodo" +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Modifica" -#: includes/i18n.php:385 -msgid "The plugin broke my site" -msgstr "Il plugin ha causato problemi al mio sito" +#: templates/account.php:490 +msgid "Sites" +msgstr "Siti" -#: includes/i18n.php:387 -msgid "The plugin suddenly stopped working" -msgstr "Il plugin ha smesso di funzionare" +#: templates/account.php:501 +msgid "Search by address" +msgstr "Cerca per indirizzo" -#: includes/i18n.php:389 -msgid "I can't pay for it anymore" -msgstr "Non posso piú pagarlo" +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" -#: includes/i18n.php:391 -msgid "It's a temporary deactivation. I'm just debugging an issue." -msgstr "È una disattivazione temporanea. Sto solo cercando di risolvere un problema." +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "Indirizzo" -#: includes/i18n.php:395 -msgctxt "" -"the text of the \"other\" reason for deactivating the plugin that is shown " -"in the modal box." -msgid "Other" -msgstr "Altro" +#: templates/account.php:512 +msgid "License" +msgstr "Licenza" -#: includes/i18n.php:399 -msgid "Kindly tell us the reason so we can improve." -msgstr "Spiegandoci il motivo ci aiuterai a migliorare." +#: templates/account.php:513 +msgid "Plan" +msgstr "Piano" -#: includes/i18n.php:401 -msgid "What's the plugin's name?" -msgstr "Qual è il nome del plugin?" +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "Licenza" -#: includes/i18n.php:403 -msgid "What price would you feel comfortable paying?" -msgstr "Che prezzo ritieni opportuno pagare?" +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Nascondi" -#: includes/i18n.php:405 -msgid "I couldn't understand how to make it work" -msgstr "Non capisco come farlo funzionare" +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Disattiva la tua licenza bloccando tutte le funzionalità premium ma potrai attivare la licenza su un altro sito. Sei sicuro di voler continuare?" -#: includes/i18n.php:407 -msgid "" -"The plugin is great, but I need specific feature that you don't support" -msgstr "Il plugin é ottimo ma ho bisogno di una funzionalitá specifica che non é supportata" +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Add-on per %s" -#: includes/i18n.php:411 -msgid "The plugin is not working" -msgstr "Il plugin non funziona" +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "Non siamo riusciti a caricare la lista degli add-on. Si tratta probabilmente di un problema nel nostro sistema, per favore riprova tra qualche minuto." -#: includes/i18n.php:413 -msgid "It's not what I was looking for" -msgstr "Non é quello che stavo cercando" +#: templates/add-ons.php:135 +msgid "View details" +msgstr "Visualizza dettagli" -#: includes/i18n.php:415 -msgid "The plugin didn't work as expected" -msgstr "Il plugin non funziona come mi aspettavo" +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Chiudi" -#: includes/i18n.php:417 -msgid "What feature?" -msgstr "Quale funzionalitá?" +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s sec" -#: includes/i18n.php:419 -msgid "Kindly share what didn't work so we can fix it for future users..." -msgstr "Condividi cosa non ha funzionato in modo da migliorare il prodotto per gli utenti futuri..." +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Installazione automatica" -#: includes/i18n.php:423 -msgid "What you've been looking for?" -msgstr "Che cosa stai cercando?" +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "Un download con installazione automatica di %s (versione a pagamento) da %s inizierà in %s. Se preferisci farlo manualmente, fai clic sul pulsante per annullare." -#: includes/i18n.php:425 -msgid "What did you expect?" -msgstr "Che cosa ti aspettavi?" +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "Il processo d'installazione è iniziato e potrebbe impiegare alcuni minuti per completarsi. Attendi finchè non ha finito, assicurandoti di non ricaricare questa pagina." -#: includes/i18n.php:427 -msgid "The plugin didn't work" -msgstr "Il plugin non funziona" +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Annulla installazione" -#: includes/i18n.php:429 -msgid "I don't like to share my information with you" -msgstr "Non voglio condividere i miei dati con te" +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Cassa" -#: includes/i18n.php:431 -msgid "" -"You might have missed it, but you don't have to share any data and can just " -"%s the opt-in." -msgstr "Potresti non averci fatto caso, ma non sei obbligato a condividere i tuoi dati e puoi semplicemente %s la tua partecipazione." +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "PCI compliant" -#: includes/i18n.php:441 +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 msgctxt "greeting" msgid "Hey %s," msgstr "Hey %s," -#: includes/i18n.php:443 -msgctxt "a greeting. E.g. Thanks John!" +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Consenti & Continua" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Invia nuovamente l'email di attivazione" + +#: templates/connect.php:160 msgid "Thanks %s!" msgstr "Grazie %s!" -#: includes/i18n.php:445 -msgid "" -"Never miss an important update - opt-in to our security and feature updates " -"notifications, and non-sensitive diagnostic tracking with %4$s." -msgstr "Non perdere nessun aggiornamento importante - iscriviti per ricevere notifiche su aggiornamenti relativi alla sicurezza e nuove versioni, oltre al tracciamento di diagnostica non sensibile con %4$s." +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "Accetta e attiva la licenza" -#: includes/i18n.php:449 -msgid "" -"Please help us improve %1$s! If you opt-in, some data about your usage of " -"%1$s will be sent to %4$s. If you skip this, that's okay! %1$s will still " -"work just fine." -msgstr "Aiutaci a migliorare %1$s! Se ti iscrivi, alcuni dati riguardanti il tuo utilizzo di %1$s verranno inviati a %4$s. Se salti questo passaggio, non c'è problema! %1$s funzionerà ugualmente." +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Grazie per aver acquistato %s! Per iniziare, per favore inserisci la tua chiave di licenza:" -#: includes/i18n.php:453 -msgid "" -"You should receive an activation email for %s to your mailbox at %s. Please " -"make sure you click the activation button in that email to %s." -msgstr "Dovresti ricevere un'email di attivazione di %s all'indirizzo %s. Assicurati di fare clic sul pulsante di attivazione nell'email per &s." +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Non perdere nessun aggiornamento importante, accetta gli aggiornamenti di sicurezza e funzionalità, contenuti formativi, offerte e il tracciamento diagnostico senza dati sensibili con %4$s." -#: includes/i18n.php:455 -msgid "complete the install" -msgstr "completa l'installazione" +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Non perdere nessun aggiornamento importante, accetta i nostri aggiornamenti di sicurezza e notifiche di funzionalità e il tracciamento diagnostico senza dati sensibili con %4$s." -#: includes/i18n.php:457 -msgid "start the trial" -msgstr "Inizia il periodo di prova gratuito" +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Non perdere nessun aggiornamento importante, accetta i nostri aggiornamenti di sicurezza e di nuove funzionalità, contenuto formativo, offerte e tracciamento diagnostico senza dati sensibili con %4$s. Se vuoi saltare questo passaggio non è un problema! %1$scontinuerà a funzionare." -#: includes/i18n.php:459 -msgid "" -"Thanks for purchasing %s! To get started, please enter your license key:" -msgstr "Grazie per aver acquistato %s! Per iniziare, per favore inserisci la tua chiave di licenza:" +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Non perdere nessun aggiornamento importante, accetta i nostri aggiornamenti di sicurezza e di nuove funzionalità, contenuto formativo, offerte e tracciamento diagnostico senza dati sensibili con %4$s. Se vuoi saltare questo passaggio non è un problema! %1$s continuerà a funzionare." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "Siamo felici di presentarvi il supporto al sistema multi network di Freemius." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "Durante la procedura di aggiornamento abbiamo individuato%d sito/i che sono in attesa della attivazione della licenza." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "Se vuoi utilizzare %s su questi siti, inserisci la tua licenza sotto e fai clic sul pulsante di attivazione." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "Funzionalità a pagamento di %s" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "In caso puoi saltare per adesso e attivare la licenza successivamente nella tua pagina di attivazione network di %s." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "Durante la procedura di aggiornamenti abbiamo individuato %s sito/i del network che sono in attesa di un tuo controllo." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "Chiave di licenza" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "Non trovi la tua chiave di licenza?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Salta" -#: includes/i18n.php:463 -msgid "" -"The plugin will be periodically sending data to %s to check for plugin " -"updates and verify the validity of your license." -msgstr "Il plugin invierà dati periodicamente a %s per controllare l'esistenza di aggiornamenti e verificare la validità della tua licenza." +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Delega ai proprietari del sito" -#: includes/i18n.php:467 -msgid "What permissions are being granted?" -msgstr "Quali autorizzazioni vengono concesse?" +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "Se fai clic questa decisione sarà delegata agli amministratori del sito." -#: includes/i18n.php:469 +#: templates/connect.php:333 msgid "Your Profile Overview" msgstr "Panoramica del tuo profilo" -#: includes/i18n.php:471 +#: templates/connect.php:334 msgid "Name and email address" msgstr "Nome ed indirizzo email" -#: includes/i18n.php:473 +#: templates/connect.php:339 msgid "Your Site Overview" msgstr "Panoramica del tuo sito" -#: includes/i18n.php:475 +#: templates/connect.php:340 msgid "Site URL, WP version, PHP info, plugins & themes" msgstr "URL del sito, versione di WP, informazioni PHP, plugin e temi" -#: includes/i18n.php:479 -msgid "Current Plugin Events" -msgstr "Eventi correnti del plugin" +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Avvisi amministratore" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Aggiornamenti, annunci, marketing, no spam" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Eventi %sattuali" -#: includes/i18n.php:481 +#: templates/connect.php:352 msgid "Activation, deactivation and uninstall" msgstr "Attiva, disattivazione e disinstallazione" -#: includes/i18n.php:483 -msgid "Plugins & Themes" -msgstr "Plugin e temi" +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Newsletter" -#: includes/i18n.php:485 -msgid "Titles, versions and state." -msgstr "Titoli, versioni e stato." +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr " Il %1$s invierà periodicamente dei dati a %2$s per verificare aggiornamenti di sicurezza e di funzionalità e verificare la validità della tua licenza." -#: includes/i18n.php:487 -msgid "Admin Notices" -msgstr "Avvisi amministratore" +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "Quali autorizzazioni vengono concesse?" -#: includes/i18n.php:489 -msgid "Newsletter" -msgstr "Newsletter" +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "Non hai una chiave di licenza?" -#: includes/i18n.php:491 -msgid "Updates, announcements, marketing, no spam" -msgstr "Aggiornamenti, annunci, marketing, no spam" +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Attiva versione gratuita" -#: includes/i18n.php:493 +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "Hai una chiave di licenza?" + +#: templates/connect.php:415 msgid "Privacy Policy" msgstr "Politica sulla privacy" -#: includes/i18n.php:495 +#: templates/connect.php:417 msgid "Terms of Service" msgstr "Termini del Servizio" -#: includes/i18n.php:497 -msgctxt "as activating plugin" -msgid "Activating" -msgstr "Attivazione" - -#: includes/i18n.php:499 +#: templates/connect.php:750 msgctxt "as in the process of sending an email" msgid "Sending email" msgstr "Invio email" -#: includes/i18n.php:503 -msgctxt "button label" -msgid "Allow & Continue" -msgstr "Consenti & Continua" - -#: includes/i18n.php:505 -msgctxt "button label" -msgid "Agree & Activate License" -msgstr "Accetta e attiva la licenza" - -#: includes/i18n.php:507 -msgctxt "verb" -msgid "Skip" -msgstr "Salta" +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Attivazione" -#: includes/i18n.php:509 -msgid "Click here to use the plugin anonymously" -msgstr "Fai clic qui per usare il plugin anonimamente" +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contatti" -#: includes/i18n.php:511 -msgid "Re-send activation email" -msgstr "Invia nuovamente l'email di attivazione" +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Non attivo" -#: includes/i18n.php:513 -msgid "License key" -msgstr "Chiave di licenza" +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "Attivo" -#: includes/i18n.php:515 -msgid "Send License Key" -msgstr "Invia chiave di licenza" +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" -#: includes/i18n.php:517 -msgid "Sending license key" -msgstr "Invio chiave di licenza" +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Debugging" -#: includes/i18n.php:519 -msgid "Have a license key?" -msgstr "Hai una chiave di licenza?" +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "Azioni" -#: includes/i18n.php:521 -msgid "Don't have a license key?" -msgstr "Non hai una chiave di licenza?" +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Sei sicuro di voler eliminare tutti i dati di Freemius?" -#: includes/i18n.php:523 -msgid "Can't find your license key?" -msgstr "Non trovi la tua chiave di licenza?" +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Eliminare tutti gli account" -#: includes/i18n.php:525 -msgid "" -"We couldn't find your email address in the system, are you sure it's the " -"right address?" -msgstr "Non siamo riusciti a trovare il tuo indirizzo email nel sistema, sei sicuro che sia l'indirizzo giusto?" +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "Elimina cache API" -#: includes/i18n.php:529 -msgid "" -"We can't see any active licenses associated with that email address, are you" -" sure it's the right address?" -msgstr "Non siamo riusciti a trovare alcuna licenza attiva associata al tuo indirizzo email, sei sicuro che sia l'indirizzo giusto?" +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Svuota le Transient degli aggiornamenti" -#: includes/i18n.php:533 -msgid "Opt In" -msgstr "Iscriviti" +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Sincronizza i dati dal server" -#: includes/i18n.php:535 -msgid "Opt Out" -msgstr "Cancella iscrizione" +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Carica opzioni del DB" -#: includes/i18n.php:537 -msgid "On second thought - I want to continue helping" -msgstr "Ci ho ripensato, voglio continuare a fornire il mio aiuto" +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Imposta opzione del DB" -#: includes/i18n.php:541 -msgid "Opting out..." -msgstr "Cancellamento dell'iscrizione..." +#: templates/debug.php:170 +msgid "Key" +msgstr "Chiave" -#: includes/i18n.php:543 -msgid "Opting in..." -msgstr "Iscrizione in corso..." +#: templates/debug.php:171 +msgid "Value" +msgstr "Valore" -#: includes/i18n.php:545 -msgid "" -"We appreciate your help in making the %s better by letting us track some " -"usage data." -msgstr "Ti ringraziamo per averci concesso di tracciare alcuni dati di utilizzo al fine di migliorare %s" +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "Versioni SDK" -#: includes/i18n.php:549 -msgid "" -"Usage tracking is done in the name of making %s better. Making a better user" -" experience, prioritizing new features, and more good things. We'd really " -"appreciate if you'll reconsider letting us continue with the tracking." -msgstr "Tracciamo l'utilizzo esclusivamente per rendere %s migliore, creando una migliore esperienza utente e dando priorità a nuove funzionalità, oltre a molte altre buone cose. Saremmo veramente felici di vederti cambiare idea e lasciarci continuare con il tracciamento." +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "Percorso SDK" -#: includes/i18n.php:553 -msgid "" -"By clicking \"Opt Out\", we will no longer be sending any data from %s to " -"%s." -msgstr "Cliccando su \"Cancella iscrizione\", non invieremo più nessuna informazione da %s a %s." +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Percorso modulo" -#: includes/i18n.php:563 -msgid "Screenshots" -msgstr "Screenshots" +#: templates/debug.php:194 +msgid "Is Active" +msgstr "è attiva" -#: includes/i18n.php:565 -msgid "Click to view full-size screenshot %d" -msgstr "Fare clic per visualizzare lo screenshot in grandi dimensioni %d" +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Plugin" -#: includes/i18n.php:573 -msgid "Freemius Debug" -msgstr "Debug Freemius" +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Temi" -#: includes/i18n.php:575 -msgctxt "as turned on" -msgid "On" -msgstr "Attivo" +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Slug" -#: includes/i18n.php:577 -msgctxt "as turned off" -msgid "Off" -msgstr "Non attivo" +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "Titolo" -#: includes/i18n.php:579 -msgctxt "as code debugging" -msgid "Debugging" -msgstr "Debugging" +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" -#: includes/i18n.php:581 +#: templates/debug.php:231 msgid "Freemius State" msgstr "Stato di Freemius" -#: includes/i18n.php:583 +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Network Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Utente Network" + +#: templates/debug.php:273 msgctxt "as connection was successful" msgid "Connected" msgstr "Connesso" -#: includes/i18n.php:585 +#: templates/debug.php:274 msgctxt "as connection blocked" msgid "Blocked" msgstr "Bloccato" -#: includes/i18n.php:587 -msgctxt "as application program interface" -msgid "API" -msgstr "API" +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simula versione di prova" -#: includes/i18n.php:589 -msgctxt "as software development kit versions" -msgid "SDK" -msgstr "SDK" +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simula aggiornamento network" -#: includes/i18n.php:591 -msgctxt "as software development kit versions" -msgid "SDK Versions" -msgstr "Versioni SDK" +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s Installazioni" -#: includes/i18n.php:595 -msgctxt "as plugin folder path" -msgid "Plugin Path" -msgstr "Percorso del plugin" +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Siti" -#: includes/i18n.php:597 -msgctxt "as sdk path" -msgid "SDK Path" -msgstr "Percorso SDK" +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "Blog ID" -#: includes/i18n.php:599 -msgid "Add Ons of Plugin %s" -msgstr "Add-on del Plugin %s" +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Elimina" -#: includes/i18n.php:601 -msgid "Are you sure you want to delete all Freemius data?" -msgstr "Sei sicuro di voler eliminare tutti i dati di Freemius?" +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Addon del modulo %s" -#: includes/i18n.php:605 -msgid "Actions" -msgstr "Azioni" +#: templates/debug.php:472 +msgid "Users" +msgstr "Utenti" -#: includes/i18n.php:607 -msgid "Delete All Accounts" -msgstr "Eliminare tutti gli account" +#: templates/debug.php:479 +msgid "Verified" +msgstr "Verificato" -#: includes/i18n.php:609 -msgid "Start Fresh" -msgstr "Inizia da capo" +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licenze" -#: includes/i18n.php:611 -msgid "Clear API Cache" -msgstr "Elimina cache API" +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "Plugin ID" -#: includes/i18n.php:613 -msgid "Sync Data From Server" -msgstr "Sincronizza i dati dal server" +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "ID Piano" -#: includes/i18n.php:615 -msgid "Scheduled Crons" -msgstr "Azioni programmate" +#: templates/debug.php:518 +msgid "Quota" +msgstr "Quota" -#: includes/i18n.php:617 -msgid "Plugins & Themes Sync" -msgstr "Sincronizzazione plugin e temi" +#: templates/debug.php:519 +msgid "Activated" +msgstr "Attivato" -#: includes/i18n.php:625 -msgctxt "as congratulations" -msgid "Congrats" -msgstr "Congratulazioni" +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Bloccato" -#: includes/i18n.php:627 -msgctxt "exclamation" -msgid "Oops" -msgstr "Ops" +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Scadenza" -#: includes/i18n.php:629 -msgctxt "interjection expressing joy or exuberance" -msgid "Yee-haw" -msgstr "Evvai" +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Debug Log" -#: includes/i18n.php:633 -msgctxt "" -"(especially in electronic communication) used to express elation, " -"enthusiasm, or triumph." -msgid "W00t" -msgstr "Forte" +#: templates/debug.php:549 +msgid "All Types" +msgstr "Tutti i tipi" -#: includes/i18n.php:637 -msgctxt "a positive response" -msgid "Right on" -msgstr "Sì" +#: templates/debug.php:556 +msgid "All Requests" +msgstr "Tutte le richieste" -#: includes/i18n.php:639 -msgctxt "" -"something somebody says when they are thinking about what you have just " -"said. " -msgid "Hmm" -msgstr "Uhm" +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "File" -#: includes/i18n.php:643 -msgid "O.K" -msgstr "OK" +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "Funzione" -#: includes/i18n.php:645 -msgctxt "exclamation" -msgid "Hey" -msgstr "Hey" +#: templates/debug.php:563 +msgid "Process ID" +msgstr "ID processo" -#: includes/i18n.php:647 -msgctxt "advance notice of something that will need attention." -msgid "Heads up" -msgstr "Attenzione" +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" -#: includes/i18n.php:657 -msgid "Seems like you got the latest release." -msgstr "Sembra che tu abbia la versione più recente." +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "Messaggio" -#: includes/i18n.php:659 -msgid "You are all good!" -msgstr "Sei fantastico!" +#: templates/debug.php:567 +msgid "Filter" +msgstr "Filtro" -#: includes/i18n.php:661 -msgid "" -"Sorry, we could not complete the email update. Another user with the same " -"email is already registered." -msgstr "Siamo spiacenti, non siamo riusciti a completare l'aggiornamento via email. Un altro utente con lo stesso indirizzo email è già registrato." +#: templates/debug.php:575 +msgid "Download" +msgstr "Download" -#: includes/i18n.php:665 -msgid "" -"If you would like to give up the ownership of the plugin's account to %s " -"click the Change Ownership button." -msgstr "Se vuoi cedere la proprietá dell'account del plugin a %s clicca su Cambia Proprietà." +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Tipo" -#: includes/i18n.php:669 -msgid "" -"Your email was successfully updated. You should receive an email with " -"confirmation instructions in few moments." -msgstr "Il tuo indirizzo email è stato aggiornato correttamente. Riceverai un'email con le istruzioni di conferma in pochi istanti." +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Timestamp" -#: includes/i18n.php:673 -msgid "Your name was successfully updated." -msgstr "Il tuo nome è stato aggiornato correttamente." +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Metti in sicurezza la pagina HTTPS %s gestita da un dominio esterno" -#: includes/i18n.php:675 -msgid "You have successfully updated your %s." -msgstr "Hai aggiornato con successo il tuo %s." +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Supporto" -#: includes/i18n.php:677 -msgid "Please provide your full name." -msgstr "Per favore inserisci il tuo nome completo." +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" -#: includes/i18n.php:679 -msgid "" -"Verification mail was just sent to %s. If you can't find it after 5 min, " -"please check your spam box." -msgstr "L'email di verifica è stata inviata a %s. Se dopo 5 minuti non è ancora arrivata, per favore controlla nella tua casella di posta indesiderata." +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" -#: includes/i18n.php:683 -msgid "" -"Just letting you know that the add-ons information of %s is being pulled " -"from an external server." -msgstr "Le informazioni sugli add-on di %s vengono scaricate da un server esterno." +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Richieste" -#: includes/i18n.php:687 -msgid "No credit card required" -msgstr "Nessuna carta di credito richiesta" +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Aggiorna" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Fatturazione" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Nome della compagnia" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "Numero Partita Iva o VAT" + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Riga indirizzo %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "Città" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "Cittadina" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "CAP" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "Nazione" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Seleziona Nazione" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "Stato" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "Provincia" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Pagamenti" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Data" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Importo" -#: includes/i18n.php:689 -msgid "Premium plugin version was successfully activated." -msgstr "La versione Premium del plugin è stata attivata correttamente." +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Fattura" -#: includes/i18n.php:693 -msgid "The upgrade of %s was successfully completed." -msgstr "L'aggiornamento di %s è stato completato con successo." +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" -#: includes/i18n.php:695 -msgid "Your account was successfully activated with the %s plan." -msgstr "Il tuo account è stato attivato correttamente con il piano %s." +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Metodo" -#: includes/i18n.php:699 -msgid "Download the latest %s version now" -msgstr "Scarica l'ultima versione di %s" +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Codice" -#: includes/i18n.php:701 -msgid "Please follow these steps to complete the upgrade" -msgstr "Segui i passi seguenti per completare l'aggiornamento" +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Lunghezza" -#: includes/i18n.php:705 -msgid "Download the latest %s version" -msgstr "Scarica l'ultima versione di %s" +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Percorso" -#: includes/i18n.php:707 -msgid "Download the latest version" -msgstr "Scarica l'ultima versione" +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Body" -#: includes/i18n.php:709 -msgid "Deactivate the free version" -msgstr "Disattiva la versione gratuita" +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Risultato" -#: includes/i18n.php:711 -msgid "Upload and activate the downloaded version" -msgstr "Carica e attiva la versione scaricata" +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Avvia" -#: includes/i18n.php:713 -msgid "How to upload and activate?" -msgstr "Come faccio a caricare ed attivare?" +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "Fine" -#: includes/i18n.php:715 -msgctxt "%s - product name, e.g. Facebook add-on was successfully..." -msgid "%s Add-on was successfully purchased." -msgstr "L' add-on %s è stato acquistato con successo." +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" -#: includes/i18n.php:719 -msgid "Your %s Add-on plan was successfully upgraded." -msgstr "Il piano del tuo add-on %s è stato aggiornato con successo." +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "In %s" -#: includes/i18n.php:723 -msgid "Your email has been successfully verified - you are AWESOME!" -msgstr "Il tuo indirizzo email è stato verificato con successo - SEI UN GRANDE!" +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "%s fa" -#: includes/i18n.php:727 -msgid "Your plan was successfully upgraded." -msgstr "Il piano è stato aggiornato con successo." +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "sec" -#: includes/i18n.php:729 -msgid "Your plan was successfully changed to %s." -msgstr "Il piano è stato cambiato con successo a %s." +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Sincronizzazione plugin e temi" -#: includes/i18n.php:731 -msgid "" -"Your license has expired. You can still continue using the free plugin " -"forever." -msgstr "La licenza è scaduta. È comunque possibile continuare ad utilizzare il plugin gratuito per sempre." +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Totale" -#: includes/i18n.php:735 -msgid "" -"Your license has been cancelled. If you think it's a mistake, please contact" -" support." -msgstr "La tua licenza è stata cancellata. Se credi sia un errore, per favore contatta il supporto." +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Ultimo" -#: includes/i18n.php:739 -msgid "Your trial has been successfully started." -msgstr "La versione di prova è stata avviata correttamente." +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Azioni programmate" -#: includes/i18n.php:741 -msgid "Your license was successfully activated." -msgstr "La tua licenza è stata attivata correttamente." +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Modulo" -#: includes/i18n.php:743 -msgid "It looks like your site currently doesn't have an active license." -msgstr "Sembra che il tuo sito non disponga di alcuna licenza attiva." +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Tipo di modulo" -#: includes/i18n.php:747 -msgid "" -"Your license was successfully deactivated, you are back to the %s plan." -msgstr "La tua licenza é stata disattivata con successo, sei tornato al piano %s." +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Tipo di Cron" -#: includes/i18n.php:751 -msgid "It looks like the license deactivation failed." -msgstr "Sembra che la disattivazione della licenza non sia riuscita." +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Successivo" -#: includes/i18n.php:755 -msgid "It looks like the license could not be activated." -msgstr "Sembra che la licenza non possa essere attivata." +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Non in scadenza" -#: includes/i18n.php:759 -msgid "Error received from the server:" -msgstr "Errore ricevuto dal server:" +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Applica per diventare un affiliato" -#: includes/i18n.php:761 -msgid "" -"Your trial has expired. You can still continue using all our free features." -msgstr "La versione di prova è scaduta. Si può comunque continuare a utilizzare tutte le nostre funzioni gratuite." +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "La tua applicazione di affiliazione per %s è stata accettata! Accedi alla tua area di affiliazione a %s." -#: includes/i18n.php:765 -msgid "" -"Your plan was successfully downgraded. Your %s plan license will expire in " -"%s." -msgstr "Il tuo piano è stato declassato con successo. La licenza del piano %s scadrà in %s." +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Grazie per la partecipazione al nostro programma di affiliazione, valuteremo la tua richiesta durante i prossimi 14 giorni e ti contatteremo per maggiori informazioni." -#: includes/i18n.php:769 -msgid "" -"Seems like we are having some temporary issue with your plan downgrade. " -"Please try again in few minutes." -msgstr "Stiamo avendo qualche problema temporaneo con il downgrade del piano. Riprova tra qualche minuto." +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Il tuo account di affiliazione è stato sospeso temporaneamente." -#: includes/i18n.php:773 -msgid "" -"It looks like you are not in trial mode anymore so there's nothing to cancel" -" :)" -msgstr "Sembra che tu non stia più usando la prova gratuita, quindi non c'è niente che tu debba annullare :)" +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Grazie per la partecipazione al nostro programma di affiliazione, sfortunatamente abbiamo valutato di rifiutare la tua richiesta. Prova nuovamente fra 30 giorni." -#: includes/i18n.php:777 -msgid "Your %s free trial was successfully cancelled." -msgstr "Il tuo periodo di prova gratuito %s è stato annullato con successo." +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "A causa della violazione dei nostri termini di affiliazione abbiamo deciso di bloccare temporaneamente il tuo account affiliativo. Se hai domande contatta il supporto." -#: includes/i18n.php:781 -msgctxt "%s - numeric version number" -msgid "Version %s was released." -msgstr "La versione %s é stata rilasciata." +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Ti piace %s? Diventa il nostro ambasciatore e guadagna denaro ;-)" -#: includes/i18n.php:785 -msgid "Please download %s." -msgstr "Scarica %s." +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Comunica nuovi clienti al nostro %s e guadagna %s di commissione per ogni vendita avvenuta!" -#: includes/i18n.php:787 -msgctxt "%s - plan name, as the latest professional version here" -msgid "the latest %s version here" -msgstr "l'ultima versione %s é quì" +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Sommario programma" -#: includes/i18n.php:791 -msgid "" -"How do you like %s so far? Test all our %s premium features with a %d-day " -"free trial." -msgstr "Come sta andando con %s? Prova tutte le funzionalità premium di %s con una prova gratuita di %d giorni." +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%scommissione quando un utente acquista una nuova lcienza." -#: includes/i18n.php:795 -msgctxt "call to action" -msgid "Start free trial" -msgstr "Inizia il periodo di prova gratuito" +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Ottieni delle commissioni dal sistema automatizzato di rinnovo." -#: includes/i18n.php:797 -msgid "Starting trial" -msgstr "Inizio del periodo di prova gratuito" +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s cookie di tracciamento dopo che la prima visita per massimizzare i margini di guadagno. " -#: includes/i18n.php:799 -msgid "Please wait" -msgstr "Attendere" +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Commissioni illimitate." -#: includes/i18n.php:801 -msgid "" -"Seems like we are having some temporary issue with your trial cancellation. " -"Please try again in few minutes." -msgstr "Stiamo avendo qualche problema temporaneo con l'annullamento del periodo di prova. Riprova tra qualche minuto." +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%s quantità minima per il pagamento." -#: includes/i18n.php:805 -msgid "You already utilized a trial before." -msgstr "Hai già utilizzato una prova gratuita in passato." +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "I pagamenti sono in Dollari Americani e processati mensilmente da PayPal." -#: includes/i18n.php:807 -msgid "You are already running the plugin in a trial mode." -msgstr "Stai già usando il plugin in modalità di prova gratuita." +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "Ci riserviamo 30 giorni in caso di rimborsi, paghiamo le commissioni se sono più vecchie di 30 giorni." -#: includes/i18n.php:811 -msgid "Plan %s do not exist, therefore, can't start a trial." -msgstr "Il piano %s non esiste, per questo motivo non è possibile iniziare il periodo di prova." +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Affiliati" -#: includes/i18n.php:815 -msgid "Plan %s does not support a trial period." -msgstr "Il piano %s non supporta il periodo di prova." +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "Indirizzo email" -#: includes/i18n.php:817 -msgid "None of the plugin's plans supports a trial period." -msgstr "Non esiste alcun piano del plugin che offra il periodo di prova." +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Nome completo" -#: includes/i18n.php:821 -msgid "" -"Unexpected API error. Please contact the plugin's author with the following " -"error." -msgstr "Errore inaspettato dell'API. Per favore contatta l'autore del plugin riportando il seguente errore." +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "Indirizzo account email Paypal" -#: includes/i18n.php:825 -msgid "No commitment for %s days - cancel anytime!" -msgstr "Nessun impegno per %s giorni - puoi annullare in qualsiasi momento!" +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Dove vuoi promuovere %s?" -#: includes/i18n.php:827 -msgid "" -"Your license has expired. You can still continue using all the %s features, " -"but you'll need to renew your license to continue getting updates and " -"support." -msgstr "La licenza è scaduta. È comunque possibile continuare a utilizzare tutte le funzionalità di %s, ma sarà necessario rinnovare la licenza per continuare a ricevere gli aggiornamenti ed il supporto." +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Inserisci il dominio del tuo sito o altri siti da dove vuoi promuovere %s." -#: includes/i18n.php:831 -msgid "Couldn't activate %s." -msgstr "Non é stato possibile attivare %s." +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Aggiungi un altro dominio" -#: includes/i18n.php:833 -msgid "Please contact us with the following message:" -msgstr "Contattaci con il seguente messaggio:" +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Domini aggiuntivi" -#: includes/i18n.php:835 -msgid "" -"It looks like you are still on the %s plan. If you did upgrade or change " -"your plan, it's probably an issue on our side - sorry." -msgstr "Sembra che tu sia ancora usando il piano %s. Se hai effettuato un upgrade o cambiato il piano, è probabile che ci sia un problema nei nostri sistemi." +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Domini aggiuntivi dove ci sarà il modulo promozionale." -#: includes/i18n.php:839 -msgid "Please contact us here" -msgstr "Contattaci qui" +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Metodi promozionali" -#: includes/i18n.php:841 -msgid "" -"I have upgraded my account but when I try to Sync the License, the plan " -"remains %s." -msgstr "Ho aggiornato il mio account, ma quando cerco di sincronizzare la licenza, il piano rimane %s." +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Social network (Facebook, Twitter, ecc.)" -#: includes/i18n.php:849 -msgid "From unknown reason, the API connectivity test failed." -msgstr "Il test di connettività dell'API ha fallito per motivi sconosciuti." +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Applicazioni mobile" -#: includes/i18n.php:853 -msgid "" -"It's probably a temporary issue on our end. Just to be sure, with your " -"permission, would it be o.k to run another connectivity test?" -msgstr "Si tratta probabilmente di un problema nei nostri sistemi. Per esserne sicuri, potresti darci il permesso di effettuare un ulteriore test della connettività? " +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Siti, email e statistiche dei social network (opzionali)" -#: includes/i18n.php:857 -msgid "" -"We use PHP cURL library for the API calls, which is a very common library " -"and usually installed out of the box. Unfortunately, cURL is not installed " -"on your server." -msgstr "Utilizziamo la libreria PHP cURL per le chiamate alla nostra API. Questa libreria è molto comune ed è installata di base. Sfortunatamente cURL non è presente nel tuo server." +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Facci sapere ogni sito o statistiche social valide, es: visite uniche mensili, numero di sottoscrizioni email, follower ecc (tratteremo queste informazioni come riservate)." -#: includes/i18n.php:861 -msgid "" -"From unknown reason, CloudFlare, the firewall we use, blocks the connection." -msgstr "Per un motivo sconosciuto, CloudFlare, il firewall che utilizziamo, blocca la connessione." +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "Come ci promuoverai?" -#: includes/i18n.php:865 -msgctxt "as pluginX requires an access to our API" -msgid "%s requires an access to our API." -msgstr "%s richiede un accesso alla nostra API." +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Fornisci i dettagli su come intendi promuovere %s. (sii più esplicativo possibile)" -#: includes/i18n.php:869 -msgid "" -"It looks like your server is using Squid ACL (access control lists), which " -"blocks the connection." -msgstr "Sembra che il tuo server stia usando Squid ACL (lista per il controllo degli accessi) il quale blocca la connessione." +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Annulla" -#: includes/i18n.php:873 -msgid "I don't know what is Squid or ACL, help me!" -msgstr "Non ho idea di cosa sia Squid o ACL, aiutami!" +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Diventa un affiliato" -#: includes/i18n.php875, includes/i18n.php:889 -msgid "" -"We'll make sure to contact your hosting company and resolve the issue. You " -"will get a follow-up email to %s once we have an update." -msgstr "Contatteremo il tuo hosting e risolveremo il problema. Riceverai un' email a %s non appena ci saranno aggiornamenti." +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Per favore inserisci la chiave di licenza che hai ricevuto via mail subito dopo l'acquisto:" -#: includes/i18n.php:879 -msgid "I'm a system administrator" -msgstr "Sono un sistemista" +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Aggiorna licenza" -#: includes/i18n.php:881 -msgid "" -"Great, please whitelist the following domains: %s. Once you done, deactivate" -" the plugin and activate it again." -msgstr "Perfetto, aggiungi alla whitelist i seguenti domini: %s. Una volta che hai fatto, disattiva il plugin e attivalo di nuovo." +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Cancella iscrizione" -#: includes/i18n.php:885 -msgid "I don't know what is cURL or how to install it, help me!" -msgstr "Non ho idea di cosa sia cURL o come installarlo, aiutami!" +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Iscriviti" -#: includes/i18n.php:893 -msgid "" -"Great, please install cURL and enable it in your php.ini file. To make sure " -"it was successfully activated, use 'phpinfo()'. Once activated, deactivate " -"the plugin and reactivate it back again." -msgstr "Perfetto, installa cURL ed attivalo nel tuo file php.ini. Per essere sicuro di averlo attivato con successo, usa \"phpinfo()\". Una volta attivato disattva il plugin e attivalo di nuovo." +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Tracciamo l'utilizzo esclusivamente per rendere %s migliore, creando una migliore esperienza utente e dando priorità a nuove funzionalità, oltre a molte altre buone cose. Saremmo veramente felici di vederti cambiare idea e lasciarci continuare con il tracciamento." -#: includes/i18n.php:897 -msgid "" -"We are sure it's an issue on our side and more than happy to resolve it for " -"you ASAP if you give us a chance." -msgstr "Siamo sicuri che sia un nostro problema e siamo più che felici di risolverlo per te al più presto. Per poter procedere abbiamo bisogno del tuo consenso." +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "Cliccando su \"Cancella iscrizione\", non invieremo più nessuna informazione da %s a %s." -#: includes/i18n.php:901 -msgid "" -"Sorry for the inconvenience and we are here to help if you give us a chance." -msgstr "Siamo spiacenti per l'inconveniente e siamo qui per aiutarti con il tuo permesso." +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "C'è una nuova versione di %s disponibile." -#: includes/i18n.php:905 -msgid "Yes - I'm giving you a chance to fix it" -msgstr "Sì - sto dandovi la possibilità di risolvere il problema" +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRinnova la tua licenza ora %s per accedere alla versione %s con aggiornamenti di sicurezza e funzionalità oltre che supporto." -#: includes/i18n.php:907 -msgid "" -"We will do our best to whitelist your server and resolve this issue ASAP. " -"You will get a follow-up email to %s once we have an update." -msgstr "Faremo del nostro meglio per mettere il server in whitelist e risolvere il problema il prima possibile. Avrai un aggiornamento dello stato tramite email all'indirizzo %s." +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "Nuova versione disponibile" -#: includes/i18n.php:911 -msgid "Let's try your previous version" -msgstr "Proviamo con la versione precedente" +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Rinnova licenza" -#: includes/i18n.php:913 -msgid "Uninstall this version and install the previous one." -msgstr "Disinstalla questa versione e installa quella precedente." +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Chiudi" -#: includes/i18n.php:917 -msgid "That's exhausting, please deactivate" -msgstr "È estenuante, disattivalo" +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Invia chiave di licenza" -#: includes/i18n.php:919 -msgid "" -"We feel your frustration and sincerely apologize for the inconvenience. Hope" -" to see you again in the future." -msgstr "Capiamo la tua frustrazione e ci scusiamo per l'inconveniente. Speriamo di rivederti nuovamente in futuro." +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Inserisci qui sotto l'indirizzo email che hai usato per registrare l'aggiornamento e ti invieremo di nuovo la chiave di licenza." -#: includes/i18n.php:923 -msgid "" -"Thank for giving us the chance to fix it! A message was just sent to our " -"technical staff. We will get back to you as soon as we have an update to %s." -" Appreciate your patience." -msgstr "Grazie per averci dato la possibilità di risolvere il problema! È stato appena inviato un messaggio al nostro staff tecnico. Ti risponderemo non appena avremo un aggiornamento riguardante %s. Grazie per la tua pazienza." +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "Sei a un clic di distanza dall'iniziare il tuo periodo di prova gratuito di %1$s giorni per il piano %2$s." -#: includes/i18n.php:927 -msgctxt "%1s - plugin title, %2s - API domain" -msgid "" -"Your server is blocking the access to Freemius' API, which is crucial for " -"%1s synchronization. Please contact your host to whitelist %2s" -msgstr "Il tuo server sta bloccando l'accesso all'API di Freemius. L'accesso è cruciale per quanto riguarda la la sincronizzazione di %1s. Per favore contatta il tuo host per aggiungere %2s alla whitelist." +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "Per essere accettato del regolamento WordPress.org, prima di attivare il periodo di prova devi accettare di condividere informazioni come il tuo utente e dati non sensibili. Permettendo a %s di inviare dati periodicamente a %s per verificare gli aggiornamenti e approvare il periodo di prova." -#: includes/i18n.php:931 -msgid "" -"It seems like one of the authentication parameters is wrong. Update your " -"Public Key, Secret Key & User ID, and try again." -msgstr "Sembra che uno dei parametri di autenticazione sia sbagliato. Aggiorna la tua chiave pubblica, Secret Key & User ID e riprova." +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" -#: includes/i18n.php:939 -msgid "" -"Please check your mailbox, you should receive an email via %s to confirm the" -" ownership change. From security reasons, you must confirm the change within" -" the next 15 min. If you cannot find the email, please check your spam " -"folder." -msgstr "Verifica di aver ricevuto l'email da %s per confermare il cambiamento del proprietario. Per ragioni di sicurezza devi confermare il cambiamento entro 15 minuti. Se non trovi l'email controlla nella posta indesiderata." +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Attiva la licenza su tutti i siti del network." -#: includes/i18n.php:943 -msgid "" -"Thanks for confirming the ownership change. An email was just sent to %s for" -" final approval." -msgstr "Grazie per aver confermato il cambiamento del proprietario. Un' email è stata appena inviata a %s per la conferma finale." +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Applica su tutti i siti della rete." -#: includes/i18n.php:947 -msgid "%s is the new owner of the account." -msgstr "%s è il nuovo proprietario dell'account." +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Attiva le licenze su tutti i siti in attesa." -#: includes/i18n.php:951 -msgctxt "addonX cannot run without pluginY" -msgid "%s cannot run without %s." -msgstr "%s non può funzionare senza %s." +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Applica su tutti i siti in attesa." -#: includes/i18n.php:955 -msgctxt "addonX cannot run..." -msgid "%s cannot run without the plugin." -msgstr "%s non può funzionare senza il plugin." +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "permetti" -#: includes/i18n.php:959 -msgctxt "pluginX activation was successfully..." -msgid "%s activation was successfully completed." -msgstr "%s è stato attivato con successo." +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "delega" -#: includes/i18n.php:963 -msgctxt "Plugin installer section title" -msgid "Features & Pricing" -msgstr "Caratteristiche & prezzi" +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "salta" -#: includes/i18n.php:967 -msgid "Add-on must be deployed to WordPress.org or Freemius." -msgstr "L'add-on dev'essere distribuito da WordPress.org o Freemius." +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Fare clic per visualizzare lo screenshot in grandi dimensioni %d" -#: includes/i18n.php:971 -msgid "Paid add-on must be deployed to Freemius." -msgstr "Gli add-on a pagamento devono essere distribuiti da Freemius." +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Aggiornamenti Illimitati" -#: includes/i18n.php:979 -msgid "" -"%s is a premium only add-on. You have to purchase a license first before " -"activating the plugin." -msgstr "%s è un add-on premium. Devi comprare una licenza prima di poter attivare il plugin." +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Localhost" -#: includes/i18n.php:983 -msgid "" -"%s free trial was successfully cancelled. Since the add-on is premium only " -"it was automatically deactivated. If you like to use it in the future, " -"you'll have to purchase a license." -msgstr "Il periodo di prova gratuito %s è stato annullato con successo. Siccome l'add-on è premium, è stato disattivato automaticamente. Se vorrai usarlo in futuro, dovrai comprare una licenza." +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "%s rimanenti" -#: includes/i18n.php:995 -msgctxt "as every month" -msgid "Monthly" -msgstr "Mensilmente" +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Ultima licenza" -#: includes/i18n.php:997 -msgctxt "as monthly period" -msgid "mo" -msgstr "mese" +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Annullato" -#: includes/i18n.php:999 -msgctxt "as once a year" -msgid "Annual" -msgstr "Annuale" +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Scaduto" -#: includes/i18n.php:1001 -msgctxt "as once a year" -msgid "Annually" -msgstr "Annualmente" +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "Nessuna scadenza" -#: includes/i18n.php:1003 -msgctxt "as once a year" -msgid "Once" -msgstr "Una volta" +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Attivare questo addon" -#: includes/i18n.php:1005 -msgctxt "as annual period" -msgid "year" -msgstr "anno" +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Nome proprietario" -#: includes/i18n.php:1007 -msgid "Lifetime" -msgstr "Tutta la vita" +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "Email proprietario" -#: includes/i18n.php:1009 -msgctxt "e.g. the best product" -msgid "Best" -msgstr "Migliore" +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "ID proprietario" -#: includes/i18n.php:1011 -msgctxt "e.g. billed monthly" -msgid "Billed %s" -msgstr "Fatturato %s" +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Sottoscrivi" -#: includes/i18n.php:1013 -msgctxt "as a discount of $5 or 10%" -msgid "Save %s" -msgstr "Risparmia %s" +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Siamo spiacenti per l'inconveniente e siamo qui per aiutarti con il tuo permesso." -#: includes/i18n.php:1017 -msgid "View details" -msgstr "Visualizza dettagli" +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Contatta il supporto" -#: includes/i18n.php:1025 -msgctxt "button label" -msgid "Approve & Start Trial" -msgstr "Approva e inizia il periodo di prova gratuito" +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Feedback anonimo" -#: includes/i18n.php:1029 -msgid "" -"You are 1-click away from starting your %1$s-day free trial of the %2$s " -"plan." -msgstr "Sei a un clic di distanza dall'iniziare il tuo periodo di prova gratuito di %1$s giorni per il piano %2$s." +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Disattiva" -#: includes/i18n.php:1033 -msgid "" -"For compliance with the WordPress.org guidelines, before we start the trial " -"we ask that you opt-in with your user and non-sensitive site information, " -"allowing the plugin to periodically send data to %s to check for version " -"updates and to validate your trial." -msgstr "Per seguire le linee guida di WordPress, prima di iniziare il periodo di prova ti chiediamo di iscriverti con il tuo utente e i dati non sensibili inerenti al tuo sito, così da permettere periodicamente al plugin di inviare dati a %s per poter controllare la presenza di nuove versioni e convalidare il tuo periodo di prova gratuito." +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Attiva %s" -#: includes/i18n.php:1045 -msgid "Business name" -msgstr "Nome della compagnia" +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Feedback veloce" -#: includes/i18n.php:1047 -msgid "Tax / VAT ID" -msgstr "Numero Partita Iva o VAT" +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "Se hai un attimo, facci sapere perché %s" -#: includes/i18n.php:1049 -msgid "Address Line %d" -msgstr "Riga indirizzo %d" +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "disattivazione in corso" -#: includes/i18n.php:1051 -msgid "Country" -msgstr "Nazione" +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "passa a" -#: includes/i18n.php:1053 -msgid "Select Country" -msgstr "Seleziona Nazione" +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Invia e %s" -#: includes/i18n.php:1055 -msgid "City" -msgstr "Città" +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "Spiegandoci il motivo ci aiuterai a migliorare." -#: includes/i18n.php:1057 -msgid "Town" -msgstr "Cittadina" +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "SI - %s" -#: includes/i18n.php:1059 -msgid "State" -msgstr "Stato" +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Salta & %s" -#: includes/i18n.php:1061 -msgid "Province" -msgstr "Provincia" +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Fai clic qui per usare il plugin anonimamente" -#: includes/i18n.php:1063 -msgid "ZIP / Postal Code" -msgstr "CAP" +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "Potresti non averci fatto caso, ma non sei obbligato a condividere i tuoi dati e puoi semplicemente %s la tua partecipazione." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.mo new file mode 100644 index 0000000000000000000000000000000000000000..d708212ff6b8560ade81375e13ba6ece5c2ce486 GIT binary patch literal 57224 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 PzlCG63Uri9XD<T)fK4pD literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.po new file mode 100644 index 000000000..a0e8714f1 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ja_JP.po @@ -0,0 +1,2302 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +# Odyssey <8bitodyssey+github@gmail.com>, 2016 +# aka.tsundoa, 2018 +# Takayuki Miyauchi <miya0001@users.noreply.github.com>, 2016 +# aka.tsundoa, 2018 +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-24 22:49+0000\n" +"Last-Translator: aka.tsundoa\n" +"Language: ja_JP\n" +"Language-Team: Japanese (Japan) (http://www.transifex.com/freemius/wordpress-sdk/language/ja_JP/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK がプラグインのメインファイルを見つけることができませんでした。現在のエラーを添えて sdk@freemius.com に連絡してください。" + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "エラー" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "より良い %sを見つけました" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "%sの名前は何ですか?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "%sは一時的なものです。現在この問題をデバッグ中です。" + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "無効化" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "テーマ変更" + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "その他" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "%sはもう不要です" + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "短期間だけ %sが 必要です。" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "%s の影響でサイトを崩れました" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "%s の動作が突然停止しました" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "もう払うことができません" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr " 支払ってもよいと思う価格はいくらですか?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "自分の情報を共有したくありません" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "%s が動作しませんでした" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "どうしたら動作するか分かりませんでした。" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "%s は素晴らしいのですが、サポートされていないある機能が必要です" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "何の機能ですか?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "%s が動作していません" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "将来のユーザーのために修正できるよう、何が動作しなかったのかどうか共有してください…" + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "探していたものではありません" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "探していたのは何ですか?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "%sが期待通りに動きませんでした " + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "何を期待していましたか?" + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Freemius デバッグ" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "cURL がなにか、そのインストール方法を知りません。助けてください。" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "ホスティング会社に連絡して問題を解決してください。 更新が完了したら、 %s へのフォローアップメールが届きます。" + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "すばらしい。cURL をインストールし、 php.ini ファイルで有効化してください。加えて、php.ini 内で 'disable_functions' ディレクティブを検索して、'curl_' で始まる無効化されたメソッドを削除してください。'phpinfo()' を使って正常に起動されたことを確認してください。有効化されている場合は %s を一度無効化し、再度有効化し直してください。" + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "はい - お構いなく" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "いいえ - すぐに無効化" + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "おっと" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "修正するチャンスをいただきありがとうございます! テクニカルスタッフにメッセージが送信されました。 %s への更新が行われるとすぐにあなたに連絡します。 あなたの忍耐に感謝します。" + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s は、%s が無いと実行することができません。" + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s は、プラグインが無いと実行することができません。" + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "予期しない API エラーです。%sの作者に次のエラーを連絡してください。" + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "プレミアムバージョンの %sは有効化に成功しました。" + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "やったー" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "%s ライセンスを持っています。" + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "ヤッホー" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "%s の無料試用が正常にキャンセルされました。 アドオンはプレミアムなので、自動的に無効化されました。 将来使用したい場合は、ライセンスを購入する必要があります。" + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s はプレミアムのみのアドオンです。そのプラグインを有効化する前にライセンスを購入する必要があります。" + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "%s に関する詳細情報" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "ライセンスを購入" + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "%s のメールボックスに %s の有効化のメールを受け取っているはずです。%s のメールに記載された有効化ボタンをクリックしてください。" + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "トライアルを開始" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "インストールを完了" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "もうあとわずかです - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "すぐに \"%s\" 有効化を完了してください" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "プラグインを微調整します、 %s, %s" + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "\"%s\" をより良くするためにオプトインをしてください!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "%s のアップグレードが完了しました。" + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "アドオン" + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "プラグイン" + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "テーマ" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "システムではメールアドレスを見つけることができませんでした。メールアドレスが正しいか確認してください。" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "メールアドレスに関連付けられた有効なライセンスが見つかりません。メールアドレスが正しいか確認してください。" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "アカウントは有効化待ちです。" + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "%s の有効化が成功しました。" + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "アカウントが %s プランで有効化できました。" + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "トライアル版の利用を開始しました。" + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "%s を有効化できません。" + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "以下のメッセージとともに私たちに連絡をください。" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "アップグレード" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "トライアルを開始" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "料金表" + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "アフィリエイト" + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "アカウント" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "連絡" + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "アドオン" + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "料金表" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "サポートフォーラム" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "あなたのメールアドレスの承認が完了しました。すごい!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "そうだ" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "%s のアドオンのプランのアップグレードが完了しました。" + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "%s のアドオンの支払いが完了しました。" + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "最新版をダウンロード" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "サーバーは %1s の同期に不可欠な Freemius の API へのアクセスをブロックしています。 ホワイトリストに %2s を追加していただけるようあなたのホスティング会社に連絡してください。" + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "サーバーからエラーを受信しました。" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "認証パラメータの1つが間違っているようです。 公開鍵、秘密鍵、ユーザーIDを更新して、もう一度お試しください。" + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "ふむ" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "まだ %s プランのようです。もしアップグレードやプランの変更をしたのなら、こちらで何らかの問題が発生しているようです。申し訳ありません。" + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "トライアル" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "アカウントをアップグレードしましたが、ライセンスを同期しようとするとプランが %s のままです。" + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "こちらで私たちに連絡をとってください。" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "プランのアップグレードが成功しました。" + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "プランの %s への変更が成功しました。" + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "ライセンスの有効期限が切れました。無料バージョンの%s は引き続き利用できます。" + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "ライセンスの有効期限が切れました。 %1$s %3$sに邪魔されずに利用を継続するには,今すぐ%2$sアップグレードを行ってください。" + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "ライセンスはキャンセルされました。もしそれが間違いだと思うならサポートに連絡してください。" + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "ライセンスは有効期限がきれました。%s の機能を引き続き利用することができます。ただし、アップデートやサポートをうけるにはライセンスをアップデートする必要があります。" + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "フリートライアル期間が終了しました。無料で使える機能は引き続き利用可能です。" + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "フリートライアル期間が終了しました。%1$s %3$sに邪魔されずに利用を継続するには,今すぐ %2$s のアップグレードを行ってください。" + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "ライセンスの有効化ができませんでした。" + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "ライセンスの有効化が成功しました。" + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "サイトは有効なライセンスを持っていないようです。" + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "ライセンスの無効化ができませんでした。" + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "ライセンスの無効化が完了しました。%s プランに戻りました。" + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "O.K" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "プランのダウングレードが完了しました。%s プランは %s に有効期限が切れます。" + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "プランのダウングレードの際に一時的な問題が発生したようです。数分後に再度操作してください。" + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "すでに%sをトライアルモードで利用中です。" + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "以前すでに試用版を利用しました。" + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "%s プランは存在しないため、試用を開始できません。" + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "%s プランにはトライアル期間はありません。" + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "%sのプランにはトライアル期間はありません。" + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "すでにトライアルモードではないようなので、キャンセルする必要はありません :)" + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "%s のフリートライアルはキャンセルされました。" + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "トライアルのキャンセルに一時的な問題がありました。数分後に再度お試しください。" + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "バージョン %s をリリースしました。" + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "%s をダウンロードしてください。" + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "最新の %s バージョンはこちらです。" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "新規" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "最新版を取得できました。" + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "すべて完璧です!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "%s に確認メールを送信しました。もし5分以内にそれが届かない場合、迷惑メールボックスを確認してください。" + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "サイトのオプトインに成功しました。" + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "すごい!" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "使用データを追跡できるよう許可してくれたことで、%s をより良くするための手助けに感謝致します。" + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "ありがとうございます!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "もう%s上の%sから%sへのデータ送信は行いません。" + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "メールボックスを確認してください。所有権の変更を確認するには、%s でメールを受け取る必要があります。 セキュリティ上の理由から、次の15分以内に変更を確認する必要があります。 電子メールが見つからない場合は、迷惑メールフォルダを確認してください。" + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "所有権の変更を確認していただきありがとうございます。 %s に承認メールが送信されました。" + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s は新しいオーナーです。" + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "おめでとう" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "メールアドレスのアップデートを完了できませんでした。他のユーザーがすでに同じメールアドレスで登録しているようです。" + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "%sの所有権を%sへ譲りたい場合は、所有権の変更ボタンをクリックしてください。" + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "オーナーを変更" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "メールアドレスのアップデートが完了しました。まもなく確認メールが届きます。" + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "フルネームを入力してください。" + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "名前のアップデートが成功しました。" + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "%s のアップデートが成功しました。" + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "%s のアドオンに関する情報は、外部サーバーから取得されます。" + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "警告" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "ヘイ" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "%s はどうですか? 私たちの全ての %s のプレミアム機能をお試しください。" + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "%s 日以内であればいつでもキャンセルできます。" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "クレジットカードは必要ありません。" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "フリートライアルを開始" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "こんにちは。%sにアフィリエイトプログラムがあるのはご存知でしたか? %sがお好きなら、私たちのアンバサダーになって報酬を得ましょう!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "詳細はこちら" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "ライセンスを有効化" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "ライセンスを変更" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "オプトアウト" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "オプトイン" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "アップグレードを完了するには以下の手順を完了させてください。" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "最新の %s をダウンロード" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "ダウンロードしたバージョンをアップロードして有効化" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "アップロードと有効化の方法" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sここをクリックして%s ライセンスを有効化したいサイトを選択してください。" + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "自動インストールはオプトインしたユーザのみで動作します。" + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "モジュール ID が不正です" + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "プレミアムバージョンはすでに有効になっています。" + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "プレミアムバージョンにアクセスできる有効なライセンス持っていません。" + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "プラグインはプレミアムコードバージョンのない「サービスウェア」です。" + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "プレミアムアドオンバージョンはすでにインストール済みです。" + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "有料の機能を表示する" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "%sとアドオンのご利用ありがとうございます!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "%sのご利用ありがとうございます!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "%sの改善に役立つ使用状況のトラッキングにすでにオプトインしています。" + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "プロダクトのご利用ありがとうございます!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "プロダクトの改善に役立つ使用状況のトラッキングにすでにオプトインしています。" + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%sとそのアドオン" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "プロダクト" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "はい" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "セキュリティと機能のアップデート、学習用コンテンツやオファーを送ってください。" + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "いいえ" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "セキュリティと機能のアップデート、学習用コンテンツやオファーを%s送らないでください%s。" + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "新しい %sEU General Data Protection Regulation (GDPR)%s コンプライアンスを満たすため、あなたが明示的に同意したことを再度確認し、またあなたがオンボードであることを確認する必要があります 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "セキュリティや機能のアップデート、学習用用コンテンツ、およびオファーについてお問い合わせを希望される場合は、お知らせください。" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "ライセンスキーが空です。" + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "バージョン%sのセキュリティや機能のアップデートまたサポートを受けられるよう、%s今すぐライセンスキーを更新してください%s。" + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "インストール中プラグイン: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "ファイルシステムに接続できません。視覚情報を確認してください。" + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "リモートプラグインパッケージには、目的のスラッグを含むフォルダが含まれていないため、リねームが機能しませんでした。" + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "購入" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "無料の %s を開始" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "フリーバージョンを今すぐインストール" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "今すぐインストール" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "最新のフリーバージョンをダウンロード" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "最新版をダウンロード" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "フリーバージョンの更新を今すぐインストール" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "今すぐ更新をインストール" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "新しいフリーバージョン (%s) がインストールされました" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "新しいバージョン (%s) がインストールされました" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "最新のフリーバージョンがインストールされました" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "最新版がイストールされました" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "説明" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "インストール" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "FAQ" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "スクリーンショット" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "変更履歴" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "レビュー" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "その他の記述" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "機能 & 料金" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "プラグインのインストール" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "%s プラン" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "ベスト" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "月" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "年次" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "ライフタイム" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "%s への請求" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "毎年" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "一度" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "シングルサイトライセンス" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "無制限ライセンス" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "%sサイトまで" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "月" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "年" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "料金" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "%s を保存" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "%s の拘束はありません。いつでもキャンセルできます。" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "無料の %s の後は、わずか %s だけお支払ください。" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "詳細" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "バージョン" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "作者" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "最終更新" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "%s 前" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "必要な WordPress のバージョン" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%sまたはそれ以上" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "互換性のある最新バージョン" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "ダウンロード済み" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "%s回" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s回" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "WordPress.org のプラグインページ" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "プラグインのホームページ" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "このプラグインに寄付する" + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "レーティングの平均" + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "%sを基に" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s評価" + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s評価" + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%sスター" + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%sスター" + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "クリックして%sの評価をしているレビューを観る" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "コントリビューター" + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "警告" + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "このプラグインはインストールされた WordPress のバージョンでは検証されていません。" + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "このプラグインはインストールされた WordPress のバージョンに互換性がありません。" + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "有料アドオンは Freemius にデプロイされている必要があります。" + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "アドオンが WordPress.org か Freemius にデプロイされている必要があります。" + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "プランをダウングレードするとすぐに将来の定期の支払いはすべて停止し、%s プランライセンスは %s で期限切れとなります。" + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "トライアルをキャンセルするとすぐにすべてのプレミアム機能へのアクセスができなくなります。本当に実行しますか?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "すべての%s機能を使うことはできますが、%sへのアクセスやアップデート、またサポートを受けることはできません。" + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "一度ライセンスの期限が切れると、フリーバージョンの利用は可能ですが、%sの機能を使うことができなくなります。" + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "%s プランを有効化" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "%s に自動更新" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "%s で期間終了" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "ライセンスを同期" + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "トライアルをキャンセル" + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "プラン変更" + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "アップグレード" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "ダウングレード" + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "無料" + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "有効化" + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "プラン" + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "フリートライアル" + +#: templates/account.php:165 +msgid "Account Details" +msgstr "アカウント詳細" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "アカウントを削除すると自動的に %s プランライセンスが無効になり、他のサイトで使うことができます。定期の支払いも終了したい場合は、\"キャンセル\"ボタンをクリックし、まずアカウントを\"ダウングレード\"してください。本当に削除を続行してもいいですか?" + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "削除は一時的なものではありません。本当に%sが必要なくなった時に行ってください。" + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "アカウントを削除" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "ライセンスを無効化" + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "本当に続行していいですか?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "サブスクリプションをキャンセルする" + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "同期" + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "名前" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "Email" + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "ユーザー ID" + +#: templates/account.php:274 +msgid "Site ID" +msgstr "サイト ID" + +#: templates/account.php:277 +msgid "No ID" +msgstr "ID がありません" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "公開鍵" + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "秘密鍵" + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "秘密鍵がありません" + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "トライアル" + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "ライセンスキー" + +#: templates/account.php:359 +msgid "not verified" +msgstr "未認証" + +#: templates/account.php:416 +msgid "Premium version" +msgstr "プレミアムバージョン" + +#: templates/account.php:418 +msgid "Free version" +msgstr "フリーバージョン" + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "認証メール" + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "%s バージョンをダウンロード" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "表示" + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "自分の %s はなんですか?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "編集" + +#: templates/account.php:490 +msgid "Sites" +msgstr "サイト数" + +#: templates/account.php:501 +msgid "Search by address" +msgstr "住所で検索する" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "住所" + +#: templates/account.php:512 +msgid "License" +msgstr "ライセンス" + +#: templates/account.php:513 +msgid "Plan" +msgstr "プラン" + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "ライセンス" + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "非表示" + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "ライセンスを無効化するとすべてのプレミアム機能が使えなくなりますが、他のサイトでライセンスを有効にすることができるようになります。本当に実行しますか?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "%s のアドオン" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "アドオンリストを読み込むことができませんでした。おそらく運営側の問題になりますので、しばらくしてからお試しください。" + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "詳細を表示" + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "却下" + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s秒" + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "自動インストール" + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "%sから %s (有料版) の自動ダウンロードと自動インストールが%sで開始します。手動で行う場合は今すぐにキャンセルボタンをクリックしてください。" + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "インストールプロセスが開始され、数分で完了します。完了までしばらくお待ちください。ページのリフレッシュなどは行わないでください。" + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "インストールをキャンセルする" + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "チェックアウト" + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "PCI コンプライアント" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "おおい %s さん、" + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "許可して続ける" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "有効化メールを再送信" + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "ありがとう $s さん!" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "同意してライセンスを有効化" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "%s を購入いただきありがとうございます。はじめにライセンスキーを入力してください:" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "重要な更新を逃さないように、セキュリティと更新通知、学習用コンテンツ、オファー、そして%4$s とセンシティブではない診断トラッキングをオプトインしてください。" + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "重要な更新を逃さないように、セキュリティと更新通知、%4$s とセンシティブではない診断トラッキングをオプトインしてください。" + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "重要な更新を逃さないように、セキュリティと更新通知、学習用コンテンツ、オファー、そして%4$s とセンシティブではない診断トラッキングをオプトインしてください。これをスキップしても%1$sはもちろん動作します。" + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "重要な更新を逃さないように、セキュリティと更新通知、学習用コンテンツ、オファー、そして%4$s とセンシティブではない診断トラッキングをオプトインしてください。これをスキップしても%1$sはもちろん動作します。" + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "Freeminus ネットワークレベルのインテグレーションをご紹介できることに興奮しています。" + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "アップデートの処理中に%dサイトがライセンスの有効化が保留中であることを検知しました。" + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "これらのサイトで%sを使う場合は、ライセンスキーを入力し、アクティベーションボタンをクリックしてください。" + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%sの有料機能" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "または、今すぐスキップして、%sのネットワークレベルのアカウントページでライセンスを有効にすることもできます。" + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "アップデートの処理中に、ネットワーク内の%dサイトが対応待ちになっていることを検知しました。" + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "ライセンスキー" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "ライセンスキーは見つかりませんか?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "スキップ" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "サイト管理者に委任する" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "決定をサイトの管理者に委任するにはクリックしてください。" + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "プロフィール概要" + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "名前とメールアドレス" + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "サイト概要" + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "サイト URL、WP バージョン、PHP info、プラグインとテーマ" + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "管理者通知" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "更新、発表、マーケティング、スパムなし" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "現在%sイベント" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "有効化、無効化、アンインストール" + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "ニュースレター" + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "%1$sはセキュリティとアプデート、そしてライセンスの状態を確認するため、定期的に%2$sへデータを送信します。" + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "付与されているパーミッションは何ですか?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "ライセンスキーをお持ちではありませんか?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "フリーバージョンを有効化" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "ライセンスキーはお持ちですか?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "プライバシーポリシー" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "利用規約" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "メール送信中" + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "有効化中" + +#: templates/contact.php:78 +msgid "Contact" +msgstr "連絡" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "オフ" + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "オン" + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "デバッグ" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "アクション" + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "ほんとうに全ての Freemius データを削除しますか?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "全てのアカウントを削除" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "API キャッシュをクリア" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "アップデートのトランジエントをクリアーにする" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "サーバーからのデータを同期" + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "DB オプションを読み込む" + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "DB オプションを設定する" + +#: templates/debug.php:170 +msgid "Key" +msgstr "キー" + +#: templates/debug.php:171 +msgid "Value" +msgstr "値" + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "SDK バージョン" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "SDK のパス" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "モジュールのパス" + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "有効" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "プラグイン" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "テーマ" + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "スラッグ" + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "タイトル" + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "Freemius ステータス" + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "ネットワークブログ" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "ネットワークユーザ" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "接続" + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "ブロック" + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "トライアルをシミュレートする" + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "ネットワークアップグレードをシミュレートする" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%sインストール" + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "サイト数" + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "ブログ ID" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "削除" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "モジュールのアドオン%s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "ユーザー" + +#: templates/debug.php:479 +msgid "Verified" +msgstr "認証済み" + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%sラインセス" + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "プラグイン ID" + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "プラン ID" + +#: templates/debug.php:518 +msgid "Quota" +msgstr "クォータ" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "有効化済み" + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "ブロッキング" + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "期限切れ" + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "デバッグログ" + +#: templates/debug.php:549 +msgid "All Types" +msgstr "すべてのタイプ" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "すべてのリクエスト" + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "ファイル" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "機能" + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "プロセス ID" + +#: templates/debug.php:564 +msgid "Logger" +msgstr "ロガー" + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "メッセージ" + +#: templates/debug.php:567 +msgid "Filter" +msgstr "フィルター" + +#: templates/debug.php:575 +msgid "Download" +msgstr "ダウンロード" + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "タイプ" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "タイムスタンプ" + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "外部ドメインで実行中のセキュアな HTTPS %sページ" + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "サポート" + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "リクエスト数" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "更新" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "請求書" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "商号" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "税金 / VAT ID" + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "住所欄 %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "市" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "町" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "ZIP / 郵便番号" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "国" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "国を選択" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "州" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "県・州・省" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "支払い" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "日付" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "総額" + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "請求書" + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "メソッド" + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "コード" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "長さ" + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "パス" + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "本文" + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "結果" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "開始" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "終了" + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "グ" + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "%s 内" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "%s 前" + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "秒" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "プラグインとテーマを同期" + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "トータル" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "最終" + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "スケジュール Cron" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "モジュール" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "モジュールタイプ" + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Cron タイプ" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "次" + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "期限のない" + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "アフィリエイトに応募する" + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "%sのアフィリエイト申請は受理されました! 次のリンクからアフィリエイトエリアにログインしてください:%s" + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "アフィリエイトプログラムに応募いただきありがとうございます。14日以内にお申し込み詳細をレビューし、改めてご連絡いたします。" + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "アフィリエイトアカウントは一時的に停止されました。" + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "アフィリエイトアカウントに応募いただきありがとうございます。残念ながら現時点では申請を受理することができませんでした。30日後に改めてお申込みください。" + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "アフィリエイト規約違反により、アフィリエイトアカウントを一時的に凍結させていただきました。ご質問等がありましたら、サポートにお問い合わせください。" + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "%sは気に入りましたか? アンバサダーになって報酬を得ましょう ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "新規カスタマーに私たちの%sを紹介して、売り上げごとに%sのコミッションを得ましょう" + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "プログラム概要" + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "カスタマーが新規ライセンスを購入するごとに%sのコミッションが発生します。" + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "サブスクリプションの自動更新でコミッションを得ましょう。" + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s初回の訪問後、クッキーをトラッキングして収益の可能性を最大化しましょう。" + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "無制限のコミッション。" + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%sお支払いの最低金額" + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "お支払いは USD かつ PayPal 経由で毎月行われます。" + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "30日間の返金期間があるため、コミッションのお支払いは30日以降になります。" + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "アフィリエイト" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "メールアドレス" + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "フルネーム" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "PayPal アカウントのメールアドレス" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "%sのプロモーションを行うサイトはどこですか?" + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "%sのプロモーションを行う予定のあなたのサイトや他のサイトのドメイン名を入力してください。" + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "ドメイン名を追加する" + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "追加のドメイン名" + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "プロダクトフォームのマーケティングを行う追加ドメイン名。" + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "プロモーション方法" + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "ソーシャルメディア(Facebook、Twitter、その他)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "モバイルアプリケーション" + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "ウェブサイト、Email またはソーシャルメディアの統計 (オプション)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "関係のあるウェブサイトやソーシャルメディアの統計を提供してください。例: サイトの月間訪問者数、Emailの購読者数、フォロワー数等 (機密情報として取り扱います)" + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "どのように我々をプロモートしますか?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "どのように%sをプロモートするつもりなのか、詳細をお知らせください (できるだけ具体的にお願いします)" + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "キャンセル" + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "アフィリエイトになる" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "購入後すぐにメールで受け取ったライセンスキーを入力してください:" + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "ライセンスを更新" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "オプトアウト" + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "オプトイン" + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "使用の追跡は %s をより良くする名目の下に行われています。ユーザー体験をより良くし、新機能に優先順位をつけるためなどに使います。追跡を続けてもよいと再考してくれるなら本当に感謝致します。" + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "\"オプトアウト\"をクリックすることで、もう %s から %s へのデータの送信は行いません。" + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "%sの入手可能な新しいバージョンがあります" + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "バージョン%sのセキュリティや機能のアップデートやサポートを受けられるよう、%s今すぐライセンスキーを更新してください%s。" + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "新しいバージョンがあります" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "ライセンスを更新" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "却下" + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "ライセンスキーを送信" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "アップグレードに使用したメールアドレスを下に入力してください。そうすれば、ライセンスキーをお送りします。" + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "%2$s プランの%1$s日間のフリートライアルを開始するまであとワンクリックです。" + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "WordPress.orgのガイドラインに準拠するため、トライアルを開始する前に、ユーザーと重要でないサイト情報のオプトイン、更新の確認やトライアルの状態確認のために%sが%sに対して定期的にデータを送信する許可を得るように設定してください。" + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "プレミアム" + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "ネットワーク上にあるすべてのサイトのライセンスを有効にする。" + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "ネットワーク上にあるすべてのサイトに対して反映させる。" + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "保留中のサイトすべてでライセンスを有効にする。" + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "保留中のサイトすべてに反映させる。" + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "許可" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "代表" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "スキップ" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "クリックしてフルサイズのスクリーンショットを見る %d" + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "無制限のアップデート" + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "localhost" + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "あと %s" + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "最新のライセンス" + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "キャンセル" + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "期限切れ" + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "有効期限なし" + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "このアドオンを有効化" + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "所有者名" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "所有者の Email" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "オーナー ID" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "サブスクリプション" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "ご迷惑をおかけしてすいません。もし機会をいただけたらお手伝いをします。" + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "サポートに連絡" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "匿名のフィードバック" + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "無効化" + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "%sを有効化する" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "クイックフィードバック" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "お時間があれば、なぜ%sするのか理由を教えてください。" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "無効化中" + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "変更中" + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "送信と%s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "改善できるよう、どうか理由を教えてください。" + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "はい" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "スキップと%s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "匿名でプラグインを使用するにはこちらをクリック" + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "見逃していたかもしれませんが、どんな情報も共有する必要はなく、オプトインを $s することができます。 " diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.mo new file mode 100644 index 0000000000000000000000000000000000000000..c18f59eec08da3c44b47fe9fa7e8a35ceba6f213 GIT binary patch literal 50763 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 MVgxu2Am=dx02CoWO8@`> literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.po new file mode 100644 index 000000000..bb848094a --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-nl_NL.po @@ -0,0 +1,2299 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +# Benny Vluggen <benny@prodevign.com>, 2017-2018 +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-24 16:14+0000\n" +"Last-Translator: Benny Vluggen <benny@prodevign.com>\n" +"Language: nl_NL\n" +"Language-Team: Dutch (Netherlands) (http://www.transifex.com/freemius/wordpress-sdk/language/nl_NL/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK kon het hoofdbestand van de plug-in niet vinden. Neem a.j.b. contact op met sdk@freemius.com m.b.t. deze fout." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Fout" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "Ik vond een beter %s" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "Wat is de naam van het %s?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "Het betreft een tijdelijke %s. Ik ben een probleem aan het debuggen." + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Deactivatie" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Thema Wissel" + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Overige" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "Ik heb de %s niet meer nodig " + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "Ik had de %s alleen nodig voor een korte periode." + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "De %s maakte mijn site onbruikbaar" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "De %s werkte opeens niet meer" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "Ik kan er niet langer meer voor betalen" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "Welke bedrag zou je ervoor over hebben?" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "Ik vind het niet prettig om mijn informatie met jullie te delen" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "De %s werkte niet" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "Ik snapte niet hoe ik het aan het werk kon krijgen." + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "De %s is uitstekend, maar ik heb een specifieke feature nodig die jullie niet ondersteunen" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "Welke feature?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "De %s werkt niet" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Wil je alsjeblieft zo vriendelijk zijn om te delen wat niet werkte, zodat we dat kunnen verbeteren voor toekomstige gebruikers ..." + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "Het is niet waarna ik opzoek was" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "Waar was je naar op zoek?" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "De %s werkte niet zoals verwacht" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "Wat had je verwacht?" + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Freemius Debug" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "Ik weet niet wat cURL is of hoe dat te installeren is, help me!" + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "We doen onze best om contact op te nemen met uw hostingbedrijf om het probleem op te lossen. We sturen een vervolgmail naar %s, zodra we een update hebben. " + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Mooi, installeer alsjeblieft cURL en activeer het in je php.ini bestand. Tevens, zoek naar de 'disable_functions' directive in je php.ini bestand en verwijder iedere methode die start met 'curl_'. Gebruik 'phpinfo()' om je ervan te vergewissen dat het nu succesvol geactiveerd is. Als actief, deactiveer de %s en heractiveer deze opnieuw." + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Ja, ga je gang" + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "Nee - alleen deactiveren" + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Oeps" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Bedankt dat je ons in de gelegenheid stelt dit op te lossen. Zojuist is er een bericht verstuurd naar onze technische staf. We laten wat van ons horen, aan %s, als we een update hebben. Bedankt voor je geduld." + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s werkt niet zonder %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s werkt niet zonder de plug-in." + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Onverwachte API fout. Neem alsjeblieft contact op met de auteur van de %s met de volgende foutmelding." + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "Premium %s versie is succesvol geactiveerd." + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "W00t" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "Je hebt een %s licentie" + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Hoera" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "%s gratis proefperiode werd succesvol stop gezet. Daar de add-on alleen als premium versie beschikbaar is werd deze automatisch gedeactiveerd. Als u de add-on in de toekomst wilt gebruiken dient u een licentie aan te schaffen." + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s is uitsluitend beschikbaar als een premium add-on. Je moet een licentie kopen voordat je de plug-in activeert." + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "Meer informatie over %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "Licentie Kopen" + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "Als het goed is ontvang je een activatie e-mail voor %s in je %s mailbox. Zorg er alsjeblieft voor dat je op de activatie knop klikt in die e-mail aan %s." + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "start de proefperiode" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "voltooi de installatie" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "Je bent slechts een stap verwijderd - %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "Voltooi \"%s\" Activatie Nu" + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "We hebben een aantal aanpassingen gedaan op de %s, %s " + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Opt-in om \"%s\" te verbeteren!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "De upgrade van %s is succesvol voltooid." + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Uitbreiding" + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "Plug-in" + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Thema" + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "ongeldige_site_details_verzameling" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "We konden je e-mailadres niet vinden in het systeem, ben je zeker dat dat het juiste adres is?" + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "Er is geen actieve licentie gekoppeld aan dat e-mailadres, ben je zeker dat dat het juiste adres is?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Account wacht op activatie." + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "%s activatie is succesvol voltooid." + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Je account is succesvol geactiveerd met het %s plan." + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "U proefperiode is met succes gestart." + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "Kon %s niet activeren." + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Neem a.u.b. contact met ons op met het volgende bericht:" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Upgrade" + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Start Proefperiode" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Prijzen" + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Affiliatie" + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "Account" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Contacteer Ons" + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Uitbreidingen" + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Prijzen" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Supportforum" + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Je e-mail werd succesvol geverifieerd - je bent GEWELDIG!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Toppie" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Uw %sAdd-on plan werd succesvol geüpgraded. " + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "%s Add-on werd succesvol aangekocht." + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Download de meeste recente versie" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Je server blokkeert de toegang tot de Freemius API, welke cruciaal is voor %1s synchronisatie. Neem alsjeblieft contact op met je host om %2s te whitelisten." + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Foutmelding ontvangen van de server:" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "Het lijkt erop dat een van de authenticatie parameters niet klopt. Update je Publieke Sleutel, Geheime Sleutel & Gebruikers ID en probeer het nogmaals. " + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "Hmm" + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "Het lijkt erop dat u nog steeds op het %s plan zit. Als u uw plan geüpgraded of veranderd heeft, dan is het waarschijnlijk een fout aan onze kant - sorry." + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Proefperiode" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "Ik heb mijn account geüpgraded maar als ik probeer te Synchroniseren blijft het plan %s." + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Neem hier a.u.b. contact met ons op" + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Je plan is succesvol geüpgraded." + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Je plan is succesvol veranderd naar %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Je licentie is verlopen. Je kan echter de gratis %s voor altijd blijven gebruiken." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Je licentie is verlopen. %1$sUpgrade nu%2$s om de %3$s zonder interrupties te blijven gebruiken." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "Je licentie is geannuleerd. Als je denkt dat dat een fout is, neem dan alsjeblieft contact op met support." + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Je licentie is verlopen. Je kan nog steeds alle %s features gebruiken, maar je zal je licentie moeten vernieuwen om weer updates en support te ontvangen." + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "Je gratis proefperiode is verlopen. Je kan nog steeds al onze gratis features blijven gebruiken." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Je gratis proefperiode is verlopen. %1$sUpgrade nu%2$som de %3$s zonder interrupties te blijven gebruiken. " + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "Het lijkt erop dat de licentie niet geactiveerd kon worden." + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "Je licentie is succesvol geactiveerd." + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "Het lijkt erop dat je site momenteel geen actieve licentie heeft." + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "Het lijkt erop dat het deactiveren van je licentie mislukt is." + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "Je licentie is succesvol gedeactiveerd, je bent terug op het %s plan." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "Oké" + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Je plan werd succesvol gedowngraded. Je %s plan licentie zal verlopen binnen %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "Het lijkt er op dat we een tijdelijk probleem hebben om je plan te downgraden. Probeer het alsjeblieft nogmaals over enkele minuten." + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "Je voert de %s reeds uit in proefmodus" + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "U heeft reeds een proefperiode gebruikt." + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "Plan %s bestaat niet, daarom kan proefperiode niet gestart worden." + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "Plan %s ondersteunt geen proefperiode." + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "Geen van de %s plannen ondersteunt een proefperiode." + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "Het lijkt er op dat u niet langer meer in de proefperiode zit, dus er valt niets stop te zetten." + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Uw gratis %s proefperiode is succesvol opgezegd. " + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "Het lijkt er op dat we een tijdelijk probleem hebben met het opzeggen van uw proefperiode. Probeer het a.u.b. over enkele minuten nog eens." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "Versie %s is vrijgegeven." + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "A.u.b. %s downloaden." + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "de meest recente %s versie hier" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "Nieuw" + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Het lijkt erop dat je de meest recente versie hebt." + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "Alles is goed!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "Verificatiemail zojuist verstuurd naar %s. Als je deze niet binnen 5 min. hebt ontvangen, kijk dan alsjeblieft in je spambox." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Site opt-in geslaagd. " + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Geweldig" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "We waarderen je hulp om %s beter te maken door ons gebruiksdata te laten verzamelen. " + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "Bedankt!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "We zullen geen gebruiksdata meer verzenden van %s m.b.t. %s naar %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Hou alsjeblieft je mailbox in de gaten, je zult een e-mail ontvangen via %s om de overdracht te bevestigen. Vanwege veiligheidsredenen moet je de overdracht binnen de volgende 15 min. bevestigen. Kijk eventueel in je spambox, mocht je de e-mail niet aantreffen in je inbox." + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Bedankt voor het bevestigen van de eigendomsoverdracht. Zojuist is er een e-mail verstuurd naar %s voor de definitieve goedkeuring. " + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%s is de nieuwe eigenaar van het account." + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Gefeliciteerd" + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Sorry, we konden de e-mail update niet voltooien. Een andere gebruiker met hetzelfde e-mailadres is reeds geregistreerd." + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "Als u het eigendom van het %s account wilt overdragen aan %s klik dan op de Eigendom Overdragen knop. " + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Eigendom Overdragen" + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Je e-mailadres is succesvol verwerkt. Als het goed is ontvang je zometeen een e-mail met bevestigingsinstructies. " + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Geef alsjeblieft je volledige naam." + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Je naam is succesvol bijgewerkt." + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "Je hebt je %s succesvol geüpdatet." + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Voor alle duidelijkheid, de add-ons informatie van %s wordt opgehaald van een externe server." + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Aankondiging" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Hoi" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "Hoe bevalt %s tot dusver? Test al onze %s premium features gedurende een%d-daagse gratis proefperiode." + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "Geen verplichting voor %s dagen - elk moment opzeggen!" + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "Geen creditcard nodig" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Start gratis proefperidoe" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Hey, wist je dat %s een affiliate programma heeft? Als je de %s goed vindt dan kan je onze ambassadeur worden en wat cash verdienen!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Lees meer" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Activeer Licentie" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Verander Licentie" + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Opt Out" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Opt In" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Volg alsjeblieft deze stappen om de upgrade te voltooien" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Download de meeste recente %s versie" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Upload en activeer de gedownloade versie" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "Hoe te uploaden en activeren?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sKlik hier%s om de sites te kiezen waar op je de licentie wil activeren." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "Automatische installatie werkt alleen voor opted-in gebruikers." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "Ongeldige Module-ID" + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Premium versie reeds actief." + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "Je hebt geen geldige licentie voor de premium versie." + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Plug-in is 'Serviceware' wat betekent dat het geen premium code versie bevat. " + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Premium add-on versie is reeds geïnstalleerd." + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "Bekijk betaalde features" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Hartelijk bedankt voor het gebruik van %s en bijbehorende uitbreidingen!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "Hartelijk bedankt voor het gebruik van %s!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "Je hebt reeds ingestemd met onze gebruiks-tracking, wat ons helpt om %s te blijven verbeteren." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "Hartelijk bedankt voor het gebruiken van onze producten!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "Je hebt reeds ingestemd met onze gebruiks-tracking, wat ons helpt om deze te blijven verbeteren." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%sen bijbehorende uitbreidingen" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Producten" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "Ja" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "stuur mij beveiliging & feature updates, educatieve content en aanbiedingen." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "Nee" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "stuur mij %sGEEN%s beveiliging & feature updates, educatieve content of aanbiedingen." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Naar aanleiding van de nieuwe %sEU General Data Protection Regulation (GDPR) / Algemene verordening gegevensbescherming (AVG) %s regelgeving is het verplicht dat je je expliciete toestemming geeft, nogmaals, bevestigend dat je 'aan boord' bent 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Laat ons alsjeblieft weten als je op de hoogte gehouden wilt worden van beveiliging & feature updates, educatieve content en zo nu en dan aanbiedingen:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "Licentiesleutel is leeg." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sVernieuw je licentie nu%s voor toegang tot versie %s beveiliging & feature updates en support." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Installeren van plug-in: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Toegang tot het bestandssysteem is niet mogelijk. Bevestig alsjeblieft je inloggegevens." + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "Het remote plug-in pakket bevat geen folder met de verwachte slug en hernoemen werkte niet. " + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Koop" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Start mijn gratis %s" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Installer Gratis Versie Nu" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Installeer Nu" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Download Nieuwste Gratis Versie" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "Download Nieuwste" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Installeer Gratis Versie Update Nu" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Installeer Update Nu" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Nieuwere Gratis Versie (%s) Geïnstalleerd" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Nieuwere Versie (%s) Geïnstalleerd" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "Nieuwste Gratis Versie Geïnstalleerd" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Meest Recente Versie Geïnstalleerd" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Beschrijving" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Installatie" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "Veelgestelde Vragen" + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Schermafbeeldingen" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Wijzigingen Log" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Reviews" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Andere Notities" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Features & Prijzen" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Plug-in Installatie" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "%s Plan" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "Beste" + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Maandelijks" + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Jaarlijks" + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "Levenslang" + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "%s gefactureerd " + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Jaarlijks" + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Eenmalig" + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Enkele Site Licentie" + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Onbeperkte Licenties" + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "Tot %s Sites" + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "mnd" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "jaar" + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Prijs" + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Bespaar %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "Geen verplichting voor %s - opzeggen kan altijd" + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "Na uw gratis %s, betaal slechts %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Details" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "Versie" + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Auteur" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Laatst Geüpdatet" + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "%s geleden" + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Vereiste WordPress Version" + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s of hoger" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Compatible tot" + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Gedownload" + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "%s tijd" + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s tijden" + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "WordPress.org Plug-in Pagina" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Plug-in Homepage" + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Doneer aan deze plug-in" + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Gemiddelde Beoordeling" + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "gebaseerd op %s" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "%s beoordeling" + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "%s beoordelingen" + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%s ster" + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "%s sterren" + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Klik om reviews te bekijken met een beoordeling van%s" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Medewerkers" + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Waarschuwing" + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "Deze plug-in is nog niet getest met je huidige WordPress versie. " + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "Deze plug-in is niet als compatibel aangemerkt voor je huidige WordPress versie." + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Betaalde add-on moet op Freemius geplaatst worden." + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "Add-on moet op WordPress.org of Freemius geplaatst worden." + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Het downgraden van je plan zal direct leiden tot het stopzetten van alle toekomstige terugkerende betalingen en je %splan zal binnen %s verlopen. " + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "Het stopzetten van de proefperiode zal de toegang tot de premium features onmiddellijk blokkeren. Weet je dat zeker?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "Je kunt nog steeds genieten van alle %s features maar je zal geen toegang meer hebben tot %s updates en support." + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "Als je licentie verloopt kan je nog steeds gebruik maken van de Gratis versie, maar je zal GEEN toegang meer hebben tot de %sfeatures." + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Activeer %s Plan" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Auto hernieuwd over %s" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Verloopt over %s" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Sync Licentie" + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Proefperiode Opzeggen" + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Wijzig Plan" + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Upgrade" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Downgrade" + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "Gratis" + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Activeer" + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Plan" + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Gratis Proefperiode" + +#: templates/account.php:165 +msgid "Account Details" +msgstr "Accountgegevens" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "Verwijdering van het account zal automatisch je %s licentie deactiveren zodat je die op andere sites kan gebruiken. Als je tevens je terugkerende betalingen wilt stopzetten, klik dan op de 'Annuleer' knop en 'Downgrade' je account eerst. Weet je zeker dat je wilt doorgaan met de verwijdering?" + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "Verwijdering is niet tijdelijk. Verwijder alleen als je deze %s niet langer wilt gebruiken. Weet je zeker dat u wilt doorgaan met de verwijdering?" + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Verwijder Account" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Deactiveer Licentie" + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "Weet je zeker dat je wilt doorgaan?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Abonnement Opzeggen" + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Sync" + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "Naam" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "E-mail" + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "Gebruikers ID" + +#: templates/account.php:274 +msgid "Site ID" +msgstr "Site ID" + +#: templates/account.php:277 +msgid "No ID" +msgstr "Geen ID" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Publieke Sleutel" + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Geheime Sleutel" + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "Geen Geheim" + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Proefperiode" + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "Licentiesleutel" + +#: templates/account.php:359 +msgid "not verified" +msgstr "niet geverifieerd" + +#: templates/account.php:416 +msgid "Premium version" +msgstr "Premium versie" + +#: templates/account.php:418 +msgid "Free version" +msgstr "Gratis versie" + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Verifieer E-mail" + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Download %s Versie" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Toon" + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "Wat is je %s?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Bewerk" + +#: templates/account.php:490 +msgid "Sites" +msgstr "Sites" + +#: templates/account.php:501 +msgid "Search by address" +msgstr "Zoek op adres" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "Adres" + +#: templates/account.php:512 +msgid "License" +msgstr "Licentie" + +#: templates/account.php:513 +msgid "Plan" +msgstr "Plan" + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "Licentie" + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Verberg" + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Deactiveren van je licentie zal alle premium features blokkeren, maar geeft je de mogelijkheid de licentie op een andere site te activeren. Weet je zeker dat je wilt doorgaan?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Add-ons voor %s" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "We konden de add-ons lijst niet laden. Dat is waarschijnlijk een probleem aan onze kant, kom alsjeblieft over enkele minuten terug." + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "Bekijk details" + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Afsluiten" + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s sec" + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Automatische Installatie" + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "Een geautomatiseerde download en installatie van %s (betaalde versie) van %s zal starten binnen %s. Als je dit handmatig wil doen, klik dan nu op de annuleer knop." + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "Het installatieproces is gestart en kan enkele minuten duren om te voltooien. Wacht alsjeblieft totdat dat gebeurt is - deze pagina niet verversen." + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Annuleer Installatie" + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Afrekenen" + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "PCI-compliant" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "Hoi %s," + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Toestaan & Ga Verder" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Activatiemail opnieuw versturen" + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "Bedankt %s!" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "Akkoord & Activeer Licentie" + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Bedankt voor het aanschaffen van %s! Om te beginnen, voer alsjeblieft je licentiesleutel in:" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Mis nooit een belangrijke update - opt-in voor onze beveiliging en feature update notificaties, educatieve content, aanbiedingen, en niet-gevoelige diagnostische tracking met %4$s." + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Mis nooit een belangrijke update - opt-in voor onze beveiliging en feature update notificaties, en niet-gevoelige diagnostische tracking met %4$s." + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Mis nooit een belangrijke update - opt-in voor onze beveiliging & feature update notificaties, educatieve content, aanbiedingen, en niet-gevoelige diagnostische tracking met %4$s. Als je deze stap overslaat, geen probleem! %1$szal ook dan gewoon 100% werken. " + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Mis nooit een belangrijke update - opt-in voor onze beveiliging & feature updates notificaties, en niet-gevoelige diagnostische tracking met %4$s. Als je deze stap overslaat, geen probleem! %1$szal ook dan gewoon 100% werken. " + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "We zijn verheugd om Freemius network-level integratie te introduceren." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "Tijdens het update proces detecteerde we %dsite(s) waarvoor de licentie nog niet geactiveerd is." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "Als je de %s op deze sites wil gebruiken, voer dan alsjeblieft de licentiesleutel hieronder in en klik op de activatie knop." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%s betaalde features" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Alternatief, voor nu kan je dat overslaan en de licentie later activeren in je %s netwerk-niveau Account pagina. " + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "Tijdens het update proces detecteerde we %dsite(s) in het netwerk die jouw aandacht vereisen." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "Licentiesleutel" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "Kan je je licentiesleutel niet vinden?" + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Sla Over" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Delegeren aan Site Beheerders" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "Al je er op klikt zal deze beslissing gedelegeerd worden aan de beheerders van de sites. " + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "Je Profiel Overzicht" + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "Naam en e-mailadres" + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "Je Site Overzicht" + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "Site URL, WP versie, PHP info, plug-ins & thema's" + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Admin Mededelingen" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Updates, aankondigingen, marketing, geen spam" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Huidige %s Gebeurtenissen" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "Activatie, deactivatie en deïnstallatie" + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Nieuwsbrief" + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "De %1$s zal periodiek data verzenden naar %2$s om te controleren op beveiliging en feature updates en om te verifiëren of je licentie geldig is." + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "Welke toestemmingen worden er verleend?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "Heb je geen licentiesleutel?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Activeer Gratis Versie" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "Heb je een licentiesleutel?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "Privacybeleid" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "Servicevoorwaarden" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "E-mail versturen" + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Activeren" + +#: templates/contact.php:78 +msgid "Contact" +msgstr "Contact" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Uit" + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "Aan" + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Debugging" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "Acties" + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Weet u zeker dat u alle Freemius data wilt verwijderen?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Verwijder All Accounts" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "API-Cache Leegmaken" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Updates Transients Opschonen" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Synchroniseer Data Vanaf Server" + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Laad DB optie" + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Activeer DB Optie" + +#: templates/debug.php:170 +msgid "Key" +msgstr "Sleutel" + +#: templates/debug.php:171 +msgid "Value" +msgstr "Waarde" + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "SDK Versies" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "SDK Pad" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Module Pad" + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "Is Actief" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Plug-ins" + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Thema's" + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Slug" + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "Titel" + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "Freemius Status" + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Netwerk Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Netwerk Gebruiker" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "Verbonden" + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "Geblokkeerd" + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Simuleer Proefversie" + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simuleer Netwerk Upgrade" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s Installaties" + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Sites" + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "Blog ID" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Verwijder" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Uitbreidingen van module %s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "Gebruikers" + +#: templates/debug.php:479 +msgid "Verified" +msgstr "Geverifieerd" + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s Licenties" + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "Plug-in ID" + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "Plan ID" + +#: templates/debug.php:518 +msgid "Quota" +msgstr "Quota" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "Geactiveerd" + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Geblokkeerd" + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Verloopdatum" + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Debug Log" + +#: templates/debug.php:549 +msgid "All Types" +msgstr "Alle Types" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "Alle Requests" + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "Bestand" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "Functie" + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "Proces-ID" + +#: templates/debug.php:564 +msgid "Logger" +msgstr "Logger" + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "Bericht" + +#: templates/debug.php:567 +msgid "Filter" +msgstr "Filter" + +#: templates/debug.php:575 +msgid "Download" +msgstr "Download" + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Type" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Tijdstempel" + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Beveiligde HTTPS %s pagina, loopt via een extern domain" + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Ondersteuning" + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "ms" + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Requests" + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Bijwerken" + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Facturering" + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Bedrijfsnaam" + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "Btw-nummer" + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Adresregel %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "Stad" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "Plaats" + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "Postcode" + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "Land" + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Selecteer Land" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "Staat" + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "Provincie" + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Betalingen" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Datum" + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Bedrag" + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Factuur" + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Methoden" + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Code" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Lengte" + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Pad" + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Body" + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Resultaat" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Start" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "Einde" + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Log" + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "Binnen %s" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "%s geleden" + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "sec" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Synchronisatie Plug-ins & Thema's" + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Totaal" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Laatste" + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Geplande Crons" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Module" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Moduletype" + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Cron Type" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Volgende" + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Niet-verlopende" + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Meld je aan om een affiliate partner te worden" + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "Je affiliate aanvraag voor %s is geaccepteerd! Log in op je affiliate omgeving op: %s." + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Bedankt voor je aanvraag voor deelname aan ons affiliate programma, we zullen binnen 14 dagen je gegevens doornemen waarna we je aanvullende informatie zullen sturen." + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Je affiliate account is tijdelijk geschorst." + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Bedankt voor je aanvraag voor deelname aan ons affiliate programma, helaas, op dit moment hebben we besloten je aanvraag af te wijzen. Probeer het alsjeblieft over 30 dagen nog eens." + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Als gevolg van het overtreden van onze affiliate voorwaarden, hebben we besloten je affiliate account tijdelijk te blokkeren. Neem voor eventuele vragen alsjeblieft contact op met support." + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Vind je de %s goed? Wordt dan onze ambassadeur en verdien cash ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Verwijs nieuwe klant naar onze %s en verdien %s commissie op iedere door jou doorverwezen geslaagde verkoop!" + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Programma Samenvatting" + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%s commissie als een klant een nieuwe licentie koopt. " + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Krijg een commissie voor automatische abonnements verlengingen." + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s tracking cookie na eerste bezoek om je verdienpotentieel te maximaliseren." + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Onbeperkte commissies." + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "%s minimum uitbetalingsbedrag." + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Uitbetalingen zijn in USD en maandelijks uitgevoerd via PayPal" + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "Daar wij 30 dagen reserveren voor mogelijk terugbetalingen, betalen we alleen commissies die ouder zijn dan 30 dagen." + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Affiliate" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "E-mailadres" + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Volledige naam" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "PayPal account e-mailadres" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Waar ga je de %s promoten?" + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Voer de domeinnaam in van je website of ander websites vanaf waar je van plan bent de %ste gaan promoten." + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Voeg nog een domein toe" + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Extra Domeinen" + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Extra domeinen vanaf waar je het product gaat promoten." + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Promotie methodes" + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Social media (Facebook, Twitter, etc.)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Mobiele apps" + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Website, mail, and social media statistieken (optioneel)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Voel je alsjeblieft vrij om elke relevante website of social media statistieken met ons te delen, bijvoorbeeld maandelijkse unieke bezoekers, aantal e-mail abonnees , volgers, etc. (we zullen deze informatie vertrouwelijk houden)." + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "Hoe ga je ons promoten?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Geef alsjeblieft zo gedetailleerd als mogelijk aan hoe je van plan bent om %s te gaan promoten." + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Annuleer" + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Wordt een affiliate" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Voer aalsjeblieft de licentiesleutel in die je ontving in de e-mail direct na de aankoop:" + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Update Licentie" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Opt Out" + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Opt In" + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Het bijhouden van het gebruik wordt gedaan om %s te verbeteren. De gebruikerservaring te verbeteren, de prioriteit van nieuwe features te bepalen, en meer goede zaken. We zouden het heel erg op prijs stellen als je ons toch weer toestaat het gebruik te volgen. " + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "Door op \"Opt Out\" te klikken, zullen wij niet langer gegevens van %s verzenden naar %s." + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "Er is een nieuwe versie van %s beschikbaar." + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sVernieuw je licentie nu%s voor toegang tot versie %s beveiliging & feature updates en support." + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "Nieuwe Versie Beschikbaar" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Vernieuw licentie" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Afsluiten" + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Verzend Licentiesleutel" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Voer hieronder het e-mailadres in dat je gebruikt hebt voor de upgrade en we zullen je jouw licentiesleutel opnieuw toesturen." + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "U bent 1-klik verwijderd van het starten van uw %1$s-daagse gratis proefperiode van het %2$s plan." + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "In overeenstemming met de Wordpress.org richtlijnen, alvorens we de proefperiode kunnen starten vragen we je in te stemmen je gebruiker en niet-sensitieve site informatie door de %s periodiek te laten verzenden naar %s om te controleren op nieuwe versies en je proefversie te valideren." + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Premium" + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Activeer licentie op alle sites in het netwerk." + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Pas toe op alle sites in het netwerk." + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Activeer licentie op alle in behandeling zijnde sites." + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Pas toe op alle in behandeling zijnde sites." + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "toestaan" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "deligeren" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "overslaan" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Klik voor het op volle-grootte bekijken van schermafbeelding %d" + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Onbeperkte Updates" + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Localhost" + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "%s beschikbaar" + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Laatste licentie" + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Geannuleerd" + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Verlopen" + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "Geen verloopdatum" + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Activeer deze add-on" + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Naam Eigenaar" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "E-mail Eigenaar" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "ID Eigenaar" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Abonnement" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Sorry voor het ongemak en we zijn er om je te helpen als je daartoe de kans geeft.." + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Contacteer Support" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Anonieme terugkoppeling" + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Deactiveer" + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Activeer %s" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Snelle terugkoppeling" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "We zouden het zeer op prijs stellen, als je even hebt, om ons alsjeblieft te laten weten waarom je gaat %s" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "deactiveren" + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "overschakelen" + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Verstuur & %s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "Wilt je alsjeblieft zo vriendelijk zijn om de reden te vermelden, zodat wij verbeteringen kunnen doorvoeren." + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Ja - %s" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Sla over & %s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Klik hier om de plug-in anoniem te gebruiken" + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "Misschien heb je het gemist, maar je hoeft geen gegevens te delen en kunt de opt-in %s." diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.mo b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.mo new file mode 100644 index 0000000000000000000000000000000000000000..82a7a249210bb09a8ccaaea953d54fe755130ec4 GIT binary patch literal 65758 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 X8U|HRwYd*;Qv!IX8D#o}EeZ?(9poB8 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.po b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.po new file mode 100644 index 000000000..b2db1b4d1 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius-ru_RU.po @@ -0,0 +1,2298 @@ +# Copyright (C) 2018 freemius +# This file is distributed under the same license as the freemius package. +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: WordPress SDK\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2018-05-24 11:59+0000\n" +"Last-Translator: Vova Feldman <vova@freemius.com>\n" +"Language: ru_RU\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/freemius/wordpress-sdk/language/ru_RU/)\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" +"MIME-Version: 1.0\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +msgstr "Freemius SDK не удалось найти основной файл плагина. Пожалуйста, свяжитесь с sdk@freemius.com с текущей ошибкой." + +#: includes/class-freemius.php:1553 +msgid "Error" +msgstr "Ошибка" + +#: includes/class-freemius.php:1871 +msgid "I found a better %s" +msgstr "Я нашел лучший %s" + +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" +msgstr "Какое название %s?" + +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." +msgstr "Это временная %s. Сейчас проходит проверка на наличие ошибок. " + +#: includes/class-freemius.php:1881 +msgid "Deactivation" +msgstr "Деактивация" + +#: includes/class-freemius.php:1882 +msgid "Theme Switch" +msgstr "Переключатель шаблона " + +#: includes/class-freemius.php1891, templates/forms/resend-key.php:24 +msgid "Other" +msgstr "Другие" + +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" +msgstr "%s больше не понадобится." + +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" +msgstr "%s требовалась на короткое время" + +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "%s повредила мой сайт" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "%s внезапно перестала работать " + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "Я больше не могу оплачивать это. " + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "Какая стоимость была бы для Вас приемлемой? " + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "Я не хочу делиться личной информацией с Вами" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "%s не сработала" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "Я не могу понять как сделать так, чтобы оно работало" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "%s отличная возможность, но мне нужен определенный функционал, который вы не поддерживаете. " + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "Какой функционал?" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "%s не работает" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "Пожалуйста, сообщите о функционале, который не работает, чтобы мы смогли исправить его для дальнейшего использования. " + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "Это не то, что я искал. " + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "Что именно Вы ищите? " + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "%s не сработала как ожидалось" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "Каковы были Ваши ожидания? " + +#: includes/class-freemius.php2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "Исправление ошибок Freemius" + +#: includes/class-freemius.php:3402 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "Я не знаю, что такое сURL и как его установить. Пожалуйста, помогите мне." + +#: includes/class-freemius.php:3404 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "Мы обязательно свяжемся с Вашим хостинг провайдером и найдем решение. Как только у нас появится информация, Вам будет отправлено письмо на почту. " + +#: includes/class-freemius.php:3411 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "Отлично! Пожалуйста, установите сURL и активируйте его в Вашем файле php.ini .Также, найдите директиву 'disable_functions' в файле php.ini и удалите все неактивные методы которые начинаются на 'curl_'. Чтобы убедится, что активация прошла успешно, используйте 'phpinfo()'. После активации, деактивируйте %s и снова активируйте ее. " + +#: includes/class-freemius.php:3516 +msgid "Yes - do your thing" +msgstr "Да, делайте то, что Вам нужно. " + +#: includes/class-freemius.php:3521 +msgid "No - just deactivate" +msgstr "Нет. Нужно деактивировать. " + +#: includes/class-freemius.php3566, includes/class-freemius.php4066, +#: includes/class-freemius.php5127, includes/class-freemius.php10941, +#: includes/class-freemius.php14205, includes/class-freemius.php14257, +#: includes/class-freemius.php14319, includes/class-freemius.php16448, +#: includes/class-freemius.php16458, includes/class-freemius.php17014, +#: includes/class-freemius.php17032, includes/class-freemius.php17130, +#: includes/class-freemius.php17866, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "Упс!" + +#: includes/class-freemius.php:3635 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "Спасибо, что предоставили нам возможность исправить ошибку. Сообщение уже отправлено нашим техническим специалистам. Мы с Вами свяжемся, как только будет новая информация о %s. Благодарны за понимание. " + +#: includes/class-freemius.php:4063 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "%s не работает без %s." + +#: includes/class-freemius.php:4064 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "%s не может работать без плагина. " + +#: includes/class-freemius.php4176, includes/class-freemius.php4201, +#: includes/class-freemius.php:17103 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "Неожиданная ошибка API. Пожалуйста, свяжитесь с автором %s в котором была обнаружена ошибка. " + +#: includes/class-freemius.php:4815 +msgid "Premium %s version was successfully activated." +msgstr "Премиум версия %s была успешно активирована. " + +#: includes/class-freemius.php4827, includes/class-freemius.php:6660 +msgctxt "" +msgid "W00t" +msgstr "Вау!" + +#: includes/class-freemius.php:4842 +msgid "You have a %s license." +msgstr "У Вас есть лицензия %s." + +#: includes/class-freemius.php4846, includes/class-freemius.php13626, +#: includes/class-freemius.php13637, includes/class-freemius.php16376, +#: includes/class-freemius.php16676, includes/class-freemius.php16741, +#: includes/class-freemius.php:16891 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "Ура!" + +#: includes/class-freemius.php:5110 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "Бесплатный период пользования %s закончился. Этот плагин является премиум продуктом и он был деактивирован автоматически. Если Вы планируете дальнейшее его использование, пожалуйста купите лицензию. " + +#: includes/class-freemius.php:5114 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "%s является премиум продуктом. Необходимо купить лицензию перед активацией плагина. " + +#: includes/class-freemius.php5123, templates/add-ons.php99, +#: templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "Больше информации о %s" + +#: includes/class-freemius.php:5124 +msgid "Purchase License" +msgstr "Купите лицензию " + +#: includes/class-freemius.php6035, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "Мы отправили Вам письмо для активации %s на Ваш электронный адрес %s. Пожалуйста, нажмите на кнопку активации в этом письме %s. " + +#: includes/class-freemius.php:6039 +msgid "start the trial" +msgstr "Начать тестовый период" + +#: includes/class-freemius.php6040, templates/connect.php:165 +msgid "complete the install" +msgstr "Закончить установку" + +#: includes/class-freemius.php:6147 +msgid "You are just one step away - %s" +msgstr "Вам осталось совсем немножко %s" + +#: includes/class-freemius.php:6150 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "Закончить активацию %s сейчас " + +#: includes/class-freemius.php:6227 +msgid "We made a few tweaks to the %s, %s" +msgstr "Мы усовершенствовали в %s, %s для лучшей работы " + +#: includes/class-freemius.php:6231 +msgid "Opt in to make \"%s\" Better!" +msgstr "Присоединяйтесь к нашему сообществу, чтобы сделать % еще лучше!" + +#: includes/class-freemius.php:6659 +msgid "The upgrade of %s was successfully completed." +msgstr "Обновление %s было успешно завершено" + +#: includes/class-freemius.php8384, includes/class-fs-plugin-updater.php581, +#: includes/class-fs-plugin-updater.php733, +#: includes/class-fs-plugin-updater.php739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "Функционал плагина " + +#: includes/class-freemius.php8386, templates/debug.php349, +#: templates/debug.php:510 +msgid "Plugin" +msgstr "Плагин " + +#: includes/class-freemius.php8387, templates/debug.php349, +#: templates/debug.php510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "Шаблон " + +#: includes/class-freemius.php:10808 +msgid "invalid_site_details_collection" +msgstr "invalid_site_details_collection" + +#: includes/class-freemius.php:10928 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "К сожалению, Ваш почтовый адрес не найден в системе. Вы уверены, что предоставили правильный адрес? " + +#: includes/class-freemius.php:10930 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "Активная лицензия выданная на этот электронный адрес не была найдена. Вы уверены, что предоставили правильный электронный адрес?" + +#: includes/class-freemius.php:11166 +msgid "Account is pending activation." +msgstr "Учетная запись в процессе активации" + +#: includes/class-freemius.php:13608 +msgid "%s activation was successfully completed." +msgstr "Активация %s была успешно завершена" + +#: includes/class-freemius.php:13622 +msgid "Your account was successfully activated with the %s plan." +msgstr "Ваша учетная запись была успешно активирована согласно плану %s" + +#: includes/class-freemius.php13633, includes/class-freemius.php:16737 +msgid "Your trial has been successfully started." +msgstr "Ваш тестовый период успешно начат" + +#: includes/class-freemius.php14203, includes/class-freemius.php14255, +#: includes/class-freemius.php:14317 +msgid "Couldn't activate %s." +msgstr "Невозможно активировать %s" + +#: includes/class-freemius.php14204, includes/class-freemius.php14256, +#: includes/class-freemius.php:14318 +msgid "Please contact us with the following message:" +msgstr "Пожалуйста, напишите нам сообщение следующего содержания:" + +#: includes/class-freemius.php14666, includes/class-freemius.php:18929 +msgid "Upgrade" +msgstr "Сделать апгрейд " + +#: includes/class-freemius.php:14672 +msgid "Start Trial" +msgstr "Начать тестовый период" + +#: includes/class-freemius.php:14674 +msgid "Pricing" +msgstr "Цены " + +#: includes/class-freemius.php14734, includes/class-freemius.php:14736 +msgid "Affiliation" +msgstr "Партнерство " + +#: includes/class-freemius.php14756, includes/class-freemius.php14758, +#: templates/account.php146, templates/debug.php:314 +msgid "Account" +msgstr "Личный кабинет" + +#: includes/class-freemius.php14769, includes/class-freemius.php14771, +#: includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "Контакты " + +#: includes/class-freemius.php14781, includes/class-freemius.php14783, +#: includes/class-freemius.php18939, templates/account.php96, +#: templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "Настройки плагина " + +#: includes/class-freemius.php14815, templates/pricing.php:97 +msgctxt "noun" +msgid "Pricing" +msgstr "Цены" + +#: includes/class-freemius.php15009, +#: includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" +msgstr "Форум поддержки " + +#: includes/class-freemius.php:15794 +msgid "Your email has been successfully verified - you are AWESOME!" +msgstr "Ваш электронный адрес был успешно подтвержден и Вы просто молодец!" + +#: includes/class-freemius.php:15795 +msgctxt "a positive response" +msgid "Right on" +msgstr "Все верно!" + +#: includes/class-freemius.php:16367 +msgid "Your %s Add-on plan was successfully upgraded." +msgstr "Ваш %s план был успешно обновлен" + +#: includes/class-freemius.php:16369 +msgid "%s Add-on was successfully purchased." +msgstr "Покупка %s плагина успешно состоялась" + +#: includes/class-freemius.php:16372 +msgid "Download the latest version" +msgstr "Скачай последнюю версию" + +#: includes/class-freemius.php:16444 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +msgstr "Ваш сервер блокирует доступ к Freemius' API, что является очень важным для синхронизации с %1s. Пожалуйста, свяжитесь с Вашим хостинг провайдером для разрешения доступа к %2s " + +#: includes/class-freemius.php16447, includes/class-freemius.php16862, +#: includes/class-freemius.php:16927 +msgid "Error received from the server:" +msgstr "Ошибка сервера" + +#: includes/class-freemius.php:16457 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +msgstr "Вероятно один из параметров является неверным. Обновите свой Public Key, Secret Key&User ID и повторите попытку." + +#: includes/class-freemius.php16639, includes/class-freemius.php16867, +#: includes/class-freemius.php:16910 +msgctxt "" +msgid "Hmm" +msgstr "Хм..." + +#: includes/class-freemius.php:16652 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +msgstr "Вероятно Вы все еще пользуетесь сервисом согласно плану %s. Если Вы обновляли или меняли свой тарифный план, то вероятно существуют какие-то трудности связанные с Вашим программным обеспечением. Извините. " + +#: includes/class-freemius.php16653, templates/account.php98, +#: templates/add-ons.php130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" +msgstr "Тестовый период" + +#: includes/class-freemius.php:16658 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +msgstr "Я провел апгрейд аккаунта, но при попытке синхронизировать лицензию, мой тарифный план не меняется. " + +#: includes/class-freemius.php16662, includes/class-freemius.php:16719 +msgid "Please contact us here" +msgstr "Пожалуйста, напишите нам сообщение здесь. " + +#: includes/class-freemius.php:16672 +msgid "Your plan was successfully upgraded." +msgstr "Ваш тарифный план был успешно изменен. " + +#: includes/class-freemius.php:16689 +msgid "Your plan was successfully changed to %s." +msgstr "Ваш тарифный план был успешно изменен на %s." + +#: includes/class-freemius.php:16705 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "Срок действия Вашей лицензии закончился. Вы можете продолжать пользоваться бесплатной версией %s на бессрочной основе." + +#: includes/class-freemius.php:16707 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16715 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "Ваша лицензия была аннулирована. Если Вы считаете, что это ошибка, пожалуйста свяжитесь с нашей службой поддержки. " + +#: includes/class-freemius.php:16728 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "Срок действия Вашей лицензии закончен. Вы можете продолжать пользоваться всеми возможностями %s продлив Вашу лицензию. Вы также будете получать доступ к обновлениям и поддержке. " + +#: includes/class-freemius.php:16751 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "Your free trial has expired. You can still continue using all our free features." + +#: includes/class-freemius.php:16753 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." + +#: includes/class-freemius.php:16858 +msgid "It looks like the license could not be activated." +msgstr "Вероятно возникли трудности с активацией лицензии. " + +#: includes/class-freemius.php:16888 +msgid "Your license was successfully activated." +msgstr "Ваша лицензия была успешно активирована. " + +#: includes/class-freemius.php:16914 +msgid "It looks like your site currently doesn't have an active license." +msgstr "Вероятно Ваш сайт не использует активную лицензию сейчас. " + +#: includes/class-freemius.php:16926 +msgid "It looks like the license deactivation failed." +msgstr "Вероятно деактивация лицензии не состоялась. " + +#: includes/class-freemius.php:16954 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "Ваша лицензия была успешно деактивирована и Вы снова пользуетесь планом %s." + +#: includes/class-freemius.php:16955 +msgid "O.K" +msgstr "O.K." + +#: includes/class-freemius.php:17003 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "Ваш тарифный план был изменен. Срок действия Вашей лицензии закончится через %s." + +#: includes/class-freemius.php:17013 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "По некоторым причинам мы не можем изменить Ваш тарифный план. Пожалуйста, повторите попытку через несколько минут. " + +#: includes/class-freemius.php:17037 +msgid "You are already running the %s in a trial mode." +msgstr "Вы уже пользуетесь тестовой версией %s " + +#: includes/class-freemius.php:17048 +msgid "You already utilized a trial before." +msgstr "Вы уже использовали Ваш тестовый период" + +#: includes/class-freemius.php:17062 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "Тарифного плана % не существует, поэтому Вы не можете начать тестовый период. " + +#: includes/class-freemius.php:17073 +msgid "Plan %s does not support a trial period." +msgstr "Тарифный план % не предусматривает тестового периода. " + +#: includes/class-freemius.php:17084 +msgid "None of the %s's plans supports a trial period." +msgstr "Тарифные планы %s не предусматривают тестовый период. " + +#: includes/class-freemius.php:17134 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "Возможно, Ваш тестовый период уже закончился. " + +#: includes/class-freemius.php:17185 +msgid "Your %s free trial was successfully cancelled." +msgstr "Ваш бесплатный тестовый период был успешно отменен. " + +#: includes/class-freemius.php:17190 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "К сожалению у нас возникли трудности с отменой Вашего тестового периода. Пожалуйста, повторите попытку через несколько минут." + +#: includes/class-freemius.php:17474 +msgid "Version %s was released." +msgstr "Релиз версии %s состоялся. " + +#: includes/class-freemius.php:17474 +msgid "Please download %s." +msgstr "Пожалуйста, скачайте %s" + +#: includes/class-freemius.php:17481 +msgid "the latest %s version here" +msgstr "Последняя версия %s здесь" + +#: includes/class-freemius.php:17486 +msgid "New" +msgstr "Новое " + +#: includes/class-freemius.php:17491 +msgid "Seems like you got the latest release." +msgstr "Вероятно, Вы пользуетесь последней версией" + +#: includes/class-freemius.php:17492 +msgid "You are all good!" +msgstr "Все прошло хорошо!" + +#: includes/class-freemius.php:17758 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "Письмо подтверждение было только что отправлено на %s. Если Вы не получите его через 5 минут, пожалуйста, проверьте папку спам." + +#: includes/class-freemius.php:17893 +msgid "Site successfully opted in." +msgstr "Site successfully opted in." + +#: includes/class-freemius.php17894, includes/class-freemius.php:18671 +msgid "Awesome" +msgstr "Отлично!" + +#: includes/class-freemius.php17910, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "Вы очень помогаете нам совершенствовать %s разрешая следить за некоторыми данными о пользовании. " + +#: includes/class-freemius.php:17911 +msgid "Thank you!" +msgstr "Thank you!" + +#: includes/class-freemius.php:17918 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "We will no longer be sending any usage data of %s on %s to %s." + +#: includes/class-freemius.php:18033 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "Пожалуйста, проверьте свою электронную почту. Вы должны были получить письмо от %s для подтверждения смены прав использования. По причинам безопасности, Вы должны подтвердить изменения на протяжении 15 минут. Если письмо не пришло, пожалуйста проверьте папку спам. " + +#: includes/class-freemius.php:18039 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "Спасибо, что подтвердили изменение прав использования. Вам отправлено письмо на %s для окончательного подтверждения. " + +#: includes/class-freemius.php:18044 +msgid "%s is the new owner of the account." +msgstr "%я является новым владельцем аккаунта" + +#: includes/class-freemius.php:18046 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "Поздравления! " + +#: includes/class-freemius.php:18066 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "Извините, нам не удалось обновить электронный адрес. Другой пользователь с таким же адресом уже был зарегистрирован. " + +#: includes/class-freemius.php:18067 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "Если Вы передаете права пользования аккаунтом %s %s нажмите кнопку \" Сменить права использования\"" + +#: includes/class-freemius.php:18074 +msgid "Change Ownership" +msgstr "Сменить владельца лицензии " + +#: includes/class-freemius.php:18082 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "Ваш электронный адрес был успешно обновлен. Через несколько минут Вы получите письмо с инструкциями для подтверждения" + +#: includes/class-freemius.php:18094 +msgid "Please provide your full name." +msgstr "Пожалуйста, введите Ваше полное имя" + +#: includes/class-freemius.php:18099 +msgid "Your name was successfully updated." +msgstr "Ваше имя было успешно обновлено" + +#: includes/class-freemius.php:18160 +msgid "You have successfully updated your %s." +msgstr "Вы успешно обновили Ваш %s" + +#: includes/class-freemius.php:18300 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "Сообщаем, что информация о дополнительных настройках %s предоставляется со стороннего сервера. " + +#: includes/class-freemius.php:18301 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "Внимание!" + +#: includes/class-freemius.php:18711 +msgctxt "exclamation" +msgid "Hey" +msgstr "Ау!" + +#: includes/class-freemius.php:18711 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "Тебе нравится пользоваться %s? Воспользуйся всеми нашими премиум возможностями на протяжении %d - дневного тестового периода. " + +#: includes/class-freemius.php:18719 +msgid "No commitment for %s days - cancel anytime!" +msgstr "Бесплатное пользование на протяжении %s дней. Отмена в любое время. " + +#: includes/class-freemius.php:18720 +msgid "No credit card required" +msgstr "Не требуются данные платежной карты" + +#: includes/class-freemius.php18727, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "Начни тестовый период!" + +#: includes/class-freemius.php:18804 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "Привет! Знали ли Вы, что %s предоставляет реферальную программу? Если Вам нравится %s, Вы можете стать нашим представителем и зарабатывать!" + +#: includes/class-freemius.php:18813 +msgid "Learn more" +msgstr "Узнать больше" + +#: includes/class-freemius.php18963, templates/account.php394, +#: templates/account.php497, templates/connect.php169, +#: templates/connect.php408, templates/forms/license-activation.php24, +#: templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "Активировать лицензию" + +#: includes/class-freemius.php18964, templates/account.php457, +#: templates/account.php496, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "Изменить лицензию " + +#: includes/class-freemius.php19046, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "Отказаться от использования" + +#: includes/class-freemius.php19048, includes/class-freemius.php19053, +#: templates/account/partials/site.php43, +#: templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "Присоединиться" + +#: includes/class-freemius.php:19245 +msgid "Please follow these steps to complete the upgrade" +msgstr "Пожалуйста, пройдите эти шаги для того, чтобы произвести апгрейд" + +#: includes/class-freemius.php:19249 +msgid "Download the latest %s version" +msgstr "Скачайте последнюю версию %s" + +#: includes/class-freemius.php:19253 +msgid "Upload and activate the downloaded version" +msgstr "Загрузите и активируйте скачанную версию" + +#: includes/class-freemius.php:19255 +msgid "How to upload and activate?" +msgstr "Как загрузить и активировать?" + +#: includes/class-freemius.php:19384 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "%sClick here%s to choose the sites where you'd like to activate the license on." + +#: includes/class-freemius.php:19545 +msgid "Auto installation only works for opted-in users." +msgstr "Авто установка работает только для зарегистрированных пользователей." + +#: includes/class-freemius.php19555, includes/class-freemius.php19588, +#: includes/class-fs-plugin-updater.php713, +#: includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "Неверный ID модуля" + +#: includes/class-freemius.php19564, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "Премиум версия уже активирована" + +#: includes/class-freemius.php:19571 +msgid "You do not have a valid license to access the premium version." +msgstr "У Вас нет необходимых лицензионных прав для пользования премиум версией" + +#: includes/class-freemius.php:19578 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "Плагин является 'Serviсeware'. Это означает, что он не имеет премиум версию кода. " + +#: includes/class-freemius.php19596, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "Премиум версия плагина была установлена" + +#: includes/class-freemius.php:19941 +msgid "View paid features" +msgstr "Просмотр платных возможностей" + +#: includes/class-freemius.php:20251 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "Thank you so much for using %s and its add-ons!" + +#: includes/class-freemius.php:20252 +msgid "Thank you so much for using %s!" +msgstr "Thank you so much for using %s!" + +#: includes/class-freemius.php:20258 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving the %s." + +#: includes/class-freemius.php:20262 +msgid "Thank you so much for using our products!" +msgstr "Thank you so much for using our products!" + +#: includes/class-freemius.php:20263 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "You've already opted-in to our usage-tracking, which helps us keep improving them." + +#: includes/class-freemius.php:20282 +msgid "%s and its add-ons" +msgstr "%s and its add-ons" + +#: includes/class-freemius.php:20291 +msgid "Products" +msgstr "Products" + +#: includes/class-freemius.php20298, templates/connect.php:259 +msgid "Yes" +msgstr "Yes" + +#: includes/class-freemius.php20299, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "send me security & feature updates, educational content and offers." + +#: includes/class-freemius.php20300, templates/connect.php:265 +msgid "No" +msgstr "No" + +#: includes/class-freemius.php20302, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "do %sNOT%s send me security & feature updates, educational content and offers." + +#: includes/class-freemius.php:20312 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" + +#: includes/class-freemius.php20314, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" + +#: includes/class-freemius.php:20598 +msgid "License key is empty." +msgstr "License key is empty." + +#: includes/class-fs-plugin-updater.php184, +#: includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "%sRenew your license now%s to access version %s security & feature updates, and support." + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "Установка плагина: %s" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "Невозможно присоединиться к системе файлов. Пожалуйста, подтвердите свои данные. " + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "Удаленный пакет плагинов не содержит папку с нужным описанием URL и смена имени не срабатывает. " + +#: includes/fs-plugin-info-dialog.php336, +#: templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "Купить" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "Начать мой бесплатный %s" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "Install Free Version Now" + +#: includes/fs-plugin-info-dialog.php381, templates/auto-installation.php111, +#: templates/account/partials/addon.php267, +#: templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "Установить сейчас " + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "Download Latest Free Version" + +#: includes/fs-plugin-info-dialog.php393, templates/account.php80, +#: templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "Скачать последнюю версию" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "Install Free Version Update Now" + +#: includes/fs-plugin-info-dialog.php404, templates/account.php:448 +msgid "Install Update Now" +msgstr "Провести обновления сейчас " + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "Newer Free Version (%s) Installed" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "Более новая версия %s установлена " + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "Latest Free Version Installed" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "Последняя версия установлена" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "Описание " + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "Установка " + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "Часто задаваемые вопросы " + +#: includes/fs-plugin-info-dialog.php583, +#: templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "Снимки экрана " + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "Журнал изменений " + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "Отзывы " + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "Другие заметки " + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "Функционал&тарифные планы " + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "Установка плагина " + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "%s план " + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" +msgstr "Лучший " + +#: includes/fs-plugin-info-dialog.php715, +#: includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" +msgstr "Помесячно " + +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" +msgstr "Ежегодно " + +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" +msgstr "На бессрочный период " + +#: includes/fs-plugin-info-dialog.php735, +#: includes/fs-plugin-info-dialog.php737, +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" +msgstr "Оплачивать %s" + +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" +msgstr "Один раз в год " + +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" +msgstr "Один раз " + +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" +msgstr "Лицензия на один сайт " + +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" +msgstr "Неограниченная лицензия " + +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" +msgstr "до % сайтов " + +#: includes/fs-plugin-info-dialog.php759, +#: templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" +msgstr "на один месяц" + +#: includes/fs-plugin-info-dialog.php766, +#: templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" +msgstr "на один год " + +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" +msgstr "Стоимость " + +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" +msgstr "Экономия %s" + +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" +msgstr "Без обязательств платить %s - аннулируй пользование в любое время " + +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" +msgstr "После окончания Вашего бесплатного %s, платите всего лиш %s" + +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" +msgstr "Детальней" + +#: includes/fs-plugin-info-dialog.php896, templates/account.php87, +#: templates/debug.php191, templates/debug.php228, templates/debug.php442, +#: templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" +msgstr "Версия " + +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" +msgstr "Автор" + +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" +msgstr "Последнее обновление " + +#: includes/fs-plugin-info-dialog.php:915 +msgctxt "x-ago" +msgid "%s ago" +msgstr "% тому назад " + +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" +msgstr "Необходима версия WordPress " + +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" +msgstr "%s или выше" + +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" +msgstr "Совместима с " + +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" +msgstr "Загружен " + +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" +msgstr "%s время " + +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" +msgstr "%s раз " + +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" +msgstr "Страница плагинов WordPress.org" + +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" +msgstr "Главная страница плагина " + +#: includes/fs-plugin-info-dialog.php972, +#: includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" +msgstr "Инвестировать в разработку плагина " + +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" +msgstr "Средний рейтинг " + +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" +msgstr "Основан на %s" + +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" +msgstr "% оценка " + +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" +msgstr "% оценки " + +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" +msgstr "%звездочка " + +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" +msgstr "% звездочки " + +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" +msgstr "Нажмите, чтобы посмотреть отзывы, которые сформировали рейтинг %s" + +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" +msgstr "Контрибьюторы " + +#: includes/fs-plugin-info-dialog.php1062, +#: includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" +msgstr "Предупреждение " + +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." +msgstr "Этот плагин не был тестирован с Вашей текущей версией WordPress. " + +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." +msgstr "Этот плагин не отмечен как совместимый з Вашей версией WordPress " + +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." +msgstr "Платный функционал должен быть заявлен в Freemius" + +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." +msgstr "Функционал должен быть заявлен на WordPress.org или Freemius " + +#: templates/account.php81, templates/account/partials/addon.php22, +#: templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +msgstr "Прекращение пользования платной версией продукта автоматически приостанавливает регулярные платежи и cрок действия Вашей лицензии %s будет закончен %s " + +#: templates/account.php82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +msgstr "Отказ от пользования тестовым периодом автоматически блокирует доступ ко всем премиум возможностям. Вы уверены, что хотите отказаться?" + +#: templates/account.php83, templates/account/partials/addon.php24, +#: templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." +msgstr "Вы все еще можете пользоваться всеми возможностями %, но у Вас не будет доступа к обновлениям и поддержке %s" + +#: templates/account.php84, templates/account/partials/addon.php25, +#: templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." +msgstr "По окончанию срока действия Вашей лицензии, Вы сможете пользоваться бесплатной версией, но у Вас не будет доступа к возможностям %s. " + +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php86, +#: templates/account/partials/activate-license-button.php31, +#: templates/account/partials/addon.php:27 +msgid "Activate %s Plan" +msgstr "Активируйте план %s" + +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php89, templates/account/partials/addon.php30, +#: templates/account/partials/site.php:275 +msgid "Auto renews in %s" +msgstr "Автоматическое продление в %s" + +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php91, templates/account/partials/addon.php32, +#: templates/account/partials/site.php:277 +msgid "Expires in %s" +msgstr "Окончание срока пользования через %s" + +#: templates/account.php92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" +msgstr "Синхронизация лицензии " + +#: templates/account.php93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" +msgstr "Отменить тестовый период " + +#: templates/account.php94, templates/account/partials/addon.php:35 +msgid "Change Plan" +msgstr "Изменить план " + +#: templates/account.php95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" +msgstr "Сделать апгрейд" + +#: templates/account.php97, templates/account/partials/addon.php38, +#: templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" +msgstr "Понизить план " + +#: templates/account.php99, templates/add-ons.php126, +#: templates/plugin-info/features.php72, +#: templates/account/partials/addon.php40, +#: templates/account/partials/site.php:31 +msgid "Free" +msgstr "Бесплатная " + +#: templates/account.php100, templates/account/partials/addon.php:41 +msgid "Activate" +msgstr "Активировать " + +#: templates/account.php101, templates/debug.php361, +#: includes/customizer/class-fs-customizer-upsell-control.php106, +#: templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" +msgstr "Тарифный план " + +#: templates/account.php:154 +msgid "Free Trial" +msgstr "Бесплатный период пользования " + +#: templates/account.php:165 +msgid "Account Details" +msgstr " Детали" + +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +msgstr "Удалив личный кабинет, Вы автоматически деактивируете лицензию на Ваш тарифный план %s, которую Вы можете использовать на других сайтах. Если Вы хотите также приостановить регулярные платежи, нажмите на кнопку \"Отмена\" и сначала измените свой тарифный план на бесплатный. Вы уверены, что хотите продолжить удаление?" + +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" +msgstr "Удаление личного кабинете не может быть произведено временно. Удалите только в случае если Вы больше не хотите пользоваться %s. Вы уверены, что хотите продолжить удаление? " + +#: templates/account.php:180 +msgid "Delete Account" +msgstr "Удалить личный кабинет" + +#: templates/account.php192, templates/account/partials/addon.php155, +#: templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" +msgstr "Деактивировать лицензию " + +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" +msgstr "Вы уверены, что хотите продолжить?" + +#: templates/account.php210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" +msgstr "Отменить подписку " + +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" +msgstr "Синхронизировать " + +#: templates/account.php253, templates/debug.php:477 +msgid "Name" +msgstr "Имя" + +#: templates/account.php259, templates/debug.php:478 +msgid "Email" +msgstr "Электронный адрес " + +#: templates/account.php266, templates/debug.php360, templates/debug.php:516 +msgid "User ID" +msgstr "User ID " + +#: templates/account.php:274 +msgid "Site ID" +msgstr "Site ID" + +#: templates/account.php:277 +msgid "No ID" +msgstr "No ID" + +#: templates/account.php282, templates/debug.php233, templates/debug.php362, +#: templates/debug.php443, templates/debug.php480, +#: templates/account/partials/site.php:219 +msgid "Public Key" +msgstr "Public Key " + +#: templates/account.php288, templates/debug.php363, templates/debug.php444, +#: templates/debug.php481, templates/account/partials/site.php:231 +msgid "Secret Key" +msgstr "Secret Key " + +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" +msgstr "Нет секрета " + +#: templates/account.php310, templates/account/partials/site.php112, +#: templates/account/partials/site.php:114 +msgid "Trial" +msgstr "Тестовый период " + +#: templates/account.php329, templates/debug.php521, +#: templates/account/partials/site.php:248 +msgid "License Key" +msgstr "Лицензионный ключ " + +#: templates/account.php:359 +msgid "not verified" +msgstr "не подтвержден " + +#: templates/account.php:416 +msgid "Premium version" +msgstr "Премиум версия " + +#: templates/account.php:418 +msgid "Free version" +msgstr "Бесплатная версия " + +#: templates/account.php:430 +msgid "Verify Email" +msgstr "Подтвердите электронный адрес " + +#: templates/account.php:441 +msgid "Download %s Version" +msgstr "Скачайте версию %s" + +#: templates/account.php455, templates/account.php636, +#: templates/account/partials/site.php237, +#: templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" +msgstr "Показать " + +#: templates/account.php:469 +msgid "What is your %s?" +msgstr "Какой Ваш %s?" + +#: templates/account.php477, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" +msgstr "Редактировать " + +#: templates/account.php:490 +msgid "Sites" +msgstr "Сайтов " + +#: templates/account.php:501 +msgid "Search by address" +msgstr "Search by address" + +#: templates/account.php510, templates/account.php558, templates/debug.php226, +#: templates/debug.php354, templates/debug.php439, templates/debug.php476, +#: templates/debug.php514, templates/debug.php587, +#: templates/account/payments.php35, templates/debug/logger.php:21 +msgid "ID" +msgstr "ID" + +#: templates/account.php511, templates/debug.php:357 +msgid "Address" +msgstr "Address" + +#: templates/account.php:512 +msgid "License" +msgstr "Лицензия " + +#: templates/account.php:513 +msgid "Plan" +msgstr "Тарифный план " + +#: templates/account.php:561 +msgctxt "as software license" +msgid "License" +msgstr "Лицензия " + +#: templates/account.php:630 +msgctxt "verb" +msgid "Hide" +msgstr "Спрятать " + +#: templates/account.php:665 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" +msgstr "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" + +#: templates/add-ons.php:36 +msgid "Add Ons for %s" +msgstr "Функционал для %s" + +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +msgstr "Мы не можем загрузить список плагинов. Вероятно, произошла какая-то ошибка с нашей стороны. Пожалуйста, вернитесь на страницу через несколько минут. " + +#: templates/add-ons.php:135 +msgid "View details" +msgstr "Смотреть детальней " + +#: templates/admin-notice.php13, templates/forms/license-activation.php208, +#: templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" +msgstr "Закрыть " + +#: templates/auto-installation.php:45 +msgid "%s sec" +msgstr "%s секунд " + +#: templates/auto-installation.php:83 +msgid "Automatic Installation" +msgstr "Автоматическая установка " + +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." +msgstr "Автоматическое скачивание и установка %s ( платной версии) %s начнется через %s. Если Вы хотите все сделать в ручном режиме, нажмите на кнопку \"Отменить\" сейчас. " + +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." +msgstr "Процесс установки уже начат и может занять несколько минут. Пожалуйста, подождите окончания процесса и не обновляйте эту страницу. " + +#: templates/auto-installation.php:109 +msgid "Cancel Installation" +msgstr "Отменить установку " + +#: templates/checkout.php:172 +msgid "Checkout" +msgstr "Оплата " + +#: templates/checkout.php:172 +msgid "PCI compliant" +msgstr "Жалоба PCI" + +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," +msgstr "Здравствуйте %s" + +#: templates/connect.php:152 +msgid "Allow & Continue" +msgstr "Разрешить и продолжить" + +#: templates/connect.php:156 +msgid "Re-send activation email" +msgstr "Отправить письмо активации еще раз " + +#: templates/connect.php:160 +msgid "Thanks %s!" +msgstr "Спасибо %s" + +#: templates/connect.php170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" +msgstr "Согласиться и активировать лицензию " + +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" +msgstr "Спасибо за покупку %s! Для того, чтобы начать введите свой лицензионный ключ:" + +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." + +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +msgstr "Никогда не пропускайте важных оповещений - подпишитесь на наши уведомления о безопасности и новом функционале." + +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." +msgstr "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." + +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." +msgstr "We're excited to introduce the Freemius network-level integration." + +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." +msgstr "During the update process we detected %d site(s) that are still pending license activation." + +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." +msgstr "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." + +#: templates/connect.php:235 +msgid "%s's paid features" +msgstr "%s's paid features" + +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." +msgstr "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." + +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." +msgstr "During the update process we detected %s site(s) in the network that are still pending your attention." + +#: templates/connect.php251, templates/forms/license-activation.php:46 +msgid "License key" +msgstr "Лицензионный ключ" + +#: templates/connect.php254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" +msgstr "Не можете найти лицензионный ключ? " + +#: templates/connect.php302, templates/connect.php617, +#: templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" +msgstr "Пропустить" + +#: templates/connect.php:305 +msgid "Delegate to Site Admins" +msgstr "Delegate to Site Admins" + +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." +msgstr "If you click it, this decision will be delegated to the sites administrators." + +#: templates/connect.php:333 +msgid "Your Profile Overview" +msgstr "Просмотр Вашего профиля " + +#: templates/connect.php:334 +msgid "Name and email address" +msgstr "Имя и электронный адрес " + +#: templates/connect.php:339 +msgid "Your Site Overview" +msgstr "Просмотр Вашего сайта " + +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" +msgstr "URL сайта, версия WP, информация о PHP, плагинах и шаблонах " + +#: templates/connect.php:345 +msgid "Admin Notices" +msgstr "Админ заметки" + +#: templates/connect.php346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" +msgstr "Новости, объявления, маркетинг, без спама" + +#: templates/connect.php:351 +msgid "Current %s Events" +msgstr "Текущие события %s" + +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" +msgstr "Активация, деактивация и деинсталляция " + +#: templates/connect.php:361 +msgid "Newsletter" +msgstr "Рассылка " + +#: templates/connect.php378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." +msgstr "%1$s будет периодически присылать информацию %2$s с целью проверки безопасности, сообщения об обновлении функционала и подтверждения действия Вашей лицензии. " + +#: templates/connect.php:383 +msgid "What permissions are being granted?" +msgstr "Какие предоставляются разрешения?" + +#: templates/connect.php:404 +msgid "Don't have a license key?" +msgstr "У Вас нет лицензионного ключа?" + +#: templates/connect.php:405 +msgid "Activate Free Version" +msgstr "Активировать бесплатную версию?" + +#: templates/connect.php:407 +msgid "Have a license key?" +msgstr "У Вас есть лицензионный ключ?" + +#: templates/connect.php:415 +msgid "Privacy Policy" +msgstr "Политика Конфиденциальности" + +#: templates/connect.php:417 +msgid "Terms of Service" +msgstr "Пользовательское соглашение" + +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" +msgstr "Электронное письмо отправляется Вам на почту " + +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" +msgstr "Активация " + +#: templates/contact.php:78 +msgid "Contact" +msgstr "Свяжитесь с нами" + +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" +msgstr "Выключить " + +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" +msgstr "Включить " + +#: templates/debug.php:20 +msgid "SDK" +msgstr "SDK" + +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" +msgstr "Устранение ошибок" + +#: templates/debug.php54, templates/debug.php238, templates/debug.php364, +#: templates/debug.php:482 +msgid "Actions" +msgstr "Действия " + +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" +msgstr "Вы уверенны, что хотите удалить все данные Freemius?" + +#: templates/debug.php:64 +msgid "Delete All Accounts" +msgstr "Удалить все аккаунты" + +#: templates/debug.php:71 +msgid "Clear API Cache" +msgstr "Очистить кэш API" + +#: templates/debug.php:79 +msgid "Clear Updates Transients" +msgstr "Clear Updates Transients" + +#: templates/debug.php:86 +msgid "Sync Data From Server" +msgstr "Синхронизация данных с сервера " + +#: templates/debug.php:90 +msgid "Load DB Option" +msgstr "Загрузить опцию базы данных " + +#: templates/debug.php:93 +msgid "Set DB Option" +msgstr "Установить опцию базы данных " + +#: templates/debug.php:170 +msgid "Key" +msgstr "Ключ " + +#: templates/debug.php:171 +msgid "Value" +msgstr "Значение " + +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" +msgstr "Версии SDK" + +#: templates/debug.php:192 +msgid "SDK Path" +msgstr "путь SDK" + +#: templates/debug.php193, templates/debug.php:232 +msgid "Module Path" +msgstr "Путь модуля " + +#: templates/debug.php:194 +msgid "Is Active" +msgstr "активный " + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" +msgstr "Плагины " + +#: templates/debug.php222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" +msgstr "Шаблоны " + +#: templates/debug.php227, templates/debug.php359, templates/debug.php441, +#: templates/debug/scheduled-crons.php:80 +msgid "Slug" +msgstr "Описательная часть URL " + +#: templates/debug.php229, templates/debug.php:440 +msgid "Title" +msgstr "Название " + +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" +msgstr "API" + +#: templates/debug.php:231 +msgid "Freemius State" +msgstr "Cостояние Freemius " + +#: templates/debug.php:235 +msgid "Network Blog" +msgstr "Network Blog" + +#: templates/debug.php:236 +msgid "Network User" +msgstr "Network User" + +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" +msgstr "Соединено " + +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" +msgstr "Заблокировано " + +#: templates/debug.php:310 +msgid "Simulate Trial" +msgstr "Симулировать тестовый период " + +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" +msgstr "Simulate Network Upgrade" + +#: templates/debug.php:348 +msgid "%s Installs" +msgstr "%s установок " + +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" +msgstr "Сайтов " + +#: templates/debug.php356, templates/account/partials/site.php:148 +msgid "Blog ID" +msgstr "Blog ID" + +#: templates/debug.php421, templates/debug.php499, +#: templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" +msgstr "Удалить" + +#: templates/debug.php:435 +msgid "Add Ons of module %s" +msgstr "Функционал модуля %s" + +#: templates/debug.php:472 +msgid "Users" +msgstr "Пользователи " + +#: templates/debug.php:479 +msgid "Verified" +msgstr "Подтвержден " + +#: templates/debug.php:510 +msgid "%s Licenses" +msgstr "%s лицензий " + +#: templates/debug.php:515 +msgid "Plugin ID" +msgstr "ID плагина " + +#: templates/debug.php:517 +msgid "Plan ID" +msgstr "ID тарифного плана " + +#: templates/debug.php:518 +msgid "Quota" +msgstr "Выделенный объем памяти" + +#: templates/debug.php:519 +msgid "Activated" +msgstr "Активирован " + +#: templates/debug.php:520 +msgid "Blocking" +msgstr "Блокирование " + +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" +msgstr "Срок пользования " + +#: templates/debug.php:545 +msgid "Debug Log" +msgstr "Журнал устранения ошибок " + +#: templates/debug.php:549 +msgid "All Types" +msgstr "Все типы" + +#: templates/debug.php:556 +msgid "All Requests" +msgstr "Все запросы " + +#: templates/debug.php561, templates/debug.php590, +#: templates/debug/logger.php:25 +msgid "File" +msgstr "Файл" + +#: templates/debug.php562, templates/debug.php588, +#: templates/debug/logger.php:23 +msgid "Function" +msgstr "Функция " + +#: templates/debug.php:563 +msgid "Process ID" +msgstr "ID процесса " + +#: templates/debug.php:564 +msgid "Logger" +msgstr "Программа сохранения изменений " + +#: templates/debug.php565, templates/debug.php589, +#: templates/debug/logger.php:24 +msgid "Message" +msgstr "Сообщение " + +#: templates/debug.php:567 +msgid "Filter" +msgstr "Фильтр " + +#: templates/debug.php:575 +msgid "Download" +msgstr "Скачать " + +#: templates/debug.php586, templates/debug/logger.php:22 +msgid "Type" +msgstr "Тип" + +#: templates/debug.php591, templates/debug/logger.php:26 +msgid "Timestamp" +msgstr "Маркер времени " + +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" +msgstr "Безопасная страница HTTPS %s воспроизводится с внешнего ресурса " + +#: includes/customizer/class-fs-customizer-support-section.php55, +#: templates/plugin-info/features.php:43 +msgid "Support" +msgstr "Поддержка " + +#: includes/debug/class-fs-debug-bar-panel.php48, +#: templates/debug/api-calls.php54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" +msgstr "мс " + +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" +msgstr "Freemius API" + +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" +msgstr "Запросы " + +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" +msgstr "Обновить " + +#: templates/account/billing.php:39 +msgid "Billing" +msgstr "Система оплаты " + +#: templates/account/billing.php44, templates/account/billing.php:44 +msgid "Business name" +msgstr "Название бизнеса " + +#: templates/account/billing.php45, templates/account/billing.php:45 +msgid "Tax / VAT ID" +msgstr "ID налога/НДС " + +#: templates/account/billing.php48, templates/account/billing.php48, +#: templates/account/billing.php49, templates/account/billing.php:49 +msgid "Address Line %d" +msgstr "Поле для адреса %d" + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "City" +msgstr "Город " + +#: templates/account/billing.php52, templates/account/billing.php:52 +msgid "Town" +msgstr "Населенный пункт " + +#: templates/account/billing.php53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" +msgstr "Индекс " + +#: templates/account/billing.php:308 +msgid "Country" +msgstr "Страна " + +#: templates/account/billing.php:310 +msgid "Select Country" +msgstr "Выбрать страну " + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "State" +msgstr "Штат " + +#: templates/account/billing.php317, templates/account/billing.php:318 +msgid "Province" +msgstr "Провинция " + +#: templates/account/payments.php:29 +msgid "Payments" +msgstr "Платежи" + +#: templates/account/payments.php:36 +msgid "Date" +msgstr "Дата " + +#: templates/account/payments.php:37 +msgid "Amount" +msgstr "Количество " + +#: templates/account/payments.php38, templates/account/payments.php:50 +msgid "Invoice" +msgstr "Счет " + +#: templates/debug/api-calls.php:56 +msgid "API" +msgstr "API" + +#: templates/debug/api-calls.php:68 +msgid "Method" +msgstr "Метод " + +#: templates/debug/api-calls.php:69 +msgid "Code" +msgstr "Код" + +#: templates/debug/api-calls.php:70 +msgid "Length" +msgstr "Длинна " + +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" +msgstr "Путь " + +#: templates/debug/api-calls.php:73 +msgid "Body" +msgstr "Основная часть " + +#: templates/debug/api-calls.php:75 +msgid "Result" +msgstr "Результат" + +#: templates/debug/api-calls.php:76 +msgid "Start" +msgstr "Начало" + +#: templates/debug/api-calls.php:77 +msgid "End" +msgstr "Конец " + +#: templates/debug/logger.php:15 +msgid "Log" +msgstr "Журнал изменений " + +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php18, +#: templates/debug/scheduled-crons.php:91 +msgid "In %s" +msgstr "В %s" + +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php20, +#: templates/debug/scheduled-crons.php:93 +msgid "%s ago" +msgstr "%s тому назад " + +#: templates/debug/plugins-themes-sync.php21, +#: templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" +msgstr "сек" + +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" +msgstr "Синхронизация плагинов и шаблонов " + +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" +msgstr "Итого" + +#: templates/debug/plugins-themes-sync.php29, +#: templates/debug/scheduled-crons.php:84 +msgid "Last" +msgstr "Последний " + +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" +msgstr "Спланированные задачи" + +#: templates/debug/scheduled-crons.php:81 +msgid "Module" +msgstr "Модуль" + +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" +msgstr "Тип модуля " + +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" +msgstr "Тип задачи" + +#: templates/debug/scheduled-crons.php:85 +msgid "Next" +msgstr "Следующий " + +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" +msgstr "Бессрочный " + +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" +msgstr "Подать заявку на партнерство " + +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." +msgstr "Ваша заявка на партнерство с %s принята! Войдите в Ваш кабинет партнера на %s" + +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." +msgstr "Спасибо за подачу заявки на партнерство. Мы рассмотрим Ваши данные на протяжении следующих 14 дней и свяжемся с Вами. " + +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." +msgstr "Ваш партнерский аккаунт временно недоступен. " + +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." +msgstr "Спасибо за подачу заявки на партнерство. К сожалению, мы приняли решение отказать Вам в этой возможности. Пожалуйста, повторите попытку через 30 дней. " + +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." +msgstr "Из-за нарушения условий партнерства мы вынуждены временно заблокировать Ваш аккаунт. Если у Вас возникли вопросы, пожалуйста, обратитесь в службу поддержки. " + +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" +msgstr "Вам нравится %s? Стань нашим партнером и зарабатывай ;-)" + +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" +msgstr "Порекомендуй % новым пользователям и зарабатывай %s c каждой успешной продажи. " + +#: templates/forms/affiliation.php:145 +msgid "Program Summary" +msgstr "Краткое описание программы " + +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." +msgstr "%s вознаграждения, если клиент купит новую лицензию." + +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." +msgstr "Получай вознаграждение за автоматические продления пользования. " + +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." +msgstr "%s данные cookies предоставляются после первого посещения, чтобы максимально увеличить вероятность заработка. " + +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." +msgstr "Неограниченное вознаграждение " + +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." +msgstr "% минимальная сумма выплаты " + +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." +msgstr "Выплаты производятся в долларах США через PayPal." + +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." +msgstr "Мы выделяем 30 дней для поступления возвратов и поэтому вознаграждения выплачиваются за покупки, которые были совершены более чем 30 дней назад." + +#: templates/forms/affiliation.php:162 +msgid "Affiliate" +msgstr "Партнер" + +#: templates/forms/affiliation.php165, templates/forms/resend-key.php:23 +msgid "Email address" +msgstr "Электронный адрес " + +#: templates/forms/affiliation.php:169 +msgid "Full name" +msgstr "Полное имя" + +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" +msgstr "Электронный адрес аккаунта PayPal" + +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" +msgstr "Где Вы намерены продвигать %s?" + +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." +msgstr "Введите домен Вашего сайта или других сайтов на которых Вы намерены продвигать %s." + +#: templates/forms/affiliation.php:181 +msgid "Add another domain" +msgstr "Добавьте другое доменное имя " + +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" +msgstr "Дополнительные доменные имена " + +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." +msgstr "Дополнительные доменные имена, где Вы будете продвигать продукт. " + +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" +msgstr "Методы продвижения " + +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" +msgstr "Социальные сети ( Facebook, Twitter, etc.)" + +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" +msgstr "Мобильные приложения " + +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" +msgstr "Вебсайт, электронный адрес и статистика социальных сетей (не обязательно)" + +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." +msgstr "Пожалуйста, предоставьте соответственную статистику вебсайта или страницы социальных сетей, например, количество уникальных посетителей, количество подписчиков, читателей, т. д. ( эта информация останется конфиденциальной). " + +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" +msgstr "Как Вы намерены продвигать нас?" + +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." +msgstr "Пожалуйста, предоставьте максимально детальную информацию о том, как Вы планируете продвигать %s." + +#: templates/forms/affiliation.php223, templates/forms/resend-key.php:22 +msgid "Cancel" +msgstr "Отмена " + +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" +msgstr "Стать партнером" + +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" +msgstr "Пожалуйста введите лицензионный ключ, который Вы получили на электронный адрес сразу после покупки. " + +#: templates/forms/license-activation.php:25 +msgid "Update License" +msgstr "Обновить лицензию" + +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" +msgstr "Отписаться " + +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" +msgstr "Присоединится " + +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +msgstr "Данные о пользовании исследуются с целью усовершенствования %s и чтобы предоставить Вам лучший опыт, поставить приоритет на новых возможностях и важном функционале. Мы будем очень благодарны, если Вы пересмотрите Ваше решение и позволите нам обрабатывать информацию о пользовании нашим продуктом." + +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +msgstr "Если Вы нажмете \"Отписаться\", Вы больше не будете получать информацию от %s на %s." + +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." +msgstr "There is a new version of %s available." + +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." +msgstr " %sRenew your license now%s to access version %s security & feature updates, and support." + +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" +msgstr "New Version Available" + +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" +msgstr "Renew license" + +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" +msgstr "Закрыть " + +#: templates/forms/resend-key.php:21 +msgid "Send License Key" +msgstr "Отправить лицензионный ключ" + +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +msgstr "Введите ниже адрес своей электронной почты, которую Вы использовали для обновлений и мы Вам отправим повторно Ваш лицензионный ключ. " + +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +msgstr "Вы уже на расстоянии одного клика от начала Вашего бесплатного %1$s - дневного тестового периода по тарифному плану %2$s. " + +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." +msgstr "В соответствии с руководством WordPress.org, перед началом тестового периода мы просим, чтобы Вы присоединились к нашему сообществу предоставив информацию о Вашем сайте и также Ваши личные данные, тем самым разрешив %s периодически отправлять сообщения на %s для уведомлений об обновлениях и подтверждения Вашего тестового периода. " + +#: templates/js/style-premium-theme.php:37 +msgid "Premium" +msgstr "Премиум " + +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." +msgstr "Activate license on all sites in the network." + +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." +msgstr "Apply on all sites in the network." + +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." +msgstr "Activate license on all pending sites." + +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." +msgstr "Apply on all pending sites." + +#: templates/partials/network-activation.php36, +#: templates/partials/network-activation.php:68 +msgid "allow" +msgstr "allow" + +#: templates/partials/network-activation.php38, +#: templates/partials/network-activation.php:70 +msgid "delegate" +msgstr "delegate" + +#: templates/partials/network-activation.php41, +#: templates/partials/network-activation.php:73 +msgid "skip" +msgstr "skip" + +#: templates/plugin-info/description.php72, +#: templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" +msgstr "Кликните, чтобы посмотреть снимок %d на широком экране. " + +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" +msgstr "Неограниченные обновления " + +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" +msgstr "Локальный хостинг " + +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" +msgstr "Осталось %s " + +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" +msgstr "Последняя лицензия " + +#: templates/account/partials/addon.php:111 +msgid "Cancelled" +msgstr "Аннулирована " + +#: templates/account/partials/addon.php:116 +msgid "Expired" +msgstr "Срок действия закончился " + +#: templates/account/partials/addon.php:121 +msgid "No expiration" +msgstr "Бессрочный период пользования " + +#: templates/account/partials/addon.php259, +#: templates/account/partials/addon.php:312 +msgid "Activate this add-on" +msgstr "Активируйте этот функционал " + +#: templates/account/partials/site.php:181 +msgid "Owner Name" +msgstr "Owner Name" + +#: templates/account/partials/site.php:193 +msgid "Owner Email" +msgstr "Owner Email" + +#: templates/account/partials/site.php:205 +msgid "Owner ID" +msgstr "Owner ID" + +#: templates/account/partials/site.php:270 +msgid "Subscription" +msgstr "Subscription" + +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +msgstr "Извините за неудобство. Мы будем рады помочь, если Вы нам предоставите эту возможность. " + +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" +msgstr "Связаться со службой поддержки" + +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" +msgstr "Анонимный отзыв " + +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" +msgstr "Деактивировать " + +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" +msgstr "Активировать %s" + +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" +msgstr "Быстрый отзыв" + +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" +msgstr "Если у Вас есть время, пожалуйста, сообщите причину почему Вы %s" + +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" +msgstr "Деактивация " + +#: templates/forms/deactivation/form.php:80 +msgid "switching" +msgstr "Переключение " + +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" +msgstr "Отправить&%s" + +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." +msgstr "Пожалуйста, укажите причину, чтобы мы могли исправиться. " + +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" +msgstr "Да - %s" + +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" +msgstr "Пропустить & %s" + +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" +msgstr "Нажмите здесь, чтобы пользоваться плагином анонимно. " + +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +msgstr "Возможно, Вы не обратили внимание, но Вы не обязаны делиться никакими данными и можете просто % кнопку \"Присоединиться\". " diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius.pot b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius.pot index 16a010085..70f2a6121 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/languages/freemius.pot +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/freemius.pot @@ -1,1525 +1,2202 @@ -# Copyright (C) 2016 freemius +# Copyright (C) 2018 freemius # This file is distributed under the same license as the freemius package. msgid "" msgstr "" "Project-Id-Version: freemius\n" -"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n" -"Last-Translator: Vova Feldman <vova@freemius.com>\n" "Language-Team: Freemius Team <admin@freemius.com>\n" +"Last-Translator: Vova Feldman <vova@freemius.com>\n" +"Report-Msgid-Bugs-To: https://github.com/Freemius/wordpress-sdk/issues\n" "X-Poedit-Basepath: ..\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-KeywordsList: get_text_inline;fs_text_inline;fs_echo_inline;fs_esc_js_inline;fs_esc_attr_inline;fs_esc_attr_echo_inline;fs_esc_html_inline;fs_esc_html_echo_inline;get_text_x_inline:1,2c;fs_text_x_inline:1,2c;fs_echo_x_inline:1,2c;fs_esc_attr_x_inline:1,2c;fs_esc_js_x_inline:1,2c;fs_esc_js_echo_x_inline:1,2c;fs_esc_html_x_inline:1,2c;fs_esc_html_echo_x_inline:1,2c\n" "X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPathExcluded-0: *.js\n" +"X-Poedit-SourceCharset: UTF-8\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: includes/i18n.php:41, includes/i18n.php:55 -msgid "Yes - I'm in!" + +#: includes/class-freemius.php:1551 +msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." msgstr "" -#: includes/i18n.php:43, includes/i18n.php:57 -msgid "Not today" +#: includes/class-freemius.php:1553 +msgid "Error" msgstr "" -#: includes/i18n.php:69 -msgid "Account" +#: includes/class-freemius.php:1871 +msgid "I found a better %s" msgstr "" -#: includes/i18n.php:71 -msgid "Add On" +#: includes/class-freemius.php:1873 +msgid "What's the %s's name?" msgstr "" -#: includes/i18n.php:73 -msgid "Contact Us" +#: includes/class-freemius.php:1879 +msgid "It's a temporary %s. I'm just debugging an issue." msgstr "" -#: includes/i18n.php:75 -msgid "Contact Support" +#: includes/class-freemius.php:1881 +msgid "Deactivation" msgstr "" -#: includes/i18n.php:77 -msgid "Change Ownership" +#: includes/class-freemius.php:1882 +msgid "Theme Switch" msgstr "" -#: includes/i18n.php:79 -msgid "Support" +#: includes/class-freemius.php:1891, templates/forms/resend-key.php:24 +msgid "Other" msgstr "" -#: includes/i18n.php:81 -msgid "Support Forum" +#: includes/class-freemius.php:1899 +msgid "I no longer need the %s" msgstr "" -#: includes/i18n.php:83 -msgid "Add Ons" +#: includes/class-freemius.php:1906 +msgid "I only needed the %s for a short period" msgstr "" -#: includes/i18n.php:85 -msgctxt "verb" +#: includes/class-freemius.php:1912 +msgid "The %s broke my site" +msgstr "" + +#: includes/class-freemius.php:1919 +msgid "The %s suddenly stopped working" +msgstr "" + +#: includes/class-freemius.php:1929 +msgid "I can't pay for it anymore" +msgstr "" + +#: includes/class-freemius.php:1931 +msgid "What price would you feel comfortable paying?" +msgstr "" + +#: includes/class-freemius.php:1937 +msgid "I don't like to share my information with you" +msgstr "" + +#: includes/class-freemius.php:1958 +msgid "The %s didn't work" +msgstr "" + +#: includes/class-freemius.php:1968 +msgid "I couldn't understand how to make it work" +msgstr "" + +#: includes/class-freemius.php:1976 +msgid "The %s is great, but I need specific feature that you don't support" +msgstr "" + +#: includes/class-freemius.php:1978 +msgid "What feature?" +msgstr "" + +#: includes/class-freemius.php:1982 +msgid "The %s is not working" +msgstr "" + +#: includes/class-freemius.php:1984 +msgid "Kindly share what didn't work so we can fix it for future users..." +msgstr "" + +#: includes/class-freemius.php:1988 +msgid "It's not what I was looking for" +msgstr "" + +#: includes/class-freemius.php:1990 +msgid "What you've been looking for?" +msgstr "" + +#: includes/class-freemius.php:1994 +msgid "The %s didn't work as expected" +msgstr "" + +#: includes/class-freemius.php:1996 +msgid "What did you expect?" +msgstr "" + +#: includes/class-freemius.php:2729, templates/debug.php:20 +msgid "Freemius Debug" +msgstr "" + +#: includes/class-freemius.php:3453 +msgid "I don't know what is cURL or how to install it, help me!" +msgstr "" + +#: includes/class-freemius.php:3455 +msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +msgstr "" + +#: includes/class-freemius.php:3462 +msgid "Great, please install cURL and enable it in your php.ini file. In addition, search for the 'disable_functions' directive in your php.ini file and remove any disabled methods starting with 'curl_'. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the %s and reactivate it back again." +msgstr "" + +#: includes/class-freemius.php:3567 +msgid "Yes - do your thing" +msgstr "" + +#: includes/class-freemius.php:3572 +msgid "No - just deactivate" +msgstr "" + +#: includes/class-freemius.php:3617, includes/class-freemius.php:4117, includes/class-freemius.php:5178, includes/class-freemius.php:10992, includes/class-freemius.php:14256, includes/class-freemius.php:14308, includes/class-freemius.php:14370, includes/class-freemius.php:16500, includes/class-freemius.php:16510, includes/class-freemius.php:17066, includes/class-freemius.php:17084, includes/class-freemius.php:17182, includes/class-freemius.php:17925, templates/add-ons.php:43 +msgctxt "exclamation" +msgid "Oops" +msgstr "" + +#: includes/class-freemius.php:3686 +msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +msgstr "" + +#: includes/class-freemius.php:4114 +msgctxt "addonX cannot run without pluginY" +msgid "%s cannot run without %s." +msgstr "" + +#: includes/class-freemius.php:4115 +msgctxt "addonX cannot run..." +msgid "%s cannot run without the plugin." +msgstr "" + +#: includes/class-freemius.php:4227, includes/class-freemius.php:4252, includes/class-freemius.php:17155 +msgid "Unexpected API error. Please contact the %s's author with the following error." +msgstr "" + +#: includes/class-freemius.php:4866 +msgid "Premium %s version was successfully activated." +msgstr "" + +#: includes/class-freemius.php:4878, includes/class-freemius.php:6711 +msgctxt "Used to express elation, enthusiasm, or triumph (especially in electronic communication)." +msgid "W00t" +msgstr "" + +#: includes/class-freemius.php:4893 +msgid "You have a %s license." +msgstr "" + +#: includes/class-freemius.php:4897, includes/class-freemius.php:13677, includes/class-freemius.php:13688, includes/class-freemius.php:16428, includes/class-freemius.php:16728, includes/class-freemius.php:16793, includes/class-freemius.php:16943 +msgctxt "interjection expressing joy or exuberance" +msgid "Yee-haw" +msgstr "" + +#: includes/class-freemius.php:5161 +msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +msgstr "" + +#: includes/class-freemius.php:5165 +msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +msgstr "" + +#: includes/class-freemius.php:5174, templates/add-ons.php:99, templates/account/partials/addon.php:283 +msgid "More information about %s" +msgstr "" + +#: includes/class-freemius.php:5175 +msgid "Purchase License" +msgstr "" + +#: includes/class-freemius.php:6086, templates/connect.php:161 +msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +msgstr "" + +#: includes/class-freemius.php:6090 +msgid "start the trial" +msgstr "" + +#: includes/class-freemius.php:6091, templates/connect.php:165 +msgid "complete the install" +msgstr "" + +#: includes/class-freemius.php:6198 +msgid "You are just one step away - %s" +msgstr "" + +#: includes/class-freemius.php:6201 +msgctxt "%s - plugin name. As complete \"PluginX\" activation now" +msgid "Complete \"%s\" Activation Now" +msgstr "" + +#: includes/class-freemius.php:6278 +msgid "We made a few tweaks to the %s, %s" +msgstr "" + +#: includes/class-freemius.php:6282 +msgid "Opt in to make \"%s\" Better!" +msgstr "" + +#: includes/class-freemius.php:6710 +msgid "The upgrade of %s was successfully completed." +msgstr "" + +#: includes/class-freemius.php:8435, includes/class-fs-plugin-updater.php:581, includes/class-fs-plugin-updater.php:733, includes/class-fs-plugin-updater.php:739, templates/auto-installation.php:32 +msgid "Add-On" +msgstr "" + +#: includes/class-freemius.php:8437, templates/debug.php:349, templates/debug.php:510 +msgid "Plugin" +msgstr "" + +#: includes/class-freemius.php:8438, templates/debug.php:349, templates/debug.php:510, templates/forms/deactivation/form.php:64 +msgid "Theme" +msgstr "" + +#: includes/class-freemius.php:10859 +msgid "Invalid site details collection." +msgstr "" + +#: includes/class-freemius.php:10979 +msgid "We couldn't find your email address in the system, are you sure it's the right address?" +msgstr "" + +#: includes/class-freemius.php:10981 +msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +msgstr "" + +#: includes/class-freemius.php:11217 +msgid "Account is pending activation." +msgstr "" + +#: includes/class-freemius.php:13659 +msgid "%s activation was successfully completed." +msgstr "" + +#: includes/class-freemius.php:13673 +msgid "Your account was successfully activated with the %s plan." +msgstr "" + +#: includes/class-freemius.php:13684, includes/class-freemius.php:16789 +msgid "Your trial has been successfully started." +msgstr "" + +#: includes/class-freemius.php:14254, includes/class-freemius.php:14306, includes/class-freemius.php:14368 +msgid "Couldn't activate %s." +msgstr "" + +#: includes/class-freemius.php:14255, includes/class-freemius.php:14307, includes/class-freemius.php:14369 +msgid "Please contact us with the following message:" +msgstr "" + +#: includes/class-freemius.php:14718, includes/class-freemius.php:18988 msgid "Upgrade" msgstr "" -#: includes/i18n.php:87 -msgid "Awesome" +#: includes/class-freemius.php:14724 +msgid "Start Trial" msgstr "" -#: includes/i18n.php:89 -msgctxt "noun" +#: includes/class-freemius.php:14726 msgid "Pricing" msgstr "" -#: includes/i18n.php:91 +#: includes/class-freemius.php:14786, includes/class-freemius.php:14788 +msgid "Affiliation" +msgstr "" + +#: includes/class-freemius.php:14808, includes/class-freemius.php:14810, templates/account.php:146, templates/debug.php:314 +msgid "Account" +msgstr "" + +#: includes/class-freemius.php:14821, includes/class-freemius.php:14823, includes/customizer/class-fs-customizer-support-section.php:60 +msgid "Contact Us" +msgstr "" + +#: includes/class-freemius.php:14833, includes/class-freemius.php:14835, includes/class-freemius.php:18998, templates/account.php:96, templates/account/partials/addon.php:37 +msgid "Add-Ons" +msgstr "" + +#: includes/class-freemius.php:14867, templates/pricing.php:97 msgctxt "noun" -msgid "Price" +msgid "Pricing" msgstr "" -#: includes/i18n.php:93 -msgid "Unlimited Updates" +#: includes/class-freemius.php:15061, includes/customizer/class-fs-customizer-support-section.php:67 +msgid "Support Forum" msgstr "" -#: includes/i18n.php:95 -msgctxt "verb" -msgid "Downgrade" +#: includes/class-freemius.php:15846 +msgid "Your email has been successfully verified - you are AWESOME!" msgstr "" -#: includes/i18n.php:97 -msgid "Cancel Trial" +#: includes/class-freemius.php:15847 +msgctxt "a positive response" +msgid "Right on" msgstr "" -#: includes/i18n.php:99 -msgid "Free Trial" +#: includes/class-freemius.php:16419 +msgid "Your %s Add-on plan was successfully upgraded." msgstr "" -#: includes/i18n.php:101 -msgid "Start my free %s" +#: includes/class-freemius.php:16421 +msgid "%s Add-on was successfully purchased." msgstr "" -#: includes/i18n.php:103 -msgid "No commitment for %s - cancel anytime" +#: includes/class-freemius.php:16424 +msgid "Download the latest version" msgstr "" -#: includes/i18n.php:105 -msgid "After your free %s, pay as little as %s" +#: includes/class-freemius.php:16496 +msgctxt "%1s - plugin title, %2s - API domain" +msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" msgstr "" -#: includes/i18n.php:107 -msgid "Details" +#: includes/class-freemius.php:16499, includes/class-freemius.php:16914, includes/class-freemius.php:16979 +msgid "Error received from the server:" msgstr "" -#: includes/i18n.php:109 -msgid "Account Details" +#: includes/class-freemius.php:16509 +msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." msgstr "" -#: includes/i18n.php:111 -msgctxt "verb" -msgid "Delete" +#: includes/class-freemius.php:16691, includes/class-freemius.php:16919, includes/class-freemius.php:16962 +msgctxt "something somebody says when they are thinking about what you have just said." +msgid "Hmm" msgstr "" -#: includes/i18n.php:113 -msgctxt "verb" -msgid "Show" +#: includes/class-freemius.php:16704 +msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." msgstr "" -#: includes/i18n.php:115 -msgctxt "verb" -msgid "Hide" +#: includes/class-freemius.php:16705, templates/account.php:98, templates/add-ons.php:130, templates/account/partials/addon.php:39 +msgctxt "trial period" +msgid "Trial" msgstr "" -#: includes/i18n.php:117 -msgctxt "verb" -msgid "Edit" +#: includes/class-freemius.php:16710 +msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." msgstr "" -#: includes/i18n.php:119 -msgctxt "verb" -msgid "Update" +#: includes/class-freemius.php:16714, includes/class-freemius.php:16771 +msgid "Please contact us here" +msgstr "" + +#: includes/class-freemius.php:16724 +msgid "Your plan was successfully upgraded." +msgstr "" + +#: includes/class-freemius.php:16741 +msgid "Your plan was successfully changed to %s." +msgstr "" + +#: includes/class-freemius.php:16757 +msgid "Your license has expired. You can still continue using the free %s forever." +msgstr "" + +#: includes/class-freemius.php:16759 +msgid "Your license has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "" + +#: includes/class-freemius.php:16767 +msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +msgstr "" + +#: includes/class-freemius.php:16780 +msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +msgstr "" + +#: includes/class-freemius.php:16803 +msgid "Your free trial has expired. You can still continue using all our free features." +msgstr "" + +#: includes/class-freemius.php:16805 +msgid "Your free trial has expired. %1$sUpgrade now%2$s to continue using the %3$s without interruptions." +msgstr "" + +#: includes/class-freemius.php:16910 +msgid "It looks like the license could not be activated." +msgstr "" + +#: includes/class-freemius.php:16940 +msgid "Your license was successfully activated." +msgstr "" + +#: includes/class-freemius.php:16966 +msgid "It looks like your site currently doesn't have an active license." +msgstr "" + +#: includes/class-freemius.php:16978 +msgid "It looks like the license deactivation failed." +msgstr "" + +#: includes/class-freemius.php:17006 +msgid "Your license was successfully deactivated, you are back to the %s plan." +msgstr "" + +#: includes/class-freemius.php:17007 +msgid "O.K" +msgstr "" + +#: includes/class-freemius.php:17055 +msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +msgstr "" + +#: includes/class-freemius.php:17065 +msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +msgstr "" + +#: includes/class-freemius.php:17089 +msgid "You are already running the %s in a trial mode." +msgstr "" + +#: includes/class-freemius.php:17100 +msgid "You already utilized a trial before." +msgstr "" + +#: includes/class-freemius.php:17114 +msgid "Plan %s do not exist, therefore, can't start a trial." +msgstr "" + +#: includes/class-freemius.php:17125 +msgid "Plan %s does not support a trial period." +msgstr "" + +#: includes/class-freemius.php:17136 +msgid "None of the %s's plans supports a trial period." +msgstr "" + +#: includes/class-freemius.php:17186 +msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +msgstr "" + +#: includes/class-freemius.php:17237 +msgid "Your %s free trial was successfully cancelled." +msgstr "" + +#: includes/class-freemius.php:17242 +msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +msgstr "" + +#: includes/class-freemius.php:17533 +msgid "Version %s was released." +msgstr "" + +#: includes/class-freemius.php:17533 +msgid "Please download %s." +msgstr "" + +#: includes/class-freemius.php:17540 +msgid "the latest %s version here" +msgstr "" + +#: includes/class-freemius.php:17545 +msgid "New" +msgstr "" + +#: includes/class-freemius.php:17550 +msgid "Seems like you got the latest release." +msgstr "" + +#: includes/class-freemius.php:17551 +msgid "You are all good!" +msgstr "" + +#: includes/class-freemius.php:17817 +msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +msgstr "" + +#: includes/class-freemius.php:17952 +msgid "Site successfully opted in." +msgstr "" + +#: includes/class-freemius.php:17953, includes/class-freemius.php:18730 +msgid "Awesome" +msgstr "" + +#: includes/class-freemius.php:17969, templates/forms/optout.php:32 +msgid "We appreciate your help in making the %s better by letting us track some usage data." +msgstr "" + +#: includes/class-freemius.php:17970 +msgid "Thank you!" +msgstr "" + +#: includes/class-freemius.php:17977 +msgid "We will no longer be sending any usage data of %s on %s to %s." +msgstr "" + +#: includes/class-freemius.php:18092 +msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +msgstr "" + +#: includes/class-freemius.php:18098 +msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +msgstr "" + +#: includes/class-freemius.php:18103 +msgid "%s is the new owner of the account." +msgstr "" + +#: includes/class-freemius.php:18105 +msgctxt "as congratulations" +msgid "Congrats" +msgstr "" + +#: includes/class-freemius.php:18125 +msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +msgstr "" + +#: includes/class-freemius.php:18126 +msgid "If you would like to give up the ownership of the %s's account to %s click the Change Ownership button." +msgstr "" + +#: includes/class-freemius.php:18133 +msgid "Change Ownership" +msgstr "" + +#: includes/class-freemius.php:18141 +msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +msgstr "" + +#: includes/class-freemius.php:18153 +msgid "Please provide your full name." +msgstr "" + +#: includes/class-freemius.php:18158 +msgid "Your name was successfully updated." +msgstr "" + +#: includes/class-freemius.php:18219 +msgid "You have successfully updated your %s." +msgstr "" + +#: includes/class-freemius.php:18359 +msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +msgstr "" + +#: includes/class-freemius.php:18360 +msgctxt "advance notice of something that will need attention." +msgid "Heads up" +msgstr "" + +#: includes/class-freemius.php:18770 +msgctxt "exclamation" +msgid "Hey" +msgstr "" + +#: includes/class-freemius.php:18770 +msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +msgstr "" + +#: includes/class-freemius.php:18778 +msgid "No commitment for %s days - cancel anytime!" +msgstr "" + +#: includes/class-freemius.php:18779 +msgid "No credit card required" +msgstr "" + +#: includes/class-freemius.php:18786, templates/forms/trial-start.php:53 +msgctxt "call to action" +msgid "Start free trial" +msgstr "" + +#: includes/class-freemius.php:18863 +msgid "Hey there, did you know that %s has an affiliate program? If you like the %s you can become our ambassador and earn some cash!" +msgstr "" + +#: includes/class-freemius.php:18872 +msgid "Learn more" +msgstr "" + +#: includes/class-freemius.php:19022, templates/account.php:398, templates/account.php:501, templates/connect.php:169, templates/connect.php:408, templates/forms/license-activation.php:24, templates/account/partials/addon.php:230 +msgid "Activate License" +msgstr "" + +#: includes/class-freemius.php:19023, templates/account.php:461, templates/account.php:500, templates/account/partials/site.php:256 +msgid "Change License" +msgstr "" + +#: includes/class-freemius.php:19105, templates/account/partials/site.php:161 +msgid "Opt Out" +msgstr "" + +#: includes/class-freemius.php:19107, includes/class-freemius.php:19112, templates/account/partials/site.php:43, templates/account/partials/site.php:161 +msgid "Opt In" +msgstr "" + +#: includes/class-freemius.php:19304 +msgid "Please follow these steps to complete the upgrade" +msgstr "" + +#: includes/class-freemius.php:19308 +msgid "Download the latest %s version" +msgstr "" + +#: includes/class-freemius.php:19312 +msgid "Upload and activate the downloaded version" +msgstr "" + +#: includes/class-freemius.php:19314 +msgid "How to upload and activate?" +msgstr "" + +#: includes/class-freemius.php:19443 +msgid "%sClick here%s to choose the sites where you'd like to activate the license on." +msgstr "" + +#: includes/class-freemius.php:19604 +msgid "Auto installation only works for opted-in users." +msgstr "" + +#: includes/class-freemius.php:19614, includes/class-freemius.php:19647, includes/class-fs-plugin-updater.php:713, includes/class-fs-plugin-updater.php:727 +msgid "Invalid module ID." +msgstr "" + +#: includes/class-freemius.php:19623, includes/class-fs-plugin-updater.php:747 +msgid "Premium version already active." +msgstr "" + +#: includes/class-freemius.php:19630 +msgid "You do not have a valid license to access the premium version." +msgstr "" + +#: includes/class-freemius.php:19637 +msgid "Plugin is a \"Serviceware\" which means it does not have a premium code version." +msgstr "" + +#: includes/class-freemius.php:19655, includes/class-fs-plugin-updater.php:746 +msgid "Premium add-on version already installed." +msgstr "" + +#: includes/class-freemius.php:20000 +msgid "View paid features" +msgstr "" + +#: includes/class-freemius.php:20310 +msgid "Thank you so much for using %s and its add-ons!" +msgstr "" + +#: includes/class-freemius.php:20311 +msgid "Thank you so much for using %s!" +msgstr "" + +#: includes/class-freemius.php:20317 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving the %s." +msgstr "" + +#: includes/class-freemius.php:20321 +msgid "Thank you so much for using our products!" +msgstr "" + +#: includes/class-freemius.php:20322 +msgid "You've already opted-in to our usage-tracking, which helps us keep improving them." +msgstr "" + +#: includes/class-freemius.php:20341 +msgid "%s and its add-ons" +msgstr "" + +#: includes/class-freemius.php:20350 +msgid "Products" +msgstr "" + +#: includes/class-freemius.php:20357, templates/connect.php:259 +msgid "Yes" +msgstr "" + +#: includes/class-freemius.php:20358, templates/connect.php:260 +msgid "send me security & feature updates, educational content and offers." +msgstr "" + +#: includes/class-freemius.php:20359, templates/connect.php:265 +msgid "No" +msgstr "" + +#: includes/class-freemius.php:20361, templates/connect.php:267 +msgid "do %sNOT%s send me security & feature updates, educational content and offers." +msgstr "" + +#: includes/class-freemius.php:20371 +msgid "Due to the new %sEU General Data Protection Regulation (GDPR)%s compliance requirements it is required that you provide your explicit consent, again, confirming that you are onboard 🙂" +msgstr "" + +#: includes/class-freemius.php:20373, templates/connect.php:274 +msgid "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:" +msgstr "" + +#: includes/class-freemius.php:20657 +msgid "License key is empty." +msgstr "" + +#: includes/class-fs-plugin-updater.php:184, includes/class-fs-plugin-updater.php:219 +msgid "%sRenew your license now%s to access version %s security & feature updates, and support." +msgstr "" + +#: includes/class-fs-plugin-updater.php:776 +msgid "Installing plugin: %s" +msgstr "" + +#: includes/class-fs-plugin-updater.php:817 +msgid "Unable to connect to the filesystem. Please confirm your credentials." +msgstr "" + +#: includes/class-fs-plugin-updater.php:923 +msgid "The remote plugin package does not contain a folder with the desired slug and renaming did not work." +msgstr "" + +#: includes/fs-plugin-info-dialog.php:336, templates/account/partials/addon.php:287 +msgctxt "verb" +msgid "Purchase" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:339 +msgid "Start my free %s" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:380 +msgid "Install Free Version Now" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:381, templates/auto-installation.php:111, templates/account/partials/addon.php:267, templates/account/partials/addon.php:317 +msgid "Install Now" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:392 +msgctxt "as download latest version" +msgid "Download Latest Free Version" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:393, templates/account.php:80, templates/account/partials/addon.php:21 +msgctxt "as download latest version" +msgid "Download Latest" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:403 +msgid "Install Free Version Update Now" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:404, templates/account.php:452 +msgid "Install Update Now" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:415 +msgid "Newer Free Version (%s) Installed" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:416 +msgid "Newer Version (%s) Installed" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:424 +msgid "Latest Free Version Installed" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:425 +msgid "Latest Version Installed" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:580 +msgctxt "Plugin installer section title" +msgid "Description" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:581 +msgctxt "Plugin installer section title" +msgid "Installation" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:582 +msgctxt "Plugin installer section title" +msgid "FAQ" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:583, templates/plugin-info/description.php:55 +msgid "Screenshots" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:584 +msgctxt "Plugin installer section title" +msgid "Changelog" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:585 +msgctxt "Plugin installer section title" +msgid "Reviews" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:586 +msgctxt "Plugin installer section title" +msgid "Other Notes" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:601 +msgctxt "Plugin installer section title" +msgid "Features & Pricing" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:611 +msgid "Plugin Install" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:683 +msgctxt "e.g. Professional Plan" +msgid "%s Plan" +msgstr "" + +#: includes/fs-plugin-info-dialog.php:709 +msgctxt "e.g. the best product" +msgid "Best" msgstr "" -#: includes/i18n.php:121 -msgid "Date" +#: includes/fs-plugin-info-dialog.php:715, includes/fs-plugin-info-dialog.php:735 +msgctxt "as every month" +msgid "Monthly" msgstr "" -#: includes/i18n.php:123 -msgid "Amount" +#: includes/fs-plugin-info-dialog.php:718 +msgctxt "as once a year" +msgid "Annual" msgstr "" -#: includes/i18n.php:125 -msgid "Invoice" +#: includes/fs-plugin-info-dialog.php:721 +msgid "Lifetime" msgstr "" -#: includes/i18n.php:127 -msgid "Billing" +#: includes/fs-plugin-info-dialog.php:735, includes/fs-plugin-info-dialog.php:737, includes/fs-plugin-info-dialog.php:739 +msgctxt "e.g. billed monthly" +msgid "Billed %s" msgstr "" -#: includes/i18n.php:129 -msgid "Payments" +#: includes/fs-plugin-info-dialog.php:737 +msgctxt "as once a year" +msgid "Annually" msgstr "" -#: includes/i18n.php:131 -msgid "Delete Account" +#: includes/fs-plugin-info-dialog.php:739 +msgctxt "as once a year" +msgid "Once" msgstr "" -#: includes/i18n.php:133 -msgctxt "as close a window" -msgid "Dismiss" +#: includes/fs-plugin-info-dialog.php:745 +msgid "Single Site License" msgstr "" -#: includes/i18n.php:135 -msgctxt "as product pricing plan" -msgid "Plan" +#: includes/fs-plugin-info-dialog.php:747 +msgid "Unlimited Licenses" msgstr "" -#: includes/i18n.php:137 -msgid "Change Plan" +#: includes/fs-plugin-info-dialog.php:749 +msgid "Up to %s Sites" msgstr "" -#: includes/i18n.php:139 -msgctxt "as download professional version" -msgid "Download %s Version" +#: includes/fs-plugin-info-dialog.php:759, templates/plugin-info/features.php:82 +msgctxt "as monthly period" +msgid "mo" msgstr "" -#: includes/i18n.php:141 -msgctxt "as download professional version now" -msgid "Download %s version now" +#: includes/fs-plugin-info-dialog.php:766, templates/plugin-info/features.php:80 +msgctxt "as annual period" +msgid "year" msgstr "" -#: includes/i18n.php:145 -msgctxt "as download latest version" -msgid "Download Latest" +#: includes/fs-plugin-info-dialog.php:820 +msgctxt "noun" +msgid "Price" msgstr "" -#: includes/i18n.php:147 -msgctxt "E.g. you have a professional license." -msgid "You have a %s license." +#: includes/fs-plugin-info-dialog.php:868 +msgid "Save %s" msgstr "" -#: includes/i18n.php:151 -msgid "New" +#: includes/fs-plugin-info-dialog.php:878 +msgid "No commitment for %s - cancel anytime" msgstr "" -#: includes/i18n.php:153 -msgid "Free" +#: includes/fs-plugin-info-dialog.php:881 +msgid "After your free %s, pay as little as %s" msgstr "" -#: includes/i18n.php:155 -msgctxt "as trial plan" -msgid "Trial" +#: includes/fs-plugin-info-dialog.php:892 +msgid "Details" msgstr "" -#: includes/i18n.php:157 -msgctxt "as starting a trial plan" -msgid "Start Trial" +#: includes/fs-plugin-info-dialog.php:896, templates/account.php:87, templates/debug.php:191, templates/debug.php:228, templates/debug.php:442, templates/account/partials/addon.php:28 +msgctxt "product version" +msgid "Version" msgstr "" -#: includes/i18n.php:159 -msgctxt "verb" -msgid "Purchase" +#: includes/fs-plugin-info-dialog.php:903 +msgctxt "as the plugin author" +msgid "Author" msgstr "" -#: includes/i18n.php:161 -msgid "Purchase License" +#: includes/fs-plugin-info-dialog.php:910 +msgid "Last Updated" msgstr "" -#: includes/i18n.php:163 -msgctxt "verb" -msgid "Buy" +#: includes/fs-plugin-info-dialog.php:915, templates/account.php:368 +msgctxt "x-ago" +msgid "%s ago" msgstr "" -#: includes/i18n.php:165 -msgid "Buy License" +#: includes/fs-plugin-info-dialog.php:924 +msgid "Requires WordPress Version" msgstr "" -#: includes/i18n.php:167 -msgid "Single Site License" +#: includes/fs-plugin-info-dialog.php:925 +msgid "%s or higher" msgstr "" -#: includes/i18n.php:169 -msgid "Unlimited Licenses" +#: includes/fs-plugin-info-dialog.php:932 +msgid "Compatible up to" msgstr "" -#: includes/i18n.php:171 -msgid "Up to %s Sites" +#: includes/fs-plugin-info-dialog.php:940 +msgid "Downloaded" msgstr "" -#: includes/i18n.php:173 -msgid "%sRenew your license now%s to access version %s features and support." +#: includes/fs-plugin-info-dialog.php:944 +msgid "%s time" msgstr "" -#: includes/i18n.php:177 -msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." +#: includes/fs-plugin-info-dialog.php:946 +msgid "%s times" msgstr "" -#: includes/i18n.php:181 -msgctxt "e.g. Professional Plan" -msgid "%s Plan" +#: includes/fs-plugin-info-dialog.php:956 +msgid "WordPress.org Plugin Page" msgstr "" -#: includes/i18n.php:183 -msgid "You are just one step away - %s" +#: includes/fs-plugin-info-dialog.php:964 +msgid "Plugin Homepage" msgstr "" -#: includes/i18n.php:185 -msgctxt "%s - plugin name. As complete \"Jetpack\" activation now" -msgid "Complete \"%s\" Activation Now" +#: includes/fs-plugin-info-dialog.php:972, includes/fs-plugin-info-dialog.php:1054 +msgid "Donate to this plugin" msgstr "" -#: includes/i18n.php:189 -msgid "We made a few tweaks to the plugin, %s" +#: includes/fs-plugin-info-dialog.php:979 +msgid "Average Rating" msgstr "" -#: includes/i18n.php:191 -msgid "Opt-in to make \"%s\" Better!" +#: includes/fs-plugin-info-dialog.php:986 +msgid "based on %s" msgstr "" -#: includes/i18n.php:193 -msgid "Error" +#: includes/fs-plugin-info-dialog.php:990 +msgid "%s rating" msgstr "" -#: includes/i18n.php:195 -msgid "Freemius SDK couldn't find the plugin's main file. Please contact sdk@freemius.com with the current error." +#: includes/fs-plugin-info-dialog.php:992 +msgid "%s ratings" msgstr "" -#: includes/i18n.php:203 -msgctxt "as expiration date" -msgid "Expiration" +#: includes/fs-plugin-info-dialog.php:1007 +msgid "%s star" msgstr "" -#: includes/i18n.php:205 -msgctxt "as software license" -msgid "License" +#: includes/fs-plugin-info-dialog.php:1009 +msgid "%s stars" msgstr "" -#: includes/i18n.php:207 -msgid "not verified" +#: includes/fs-plugin-info-dialog.php:1020 +msgid "Click to see reviews that provided a rating of %s" msgstr "" -#: includes/i18n.php:209 -msgid "Verify Email" +#: includes/fs-plugin-info-dialog.php:1033 +msgid "Contributors" msgstr "" -#: includes/i18n.php:211 -msgctxt "e.g. expires in 2 months" -msgid "Expires in %s" +#: includes/fs-plugin-info-dialog.php:1062, includes/fs-plugin-info-dialog.php:1064 +msgid "Warning" msgstr "" -#: includes/i18n.php:213 -msgctxt "e.g. auto renews in 2 months" -msgid "Auto renews in %s" +#: includes/fs-plugin-info-dialog.php:1062 +msgid "This plugin has not been tested with your current version of WordPress." msgstr "" -#: includes/i18n.php:215 -msgid "No expiration" +#: includes/fs-plugin-info-dialog.php:1064 +msgid "This plugin has not been marked as compatible with your version of WordPress." msgstr "" -#: includes/i18n.php:217 -msgid "Expired" +#: includes/fs-plugin-info-dialog.php:1083 +msgid "Paid add-on must be deployed to Freemius." msgstr "" -#: includes/i18n.php:219 -msgid "Cancelled" +#: includes/fs-plugin-info-dialog.php:1084 +msgid "Add-on must be deployed to WordPress.org or Freemius." msgstr "" -#: includes/i18n.php:221 -msgctxt "e.g. In 2 hours" -msgid "In %s" +#: templates/account.php:81, templates/account/partials/addon.php:22, templates/account/partials/site.php:295 +msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." msgstr "" -#: includes/i18n.php:223 -msgctxt "e.g. 2 min ago" -msgid "%s ago" +#: templates/account.php:82, templates/account/partials/addon.php:23 +msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" msgstr "" -#: includes/i18n.php:225 -msgctxt "as plugin version" -msgid "Version" +#: templates/account.php:83, templates/account/partials/addon.php:24, templates/account/partials/site.php:296 +msgid "You can still enjoy all %s features but you will not have access to %s updates and support." msgstr "" -#: includes/i18n.php:227 -msgid "Name" +#: templates/account.php:84, templates/account/partials/addon.php:25, templates/account/partials/site.php:297 +msgid "Once your license expires you can still use the Free version but you will NOT have access to the %s features." msgstr "" -#: includes/i18n.php:229 -msgid "Email" +#. translators: %s: Plan title (e.g. "Professional") +#: templates/account.php:86, templates/account/partials/activate-license-button.php:31, templates/account/partials/addon.php:27 +msgid "Activate %s Plan" msgstr "" -#: includes/i18n.php:231 -msgid "Email address" +#. translators: %s: Time period (e.g. Auto renews in "2 months") +#: templates/account.php:89, templates/account/partials/addon.php:30, templates/account/partials/site.php:275 +msgid "Auto renews in %s" msgstr "" -#: includes/i18n.php:233 -msgid "Verified" +#. translators: %s: Time period (e.g. Expires in "2 months") +#: templates/account.php:91, templates/account/partials/addon.php:32, templates/account/partials/site.php:277 +msgid "Expires in %s" msgstr "" -#: includes/i18n.php:235 -msgid "Plugin" +#: templates/account.php:92, templates/account/partials/addon.php:33 +msgctxt "as synchronize license" +msgid "Sync License" msgstr "" -#: includes/i18n.php:237 -msgid "Plugins" +#: templates/account.php:93, templates/account/partials/addon.php:34 +msgid "Cancel Trial" msgstr "" -#: includes/i18n.php:239 -msgid "Themes" +#: templates/account.php:94, templates/account/partials/addon.php:35 +msgid "Change Plan" msgstr "" -#: includes/i18n.php:241 -msgctxt "as file/folder path" -msgid "Path" +#: templates/account.php:95, templates/account/partials/addon.php:36 +msgctxt "verb" +msgid "Upgrade" msgstr "" -#: includes/i18n.php:243 -msgid "Title" +#: templates/account.php:97, templates/account/partials/addon.php:38, templates/account/partials/site.php:298 +msgctxt "verb" +msgid "Downgrade" msgstr "" -#: includes/i18n.php:245 -msgid "Free version" +#: templates/account.php:99, templates/add-ons.php:126, templates/plugin-info/features.php:72, templates/account/partials/addon.php:40, templates/account/partials/site.php:31 +msgid "Free" msgstr "" -#: includes/i18n.php:247 -msgid "Premium version" +#: templates/account.php:100, templates/account/partials/addon.php:41 +msgid "Activate" msgstr "" -#: includes/i18n.php:249 -msgctxt "as WP plugin slug" -msgid "Slug" +#: templates/account.php:101, templates/debug.php:361, includes/customizer/class-fs-customizer-upsell-control.php:106, templates/account/partials/addon.php:42 +msgctxt "as product pricing plan" +msgid "Plan" msgstr "" -#: includes/i18n.php:251 -msgid "ID" +#: templates/account.php:154 +msgid "Free Trial" msgstr "" -#: includes/i18n.php:253 -msgid "Users" +#: templates/account.php:165 +msgid "Account Details" msgstr "" -#: includes/i18n.php:255 -msgid "Plugin Installs" +#: templates/account.php:175 +msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" msgstr "" -#: includes/i18n.php:257 -msgctxt "like websites" -msgid "Sites" +#: templates/account.php:177 +msgid "Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?" msgstr "" -#: includes/i18n.php:259 -msgid "User ID" +#: templates/account.php:180 +msgid "Delete Account" msgstr "" -#: includes/i18n.php:261 -msgid "Site ID" +#: templates/account.php:192, templates/account/partials/addon.php:155, templates/account/partials/deactivate-license-button.php:35 +msgid "Deactivate License" msgstr "" -#: includes/i18n.php:263 -msgid "Public Key" +#: templates/account.php:210 +msgid "Are you sure you want to proceed?" msgstr "" -#: includes/i18n.php:265 -msgid "Secret Key" +#: templates/account.php:210, templates/account/partials/addon.php:177 +msgid "Cancel Subscription" msgstr "" -#: includes/i18n.php:267 -msgctxt "as secret encryption key missing" -msgid "No Secret" +#: templates/account.php:239 +msgctxt "as synchronize" +msgid "Sync" msgstr "" -#: includes/i18n.php:269 -msgid "No ID" +#: templates/account.php:253, templates/debug.php:477 +msgid "Name" msgstr "" -#: includes/i18n.php:271 -msgctxt "as synchronize license" -msgid "Sync License" +#: templates/account.php:259, templates/debug.php:478 +msgid "Email" msgstr "" -#: includes/i18n.php:273 -msgctxt "as synchronize" -msgid "Sync" +#: templates/account.php:266, templates/debug.php:360, templates/debug.php:516 +msgid "User ID" msgstr "" -#: includes/i18n.php:275 -msgid "Activate License" +#: templates/account.php:274 +msgid "Site ID" msgstr "" -#: includes/i18n.php:277 -msgid "Activate Free Version" +#: templates/account.php:277 +msgid "No ID" msgstr "" -#: includes/i18n.php:279 -msgid "Please enter the license key that you received in the email right after the purchase:" +#: templates/account.php:282, templates/debug.php:233, templates/debug.php:362, templates/debug.php:443, templates/debug.php:480, templates/account/partials/site.php:219 +msgid "Public Key" msgstr "" -#: includes/i18n.php:283 -msgid "Activating license..." +#: templates/account.php:288, templates/debug.php:363, templates/debug.php:444, templates/debug.php:481, templates/account/partials/site.php:231 +msgid "Secret Key" msgstr "" -#: includes/i18n.php:285 -msgid "Change License" +#: templates/account.php:291 +msgctxt "as secret encryption key missing" +msgid "No Secret" msgstr "" -#: includes/i18n.php:287 -msgid "Update License" +#: templates/account.php:310, templates/account/partials/site.php:112, templates/account/partials/site.php:114 +msgid "Trial" msgstr "" -#: includes/i18n.php:289 -msgid "Deactivate License" +#: templates/account.php:329, templates/debug.php:521, templates/account/partials/site.php:248 +msgid "License Key" msgstr "" -#: includes/i18n.php:291 -msgid "Activate" +#: templates/account.php:359 +msgid "not verified" msgstr "" -#: includes/i18n.php:293 -msgid "Deactivate" +#: templates/account.php:368, templates/account/partials/addon.php:116 +msgid "Expired" msgstr "" -#: includes/i18n.php:295 -msgid "Skip & Deactivate" +#: templates/account.php:420 +msgid "Premium version" msgstr "" -#: includes/i18n.php:297 -msgid "No - just deactivate" +#: templates/account.php:422 +msgid "Free version" msgstr "" -#: includes/i18n.php:299 -msgid "Yes - do your thing" +#: templates/account.php:434 +msgid "Verify Email" msgstr "" -#: includes/i18n.php:301 -msgctxt "active mode" -msgid "Active" +#: templates/account.php:445 +msgid "Download %s Version" msgstr "" -#: includes/i18n.php:303 -msgctxt "is active mode?" -msgid "Is Active" +#: templates/account.php:459, templates/account.php:640, templates/account/partials/site.php:237, templates/account/partials/site.php:255 +msgctxt "verb" +msgid "Show" msgstr "" -#: includes/i18n.php:305 -msgid "Install Now" +#: templates/account.php:473 +msgid "What is your %s?" msgstr "" -#: includes/i18n.php:307 -msgid "Install Update Now" +#: templates/account.php:481, templates/account/billing.php:27 +msgctxt "verb" +msgid "Edit" msgstr "" -#: includes/i18n.php:309 -msgid "More information about %s" +#: templates/account.php:494 +msgid "Sites" msgstr "" -#: includes/i18n.php:311 -msgid "Localhost" +#: templates/account.php:505 +msgid "Search by address" msgstr "" -#: includes/i18n.php:313 -msgctxt "as activate Professional plan" -msgid "Activate %s Plan" +#: templates/account.php:514, templates/account.php:562, templates/debug.php:226, templates/debug.php:354, templates/debug.php:439, templates/debug.php:476, templates/debug.php:514, templates/debug.php:587, templates/account/payments.php:35, templates/debug/logger.php:21 +msgid "ID" msgstr "" -#: includes/i18n.php:315 -msgctxt "as 5 licenses left" -msgid "%s left" +#: templates/account.php:515, templates/debug.php:357 +msgid "Address" msgstr "" -#: includes/i18n.php:317 -msgid "Last license" +#: templates/account.php:516 +msgid "License" msgstr "" -#: includes/i18n.php:319 -msgid "What is your %s?" +#: templates/account.php:517 +msgid "Plan" msgstr "" -#: includes/i18n.php:321 -msgid "Activate this add-on" +#: templates/account.php:565 +msgctxt "as software license" +msgid "License" msgstr "" -#: includes/i18n.php:323 -msgid "Deactivating your license will block all premium features, but will enable you to activate the license on another site. Are you sure you want to proceed?" +#: templates/account.php:634 +msgctxt "verb" +msgid "Hide" msgstr "" -#: includes/i18n.php:327 -msgid "Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the \"Cancel\" button, and first \"Downgrade\" your account. Are you sure you would like to continue with the deletion?" +#: templates/account.php:669 +msgid "Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?" msgstr "" -#: includes/i18n.php:331 -msgid "Deletion is not temporary. Only delete if you no longer want to use this plugin anymore. Are you sure you would like to continue with the deletion?" +#: templates/add-ons.php:36 +msgid "Add Ons for %s" msgstr "" -#: includes/i18n.php:335 -msgid "Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s." +#: templates/add-ons.php:44 +msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." msgstr "" -#: includes/i18n.php:339 -msgid "Cancelling the trial will immediately block access to all premium features. Are you sure?" +#: templates/add-ons.php:135 +msgid "View details" msgstr "" -#: includes/i18n.php:343 -msgid "You can still enjoy all %s features but you will not have access to plugin updates and support." +#: templates/admin-notice.php:13, templates/forms/license-activation.php:208, templates/forms/resend-key.php:77 +msgctxt "as close a window" +msgid "Dismiss" msgstr "" -#: includes/i18n.php:347 -msgid "Once your license expire you can still use the Free version but you will NOT have access to the %s features." +#: templates/auto-installation.php:45 +msgid "%s sec" msgstr "" -#: includes/i18n.php:351 -msgid "Are you sure you want to proceed?" +#: templates/auto-installation.php:83 +msgid "Automatic Installation" msgstr "" -#: includes/i18n.php:357 -msgid "Add Ons for %s" +#: templates/auto-installation.php:93 +msgid "An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now." msgstr "" -#: includes/i18n.php:359 -msgid "We could'nt load the add-ons list. It's probably an issue on our side, please try to come back in few minutes." +#: templates/auto-installation.php:104 +msgid "The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page." msgstr "" -#: includes/i18n.php:365 -msgid "Anonymous feedback" +#: templates/auto-installation.php:109 +msgid "Cancel Installation" msgstr "" -#: includes/i18n.php:367 -msgid "Quick feedback" +#: templates/checkout.php:172 +msgid "Checkout" msgstr "" -#: includes/i18n.php:369 -msgid "If you have a moment, please let us know why you are deactivating" +#: templates/checkout.php:172 +msgid "PCI compliant" msgstr "" -#: includes/i18n.php:373 -msgid "Yes - Deactivate" +#. translators: %s: name (e.g. Hey John,) +#: templates/connect.php:110 +msgctxt "greeting" +msgid "Hey %s," msgstr "" -#: includes/i18n.php:375 -msgid "Submit & Deactivate" +#: templates/connect.php:152 +msgid "Allow & Continue" msgstr "" -#: includes/i18n.php:377 -msgid "Cancel" +#: templates/connect.php:156 +msgid "Re-send activation email" msgstr "" -#: includes/i18n.php:379 -msgid "I no longer need the plugin" +#: templates/connect.php:160 +msgid "Thanks %s!" msgstr "" -#: includes/i18n.php:381 -msgid "I found a better plugin" +#: templates/connect.php:170, templates/forms/license-activation.php:43 +msgid "Agree & Activate License" msgstr "" -#: includes/i18n.php:383 -msgid "I only needed the plugin for a short period" +#: templates/connect.php:179 +msgid "Thanks for purchasing %s! To get started, please enter your license key:" msgstr "" -#: includes/i18n.php:385 -msgid "The plugin broke my site" +#: templates/connect.php:186 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s." msgstr "" -#: includes/i18n.php:387 -msgid "The plugin suddenly stopped working" +#: templates/connect.php:187 +msgid "Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." msgstr "" -#: includes/i18n.php:389 -msgid "I can't pay for it anymore" +#: templates/connect.php:193 +msgid "Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." msgstr "" -#: includes/i18n.php:391 -msgid "It's a temporary deactivation. I'm just debugging an issue." +#: templates/connect.php:194 +msgid "Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that's okay! %1$s will still work just fine." msgstr "" -#: includes/i18n.php:395 -msgctxt "the text of the \"other\" reason for deactivating the plugin that is shown in the modal box." -msgid "Other" +#: templates/connect.php:228 +msgid "We're excited to introduce the Freemius network-level integration." msgstr "" -#: includes/i18n.php:399 -msgid "Kindly tell us the reason so we can improve." +#: templates/connect.php:231 +msgid "During the update process we detected %d site(s) that are still pending license activation." msgstr "" -#: includes/i18n.php:401 -msgid "What's the plugin's name?" +#: templates/connect.php:233 +msgid "If you'd like to use the %s on those sites, please enter your license key below and click the activation button." msgstr "" -#: includes/i18n.php:403 -msgid "What price would you feel comfortable paying?" +#: templates/connect.php:235 +msgid "%s's paid features" msgstr "" -#: includes/i18n.php:405 -msgid "I couldn't understand how to make it work" +#: templates/connect.php:240 +msgid "Alternatively, you can skip it for now and activate the license later, in your %s's network-level Account page." msgstr "" -#: includes/i18n.php:407 -msgid "The plugin is great, but I need specific feature that you don't support" +#: templates/connect.php:242 +msgid "During the update process we detected %s site(s) in the network that are still pending your attention." msgstr "" -#: includes/i18n.php:411 -msgid "The plugin is not working" +#: templates/connect.php:251, templates/forms/license-activation.php:46 +msgid "License key" msgstr "" -#: includes/i18n.php:413 -msgid "It's not what I was looking for" +#: templates/connect.php:254, templates/forms/license-activation.php:19 +msgid "Can't find your license key?" msgstr "" -#: includes/i18n.php:415 -msgid "The plugin didn't work as expected" +#: templates/connect.php:302, templates/connect.php:617, templates/forms/deactivation/retry-skip.php:20 +msgctxt "verb" +msgid "Skip" msgstr "" -#: includes/i18n.php:417 -msgid "What feature?" +#: templates/connect.php:305 +msgid "Delegate to Site Admins" msgstr "" -#: includes/i18n.php:419 -msgid "Kindly share what didn't work so we can fix it for future users..." +#: templates/connect.php:305 +msgid "If you click it, this decision will be delegated to the sites administrators." msgstr "" -#: includes/i18n.php:423 -msgid "What you've been looking for?" +#: templates/connect.php:333 +msgid "Your Profile Overview" msgstr "" -#: includes/i18n.php:425 -msgid "What did you expect?" +#: templates/connect.php:334 +msgid "Name and email address" msgstr "" -#: includes/i18n.php:427 -msgid "The plugin didn't work" +#: templates/connect.php:339 +msgid "Your Site Overview" msgstr "" -#: includes/i18n.php:429 -msgid "I don't like to share my information with you" +#: templates/connect.php:340 +msgid "Site URL, WP version, PHP info, plugins & themes" msgstr "" -#: includes/i18n.php:431 -msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." +#: templates/connect.php:345 +msgid "Admin Notices" msgstr "" -#: includes/i18n.php:441 -msgctxt "greeting" -msgid "Hey %s," +#: templates/connect.php:346, templates/connect.php:362 +msgid "Updates, announcements, marketing, no spam" msgstr "" -#: includes/i18n.php:443 -msgctxt "a greeting. E.g. Thanks John!" -msgid "Thanks %s!" +#: templates/connect.php:351 +msgid "Current %s Events" msgstr "" -#: includes/i18n.php:445 -msgid "Never miss an important update - opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s." +#: templates/connect.php:352 +msgid "Activation, deactivation and uninstall" msgstr "" -#: includes/i18n.php:449 -msgid "Please help us improve %1$s! If you opt-in, some data about your usage of %1$s will be sent to %4$s. If you skip this, that's okay! %1$s will still work just fine." +#: templates/connect.php:361 +msgid "Newsletter" msgstr "" -#: includes/i18n.php:453 -msgid "You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s." +#: templates/connect.php:378, templates/forms/license-activation.php:38 +msgid "The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license." msgstr "" -#: includes/i18n.php:455 -msgid "complete the install" +#: templates/connect.php:383 +msgid "What permissions are being granted?" msgstr "" -#: includes/i18n.php:457 -msgid "start the trial" +#: templates/connect.php:404 +msgid "Don't have a license key?" msgstr "" -#: includes/i18n.php:459 -msgid "Thanks for purchasing %s! To get started, please enter your license key:" +#: templates/connect.php:405 +msgid "Activate Free Version" msgstr "" -#: includes/i18n.php:463 -msgid "The plugin will be periodically sending data to %s to check for plugin updates and verify the validity of your license." +#: templates/connect.php:407 +msgid "Have a license key?" msgstr "" -#: includes/i18n.php:467 -msgid "What permissions are being granted?" +#: templates/connect.php:415 +msgid "Privacy Policy" msgstr "" -#: includes/i18n.php:469 -msgid "Your Profile Overview" +#: templates/connect.php:417 +msgid "Terms of Service" msgstr "" -#: includes/i18n.php:471 -msgid "Name and email address" +#: templates/connect.php:750 +msgctxt "as in the process of sending an email" +msgid "Sending email" msgstr "" -#: includes/i18n.php:473 -msgid "Your Site Overview" +#: templates/connect.php:751 +msgctxt "as activating plugin" +msgid "Activating" msgstr "" -#: includes/i18n.php:475 -msgid "Site URL, WP version, PHP info, plugins & themes" +#: templates/contact.php:78 +msgid "Contact" msgstr "" -#: includes/i18n.php:479 -msgid "Current Plugin Events" +#: templates/debug.php:17 +msgctxt "as turned off" +msgid "Off" msgstr "" -#: includes/i18n.php:481 -msgid "Activation, deactivation and uninstall" +#: templates/debug.php:18 +msgctxt "as turned on" +msgid "On" msgstr "" -#: includes/i18n.php:483 -msgid "Plugins & Themes" +#: templates/debug.php:20 +msgid "SDK" msgstr "" -#: includes/i18n.php:485 -msgid "Titles, versions and state." +#: templates/debug.php:24 +msgctxt "as code debugging" +msgid "Debugging" msgstr "" -#: includes/i18n.php:487 -msgid "Admin Notices" +#: templates/debug.php:54, templates/debug.php:238, templates/debug.php:364, templates/debug.php:482 +msgid "Actions" msgstr "" -#: includes/i18n.php:489 -msgid "Newsletter" +#: templates/debug.php:64 +msgid "Are you sure you want to delete all Freemius data?" msgstr "" -#: includes/i18n.php:491 -msgid "Updates, announcements, marketing, no spam" +#: templates/debug.php:64 +msgid "Delete All Accounts" msgstr "" -#: includes/i18n.php:493 -msgid "Privacy Policy" +#: templates/debug.php:71 +msgid "Clear API Cache" msgstr "" -#: includes/i18n.php:495 -msgid "Terms of Service" +#: templates/debug.php:79 +msgid "Clear Updates Transients" msgstr "" -#: includes/i18n.php:497 -msgctxt "as activating plugin" -msgid "Activating" +#: templates/debug.php:86 +msgid "Sync Data From Server" msgstr "" -#: includes/i18n.php:499 -msgctxt "as in the process of sending an email" -msgid "Sending email" +#: templates/debug.php:90 +msgid "Load DB Option" msgstr "" -#: includes/i18n.php:503 -msgctxt "button label" -msgid "Allow & Continue" +#: templates/debug.php:93 +msgid "Set DB Option" msgstr "" -#: includes/i18n.php:505 -msgctxt "button label" -msgid "Agree & Activate License" +#: templates/debug.php:170 +msgid "Key" msgstr "" -#: includes/i18n.php:507 -msgctxt "verb" -msgid "Skip" +#: templates/debug.php:171 +msgid "Value" msgstr "" -#: includes/i18n.php:509 -msgid "Click here to use the plugin anonymously" +#: templates/debug.php:187 +msgctxt "as software development kit versions" +msgid "SDK Versions" msgstr "" -#: includes/i18n.php:511 -msgid "Re-send activation email" +#: templates/debug.php:192 +msgid "SDK Path" msgstr "" -#: includes/i18n.php:513 -msgid "License key" +#: templates/debug.php:193, templates/debug.php:232 +msgid "Module Path" msgstr "" -#: includes/i18n.php:515 -msgid "Send License Key" +#: templates/debug.php:194 +msgid "Is Active" msgstr "" -#: includes/i18n.php:517 -msgid "Sending license key" +#: templates/debug.php:222, templates/debug/plugins-themes-sync.php:35 +msgid "Plugins" msgstr "" -#: includes/i18n.php:519 -msgid "Have a license key?" +#: templates/debug.php:222, templates/debug/plugins-themes-sync.php:56 +msgid "Themes" msgstr "" -#: includes/i18n.php:521 -msgid "Don't have a license key?" +#: templates/debug.php:227, templates/debug.php:359, templates/debug.php:441, templates/debug/scheduled-crons.php:80 +msgid "Slug" msgstr "" -#: includes/i18n.php:523 -msgid "Can't find your license key?" +#: templates/debug.php:229, templates/debug.php:440 +msgid "Title" msgstr "" -#: includes/i18n.php:525 -msgid "We couldn't find your email address in the system, are you sure it's the right address?" +#: templates/debug.php:230 +msgctxt "as application program interface" +msgid "API" msgstr "" -#: includes/i18n.php:529 -msgid "We can't see any active licenses associated with that email address, are you sure it's the right address?" +#: templates/debug.php:231 +msgid "Freemius State" msgstr "" -#: includes/i18n.php:533 -msgid "Opt In" +#: templates/debug.php:235 +msgid "Network Blog" msgstr "" -#: includes/i18n.php:535 -msgid "Opt Out" +#: templates/debug.php:236 +msgid "Network User" msgstr "" -#: includes/i18n.php:537 -msgid "On second thought - I want to continue helping" +#: templates/debug.php:273 +msgctxt "as connection was successful" +msgid "Connected" msgstr "" -#: includes/i18n.php:541 -msgid "Opting out..." +#: templates/debug.php:274 +msgctxt "as connection blocked" +msgid "Blocked" msgstr "" -#: includes/i18n.php:543 -msgid "Opting in..." +#: templates/debug.php:310 +msgid "Simulate Trial" msgstr "" -#: includes/i18n.php:545 -msgid "We appreciate your help in making the %s better by letting us track some usage data." +#: templates/debug.php:322 +msgid "Simulate Network Upgrade" msgstr "" -#: includes/i18n.php:549 -msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." +#: templates/debug.php:348 +msgid "%s Installs" msgstr "" -#: includes/i18n.php:553 -msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." +#: templates/debug.php:350 +msgctxt "like websites" +msgid "Sites" msgstr "" -#: includes/i18n.php:563 -msgid "Screenshots" +#: templates/debug.php:356, templates/account/partials/site.php:148 +msgid "Blog ID" msgstr "" -#: includes/i18n.php:565 -msgid "Click to view full-size screenshot %d" +#: templates/debug.php:421, templates/debug.php:499, templates/account/partials/addon.php:334 +msgctxt "verb" +msgid "Delete" msgstr "" -#: includes/i18n.php:573 -msgid "Freemius Debug" +#: templates/debug.php:435 +msgid "Add Ons of module %s" msgstr "" -#: includes/i18n.php:575 -msgctxt "as turned on" -msgid "On" +#: templates/debug.php:472 +msgid "Users" msgstr "" -#: includes/i18n.php:577 -msgctxt "as turned off" -msgid "Off" +#: templates/debug.php:479 +msgid "Verified" msgstr "" -#: includes/i18n.php:579 -msgctxt "as code debugging" -msgid "Debugging" +#: templates/debug.php:510 +msgid "%s Licenses" msgstr "" -#: includes/i18n.php:581 -msgid "Freemius State" +#: templates/debug.php:515 +msgid "Plugin ID" msgstr "" -#: includes/i18n.php:583 -msgctxt "as connection was successful" -msgid "Connected" +#: templates/debug.php:517 +msgid "Plan ID" msgstr "" -#: includes/i18n.php:585 -msgctxt "as connection blocked" -msgid "Blocked" +#: templates/debug.php:518 +msgid "Quota" msgstr "" -#: includes/i18n.php:587 -msgctxt "as application program interface" -msgid "API" +#: templates/debug.php:519 +msgid "Activated" msgstr "" -#: includes/i18n.php:589 -msgctxt "as software development kit versions" -msgid "SDK" +#: templates/debug.php:520 +msgid "Blocking" msgstr "" -#: includes/i18n.php:591 -msgctxt "as software development kit versions" -msgid "SDK Versions" +#: templates/debug.php:522 +msgctxt "as expiration date" +msgid "Expiration" msgstr "" -#: includes/i18n.php:595 -msgctxt "as plugin folder path" -msgid "Plugin Path" +#: templates/debug.php:545 +msgid "Debug Log" msgstr "" -#: includes/i18n.php:597 -msgctxt "as sdk path" -msgid "SDK Path" +#: templates/debug.php:549 +msgid "All Types" msgstr "" -#: includes/i18n.php:599 -msgid "Add Ons of Plugin %s" +#: templates/debug.php:556 +msgid "All Requests" msgstr "" -#: includes/i18n.php:601 -msgid "Are you sure you want to delete all Freemius data?" +#: templates/debug.php:561, templates/debug.php:590, templates/debug/logger.php:25 +msgid "File" msgstr "" -#: includes/i18n.php:605 -msgid "Actions" +#: templates/debug.php:562, templates/debug.php:588, templates/debug/logger.php:23 +msgid "Function" msgstr "" -#: includes/i18n.php:607 -msgid "Delete All Accounts" +#: templates/debug.php:563 +msgid "Process ID" msgstr "" -#: includes/i18n.php:609 -msgid "Start Fresh" +#: templates/debug.php:564 +msgid "Logger" msgstr "" -#: includes/i18n.php:611 -msgid "Clear API Cache" +#: templates/debug.php:565, templates/debug.php:589, templates/debug/logger.php:24 +msgid "Message" msgstr "" -#: includes/i18n.php:613 -msgid "Sync Data From Server" +#: templates/debug.php:567 +msgid "Filter" msgstr "" -#: includes/i18n.php:615 -msgid "Scheduled Crons" +#: templates/debug.php:575 +msgid "Download" msgstr "" -#: includes/i18n.php:617 -msgid "Plugins & Themes Sync" +#: templates/debug.php:586, templates/debug/logger.php:22 +msgid "Type" msgstr "" -#: includes/i18n.php:625 -msgctxt "as congratulations" -msgid "Congrats" +#: templates/debug.php:591, templates/debug/logger.php:26 +msgid "Timestamp" msgstr "" -#: includes/i18n.php:627 -msgctxt "exclamation" -msgid "Oops" +#: templates/secure-https-header.php:28 +msgid "Secure HTTPS %s page, running from an external domain" msgstr "" -#: includes/i18n.php:629 -msgctxt "interjection expressing joy or exuberance" -msgid "Yee-haw" +#: includes/customizer/class-fs-customizer-support-section.php:55, templates/plugin-info/features.php:43 +msgid "Support" msgstr "" -#: includes/i18n.php:633 -msgctxt "(especially in electronic communication) used to express elation, enthusiasm, or triumph." -msgid "W00t" +#: includes/debug/class-fs-debug-bar-panel.php:48, templates/debug/api-calls.php:54, templates/debug/logger.php:62 +msgctxt "milliseconds" +msgid "ms" msgstr "" -#: includes/i18n.php:637 -msgctxt "a positive response" -msgid "Right on" +#: includes/debug/debug-bar-start.php:41 +msgid "Freemius API" msgstr "" -#: includes/i18n.php:639 -msgctxt "something somebody says when they are thinking about what you have just said. " -msgid "Hmm" +#: includes/debug/debug-bar-start.php:42 +msgid "Requests" msgstr "" -#: includes/i18n.php:643 -msgid "O.K" +#: templates/account/billing.php:28 +msgctxt "verb" +msgid "Update" msgstr "" -#: includes/i18n.php:645 -msgctxt "exclamation" -msgid "Hey" +#: templates/account/billing.php:39 +msgid "Billing" msgstr "" -#: includes/i18n.php:647 -msgctxt "advance notice of something that will need attention." -msgid "Heads up" +#: templates/account/billing.php:44, templates/account/billing.php:44 +msgid "Business name" msgstr "" -#: includes/i18n.php:657 -msgid "Seems like you got the latest release." +#: templates/account/billing.php:45, templates/account/billing.php:45 +msgid "Tax / VAT ID" msgstr "" -#: includes/i18n.php:659 -msgid "You are all good!" +#: templates/account/billing.php:48, templates/account/billing.php:48, templates/account/billing.php:49, templates/account/billing.php:49 +msgid "Address Line %d" msgstr "" -#: includes/i18n.php:661 -msgid "Sorry, we could not complete the email update. Another user with the same email is already registered." +#: templates/account/billing.php:52, templates/account/billing.php:52 +msgid "City" msgstr "" -#: includes/i18n.php:665 -msgid "If you would like to give up the ownership of the plugin's account to %s click the Change Ownership button." +#: templates/account/billing.php:52, templates/account/billing.php:52 +msgid "Town" msgstr "" -#: includes/i18n.php:669 -msgid "Your email was successfully updated. You should receive an email with confirmation instructions in few moments." +#: templates/account/billing.php:53, templates/account/billing.php:53 +msgid "ZIP / Postal Code" msgstr "" -#: includes/i18n.php:673 -msgid "Your name was successfully updated." +#: templates/account/billing.php:308 +msgid "Country" msgstr "" -#: includes/i18n.php:675 -msgid "You have successfully updated your %s." +#: templates/account/billing.php:310 +msgid "Select Country" msgstr "" -#: includes/i18n.php:677 -msgid "Please provide your full name." +#: templates/account/billing.php:317, templates/account/billing.php:318 +msgid "State" msgstr "" -#: includes/i18n.php:679 -msgid "Verification mail was just sent to %s. If you can't find it after 5 min, please check your spam box." +#: templates/account/billing.php:317, templates/account/billing.php:318 +msgid "Province" msgstr "" -#: includes/i18n.php:683 -msgid "Just letting you know that the add-ons information of %s is being pulled from an external server." +#: templates/account/payments.php:29 +msgid "Payments" msgstr "" -#: includes/i18n.php:687 -msgid "No credit card required" +#: templates/account/payments.php:36 +msgid "Date" msgstr "" -#: includes/i18n.php:689 -msgid "Premium plugin version was successfully activated." +#: templates/account/payments.php:37 +msgid "Amount" msgstr "" -#: includes/i18n.php:693 -msgid "The upgrade of %s was successfully completed." +#: templates/account/payments.php:38, templates/account/payments.php:50 +msgid "Invoice" msgstr "" -#: includes/i18n.php:695 -msgid "Your account was successfully activated with the %s plan." +#: templates/debug/api-calls.php:56 +msgid "API" msgstr "" -#: includes/i18n.php:699 -msgid "Download the latest %s version now" +#: templates/debug/api-calls.php:68 +msgid "Method" msgstr "" -#: includes/i18n.php:701 -msgid "Please follow these steps to complete the upgrade" +#: templates/debug/api-calls.php:69 +msgid "Code" msgstr "" -#: includes/i18n.php:705 -msgid "Download the latest %s version" +#: templates/debug/api-calls.php:70 +msgid "Length" msgstr "" -#: includes/i18n.php:707 -msgid "Download the latest version" +#: templates/debug/api-calls.php:71 +msgctxt "as file/folder path" +msgid "Path" msgstr "" -#: includes/i18n.php:709 -msgid "Deactivate the free version" +#: templates/debug/api-calls.php:73 +msgid "Body" msgstr "" -#: includes/i18n.php:711 -msgid "Upload and activate the downloaded version" +#: templates/debug/api-calls.php:75 +msgid "Result" msgstr "" -#: includes/i18n.php:713 -msgid "How to upload and activate?" +#: templates/debug/api-calls.php:76 +msgid "Start" msgstr "" -#: includes/i18n.php:715 -msgctxt "%s - product name, e.g. Facebook add-on was successfully..." -msgid "%s Add-on was successfully purchased." +#: templates/debug/api-calls.php:77 +msgid "End" msgstr "" -#: includes/i18n.php:719 -msgid "Your %s Add-on plan was successfully upgraded." +#: templates/debug/logger.php:15 +msgid "Log" msgstr "" -#: includes/i18n.php:723 -msgid "Your email has been successfully verified - you are AWESOME!" +#. translators: %s: time period (e.g. In "2 hours") +#: templates/debug/plugins-themes-sync.php:18, templates/debug/scheduled-crons.php:91 +msgid "In %s" msgstr "" -#: includes/i18n.php:727 -msgid "Your plan was successfully upgraded." +#. translators: %s: time period (e.g. "2 hours" ago) +#: templates/debug/plugins-themes-sync.php:20, templates/debug/scheduled-crons.php:93 +msgid "%s ago" msgstr "" -#: includes/i18n.php:729 -msgid "Your plan was successfully changed to %s." +#: templates/debug/plugins-themes-sync.php:21, templates/debug/scheduled-crons.php:74 +msgctxt "seconds" +msgid "sec" msgstr "" -#: includes/i18n.php:731 -msgid "Your license has expired. You can still continue using the free plugin forever." +#: templates/debug/plugins-themes-sync.php:23 +msgid "Plugins & Themes Sync" msgstr "" -#: includes/i18n.php:735 -msgid "Your license has been cancelled. If you think it's a mistake, please contact support." +#: templates/debug/plugins-themes-sync.php:28 +msgid "Total" msgstr "" -#: includes/i18n.php:739 -msgid "Your trial has been successfully started." +#: templates/debug/plugins-themes-sync.php:29, templates/debug/scheduled-crons.php:84 +msgid "Last" msgstr "" -#: includes/i18n.php:741 -msgid "Your license was successfully activated." +#: templates/debug/scheduled-crons.php:76 +msgid "Scheduled Crons" msgstr "" -#: includes/i18n.php:743 -msgid "It looks like your site currently doesn't have an active license." +#: templates/debug/scheduled-crons.php:81 +msgid "Module" msgstr "" -#: includes/i18n.php:747 -msgid "Your license was successfully deactivated, you are back to the %s plan." +#: templates/debug/scheduled-crons.php:82 +msgid "Module Type" msgstr "" -#: includes/i18n.php:751 -msgid "It looks like the license deactivation failed." +#: templates/debug/scheduled-crons.php:83 +msgid "Cron Type" msgstr "" -#: includes/i18n.php:755 -msgid "It looks like the license could not be activated." +#: templates/debug/scheduled-crons.php:85 +msgid "Next" msgstr "" -#: includes/i18n.php:759 -msgid "Error received from the server:" +#: templates/forms/affiliation.php:82 +msgid "Non-expiring" msgstr "" -#: includes/i18n.php:761 -msgid "Your trial has expired. You can still continue using all our free features." +#: templates/forms/affiliation.php:85 +msgid "Apply to become an affiliate" msgstr "" -#: includes/i18n.php:765 -msgid "Your plan was successfully downgraded. Your %s plan license will expire in %s." +#: templates/forms/affiliation.php:104 +msgid "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s." msgstr "" -#: includes/i18n.php:769 -msgid "Seems like we are having some temporary issue with your plan downgrade. Please try again in few minutes." +#: templates/forms/affiliation.php:119 +msgid "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information." msgstr "" -#: includes/i18n.php:773 -msgid "It looks like you are not in trial mode anymore so there's nothing to cancel :)" +#: templates/forms/affiliation.php:122 +msgid "Your affiliation account was temporarily suspended." msgstr "" -#: includes/i18n.php:777 -msgid "Your %s free trial was successfully cancelled." +#: templates/forms/affiliation.php:125 +msgid "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days." msgstr "" -#: includes/i18n.php:781 -msgctxt "%s - numeric version number" -msgid "Version %s was released." +#: templates/forms/affiliation.php:128 +msgid "Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support." msgstr "" -#: includes/i18n.php:785 -msgid "Please download %s." +#: templates/forms/affiliation.php:141 +msgid "Like the %s? Become our ambassador and earn cash ;-)" msgstr "" -#: includes/i18n.php:787 -msgctxt "%s - plan name, as the latest professional version here" -msgid "the latest %s version here" +#: templates/forms/affiliation.php:142 +msgid "Refer new customers to our %s and earn %s commission on each successful sale you refer!" msgstr "" -#: includes/i18n.php:791 -msgid "How do you like %s so far? Test all our %s premium features with a %d-day free trial." +#: templates/forms/affiliation.php:145 +msgid "Program Summary" msgstr "" -#: includes/i18n.php:795 -msgctxt "call to action" -msgid "Start free trial" +#: templates/forms/affiliation.php:147 +msgid "%s commission when a customer purchases a new license." msgstr "" -#: includes/i18n.php:797 -msgid "Starting trial" +#: templates/forms/affiliation.php:149 +msgid "Get commission for automated subscription renewals." msgstr "" -#: includes/i18n.php:799 -msgid "Please wait" +#: templates/forms/affiliation.php:152 +msgid "%s tracking cookie after the first visit to maximize earnings potential." msgstr "" -#: includes/i18n.php:801 -msgid "Seems like we are having some temporary issue with your trial cancellation. Please try again in few minutes." +#: templates/forms/affiliation.php:155 +msgid "Unlimited commissions." msgstr "" -#: includes/i18n.php:805 -msgid "You already utilized a trial before." +#: templates/forms/affiliation.php:157 +msgid "%s minimum payout amount." msgstr "" -#: includes/i18n.php:807 -msgid "You are already running the plugin in a trial mode." +#: templates/forms/affiliation.php:158 +msgid "Payouts are in USD and processed monthly via PayPal." msgstr "" -#: includes/i18n.php:811 -msgid "Plan %s do not exist, therefore, can't start a trial." +#: templates/forms/affiliation.php:159 +msgid "As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days." msgstr "" -#: includes/i18n.php:815 -msgid "Plan %s does not support a trial period." +#: templates/forms/affiliation.php:162 +msgid "Affiliate" msgstr "" -#: includes/i18n.php:817 -msgid "None of the plugin's plans supports a trial period." +#: templates/forms/affiliation.php:165, templates/forms/resend-key.php:23 +msgid "Email address" msgstr "" -#: includes/i18n.php:821 -msgid "Unexpected API error. Please contact the plugin's author with the following error." +#: templates/forms/affiliation.php:169 +msgid "Full name" msgstr "" -#: includes/i18n.php:825 -msgid "No commitment for %s days - cancel anytime!" +#: templates/forms/affiliation.php:173 +msgid "PayPal account email address" msgstr "" -#: includes/i18n.php:827 -msgid "Your license has expired. You can still continue using all the %s features, but you'll need to renew your license to continue getting updates and support." +#: templates/forms/affiliation.php:177 +msgid "Where are you going to promote the %s?" msgstr "" -#: includes/i18n.php:831 -msgid "Couldn't activate %s." +#: templates/forms/affiliation.php:179 +msgid "Enter the domain of your website or other websites from where you plan to promote the %s." msgstr "" -#: includes/i18n.php:833 -msgid "Please contact us with the following message:" +#: templates/forms/affiliation.php:181 +msgid "Add another domain" msgstr "" -#: includes/i18n.php:835 -msgid "It looks like you are still on the %s plan. If you did upgrade or change your plan, it's probably an issue on our side - sorry." +#: templates/forms/affiliation.php:185 +msgid "Extra Domains" msgstr "" -#: includes/i18n.php:839 -msgid "Please contact us here" +#: templates/forms/affiliation.php:186 +msgid "Extra domains where you will be marketing the product from." msgstr "" -#: includes/i18n.php:841 -msgid "I have upgraded my account but when I try to Sync the License, the plan remains %s." +#: templates/forms/affiliation.php:196 +msgid "Promotion methods" msgstr "" -#: includes/i18n.php:849 -msgid "From unknown reason, the API connectivity test failed." +#: templates/forms/affiliation.php:199 +msgid "Social media (Facebook, Twitter, etc.)" msgstr "" -#: includes/i18n.php:853 -msgid "It's probably a temporary issue on our end. Just to be sure, with your permission, would it be o.k to run another connectivity test?" +#: templates/forms/affiliation.php:203 +msgid "Mobile apps" msgstr "" -#: includes/i18n.php:857 -msgid "We use PHP cURL library for the API calls, which is a very common library and usually installed out of the box. Unfortunately, cURL is not installed on your server." +#: templates/forms/affiliation.php:207 +msgid "Website, email, and social media statistics (optional)" msgstr "" -#: includes/i18n.php:861 -msgid "From unknown reason, CloudFlare, the firewall we use, blocks the connection." +#: templates/forms/affiliation.php:210 +msgid "Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential)." msgstr "" -#: includes/i18n.php:865 -msgctxt "as pluginX requires an access to our API" -msgid "%s requires an access to our API." +#: templates/forms/affiliation.php:214 +msgid "How will you promote us?" msgstr "" -#: includes/i18n.php:869 -msgid "It looks like your server is using Squid ACL (access control lists), which blocks the connection." +#: templates/forms/affiliation.php:217 +msgid "Please provide details on how you intend to promote %s (please be as specific as possible)." msgstr "" -#: includes/i18n.php:873 -msgid "I don't know what is Squid or ACL, help me!" +#: templates/forms/affiliation.php:223, templates/forms/resend-key.php:22 +msgid "Cancel" msgstr "" -#: includes/i18n.php:875, includes/i18n.php:889 -msgid "We'll make sure to contact your hosting company and resolve the issue. You will get a follow-up email to %s once we have an update." +#: templates/forms/affiliation.php:225 +msgid "Become an affiliate" msgstr "" -#: includes/i18n.php:879 -msgid "I'm a system administrator" +#: templates/forms/license-activation.php:20 +msgid "Please enter the license key that you received in the email right after the purchase:" msgstr "" -#: includes/i18n.php:881 -msgid "Great, please whitelist the following domains: %s. Once you done, deactivate the plugin and activate it again." +#: templates/forms/license-activation.php:25 +msgid "Update License" msgstr "" -#: includes/i18n.php:885 -msgid "I don't know what is cURL or how to install it, help me!" +#: templates/forms/optout.php:30 +msgctxt "verb" +msgid "Opt Out" msgstr "" -#: includes/i18n.php:893 -msgid "Great, please install cURL and enable it in your php.ini file. To make sure it was successfully activated, use 'phpinfo()'. Once activated, deactivate the plugin and reactivate it back again." +#: templates/forms/optout.php:31 +msgctxt "verb" +msgid "Opt In" msgstr "" -#: includes/i18n.php:897 -msgid "We are sure it's an issue on our side and more than happy to resolve it for you ASAP if you give us a chance." +#: templates/forms/optout.php:33 +msgid "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking." msgstr "" -#: includes/i18n.php:901 -msgid "Sorry for the inconvenience and we are here to help if you give us a chance." +#: templates/forms/optout.php:35 +msgid "By clicking \"Opt Out\", we will no longer be sending any data from %s to %s." msgstr "" -#: includes/i18n.php:905 -msgid "Yes - I'm giving you a chance to fix it" +#: templates/forms/premium-versions-upgrade-handler.php:24 +msgid "There is a new version of %s available." msgstr "" -#: includes/i18n.php:907 -msgid "We will do our best to whitelist your server and resolve this issue ASAP. You will get a follow-up email to %s once we have an update." +#: templates/forms/premium-versions-upgrade-handler.php:25 +msgid " %sRenew your license now%s to access version %s security & feature updates, and support." msgstr "" -#: includes/i18n.php:911 -msgid "Let's try your previous version" +#: templates/forms/premium-versions-upgrade-handler.php:34 +msgid "New Version Available" msgstr "" -#: includes/i18n.php:913 -msgid "Uninstall this version and install the previous one." +#: templates/forms/premium-versions-upgrade-handler.php:36 +msgid "Renew license" msgstr "" -#: includes/i18n.php:917 -msgid "That's exhausting, please deactivate" +#: templates/forms/premium-versions-upgrade-handler.php:53 +msgctxt "close a window" +msgid "Dismiss" msgstr "" -#: includes/i18n.php:919 -msgid "We feel your frustration and sincerely apologize for the inconvenience. Hope to see you again in the future." +#: templates/forms/resend-key.php:21 +msgid "Send License Key" msgstr "" -#: includes/i18n.php:923 -msgid "Thank for giving us the chance to fix it! A message was just sent to our technical staff. We will get back to you as soon as we have an update to %s. Appreciate your patience." +#: templates/forms/resend-key.php:57 +msgid "Enter the email address you've used for the upgrade below and we will resend you the license key." msgstr "" -#: includes/i18n.php:927 -msgctxt "%1s - plugin title, %2s - API domain" -msgid "Your server is blocking the access to Freemius' API, which is crucial for %1s synchronization. Please contact your host to whitelist %2s" +#: templates/forms/trial-start.php:22 +msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." msgstr "" -#: includes/i18n.php:931 -msgid "It seems like one of the authentication parameters is wrong. Update your Public Key, Secret Key & User ID, and try again." +#: templates/forms/trial-start.php:28 +msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial." msgstr "" -#: includes/i18n.php:939 -msgid "Please check your mailbox, you should receive an email via %s to confirm the ownership change. From security reasons, you must confirm the change within the next 15 min. If you cannot find the email, please check your spam folder." +#: templates/js/style-premium-theme.php:37 +msgid "Premium" msgstr "" -#: includes/i18n.php:943 -msgid "Thanks for confirming the ownership change. An email was just sent to %s for final approval." +#: templates/partials/network-activation.php:23 +msgid "Activate license on all sites in the network." msgstr "" -#: includes/i18n.php:947 -msgid "%s is the new owner of the account." +#: templates/partials/network-activation.php:24 +msgid "Apply on all sites in the network." msgstr "" -#: includes/i18n.php:951 -msgctxt "addonX cannot run without pluginY" -msgid "%s cannot run without %s." +#: templates/partials/network-activation.php:27 +msgid "Activate license on all pending sites." msgstr "" -#: includes/i18n.php:955 -msgctxt "addonX cannot run..." -msgid "%s cannot run without the plugin." +#: templates/partials/network-activation.php:28 +msgid "Apply on all pending sites." msgstr "" -#: includes/i18n.php:959 -msgctxt "pluginX activation was successfully..." -msgid "%s activation was successfully completed." +#: templates/partials/network-activation.php:36, templates/partials/network-activation.php:68 +msgid "allow" msgstr "" -#: includes/i18n.php:963 -msgctxt "Plugin installer section title" -msgid "Features & Pricing" +#: templates/partials/network-activation.php:38, templates/partials/network-activation.php:70 +msgid "delegate" msgstr "" -#: includes/i18n.php:967 -msgid "Add-on must be deployed to WordPress.org or Freemius." +#: templates/partials/network-activation.php:41, templates/partials/network-activation.php:73 +msgid "skip" msgstr "" -#: includes/i18n.php:971 -msgid "Paid add-on must be deployed to Freemius." +#: templates/plugin-info/description.php:72, templates/plugin-info/screenshots.php:31 +msgid "Click to view full-size screenshot %d" msgstr "" -#: includes/i18n.php:979 -msgid "%s is a premium only add-on. You have to purchase a license first before activating the plugin." +#: templates/plugin-info/features.php:56 +msgid "Unlimited Updates" msgstr "" -#: includes/i18n.php:983 -msgid "%s free trial was successfully cancelled. Since the add-on is premium only it was automatically deactivated. If you like to use it in the future, you'll have to purchase a license." +#: templates/account/partials/activate-license-button.php:46 +msgid "Localhost" msgstr "" -#: includes/i18n.php:995 -msgctxt "as every month" -msgid "Monthly" +#: templates/account/partials/activate-license-button.php:50 +msgctxt "as 5 licenses left" +msgid "%s left" msgstr "" -#: includes/i18n.php:997 -msgctxt "as monthly period" -msgid "mo" +#: templates/account/partials/activate-license-button.php:51 +msgid "Last license" msgstr "" -#: includes/i18n.php:999 -msgctxt "as once a year" -msgid "Annual" +#: templates/account/partials/addon.php:111 +msgid "Cancelled" msgstr "" -#: includes/i18n.php:1001 -msgctxt "as once a year" -msgid "Annually" +#: templates/account/partials/addon.php:121 +msgid "No expiration" msgstr "" -#: includes/i18n.php:1003 -msgctxt "as once a year" -msgid "Once" +#: templates/account/partials/addon.php:259, templates/account/partials/addon.php:312 +msgid "Activate this add-on" msgstr "" -#: includes/i18n.php:1005 -msgctxt "as annual period" -msgid "year" +#: templates/account/partials/site.php:181 +msgid "Owner Name" msgstr "" -#: includes/i18n.php:1007 -msgid "Lifetime" +#: templates/account/partials/site.php:193 +msgid "Owner Email" msgstr "" -#: includes/i18n.php:1009 -msgctxt "e.g. the best product" -msgid "Best" +#: templates/account/partials/site.php:205 +msgid "Owner ID" msgstr "" -#: includes/i18n.php:1011 -msgctxt "e.g. billed monthly" -msgid "Billed %s" +#: templates/account/partials/site.php:270 +msgid "Subscription" msgstr "" -#: includes/i18n.php:1013 -msgctxt "as a discount of $5 or 10%" -msgid "Save %s" +#: templates/forms/deactivation/contact.php:19 +msgid "Sorry for the inconvenience and we are here to help if you give us a chance." msgstr "" -#: includes/i18n.php:1017 -msgid "View details" +#: templates/forms/deactivation/contact.php:22 +msgid "Contact Support" msgstr "" -#: includes/i18n.php:1025 -msgctxt "button label" -msgid "Approve & Start Trial" +#: templates/forms/deactivation/form.php:56 +msgid "Anonymous feedback" msgstr "" -#: includes/i18n.php:1029 -msgid "You are 1-click away from starting your %1$s-day free trial of the %2$s plan." +#: templates/forms/deactivation/form.php:63 +msgid "Deactivate" msgstr "" -#: includes/i18n.php:1033 -msgid "For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt-in with your user and non-sensitive site information, allowing the plugin to periodically send data to %s to check for version updates and to validate your trial." +#: templates/forms/deactivation/form.php:65 +msgid "Activate %s" msgstr "" -#: includes/i18n.php:1045 -msgid "Business name" +#: templates/forms/deactivation/form.php:76 +msgid "Quick feedback" msgstr "" -#: includes/i18n.php:1047 -msgid "Tax / VAT ID" +#: templates/forms/deactivation/form.php:80 +msgid "If you have a moment, please let us know why you are %s" msgstr "" -#: includes/i18n.php:1049 -msgid "Address Line %d" +#: templates/forms/deactivation/form.php:80 +msgid "deactivating" msgstr "" -#: includes/i18n.php:1051 -msgid "Country" +#: templates/forms/deactivation/form.php:80 +msgid "switching" msgstr "" -#: includes/i18n.php:1053 -msgid "Select Country" +#: templates/forms/deactivation/form.php:269 +msgid "Submit & %s" msgstr "" -#: includes/i18n.php:1055 -msgid "City" +#: templates/forms/deactivation/form.php:290 +msgid "Kindly tell us the reason so we can improve." msgstr "" -#: includes/i18n.php:1057 -msgid "Town" +#: templates/forms/deactivation/form.php:411 +msgid "Yes - %s" msgstr "" -#: includes/i18n.php:1059 -msgid "State" +#: templates/forms/deactivation/form.php:418 +msgid "Skip & %s" msgstr "" -#: includes/i18n.php:1061 -msgid "Province" +#: templates/forms/deactivation/retry-skip.php:21 +msgid "Click here to use the plugin anonymously" msgstr "" -#: includes/i18n.php:1063 -msgid "ZIP / Postal Code" +#: templates/forms/deactivation/retry-skip.php:23 +msgid "You might have missed it, but you don't have to share any data and can just %s the opt-in." msgstr "" diff --git a/wp-content/plugins/nextgen-gallery/freemius/languages/index.php b/wp-content/plugins/nextgen-gallery/freemius/languages/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/languages/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/package.json b/wp-content/plugins/nextgen-gallery/freemius/package.json new file mode 100644 index 000000000..5d4b7533b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/package.json @@ -0,0 +1,27 @@ +{ + "name": "freemius-wordpress-sdk", + "description": "Monetization, analytics, and marketing automation platform for plugin & theme developers.", + "author": "Freemius, Inc.", + "license": "GPL-3.0", + "homepage": "https://freemius.com", + "version": "2.1.2", + "main": "gulpfile.js", + "dependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "prune": "rimraf .codeclimate.yml .git .github .gitignore .travis.yml gulpfile.js composer.json" + }, + "repository": "Freemius/wordpress-sdk.git", + "devDependencies": { + "gulp": "^3.9.1", + "gulp-clean": "^0.3.2", + "gulp-fs": "0.0.2", + "gulp-gettext": "^0.3.0", + "gulp-path": "^3.0.3", + "gulp-pofill": "^1.0.0", + "gulp-rename": "^1.2.2", + "gulp-sort": "^2.0.0", + "gulp-transifex": "^0.1.17", + "gulp-wp-pot": "^1.3.5" + } +} diff --git a/wp-content/plugins/nextgen-gallery/freemius/require.php b/wp-content/plugins/nextgen-gallery/freemius/require.php index 082cd9304..72e2717d2 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/require.php +++ b/wp-content/plugins/nextgen-gallery/freemius/require.php @@ -2,20 +2,21 @@ /** * @package Freemius * @copyright Copyright (c) 2016, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.9 */ // Configuration should be loaded first. require_once dirname( __FILE__ ) . '/config.php'; + require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php'; // Logger must be loaded before any other. require_once WP_FS__DIR_INCLUDES . '/class-fs-logger.php'; require_once WP_FS__DIR_INCLUDES . '/debug/debug-bar-start.php'; - require_once WP_FS__DIR_INCLUDES . '/fs-core-functions.php'; // require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-abstract-manager.php'; require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-option-manager.php'; + require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-gdpr-manager.php'; require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-cache-manager.php'; require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-notice-manager.php'; require_once WP_FS__DIR_INCLUDES . '/managers/class-fs-admin-menu-manager.php'; @@ -28,6 +29,8 @@ require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-user.php'; require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-site.php'; require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-plugin.php'; + require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-affiliate.php'; + require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-affiliate-terms.php'; require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-plugin-info.php'; require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-plugin-tag.php'; require_once WP_FS__DIR_INCLUDES . '/entities/class-fs-plugin-plan.php'; @@ -38,6 +41,9 @@ require_once WP_FS__DIR_INCLUDES . '/class-fs-api.php'; require_once WP_FS__DIR_INCLUDES . '/class-fs-plugin-updater.php'; require_once WP_FS__DIR_INCLUDES . '/class-fs-security.php'; + require_once WP_FS__DIR_INCLUDES . '/class-fs-options.php'; + require_once WP_FS__DIR_INCLUDES . '/class-fs-storage.php'; + require_once WP_FS__DIR_INCLUDES . '/class-fs-admin-notices.php'; require_once WP_FS__DIR_INCLUDES . '/class-freemius-abstract.php'; require_once WP_FS__DIR_INCLUDES . '/sdk/Exceptions/Exception.php'; require_once WP_FS__DIR_INCLUDES . '/class-freemius.php'; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/start.php b/wp-content/plugins/nextgen-gallery/freemius/start.php index d6817d9ef..dc7a50266 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/start.php +++ b/wp-content/plugins/nextgen-gallery/freemius/start.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ @@ -15,7 +15,7 @@ * * @var string */ - $this_sdk_version = '1.2.1.5'; + $this_sdk_version = '2.1.3'; #region SDK Selection Logic -------------------------------------------------------------------- @@ -31,12 +31,35 @@ global $fs_active_plugins; - $this_sdk_relative_path = plugin_basename( dirname( __FILE__ ) ); - - if ( ! isset( $fs_active_plugins ) ) { + if ( ! function_exists( 'fs_find_caller_plugin_file' ) ) { // Require SDK essentials. require_once dirname( __FILE__ ) . '/includes/fs-essential-functions.php'; + } + + /** + * This complex logic fixes symlink issues (e.g. with Vargant). The logic assumes + * that if it's a file from an SDK running in a theme, the location of the SDK + * is in the main theme's folder. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.6 + */ + $file_path = fs_normalize_path( __FILE__ ); + $fs_root_path = dirname( $file_path ); + $themes_directory = get_theme_root(); + $themes_directory_name = basename( $themes_directory ); + $theme_candidate_basename = basename( dirname( $fs_root_path ) ) . '/' . basename( $fs_root_path ); + if ( $file_path == fs_normalize_path( realpath( trailingslashit( $themes_directory ) . $theme_candidate_basename . '/' . basename( $file_path ) ) ) + ) { + $this_sdk_relative_path = '../' . $themes_directory_name . '/' . $theme_candidate_basename; + $is_theme = true; + } else { + $this_sdk_relative_path = plugin_basename( $fs_root_path ); + $is_theme = false; + } + + if ( ! isset( $fs_active_plugins ) ) { // Load all Freemius powered active plugins. $fs_active_plugins = get_option( 'fs_active_plugins', new stdClass() ); @@ -45,6 +68,54 @@ } } + if ( empty( $fs_active_plugins->abspath ) ) { + /** + * Store the WP install absolute path reference to identify environment change + * while replicating the storage. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + $fs_active_plugins->abspath = ABSPATH; + } else { + if ( ABSPATH !== $fs_active_plugins->abspath ) { + /** + * WordPress path has changed, cleanup the SDK references cache. + * This resolves issues triggered when spinning a staging environments + * while replicating the database. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + $fs_active_plugins->abspath = ABSPATH; + $fs_active_plugins->plugins = array(); + unset( $fs_active_plugins->newest ); + } else { + /** + * Make sure SDK references are still valid. This resolves + * issues when users hard delete modules via FTP. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.1.7 + */ + $has_changes = false; + foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { + if ( ! file_exists( WP_PLUGIN_DIR . '/' . $sdk_path ) ) { + unset( $fs_active_plugins->plugins[ $sdk_path ] ); + $has_changes = true; + } + } + + if ( $has_changes ) { + if ( empty( $fs_active_plugins->plugins ) ) { + unset( $fs_active_plugins->newest ); + } + + update_option( 'fs_active_plugins', $fs_active_plugins ); + } + } + } + if ( ! function_exists( 'fs_find_direct_caller_plugin_file' ) ) { require_once dirname( __FILE__ ) . '/includes/supplements/fs-essential-functions-1.1.7.1.php'; } @@ -53,10 +124,17 @@ if ( ! isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) || $this_sdk_version != $fs_active_plugins->plugins[ $this_sdk_relative_path ]->version ) { + if ( $is_theme ) { + $plugin_path = basename( dirname( $this_sdk_relative_path ) ); + } else { + $plugin_path = plugin_basename( fs_find_direct_caller_plugin_file( $file_path ) ); + } + $fs_active_plugins->plugins[ $this_sdk_relative_path ] = (object) array( 'version' => $this_sdk_version, + 'type' => ( $is_theme ? 'theme' : 'plugin' ), 'timestamp' => time(), - 'plugin_path' => plugin_basename( fs_find_direct_caller_plugin_file( __FILE__ ) ), + 'plugin_path' => $plugin_path, ); } @@ -88,13 +166,33 @@ } } else { if ( ! function_exists( 'get_plugins' ) ) { - require_once( ABSPATH . 'wp-admin/includes/plugin.php' ); + require_once ABSPATH . 'wp-admin/includes/plugin.php'; } - $is_newest_sdk_plugin_activate = is_plugin_active( $fs_active_plugins->newest->plugin_path ); + $fs_newest_sdk = $fs_active_plugins->newest; + $fs_newest_sdk = $fs_active_plugins->plugins[ $fs_newest_sdk->sdk_path ]; + + $is_newest_sdk_type_theme = ( isset( $fs_newest_sdk->type ) && 'theme' === $fs_newest_sdk->type ); + + if ( ! $is_newest_sdk_type_theme ) { + $is_newest_sdk_plugin_active = is_plugin_active( $fs_newest_sdk->plugin_path ); + } else { + $current_theme = wp_get_theme(); + $is_newest_sdk_plugin_active = ( $current_theme->stylesheet === $fs_newest_sdk->plugin_path ); + + $current_theme_parent = $current_theme->parent(); + + /** + * If the current theme is a child of the theme that has the newest SDK, this prevents a redirects loop + * from happening by keeping the SDK info stored in the `fs_active_plugins` option. + */ + if ( ! $is_newest_sdk_plugin_active && $current_theme_parent instanceof WP_Theme ) { + $is_newest_sdk_plugin_active = ( $fs_newest_sdk->plugin_path === $current_theme_parent->stylesheet ); + } + } if ( $is_current_sdk_newest && - ! $is_newest_sdk_plugin_activate && + ! $is_newest_sdk_plugin_active && ! $fs_active_plugins->newest->in_activation ) { // If current SDK is the newest and the plugin is NOT active, it means @@ -103,14 +201,24 @@ update_option( 'fs_active_plugins', $fs_active_plugins ); } - $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_activate || $fs_active_plugins->newest->in_activation ) && file_exists( fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' ) ); + if ( ! $is_theme ) { + $sdk_starter_path = fs_normalize_path( WP_PLUGIN_DIR . '/' . $this_sdk_relative_path . '/start.php' ); + } else { + $sdk_starter_path = fs_normalize_path( + get_theme_root() + . '/' + . str_replace( "../{$themes_directory_name}/", '', $this_sdk_relative_path ) + . '/start.php' ); + } + + $is_newest_sdk_path_valid = ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) && file_exists( $sdk_starter_path ); if ( ! $is_newest_sdk_path_valid && ! $is_current_sdk_newest ) { // Plugin with newest SDK is no longer active, or SDK was moved to a different location. unset( $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ] ); } - if ( ! ( $is_newest_sdk_plugin_activate || $fs_active_plugins->newest->in_activation ) || + if ( ! ( $is_newest_sdk_plugin_active || $fs_active_plugins->newest->in_activation ) || ! $is_newest_sdk_path_valid || // Is newest SDK downgraded. ( $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path && @@ -125,14 +233,14 @@ // Find the active plugin with the newest SDK version and update the newest reference. fs_fallback_to_newest_active_sdk(); } else { - if ( $is_newest_sdk_plugin_activate && + if ( $is_newest_sdk_plugin_active && $this_sdk_relative_path == $fs_active_plugins->newest->sdk_path && ( $fs_active_plugins->newest->in_activation || ( class_exists( 'Freemius' ) && ( ! defined( 'WP_FS__SDK_VERSION' ) || version_compare( WP_FS__SDK_VERSION, $this_sdk_version, '<' ) ) ) ) ) { - if ( $fs_active_plugins->newest->in_activation ) { + if ( $fs_active_plugins->newest->in_activation && ! $is_newest_sdk_type_theme ) { // Plugin no more in activation. $fs_active_plugins->newest->in_activation = false; update_option( 'fs_active_plugins', $fs_active_plugins ); @@ -155,7 +263,17 @@ } if ( version_compare( $this_sdk_version, $fs_active_plugins->newest->version, '<' ) ) { - $newest_sdk_starter = fs_normalize_path( WP_PLUGIN_DIR . '/' . $fs_active_plugins->newest->sdk_path . '/start.php' ); + $newest_sdk = $fs_active_plugins->plugins[ $fs_active_plugins->newest->sdk_path ]; + + $plugins_or_theme_dir_path = ( ! isset( $newest_sdk->type ) || 'theme' !== $newest_sdk->type ) ? + WP_PLUGIN_DIR : + get_theme_root(); + + $newest_sdk_starter = fs_normalize_path( + $plugins_or_theme_dir_path + . '/' + . str_replace( "../{$themes_directory_name}/", '', $fs_active_plugins->newest->sdk_path ) + . '/start.php' ); if ( file_exists( $newest_sdk_starter ) ) { // Reorder plugins to load plugin with newest SDK first. @@ -256,6 +374,91 @@ define( 'WP_FS__SDK_VERSION', $this_sdk_version ); } + $plugins_or_theme_dir_path = fs_normalize_path( trailingslashit( $is_theme ? + get_theme_root() : + WP_PLUGIN_DIR ) ); + + if ( 0 === strpos( $file_path, $plugins_or_theme_dir_path ) ) { + // No symlinks + } else { + /** + * This logic finds the SDK symlink and set WP_FS__DIR to use it. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.5 + */ + $sdk_symlink = null; + + // Try to load SDK's symlink from cache. + if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && + is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && + ! empty( $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink ) + ) { + $sdk_symlink = $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink; + if ( 0 === strpos( $sdk_symlink, $plugins_or_theme_dir_path ) ) { + /** + * Make the symlink path relative. + * + * @author Leo Fajardo (@leorw) + */ + $sdk_symlink = substr( $sdk_symlink, strlen( $plugins_or_theme_dir_path ) ); + + $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink; + update_option( 'fs_active_plugins', $fs_active_plugins ); + } + + $realpath = realpath( $plugins_or_theme_dir_path . $sdk_symlink ); + if ( ! is_string( $realpath ) || ! file_exists( $realpath ) ) { + $sdk_symlink = null; + } + } + + if ( empty( $sdk_symlink ) ) // Has symlinks, therefore, we need to configure WP_FS__DIR based on the symlink. + { + $partial_path_right = basename( $file_path ); + $partial_path_left = dirname( $file_path ); + $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right ); + + while ( '/' !== $partial_path_left && + ( false === $realpath || $file_path !== fs_normalize_path( $realpath ) ) + ) { + $partial_path_right = trailingslashit( basename( $partial_path_left ) ) . $partial_path_right; + $partial_path_left_prev = $partial_path_left; + $partial_path_left = dirname( $partial_path_left_prev ); + + /** + * Avoid infinite loop if for example `$partial_path_left_prev` is `C:/`, in this case, + * `dirname( 'C:/' )` will return `C:/`. + * + * @author Leo Fajardo (@leorw) + */ + if ( $partial_path_left === $partial_path_left_prev ) { + $partial_path_left = ''; + break; + } + + $realpath = realpath( $plugins_or_theme_dir_path . $partial_path_right ); + } + + if ( ! empty( $partial_path_left ) && '/' !== $partial_path_left ) { + $sdk_symlink = fs_normalize_path( dirname( $partial_path_right ) ); + + // Cache value. + if ( isset( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) && + is_object( $fs_active_plugins->plugins[ $this_sdk_relative_path ] ) + ) { + $fs_active_plugins->plugins[ $this_sdk_relative_path ]->sdk_symlink = $sdk_symlink; + update_option( 'fs_active_plugins', $fs_active_plugins ); + } + } + } + + if ( ! empty( $sdk_symlink ) ) { + // Set SDK dir to the symlink path. + define( 'WP_FS__DIR', $plugins_or_theme_dir_path . $sdk_symlink ); + } + } + // Load SDK files. require_once dirname( __FILE__ ) . '/require.php'; @@ -263,12 +466,12 @@ * Quick shortcut to get Freemius for specified plugin. * Used by various templates. * - * @param string $slug + * @param number $module_id * * @return Freemius */ - function freemius( $slug ) { - return Freemius::instance( $slug ); + function freemius( $module_id ) { + return Freemius::instance( $module_id ); } /** @@ -283,20 +486,20 @@ * @deprecated Please use fs_dynamic_init(). */ function fs_init( $slug, $plugin_id, $public_key, $is_live = true, $is_premium = true ) { - $fs = Freemius::instance( $slug, true ); + $fs = Freemius::instance( $plugin_id, $slug, true ); $fs->init( $plugin_id, $public_key, $is_live, $is_premium ); return $fs; } /** - * @param array<string,string> $module Plugin or Theme details. + * @param array <string,string> $module Plugin or Theme details. * * @return Freemius * @throws Freemius_Exception */ function fs_dynamic_init( $module ) { - $fs = Freemius::instance( $module['slug'], true ); + $fs = Freemius::instance( $module['id'], $module['slug'], true ); $fs->dynamic_init( $module ); return $fs; diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account.php index 484fdc311..1a5324a9b 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/account.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account.php @@ -1,716 +1,739 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - /** - * @var array $VARS - */ - $slug = $VARS['slug']; - /** - * @var Freemius $fs - */ - $fs = freemius( $slug ); - - /** - * @var FS_Plugin_Tag $update - */ - $update = $fs->get_update( false, false ); - - $is_paying = $fs->is_paying(); - $user = $fs->get_user(); - $site = $fs->get_site(); - $name = $user->get_name(); - $license = $fs->_get_license(); - $subscription = $fs->_get_subscription(); - $plan = $fs->get_plan(); - $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); - $is_paid_trial = $fs->is_paid_trial(); - $show_upgrade = ( $fs->has_paid_plan() && ! $is_paying && ! $is_paid_trial ); - - if ( $show_upgrade ) { - $fs->_add_license_activation_dialog_box(); - } -?> - <div class="wrap"> - <h2 class="nav-tab-wrapper"> - <a href="<?php echo $fs->get_account_url() ?>" - class="nav-tab nav-tab-active"><?php _efs( 'account', $slug ) ?></a> - <?php if ( $fs->has_addons() ) : ?> - <a href="<?php echo $fs->_get_admin_page_url( 'addons' ) ?>" - class="nav-tab"><?php _efs( 'add-ons', $slug ) ?></a> - <?php endif ?> - <?php if ( $show_upgrade ) : ?> - <a href="<?php echo $fs->get_upgrade_url() ?>" class="nav-tab"><?php _efs( 'upgrade', $slug ) ?></a> - <?php if ( $fs->apply_filters( 'show_trial', true ) && ! $fs->is_trial_utilized() && $fs->has_trial_plan() ) : ?> - <a href="<?php echo $fs->get_trial_url() ?>" class="nav-tab"><?php _efs( 'free-trial', $slug ) ?></a> - <?php endif ?> - <?php endif ?> - <?php if ( ! $plan->is_free() ) : ?> - <a href="<?php echo $fs->get_account_tab_url( 'billing' ) ?>" - class="nav-tab"><?php _efs( 'billing', $slug ) ?></a> - <?php endif ?> - </h2> - - <div id="poststuff"> - <div id="fs_account"> - <div class="has-sidebar has-right-sidebar"> - <div class="has-sidebar-content"> - <div class="postbox"> - <h3><?php _efs( 'account-details', $slug ) ?></h3> - - <div class="fs-header-actions"> - <ul> - <li> - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="delete_account"> - <?php wp_nonce_field( 'delete_account' ) ?> - <a href="#" onclick="if (confirm('<?php - if ( $is_active_subscription ) { - echo esc_attr( sprintf( __fs( 'delete-account-x-confirm', $slug ), $plan->title ) ); - } else { - _efs( 'delete-account-confirm', $slug ); - } - ?>')) this.parentNode.submit(); return false;"><i - class="dashicons dashicons-no"></i> <?php _efs( 'delete-account', $slug ) ?></a> - </form> - </li> - <?php if ( $is_paying ) : ?> - <li> - • - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="deactivate_license"> - <?php wp_nonce_field( 'deactivate_license' ) ?> - <a href="#" - onclick="if (confirm('<?php _efs( 'deactivate-license-confirm', $slug ) ?>')) this.parentNode.submit(); return false;"><i - class="dashicons dashicons-admin-network"></i> <?php _efs( 'deactivate-license', $slug ) ?> - </a> - </form> - </li> - <?php if ( ! $license->is_lifetime() && - $is_active_subscription - ) : ?> - <li> - • - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="downgrade_account"> - <?php wp_nonce_field( 'downgrade_account' ) ?> - <a href="#" - onclick="if (confirm('<?php printf( __fs( 'downgrade-x-confirm', $slug ), $plan->title, human_time_diff( time(), strtotime( $license->expiration ) ) ) ?> <?php if ( ! $license->is_block_features ) { - printf( __fs( 'after-downgrade-non-blocking', $slug ), $plan->title ); - } else { - printf( __fs( 'after-downgrade-blocking', $slug ), $plan->title ); - }?> <?php _efs( 'proceed-confirmation', $slug ) ?>')) this.parentNode.submit(); return false;"><i - class="dashicons dashicons-download"></i> <?php _efs( 'downgrade', $slug ) ?></a> - </form> - </li> - <?php endif ?> - <li> - • - <a href="<?php echo $fs->get_upgrade_url() ?>"><i - class="dashicons dashicons-grid-view"></i> <?php _efs( 'change-plan', $slug ) ?></a> - </li> - <?php elseif ( $is_paid_trial ) : ?> - <li> - • - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="cancel_trial"> - <?php wp_nonce_field( 'cancel_trial' ) ?> - <a href="#" - onclick="if (confirm('<?php _efs( 'cancel-trial-confirm' ) ?>')) this.parentNode.submit(); return false;"><i - class="dashicons dashicons-download"></i> <?php _efs( 'cancel-trial', $slug ) ?></a> - </form> - </li> - <?php endif ?> - <li> - • - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="<?php echo $slug ?>_sync_license"> - <?php wp_nonce_field( $slug . '_sync_license' ) ?> - <a href="#" onclick="this.parentNode.submit(); return false;"><i - class="dashicons dashicons-image-rotate"></i> <?php _efs( 'sync', $slug ) ?></a> - </form> - </li> - - </ul> - </div> - <div class="inside"> - <table id="fs_account_details" cellspacing="0" class="fs-key-value-table"> - <?php - $profile = array(); - $profile[] = array( - 'id' => 'user_name', - 'title' => __fs( 'name', $slug ), - 'value' => $name - ); - // if (isset($user->email) && false !== strpos($user->email, '@')) - $profile[] = array( - 'id' => 'email', - 'title' => __fs( 'email', $slug ), - 'value' => $user->email - ); - - if ( is_numeric( $user->id ) ) { - $profile[] = array( - 'id' => 'user_id', - 'title' => __fs( 'user-id', $slug ), - 'value' => $user->id - ); - } - - $profile[] = array( - 'id' => 'site_id', - 'title' => __fs( 'site-id', $slug ), - 'value' => is_string( $site->id ) ? - $site->id : - __fs( 'no-id', $slug ) - ); - - $profile[] = array( - 'id' => 'site_public_key', - 'title' => __fs( 'public-key', $slug ), - 'value' => $site->public_key - ); - - $profile[] = array( - 'id' => 'site_secret_key', - 'title' => __fs( 'secret-key', $slug ), - 'value' => ( ( is_string( $site->secret_key ) ) ? - $site->secret_key : - __fs( 'no-secret', $slug ) - ) - ); - - $profile[] = array( - 'id' => 'version', - 'title' => __fs( 'version', $slug ), - 'value' => $fs->get_plugin_version() - ); - - if ( $fs->has_paid_plan() ) { - if ( $fs->is_trial() ) { - $trial_plan = $fs->get_trial_plan(); - - $profile[] = array( - 'id' => 'plan', - 'title' => __fs( 'plan', $slug ), - 'value' => ( is_string( $trial_plan->name ) ? - strtoupper( $trial_plan->title ) : - __fs( 'trial', $slug ) ) - ); - } else { - $profile[] = array( - 'id' => 'plan', - 'title' => __fs( 'plan', $slug ), - 'value' => is_string( $site->plan->name ) ? - strtoupper( $site->plan->title ) : - strtoupper( __fs( 'free', $slug ) ) - ); - - if ( is_object( $license ) ) { - $profile[] = array( - 'id' => 'license_key', - 'title' => __fs( 'License Key', $slug ), - 'value' => $license->secret_key, - ); - } - } - } - ?> - <?php $odd = true; - foreach ( $profile as $p ) : ?> - <?php - if ( 'plan' === $p['id'] && ! $fs->has_paid_plan() ) { - // If plugin don't have any paid plans, there's no reason - // to show current plan. - continue; - } - ?> - <tr class="fs-field-<?php echo $p['id'] ?><?php if ( $odd ) : ?> alternate<?php endif ?>"> - <td> - <nobr><?php echo $p['title'] ?>:</nobr> - </td> - <td<?php if ( 'plan' === $p['id'] ) { echo ' colspan="2"'; }?>> - <?php if ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?> - <code><?php echo htmlspecialchars( substr( $p['value'], 0, 6 ) ) . str_pad( '', 23 * 6, '•' ) . htmlspecialchars( substr( $p['value'], - 3 ) ) ?></code> - <input type="text" value="<?php echo htmlspecialchars( $p['value'] ) ?>" style="display: none" - readonly/> - <?php else : ?> - <code><?php echo htmlspecialchars( $p['value'] ) ?></code> - <?php endif ?> - <?php if ( 'email' === $p['id'] && ! $user->is_verified() ) : ?> - <label class="fs-tag fs-warn"><?php _efs( 'not-verified', $slug ) ?></label> - <?php endif ?> - <?php if ( 'plan' === $p['id'] ) : ?> - <?php if ( $fs->is_trial() ) : ?> - <label class="fs-tag fs-success"><?php _efs( 'trial', $slug ) ?></label> - <?php endif ?> - <?php if ( is_object( $license ) && ! $license->is_lifetime() ) : ?> - <?php if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) : ?> - <label - class="fs-tag fs-warn"><?php printf( __fs( 'expires-in', $slug ), human_time_diff( time(), strtotime( $license->expiration ) ) ) ?></label> - <?php elseif ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) : ?> - <label - class="fs-tag fs-success"><?php printf( __fs( 'renews-in', $slug ), human_time_diff( time(), strtotime( $subscription->next_payment ) ) ) ?></label> - <?php endif ?> - <?php elseif ( $fs->is_trial() ) : ?> - <label - class="fs-tag fs-warn"><?php printf( __fs( 'expires-in', $slug ), human_time_diff( time(), strtotime( $site->trial_ends ) ) ) ?></label> - <?php endif ?> - <div class="button-group"> - <?php $available_license = $fs->is_free_plan() ? $fs->_get_available_premium_license() : false ?> - <?php if ( false !== $available_license && ( $available_license->left() > 0 || ( $site->is_localhost() && $available_license->is_free_localhost ) ) ) : ?> - <?php $premium_plan = $fs->_get_plan_by_id( $available_license->plan_id ) ?> - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" - method="POST"> - <input type="hidden" name="fs_action" value="activate_license"> - <input type="hidden" name="license_id" value="<?php echo $available_license->id ?>"> - <?php wp_nonce_field( 'activate_license' ) ?> - <input type="submit" class="button button-primary" - value="<?php printf( - __fs( 'activate-x-plan', $slug ) . '%s', - $premium_plan->title, - ( $site->is_localhost() && $available_license->is_free_localhost ) ? - ' [' . __fs( 'localhost', $slug ) . ']' : - ( $available_license->is_single_site() ? - '' : - ' [' . ( 1 < $available_license->left() ? - sprintf( __fs( 'x-left', $slug ), $available_license->left() ) : - strtolower( __fs( 'last-license', $slug ) ) ) . ']' - ) - ) ?> "> - </form> - <?php else : ?> - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" - method="POST" class="button-group"> - <?php if ( $show_upgrade && $fs->is_premium() ) : ?> - <a class="button activate-license-trigger <?php echo $slug ?>" href="#"><?php _efs( 'activate-license', $slug ) ?></a> - <?php endif ?> - <input type="submit" class="button" - value="<?php _efs( 'sync-license', $slug ) ?>"> - <input type="hidden" name="fs_action" - value="<?php echo $slug ?>_sync_license"> - <?php wp_nonce_field( $slug . '_sync_license' ) ?> - <a href="<?php echo $fs->get_upgrade_url() ?>" - class="button<?php if ( $show_upgrade ) { - echo ' button-primary'; - } ?> button-upgrade"><i - class="dashicons dashicons-cart"></i> <?php ( $show_upgrade ) ? - _efs( 'upgrade', $slug ) : - _efs( 'change-plan', $slug ) - ?></a> - </form> - <?php endif ?> - </div> - <?php elseif ( 'version' === $p['id'] && $fs->has_paid_plan() ) : ?> - <?php if ( $fs->is_premium() ) : ?> - <label - class="fs-tag fs-<?php echo $fs->can_use_premium_code() ? 'success' : 'warn' ?>"><?php _efs( 'premium-version' ) ?></label> - <?php elseif ( $fs->can_use_premium_code() ) : ?> - <label class="fs-tag fs-warn"><?php _efs( 'free-version' ) ?></label> - <?php endif ?> - <?php endif ?> - </td> - <?php if ( 'plan' !== $p['id'] ) : ?> - <td class="fs-right"> - <?php if ( 'email' === $p['id'] && ! $user->is_verified() ) : ?> - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> - <input type="hidden" name="fs_action" value="verify_email"> - <?php wp_nonce_field( 'verify_email' ) ?> - <input type="submit" class="button button-small" - value="<?php _efs( 'verify-email', $slug ) ?>"> - </form> - <?php endif ?> - <?php if ( 'version' === $p['id'] ) : ?> - <div class="button-group"> - <?php if ( $is_paying || $fs->is_trial() ) : ?> - <?php if ( ! $fs->is_allowed_to_install() ) : ?> - <a target="_blank" class="button button-primary" - href="<?php echo $fs->_get_latest_download_local_url() ?>"><?php echo sprintf( __fs( 'download-x-version', $slug ), ( $fs->is_trial() ? $trial_plan->title : $site->plan->title ) ) . ( is_object( $update ) ? ' [' . $update->version . ']' : '' ) ?></a> - <?php elseif ( is_object( $update ) ) : ?> - <a class="button button-primary" - href="<?php echo wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' . $fs->get_plugin_basename() ), 'upgrade-plugin_' . $fs->get_plugin_basename() ) ?>"><?php echo __fs( 'install-update-now', $slug ) . ' [' . $update->version . ']' ?></a> - <?php endif ?> - <?php endif; ?> - </div> - <?php - elseif ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?> - <button class="button button-small"><?php _efs( 'show', $slug ) ?></button> - <?php - elseif (/*in_array($p['id'], array('site_secret_key', 'site_id', 'site_public_key')) ||*/ - ( is_string( $user->secret_key ) && in_array( $p['id'], array( - 'email', - 'user_name' - ) ) ) - ) : ?> - <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST" - onsubmit="var val = prompt('<?php printf( __fs( 'what-is-your-x', $slug ), $p['title'] ) ?>', '<?php echo $p['value'] ?>'); if (null == val || '' === val) return false; jQuery('input[name=fs_<?php echo $p['id'] ?>_<?php echo $slug ?>]').val(val); return true;"> - <input type="hidden" name="fs_action" value="update_<?php echo $p['id'] ?>"> - <input type="hidden" name="fs_<?php echo $p['id'] ?>_<?php echo $slug ?>" - value=""> - <?php wp_nonce_field( 'update_' . $p['id'] ) ?> - <input type="submit" class="button button-small" - value="<?php _efs( 'edit', $slug ) ?>"> - </form> - <?php endif ?> - </td> - <?php endif ?> - </tr> - <?php $odd = ! $odd; - endforeach ?> - </table> - </div> - </div> - <script type="text/javascript"> - (function ($) { - $('.fs-field-license_key button, .fs-field-site_secret_key button').click(function () { - var - $this = $(this), - $parent = $this.closest('tr'), - $input = $parent.find('input'); - - $parent.find('code').toggle(); - $input.toggle(); - - if ($input.is(':visible')) { - $this.html('<?php _efs( 'hide', $slug ) ?>'); - setTimeout(function () { - $input.select().focus(); - }, 100); - } - else { - $this.html('<?php _efs( 'show', $slug ) ?>'); - } - }); - }(jQuery)); - - </script> - - <?php - $account_addons = $fs->get_account_addons(); - if ( ! is_array( $account_addons ) ) { - $account_addons = array(); - } - - $installed_addons = $fs->get_installed_addons(); - $installed_addons_ids = array(); - foreach ( $installed_addons as $fs_addon ) { - $installed_addons_ids[] = $fs_addon->get_id(); - } - - $addons_to_show = array_unique( array_merge( $installed_addons_ids, $account_addons ) ); - ?> - <?php if ( 0 < count( $addons_to_show ) ) : ?> - <!-- Add-Ons --> - <div class="postbox"> - <div class=""> - <!-- <div class="inside">--> - <table id="fs_addons" class="widefat"> - <thead> - <tr> - <th><h3><?php _efs( 'add-ons', $slug ) ?></h3></th> - <th><?php _efs( 'id', $slug ) ?></th> - <th><?php _efs( 'version', $slug ) ?></th> - <th><?php _efs( 'plan', $slug ) ?></th> - <th><?php _efs( 'license', $slug ) ?></th> - <th></th> - <?php if ( defined( 'WP_FS__DEV_MODE' ) && WP_FS__DEV_MODE ) : ?> - <th></th> - <?php endif ?> - </tr> - </thead> - <tbody> - <?php $odd = true; - foreach ( $addons_to_show as $addon_id ) : ?> - <?php - $addon = $fs->get_addon( $addon_id ); - $is_addon_activated = $fs->is_addon_activated( $addon->slug ); - $is_addon_connected = $fs->is_addon_connected( $addon->slug ); - - $fs_addon = $is_addon_connected ? freemius( $addon->slug ) : false; - if ( is_object( $fs_addon ) ) { - $is_paying = $fs_addon->is_paying(); - $user = $fs_addon->get_user(); - $site = $fs_addon->get_site(); - $license = $fs_addon->_get_license(); - $subscription = $fs_addon->_get_subscription(); - $plan = $fs_addon->get_plan(); - $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); - $is_paid_trial = $fs_addon->is_paid_trial(); - $show_upgrade = ( ! $is_paying && ! $is_paid_trial && ! $fs_addon->_has_premium_license() ); - $is_current_license_expired = is_object( $license ) && $license->is_expired(); - } - - // var_dump( $is_paid_trial, $license, $site, $subscription ); - - ?> - <tr<?php if ( $odd ) { - echo ' class="alternate"'; - } ?>> - <td> - <!-- Title --> - <?php echo $addon->title ?> - </td> - <?php if ( $is_addon_connected ) : ?> - <?php // Add-on Installed ?> - <?php $addon_site = $fs_addon->get_site(); ?> - <td> - <!-- ID --> - <?php echo $addon_site->id ?> - </td> - <td> - <!-- Version --> - <?php echo $fs_addon->get_plugin_version() ?> - </td> - <td> - <!-- Plan Title --> - <?php echo is_string( $addon_site->plan->name ) ? strtoupper( $addon_site->plan->title ) : 'FREE' ?> - </td> - <td> - <!-- Expiration --> - <?php - $tags = array(); - - if ( $fs_addon->is_trial() ) { - $tags[] = array( 'label' => __fs( 'trial', $slug ), 'type' => 'success' ); - - $tags[] = array( - 'label' => sprintf( __fs( ( $is_paid_trial ? 'renews-in' : 'expires-in' ), $slug ), human_time_diff( time(), strtotime( $site->trial_ends ) ) ), - 'type' => ( $is_paid_trial ? 'success' : 'warn' ) - ); - } else { - if ( is_object( $license ) ) { - if ( $license->is_cancelled ) { - $tags[] = array( - 'label' => __fs( 'cancelled', $slug ), - 'type' => 'error' - ); - } else if ( $license->is_expired() ) { - $tags[] = array( - 'label' => __fs( 'expired', $slug ), - 'type' => 'error' - ); - } else if ( $license->is_lifetime() ) { - $tags[] = array( - 'label' => __fs( 'no-expiration', $slug ), - 'type' => 'success' - ); - } else if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) { - $tags[] = array( - 'label' => sprintf( __fs( 'expires-in', $slug ), human_time_diff( time(), strtotime( $license->expiration ) ) ), - 'type' => 'warn' - ); - } else if ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) { - $tags[] = array( - 'label' => sprintf( __fs( 'renews-in', $slug ), human_time_diff( time(), strtotime( $subscription->next_payment ) ) ), - 'type' => 'success' - ); - } - } - } - - foreach ( $tags as $t ) { - printf( '<label class="fs-tag fs-%s">%s</label>' . "\n", $t['type'], $t['label'] ); - } - ?> - </td> - <?php - $buttons = array(); - if ( $is_addon_activated ) { - if ( $is_paying ) { - $buttons[] = fs_ui_get_action_button( - $slug, - 'account', - 'deactivate_license', - __fs( 'deactivate-license', $slug ), - array( 'plugin_id' => $addon_id ), - false - ); - - $human_readable_license_expiration = human_time_diff( time(), strtotime( $license->expiration ) ); - $downgrade_confirmation_message = sprintf( __fs( 'downgrade-x-confirm', $slug ), - $plan->title, - $human_readable_license_expiration ); - - $after_downgrade_message_id = ( ! $license->is_block_features ? - 'after-downgrade-non-blocking' : - 'after-downgrade-blocking' ); - - $after_downgrade_message = sprintf( __fs( $after_downgrade_message_id, $slug ), $plan->title ); - - if ( ! $license->is_lifetime() && $is_active_subscription ) { - $buttons[] = fs_ui_get_action_button( - $slug, - 'account', - 'downgrade_account', - __fs( 'downgrade', $slug ), - array( 'plugin_id' => $addon_id ), - false, - false, - ( $downgrade_confirmation_message . ' ' . $after_downgrade_message ), - 'POST' - ); - } - } else if ( $is_paid_trial ) { - $buttons[] = fs_ui_get_action_button( - $slug, - 'account', - 'cancel_trial', - __fs( 'cancel-trial', $slug ), - array( 'plugin_id' => $addon_id ), - false, - 'dashicons dashicons-download', - __fs( 'cancel-trial-confirm', $slug ), - 'POST' - ); - } else { - $premium_license = $fs_addon->_get_available_premium_license(); - - if ( is_object( $premium_license ) ) { - $site = $fs_addon->get_site(); - - $buttons[] = fs_ui_get_action_button( - $slug, - 'account', - 'activate_license', - sprintf( __fs( 'activate-x-plan', $slug ), $fs_addon->get_plan_title(), ( $site->is_localhost() && $premium_license->is_free_localhost ) ? '[localhost]' : ( 1 < $premium_license->left() ? $premium_license->left() . ' left' : '' ) ), - array( - 'plugin_id' => $addon_id, - 'license_id' => $premium_license->id, - ) - ); - } - } - - if ( 0 == count( $buttons ) ) { - // Add sync license only if non of the other CTAs are visible. - $buttons[] = fs_ui_get_action_button( - $slug, - 'account', - $slug . '_sync_license', - __fs( 'sync-license', $slug ), - array( 'plugin_id' => $addon_id ), - false - ); - - } - } else if ( ! $show_upgrade ) { - if ( $fs->is_addon_installed( $addon->slug ) ) { - $addon_file = $fs->get_addon_basename( $addon->slug ); - $buttons[] = sprintf( - '<a class="button button-primary" href="%s" title="%s" class="edit">%s</a>', - wp_nonce_url( 'plugins.php?action=activate&plugin=' . $addon_file, 'activate-plugin_' . $addon_file ), - esc_attr( __fs( 'activate-this-addon', $slug ) ), - __fs( 'activate', $slug ) - ); - } else { - if ( $fs->is_allowed_to_install() ) { - $buttons[] = sprintf( - '<a class="button button-primary" href="%s" class="edit">%s</a>', - wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $addon->slug ), 'install-plugin_' . $addon->slug ), - __fs( 'install-now', $slug ) - ); - } else { - $buttons[] = sprintf( - '<a target="_blank" class="button button-primary" href="%s" class="edit">%s</a>', - $fs->_get_latest_download_local_url( $addon_id ), - __fs( 'download-latest', $slug ) - ); - } - } - } - - if ( $show_upgrade ) { - $buttons[] = sprintf( '<a href="%s" class="thickbox button button-primary" aria-label="%s" data-title="%s"><i class="dashicons dashicons-cart"></i> %s</a>', - esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&parent_plugin_id=' . $fs->get_id() . '&plugin=' . $addon->slug . - '&TB_iframe=true&width=600&height=550' ) ), - esc_attr( sprintf( __fs( 'more-information-about-x', $slug ), $addon->title ) ), - esc_attr( $addon->title ), - __fs( ( $fs_addon->has_free_plan() ? 'upgrade' : 'purchase' ), $slug ) - ); - } - - $buttons_count = count( $buttons ); - ?> - - <td> - <!-- Actions --> - <?php if ($buttons_count > 1) : ?> - <div class="button-group"> - <?php endif ?> - <?php foreach ( $buttons as $button ) : ?> - <?php echo $button ?> - <?php endforeach ?> - <?php if ($buttons_count > 1) : ?> - </div> - <?php endif ?> - </td> - <?php else : ?> - <?php // Add-on NOT Installed or was never connected. - ?> - <td colspan="4"> - <!-- Action --> - <?php if ( $fs->is_addon_installed( $addon->slug ) ) : ?> - <?php $addon_file = $fs->get_addon_basename( $addon->slug ) ?> - <a class="button button-primary" - href="<?php echo wp_nonce_url( 'plugins.php?action=activate&plugin=' . $addon_file, 'activate-plugin_' . $addon_file ) ?>" - title="<?php esc_attr( __fs( 'activate-this-addon', $slug ) ) ?>" - class="edit"><?php _efs( 'activate', $slug ) ?></a> - <?php else : ?> - <?php if ( $fs->is_allowed_to_install() ) : ?> - <a class="button button-primary" - href="<?php echo wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $addon->slug ), 'install-plugin_' . $addon->slug ) ?>"><?php _efs( 'install-now', $slug ) ?></a> - <?php else : ?> - <a target="_blank" class="button button-primary" - href="<?php echo $fs->_get_latest_download_local_url( $addon_id ) ?>"><?php _efs( 'download-latest', $slug ) ?></a> - <?php endif ?> - <?php endif ?> - </td> - <?php endif ?> - <?php if ( defined( 'WP_FS__DEV_MODE' ) && WP_FS__DEV_MODE ) : ?> - <td> - <!-- Optional Delete Action --> - <?php - if ( $is_addon_activated ) { - fs_ui_action_button( - $slug, 'account', - 'delete_account', - __fs( 'delete', $slug ), - array( 'plugin_id' => $addon_id ), - false - ); - } - ?> - </td> - <?php endif ?> - </tr> - <?php $odd = ! $odd; - endforeach ?> - </tbody> - </table> - </div> - </div> - <?php endif ?> - - <?php $fs->do_action( 'after_account_details' ) ?> - </div> - </div> - </div> - </div> - </div> -<?php - $params = array( - 'page' => 'account', - 'module_id' => $fs->get_id(), - 'module_slug' => $slug, - 'module_version' => $fs->get_plugin_version(), - ); - fs_require_template( 'powered-by.php', $params ); -?> \ No newline at end of file +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + /** + * @var FS_Plugin_Tag $update + */ + $update = $fs->get_update( false, false, WP_FS__TIME_24_HOURS_IN_SEC / 24 ); + + if ( is_object($update) ) { + /** + * This logic is particularly required for multisite environment. + * If a module is site activated (not network) and not on the main site, + * the module will NOT be executed on the network level, therefore, the + * custom updates logic will not be executed as well, so unless we force + * the injection of the update into the updates transient, premium updates + * will not work. + * + * @author Vova Feldman (@svovaf) + * @since 2.0.0 + */ + $updater = FS_Plugin_Updater::instance( $fs ); + $updater->set_update_data( $update ); + } + + $is_paying = $fs->is_paying(); + $user = $fs->get_user(); + $site = $fs->get_site(); + $name = $user->get_name(); + $license = $fs->_get_license(); + $subscription = ( is_object( $license ) ? + $fs->_get_subscription( $license->id ) : + null ); + $plan = $fs->get_plan(); + $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); + $is_paid_trial = $fs->is_paid_trial(); + $has_paid_plan = $fs->has_paid_plan(); + $show_upgrade = ( $has_paid_plan && ! $is_paying && ! $is_paid_trial ); + $trial_plan = $fs->get_trial_plan(); + + if ( $has_paid_plan ) { + $fs->_add_license_activation_dialog_box(); + } + + if ( fs_request_get_bool( 'auto_install' ) ) { + $fs->_add_auto_installation_dialog_box(); + } + + if ( fs_request_get_bool( 'activate_license' ) ) { + // Open the license activation dialog box on the account page. + add_action( 'admin_footer', array( + &$fs, + '_open_license_activation_dialog_box' + ) ); + } + + $has_tabs = $fs->_add_tabs_before_content(); + + if ( $has_tabs ) { + $query_params['tabs'] = 'true'; + } + + // Aliases. + $download_latest_text = fs_text_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $slug ); + $downgrade_x_confirm_text = fs_text_inline( 'Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s.', 'downgrade-x-confirm', $slug ); + $cancel_trial_confirm_text = fs_text_inline( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', 'cancel-trial-confirm', $slug ); + $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s updates and support.', 'after-downgrade-non-blocking', $slug ); + $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); + /* translators: %s: Plan title (e.g. "Professional") */ + $activate_plan_text = fs_text_inline( 'Activate %s Plan', 'activate-x-plan', $slug ); + $version_text = fs_text_x_inline( 'Version', 'product version', 'version', $slug ); + /* translators: %s: Time period (e.g. Auto renews in "2 months") */ + $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); + /* translators: %s: Time period (e.g. Expires in "2 months") */ + $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); + $sync_license_text = fs_text_x_inline( 'Sync License', 'as synchronize license', 'sync-license', $slug ); + $cancel_trial_text = fs_text_inline( 'Cancel Trial', 'cancel-trial', $slug ); + $change_plan_text = fs_text_inline( 'Change Plan', 'change-plan', $slug ); + $upgrade_text = fs_text_x_inline( 'Upgrade', 'verb', 'upgrade', $slug ); + $addons_text = fs_text_inline( 'Add-Ons', 'add-ons', $slug ); + $downgrade_text = fs_text_x_inline( 'Downgrade', 'verb', 'downgrade', $slug ); + $trial_text = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); + $free_text = fs_text_inline( 'Free', 'free', $slug ); + $activate_text = fs_text_inline( 'Activate', 'activate', $slug ); + $plan_text = fs_text_x_inline( 'Plan', 'as product pricing plan', 'plan', $slug ); + + $show_plan_row = true; + $show_license_row = is_object( $license ); + + $site_view_params = array(); + + if ( fs_is_network_admin() ) { + $sites = Freemius::get_sites(); + $all_installs_plan_id = null; + $all_installs_license_id = ( $show_license_row ? $license->id : null ); + foreach ( $sites as $s ) { + $site_info = $fs->get_site_info( $s ); + $install = $fs->get_install_by_blog_id( $site_info['blog_id'] ); + $view_params = array( + 'freemius' => $fs, + 'license' => $license, + 'site' => $site_info, + 'install' => $install, + ); + + $site_view_params[] = $view_params; + + if ( empty( $install ) ) { + continue; + } + + if ( $show_plan_row ) { + if ( is_null( $all_installs_plan_id ) ) { + $all_installs_plan_id = $install->plan_id; + } else if ( $all_installs_plan_id != $install->plan_id ) { + $show_plan_row = false; + } + } + + if ( $show_license_row && $all_installs_license_id != $install->license_id ) { + $show_license_row = false; + } + } + } +?> + <div class="wrap fs-section"> + <?php if ( ! $has_tabs && ! $fs->apply_filters( 'hide_account_tabs', false ) ) : ?> + <h2 class="nav-tab-wrapper"> + <a href="<?php echo $fs->get_account_url() ?>" + class="nav-tab nav-tab-active"><?php fs_esc_html_echo_inline( 'Account', 'account', $slug ) ?></a> + <?php if ( $fs->has_addons() ) : ?> + <a href="<?php echo $fs->_get_admin_page_url( 'addons' ) ?>" + class="nav-tab"><?php echo esc_html( $addons_text ) ?></a> + <?php endif ?> + <?php if ( $show_upgrade ) : ?> + <a href="<?php echo $fs->get_upgrade_url() ?>" class="nav-tab"><?php echo esc_html( $upgrade_text ) ?></a> + <?php if ( $fs->apply_filters( 'show_trial', true ) && ! $fs->is_trial_utilized() && $fs->has_trial_plan() ) : ?> + <a href="<?php echo $fs->get_trial_url() ?>" class="nav-tab"><?php fs_esc_html_echo_inline( 'Free Trial', 'free-trial', $slug ) ?></a> + <?php endif ?> + <?php endif ?> + </h2> + <?php endif ?> + + <div id="poststuff"> + <div id="fs_account"> + <div class="has-sidebar has-right-sidebar"> + <div class="has-sidebar-content"> + <div class="postbox"> + <h3><span class="dashicons dashicons-businessman"></span> <?php fs_esc_html_echo_inline( 'Account Details', 'account-details', $slug ) ?></h3> + <div class="fs-header-actions"> + <ul> + <?php if ( ! $is_paying ) : ?> + <li> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="delete_account"> + <?php wp_nonce_field( 'delete_account' ) ?> + <a class="fs-delete-account" href="#" onclick="if (confirm('<?php + if ( $is_active_subscription ) { + echo esc_attr( sprintf( fs_text_inline( 'Deleting the account will automatically deactivate your %s plan license so you can use it on other sites. If you want to terminate the recurring payments as well, click the "Cancel" button, and first "Downgrade" your account. Are you sure you would like to continue with the deletion?', 'delete-account-x-confirm', $slug ), $plan->title ) ); + } else { + echo esc_attr( sprintf( fs_text_inline( 'Deletion is not temporary. Only delete if you no longer want to use this %s anymore. Are you sure you would like to continue with the deletion?', 'delete-account-confirm', $slug ), $fs->get_module_label( true ) ) ); + } + ?>')) this.parentNode.submit(); return false;"><i + class="dashicons dashicons-no"></i> <?php fs_esc_html_echo_inline( 'Delete Account', 'delete-account', $slug ) ?></a> + </form> + </li> + <li> • </li> + <?php endif ?> + <?php if ( $is_paying ) : ?> + <?php if ( ! fs_is_network_admin() ) : ?> + <li> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="deactivate_license"> + <?php wp_nonce_field( 'deactivate_license' ) ?> + <a href="#" class="fs-deactivate-license"><i + class="dashicons dashicons-admin-network"></i> <?php fs_echo_inline( 'Deactivate License', 'deactivate-license', $slug ) ?> + </a> + </form> + </li> + <li> • </li> + <?php endif ?> + <?php if ( ! $license->is_lifetime() && + $is_active_subscription + ) : ?> + <li> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="downgrade_account"> + <?php wp_nonce_field( 'downgrade_account' ) ?> + <a href="#" + onclick="if ( confirm('<?php echo esc_attr( sprintf( $downgrade_x_confirm_text, $plan->title, human_time_diff( time(), strtotime( $license->expiration ) ) ) ) ?> <?php if ( ! $license->is_block_features ) { + echo esc_attr( sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs->get_module_label( true ) ) ); + } else { + echo esc_attr( sprintf( $after_downgrade_blocking_text, $plan->title ) ); + }?> <?php fs_esc_attr_echo_inline( 'Are you sure you want to proceed?', 'proceed-confirmation', $slug ) ?>') ) this.parentNode.submit(); return false;"><i class="dashicons dashicons-download"></i> <?php echo esc_html( $fs->is_only_premium() ? fs_text_inline( 'Cancel Subscription', 'cancel-subscription', $slug ) : $downgrade_text ) ?></a> + </form> + </li> + <li> • </li> + <?php endif ?> + <?php if ( ! $fs->is_single_plan() ) : ?> + <li> + <a href="<?php echo $fs->get_upgrade_url() ?>"><i + class="dashicons dashicons-grid-view"></i> <?php echo esc_html( $change_plan_text ) ?></a> + </li> + <li> • </li> + <?php endif ?> + <?php elseif ( $is_paid_trial ) : ?> + <li> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="cancel_trial"> + <?php wp_nonce_field( 'cancel_trial' ) ?> + <a href="#" + onclick="if (confirm('<?php echo esc_attr( $cancel_trial_confirm_text ) ?>')) this.parentNode.submit(); return false;"><i + class="dashicons dashicons-download"></i> <?php echo esc_html( $cancel_trial_text ) ?></a> + </form> + </li> + <li> • </li> + <?php endif ?> + <li> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $fs->get_unique_affix() ?>_sync_license"> + <?php wp_nonce_field( $fs->get_unique_affix() . '_sync_license' ) ?> + <a href="#" onclick="this.parentNode.submit(); return false;"><i + class="dashicons dashicons-image-rotate"></i> <?php fs_esc_html_echo_x_inline( 'Sync', 'as synchronize', 'sync', $slug ) ?></a> + </form> + </li> + + </ul> + </div> + <div class="inside"> + <table id="fs_account_details" cellspacing="0" class="fs-key-value-table"> + <?php + $hide_license_key = ( ! $show_license_row || $fs->apply_filters( 'hide_license_key', false ) ); + + $profile = array(); + $profile[] = array( + 'id' => 'user_name', + 'title' => fs_text_inline( 'Name', 'name', $slug ), + 'value' => $name + ); + // if (isset($user->email) && false !== strpos($user->email, '@')) + $profile[] = array( + 'id' => 'email', + 'title' => fs_text_inline( 'Email', 'email', $slug ), + 'value' => $user->email + ); + + if ( is_numeric( $user->id ) ) { + $profile[] = array( + 'id' => 'user_id', + 'title' => fs_text_inline( 'User ID', 'user-id', $slug ), + 'value' => $user->id + ); + } + + if ( ! fs_is_network_admin()) { + $profile[] = array( + 'id' => 'site_id', + 'title' => fs_text_inline( 'Site ID', 'site-id', $slug ), + 'value' => is_string( $site->id ) ? + $site->id : + fs_text_inline( 'No ID', 'no-id', $slug ) + ); + + $profile[] = array( + 'id' => 'site_public_key', + 'title' => fs_text_inline( 'Public Key', 'public-key', $slug ), + 'value' => $site->public_key + ); + + $profile[] = array( + 'id' => 'site_secret_key', + 'title' => fs_text_inline( 'Secret Key', 'secret-key', $slug ), + 'value' => ( ( is_string( $site->secret_key ) ) ? + $site->secret_key : + fs_text_x_inline( 'No Secret', 'as secret encryption key missing', 'no-secret', $slug ) + ) + ); + } + + $profile[] = array( + 'id' => 'version', + 'title' => $version_text, + 'value' => $fs->get_plugin_version() + ); + + if ( $has_paid_plan ) { + if ( $fs->is_trial() ) { + if ( $show_plan_row ) { + $profile[] = array( + 'id' => 'plan', + 'title' => $plan_text, + 'value' => ( is_string( $trial_plan->name ) ? + strtoupper( $trial_plan->title ) : + fs_text_inline( 'Trial', 'trial', $slug ) ) + ); + } + } else { + if ( $show_plan_row ) { + $profile[] = array( + 'id' => 'plan', + 'title' => $plan_text, + 'value' => strtoupper( is_string( $plan->name ) ? + $plan->title : + strtoupper( $free_text ) + ) + ); + } + + if ( is_object( $license ) ) { + if ( ! $hide_license_key ) { + $profile[] = array( + 'id' => 'license_key', + 'title' => fs_text_inline( 'License Key', $slug ), + 'value' => $license->secret_key, + ); + } + } + } + } + ?> + <?php $odd = true; + foreach ( $profile as $p ) : ?> + <?php + if ( 'plan' === $p['id'] && ! $has_paid_plan ) { + // If plugin don't have any paid plans, there's no reason + // to show current plan. + continue; + } + ?> + <tr class="fs-field-<?php echo $p['id'] ?><?php if ( $odd ) : ?> alternate<?php endif ?>"> + <td> + <nobr><?php echo $p['title'] ?>:</nobr> + </td> + <td<?php if ( 'plan' === $p['id'] ) { echo ' colspan="2"'; }?>> + <?php if ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?> + <code><?php echo htmlspecialchars( substr( $p['value'], 0, 6 ) ) . str_pad( '', 23 * 6, '•' ) . htmlspecialchars( substr( $p['value'], - 3 ) ) ?></code> + <input type="text" value="<?php echo htmlspecialchars( $p['value'] ) ?>" style="display: none" + readonly/> + <?php else : ?> + <code><?php echo htmlspecialchars( $p['value'] ) ?></code> + <?php endif ?> + <?php if ( 'email' === $p['id'] && ! $user->is_verified() ) : ?> + <label class="fs-tag fs-warn"><?php fs_esc_html_echo_inline( 'not verified', 'not-verified', $slug ) ?></label> + <?php endif ?> + <?php if ( 'plan' === $p['id'] ) : ?> + <?php if ( $fs->is_trial() ) : ?> + <label class="fs-tag fs-success"><?php echo esc_html( $trial_text ) ?></label> + <?php endif ?> + <?php if ( is_object( $license ) && ! $license->is_lifetime() ) : ?> + <?php if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) : ?> + <?php $is_license_expired = $license->is_expired() ?> + <?php $expired_ago_text = ( fs_text_inline( 'Expired', 'expired', $slug ) . ' ' . fs_text_x_inline( '%s ago', 'x-ago', $slug ) ) ?> + <label + class="fs-tag <?php echo $is_license_expired ? 'fs-error' : 'fs-warn' ?>"><?php + echo esc_html( sprintf( $is_license_expired ? $expired_ago_text : $expires_in_text, human_time_diff( time(), strtotime( $license->expiration ) ) ) ) + ?></label> + <?php elseif ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) : ?> + <label class="fs-tag fs-success"><?php echo esc_html( sprintf( $renews_in_text, human_time_diff( time(), strtotime( $subscription->next_payment ) ) ) ) ?></label> + <?php endif ?> + <?php elseif ( $fs->is_trial() ) : ?> + <label class="fs-tag fs-warn"><?php echo esc_html( sprintf( $expires_in_text, human_time_diff( time(), strtotime( $site->trial_ends ) ) ) ) ?></label> + <?php endif ?> + <div class="button-group"> + <?php $available_license = $fs->is_free_plan() && ! fs_is_network_admin() ? $fs->_get_available_premium_license( $site->is_localhost() ) : false ?> + <?php if ( is_object( $available_license ) ) : ?> + <?php $premium_plan = $fs->_get_plan_by_id( $available_license->plan_id ) ?> + <?php + $view_params = array( + 'freemius' => $fs, + 'slug' => $slug, + 'license' => $available_license, + 'plan' => $premium_plan, + 'is_localhost' => $site->is_localhost(), + 'install_id' => $site->id, + 'class' => 'button-primary', + ); + fs_require_template( 'account/partials/activate-license-button.php', $view_params ); ?> + <?php else : ?> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" + method="POST" class="button-group"> + <?php if ( $show_upgrade && $fs->is_premium() ) : ?> + <a class="button activate-license-trigger <?php echo $fs->get_unique_affix() ?>" href="#"><?php fs_esc_html_echo_inline( 'Activate License', 'activate-license', $slug ) ?></a> + <?php endif ?> + <input type="submit" class="button" + value="<?php echo esc_attr( $sync_license_text ) ?>"> + <input type="hidden" name="fs_action" + value="<?php echo $fs->get_unique_affix() ?>_sync_license"> + <?php wp_nonce_field( $fs->get_unique_affix() . '_sync_license' ) ?> + <?php if ( $show_upgrade || ! $fs->is_single_plan() ) : ?> + <a href="<?php echo $fs->get_upgrade_url() ?>" + class="button<?php + echo $show_upgrade ? + ' button-primary fs-upgrade' : + ' fs-change-plan'; ?> button-upgrade"><i + class="dashicons dashicons-cart"></i> <?php echo esc_html( $show_upgrade ? $upgrade_text : $change_plan_text ) ?></a> + <?php endif ?> + </form> + <?php endif ?> + </div> + <?php elseif ( 'version' === $p['id'] && $has_paid_plan ) : ?> + <?php if ( $fs->has_premium_version() ) : ?> + <?php if ( $fs->is_premium() ) : ?> + <label + class="fs-tag fs-<?php echo $fs->can_use_premium_code() ? 'success' : 'warn' ?>"><?php fs_esc_html_echo_inline( 'Premium version', 'premium-version', $slug ) ?></label> + <?php elseif ( $fs->can_use_premium_code() ) : ?> + <label class="fs-tag fs-warn"><?php fs_esc_html_echo_inline( 'Free version', 'free-version', $slug ) ?></label> + <?php endif ?> + <?php endif ?> + <?php endif ?> + </td> + <?php if ( 'plan' !== $p['id'] ) : ?> + <td class="fs-right"> + <?php if ( 'email' === $p['id'] && ! $user->is_verified() ) : ?> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="verify_email"> + <?php wp_nonce_field( 'verify_email' ) ?> + <input type="submit" class="button button-small" + value="<?php fs_esc_attr_echo_inline( 'Verify Email', 'verify-email', $slug ) ?>"> + </form> + <?php endif ?> + <?php if ( 'version' === $p['id'] ) : ?> + <?php if ( $fs->has_release_on_freemius() ) : ?> + <div class="button-group"> + <?php if ( $is_paying || $fs->is_trial() ) : ?> + <?php if ( ! $fs->is_allowed_to_install() ) : ?> + <a target="_blank" class="button button-primary" + href="<?php echo $fs->_get_latest_download_local_url() ?>"><?php echo sprintf( + /* translators: %s: plan name (e.g. Download "Professional" Version) */ + fs_text_inline( 'Download %s Version', 'download-x-version', $slug ), + ( $fs->is_trial() ? $trial_plan->title : $plan->title ) ) . ( is_object( $update ) ? ' [' . $update->version . ']' : '' ) ?></a> + <?php elseif ( is_object( $update ) ) : ?> + <?php + $module_type = $fs->get_module_type(); + ?> + <a class="button button-primary" + href="<?php echo wp_nonce_url( self_admin_url( "update.php?action=upgrade-{$module_type}&{$module_type}=" . $fs->get_plugin_basename() ), "upgrade-{$module_type}_" . $fs->get_plugin_basename() ) ?>"><?php echo fs_esc_html_inline( 'Install Update Now', 'install-update-now', $slug ) . ' [' . $update->version . ']' ?></a> + <?php endif ?> + <?php endif; ?> + </div> + <?php endif ?> + <?php + elseif ( in_array( $p['id'], array( 'license_key', 'site_secret_key' ) ) ) : ?> + <button class="button button-small fs-toggle-visibility"><?php fs_esc_html_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?></button> + <?php if ('license_key' === $p['id']) : ?> + <button class="button button-small activate-license-trigger <?php echo $fs->get_unique_affix() ?>"><?php fs_esc_html_echo_inline( 'Change License', 'change-license', $slug ) ?></button> + <?php endif ?> + <?php + elseif (/*in_array($p['id'], array('site_secret_key', 'site_id', 'site_public_key')) ||*/ + ( is_string( $user->secret_key ) && in_array( $p['id'], array( + 'email', + 'user_name' + ) ) ) + ) : ?> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST" + onsubmit="var val = prompt('<?php echo esc_attr( sprintf( + /* translators: %s: User's account property (e.g. name, email) */ + fs_text_inline( 'What is your %s?', 'what-is-your-x', $slug ), + $p['title'] + ) ) ?>', '<?php echo $p['value'] ?>'); if (null == val || '' === val) return false; jQuery('input[name=fs_<?php echo $p['id'] ?>_<?php echo $fs->get_unique_affix() ?>]').val(val); return true;"> + <input type="hidden" name="fs_action" value="update_<?php echo $p['id'] ?>"> + <input type="hidden" name="fs_<?php echo $p['id'] ?>_<?php echo $fs->get_unique_affix() ?>" + value=""> + <?php wp_nonce_field( 'update_' . $p['id'] ) ?> + <input type="submit" class="button button-small" + value="<?php echo fs_esc_attr_x_inline( 'Edit', 'verb', 'edit', $slug ) ?>"> + </form> + <?php endif ?> + </td> + <?php endif ?> + </tr> + <?php $odd = ! $odd; + endforeach ?> + </table> + </div> + </div> + <?php if ( fs_is_network_admin() ) : ?> + <div id="fs_sites" class="postbox"> + <h3><span class="dashicons dashicons-networking"></span> <?php fs_esc_html_echo_inline( 'Sites', 'sites', $slug ) ?></h3> + <div class="fs-header-actions"> + <?php $has_license = is_object( $license ) ?> + <?php if ( $has_license || ( $show_upgrade && $fs->is_premium() ) ) : ?> + <?php + $activate_license_button_text = $has_license ? + fs_esc_html_inline( 'Change License', 'change-license', $slug ) : + fs_esc_html_inline( 'Activate License', 'activate-license', $slug ); + ?> + <a class="button<?php echo ( ! $has_license ? ' button-primary' : '' ) ?> activate-license-trigger <?php echo $fs->get_unique_affix() ?>" href="#"><?php echo $activate_license_button_text ?></a> + <?php endif ?> + <input class="fs-search" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Search by address', 'search-by-address', $slug ) ?>..."><span class="dashicons dashicons-search"></span> + </div> + + <div class="inside"> + <div id="" class="fs-scrollable-table"> + <div class="fs-table-head"> + <table class="widefat"> + <thead> + <tr> + <td><?php fs_esc_html_echo_inline('ID', 'id', $slug) ?></td> + <td><?php fs_esc_html_echo_inline('Address', 'address', $slug) ?></td> + <td><?php fs_esc_html_echo_inline('License', 'license', $slug) ?></td> + <td><?php fs_esc_html_echo_inline('Plan', 'plan', $slug) ?></td> + <td></td> + </tr> + </thead> + </table> + </div> + <div class="fs-table-body"> + <table class="widefat"> + <?php + foreach ( $site_view_params as $view_params ) { + fs_require_template( + 'account/partials/site.php', + $view_params + ); + } ?> + </table> + </div> + </div> + </div> + </div> + <?php endif ?> + + <?php + $account_addons = $fs->get_account_addons(); + if ( ! is_array( $account_addons ) ) { + $account_addons = array(); + } + + $installed_addons = $fs->get_installed_addons(); + $installed_addons_ids = array(); + foreach ( $installed_addons as $fs_addon ) { + $installed_addons_ids[] = $fs_addon->get_id(); + } + + $addons_to_show = array_unique( array_merge( $installed_addons_ids, $account_addons ) ); + ?> + <?php if ( 0 < count( $addons_to_show ) ) : ?> + <!-- Add-Ons --> + <div class="postbox"> + <div class=""> + <!-- <div class="inside">--> + <table id="fs_addons" class="widefat"> + <thead> + <tr> + <th><h3><?php echo esc_html( $addons_text ) ?></h3></th> + <th><?php fs_esc_html_echo_inline( 'ID', 'id', $slug ) ?></th> + <th><?php echo esc_html( $version_text ) ?></th> + <th><?php echo esc_html( $plan_text ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'License', 'as software license', 'license', $slug ) ?></th> + <th></th> + <?php if ( defined( 'WP_FS__DEV_MODE' ) && WP_FS__DEV_MODE ) : ?> + <th></th> + <?php endif ?> + </tr> + </thead> + <tbody> + <?php $odd = true; + foreach ( $addons_to_show as $addon_id ) { + $addon_view_params = array( + 'parent_fs' => $fs, + 'addon_id' => $addon_id, + 'odd' => $odd, + ); + + fs_require_template( + 'account/partials/addon.php', + $addon_view_params + ); + + $odd = ! $odd; + } ?> + </tbody> + </table> + </div> + </div> + <?php endif ?> + + <?php $fs->do_action( 'after_account_details' ) ?> + + <?php + $view_params = array( 'id' => $VARS['id'] ); + fs_require_once_template( 'account/billing.php', $view_params ); + fs_require_once_template( 'account/payments.php', $view_params ); + ?> + </div> + </div> + </div> + </div> + </div> + <script type="text/javascript"> + (function ($) { + var setLoading = function ($this, label) { + // Set loading mode. + $(document.body).css({'cursor': 'wait'}); + + $this.css({'cursor': 'wait'}); + + if ($this.is('input')) + $this.val(label); + else + $this.html(label); + + setTimeout(function () { + $this.attr('disabled', 'disabled'); + }, 200); + }; + + $('.fs-toggle-visibility').click(function () { + var + $this = $(this), + $parent = $this.closest('tr'), + $input = $parent.find('input'); + + $parent.find('code').toggle(); + $input.toggle(); + + if ($input.is(':visible')) { + $this.html('<?php fs_esc_js_echo_x_inline( 'Hide', 'verb', 'hide', $slug ) ?>'); + setTimeout(function () { + $input.select().focus(); + }, 100); + } + else { + $this.html( '<?php fs_esc_js_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?>' ); + } + }); + + $('.fs-toggle-tracking').click(function () { + setLoading( + $(this), + ($(this).data('is-disconnected') ? + '<?php fs_esc_js_echo_inline('Opting in', 'opting-in' ) ?>' : + '<?php fs_esc_js_echo_inline('Opting out', 'opting-out' ) ?>') + + '...' + ); + }); + + $('.fs-opt-in').click(function () { + setLoading($(this), '<?php fs_esc_js_echo_inline('Opting in', 'opting-in' ) ?>...'); + }); + + $( '#fs_downgrade' ).submit(function( event ) { + event.preventDefault(); + + setLoading( $( this ).find( '.button' ), '<?php fs_esc_js_echo_inline( 'Downgrading', 'downgrading' ) ?>...' ); + }); + + $('.fs-activate-license').click(function () { + setLoading($(this), '<?php fs_esc_js_echo_inline('Activating', 'activating' ) ?>...'); + }); + + $('.fs-deactivate-license').click(function () { + if (confirm('<?php fs_esc_attr_echo_inline( 'Deactivating your license will block all premium features, but will enable activating the license on another site. Are you sure you want to proceed?', 'deactivate-license-confirm', $slug ) ?>')) { + var $this = $(this); + + setLoading($this, '<?php fs_esc_js_echo_inline('Deactivating', 'deactivating' ) ?>...'); + $this[0].parentNode.submit(); + } + + return false; + }); + + var $sitesSection = $('#fs_sites'), + $sitesTable = $sitesSection.find('.fs-scrollable-table'), + $sitesTableRows = $sitesTable.find('.fs-site-details'); + + $('.fs-show-install-details').click(function(){ + var installID = $(this).parents('.fs-site-details').attr('data-install-id'); + $sitesSection.find('.fs-install-details[data-install-id=' + installID + ']').toggle(); + }); + + + var adjustColumnWidth = function($table) { + var $headerColumns = $table.find('.fs-table-head td'), + $bodyColumns = $table.find('.fs-table-body tr:first > td'); + + for (var i = 0, len = $headerColumns.length; i < len; i++) { + $($headerColumns[i]).width($($bodyColumns[i]).width()); + } + for (i = 0, len = $headerColumns.length; i < len; i++) { + $($bodyColumns[i]).width($($headerColumns[i]).width()); + } + }; + + adjustColumnWidth($sitesTable); + + $sitesSection.find('.fs-search').keyup(function(){ + var search = $(this).val().trim(); + + if ('' === search){ + // Show all. + $sitesTableRows.show(); + return; + } + + var url; + + $sitesTableRows.each(function(index){ + url = $(this).find('.fs-field-url').html(); + + if (-1 < url.indexOf(search)){ + $(this).show(); + } else { + $(this).hide(); + } + }); + }); + + })(jQuery); + </script> +<?php + if ( $has_tabs ) { + $fs->_add_tabs_after_content(); + } + + $params = array( + 'page' => 'account', + 'module_id' => $fs->get_id(), + 'module_type' => $fs->get_module_type(), + 'module_slug' => $slug, + 'module_version' => $fs->get_plugin_version(), + ); + fs_require_template( 'powered-by.php', $params ); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/billing.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/billing.php new file mode 100644 index 000000000..f916ab19e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/billing.php @@ -0,0 +1,431 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2016, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + $payments = $fs->_fetch_payments(); + + $show_billing = ( is_array( $payments ) && 0 < count( $payments ) ); + + if ( $show_billing ) : + + $edit_text = fs_text_x_inline( 'Edit', 'verb', 'edit', $slug ); + $update_text = fs_text_x_inline( 'Update', 'verb', 'update', $slug ); + + $billing = $fs->_fetch_billing(); + $has_billing = ( $billing instanceof FS_Billing ); + if ( ! $has_billing ) { + $billing = new FS_Billing(); + } +?> +<!-- Billing --> +<div class="postbox"> + <div id="fs_billing"> + <h3><span class="dashicons dashicons-portfolio"></span> <?php fs_esc_html_echo_inline( 'Billing', 'billing', $slug ) ?></h3> + <table id="fs_billing_address"<?php if ( $has_billing ) { + echo ' class="fs-read-mode"'; + } ?>> + <tr> + <td><label><span><?php fs_esc_html_echo_inline( 'Business name', 'business-name', $slug ) ?>:</span> <input id="business_name" value="<?php echo $billing->business_name ?>" placeholder="<?php fs_esc_attr_echo_inline( 'Business name', 'business-name', $slug ) ?>"></label></td> + <td><label><span><?php fs_esc_html_echo_inline( 'Tax / VAT ID', 'tax-vat-id', $slug ) ?>:</span> <input id="tax_id" value="<?php echo $billing->tax_id ?>" placeholder="<?php fs_esc_attr_echo_inline( 'Tax / VAT ID', 'tax-vat-id', $slug ) ?>"></label></td> + </tr> + <tr> + <td><label><span><?php printf( fs_esc_html_inline( 'Address Line %d', 'address-line-n', $slug ), 1 ) ?>:</span> <input id="address_street" value="<?php echo $billing->address_street ?>" placeholder="<?php printf( fs_esc_attr_inline( 'Address Line %d', 'address-line-n', $slug ), 1 ) ?>"></label></td> + <td><label><span><?php printf( fs_esc_html_inline( 'Address Line %d', 'address-line-n', $slug ), 2 ) ?>:</span> <input id="address_apt" value="<?php echo $billing->address_apt ?>" placeholder="<?php printf( fs_esc_attr_inline( 'Address Line %d', 'address-line-n', $slug ), 2 ) ?>"></label></td> + </tr> + <tr> + <td><label><span><?php fs_esc_html_echo_inline( 'City', 'city', $slug ) ?> / <?php fs_esc_html_echo_inline( 'Town', 'town', $slug ) ?>:</span> <input id="address_city" value="<?php echo $billing->address_city ?>" placeholder="<?php fs_esc_attr_echo_inline( 'City', 'city', $slug ) ?> / <?php fs_esc_attr_echo_inline( 'Town', 'town', $slug ) ?>"></label></td> + <td><label><span><?php fs_esc_html_echo_inline( 'ZIP / Postal Code', 'zip-postal-code', $slug ) ?>:</span> <input id="address_zip" value="<?php echo $billing->address_zip ?>" placeholder="<?php fs_esc_attr_echo_inline( 'ZIP / Postal Code', 'zip-postal-code', $slug ) ?>"></label></td> + </tr> + <tr> + <?php $countries = array( + 'AF' => 'Afghanistan', + 'AX' => 'Aland Islands', + 'AL' => 'Albania', + 'DZ' => 'Algeria', + 'AS' => 'American Samoa', + 'AD' => 'Andorra', + 'AO' => 'Angola', + 'AI' => 'Anguilla', + 'AQ' => 'Antarctica', + 'AG' => 'Antigua and Barbuda', + 'AR' => 'Argentina', + 'AM' => 'Armenia', + 'AW' => 'Aruba', + 'AU' => 'Australia', + 'AT' => 'Austria', + 'AZ' => 'Azerbaijan', + 'BS' => 'Bahamas', + 'BH' => 'Bahrain', + 'BD' => 'Bangladesh', + 'BB' => 'Barbados', + 'BY' => 'Belarus', + 'BE' => 'Belgium', + 'BZ' => 'Belize', + 'BJ' => 'Benin', + 'BM' => 'Bermuda', + 'BT' => 'Bhutan', + 'BO' => 'Bolivia', + 'BQ' => 'Bonaire, Saint Eustatius and Saba', + 'BA' => 'Bosnia and Herzegovina', + 'BW' => 'Botswana', + 'BV' => 'Bouvet Island', + 'BR' => 'Brazil', + 'IO' => 'British Indian Ocean Territory', + 'VG' => 'British Virgin Islands', + 'BN' => 'Brunei', + 'BG' => 'Bulgaria', + 'BF' => 'Burkina Faso', + 'BI' => 'Burundi', + 'KH' => 'Cambodia', + 'CM' => 'Cameroon', + 'CA' => 'Canada', + 'CV' => 'Cape Verde', + 'KY' => 'Cayman Islands', + 'CF' => 'Central African Republic', + 'TD' => 'Chad', + 'CL' => 'Chile', + 'CN' => 'China', + 'CX' => 'Christmas Island', + 'CC' => 'Cocos Islands', + 'CO' => 'Colombia', + 'KM' => 'Comoros', + 'CK' => 'Cook Islands', + 'CR' => 'Costa Rica', + 'HR' => 'Croatia', + 'CU' => 'Cuba', + 'CW' => 'Curacao', + 'CY' => 'Cyprus', + 'CZ' => 'Czech Republic', + 'CD' => 'Democratic Republic of the Congo', + 'DK' => 'Denmark', + 'DJ' => 'Djibouti', + 'DM' => 'Dominica', + 'DO' => 'Dominican Republic', + 'TL' => 'East Timor', + 'EC' => 'Ecuador', + 'EG' => 'Egypt', + 'SV' => 'El Salvador', + 'GQ' => 'Equatorial Guinea', + 'ER' => 'Eritrea', + 'EE' => 'Estonia', + 'ET' => 'Ethiopia', + 'FK' => 'Falkland Islands', + 'FO' => 'Faroe Islands', + 'FJ' => 'Fiji', + 'FI' => 'Finland', + 'FR' => 'France', + 'GF' => 'French Guiana', + 'PF' => 'French Polynesia', + 'TF' => 'French Southern Territories', + 'GA' => 'Gabon', + 'GM' => 'Gambia', + 'GE' => 'Georgia', + 'DE' => 'Germany', + 'GH' => 'Ghana', + 'GI' => 'Gibraltar', + 'GR' => 'Greece', + 'GL' => 'Greenland', + 'GD' => 'Grenada', + 'GP' => 'Guadeloupe', + 'GU' => 'Guam', + 'GT' => 'Guatemala', + 'GG' => 'Guernsey', + 'GN' => 'Guinea', + 'GW' => 'Guinea-Bissau', + 'GY' => 'Guyana', + 'HT' => 'Haiti', + 'HM' => 'Heard Island and McDonald Islands', + 'HN' => 'Honduras', + 'HK' => 'Hong Kong', + 'HU' => 'Hungary', + 'IS' => 'Iceland', + 'IN' => 'India', + 'ID' => 'Indonesia', + 'IR' => 'Iran', + 'IQ' => 'Iraq', + 'IE' => 'Ireland', + 'IM' => 'Isle of Man', + 'IL' => 'Israel', + 'IT' => 'Italy', + 'CI' => 'Ivory Coast', + 'JM' => 'Jamaica', + 'JP' => 'Japan', + 'JE' => 'Jersey', + 'JO' => 'Jordan', + 'KZ' => 'Kazakhstan', + 'KE' => 'Kenya', + 'KI' => 'Kiribati', + 'XK' => 'Kosovo', + 'KW' => 'Kuwait', + 'KG' => 'Kyrgyzstan', + 'LA' => 'Laos', + 'LV' => 'Latvia', + 'LB' => 'Lebanon', + 'LS' => 'Lesotho', + 'LR' => 'Liberia', + 'LY' => 'Libya', + 'LI' => 'Liechtenstein', + 'LT' => 'Lithuania', + 'LU' => 'Luxembourg', + 'MO' => 'Macao', + 'MK' => 'Macedonia', + 'MG' => 'Madagascar', + 'MW' => 'Malawi', + 'MY' => 'Malaysia', + 'MV' => 'Maldives', + 'ML' => 'Mali', + 'MT' => 'Malta', + 'MH' => 'Marshall Islands', + 'MQ' => 'Martinique', + 'MR' => 'Mauritania', + 'MU' => 'Mauritius', + 'YT' => 'Mayotte', + 'MX' => 'Mexico', + 'FM' => 'Micronesia', + 'MD' => 'Moldova', + 'MC' => 'Monaco', + 'MN' => 'Mongolia', + 'ME' => 'Montenegro', + 'MS' => 'Montserrat', + 'MA' => 'Morocco', + 'MZ' => 'Mozambique', + 'MM' => 'Myanmar', + 'NA' => 'Namibia', + 'NR' => 'Nauru', + 'NP' => 'Nepal', + 'NL' => 'Netherlands', + 'NC' => 'New Caledonia', + 'NZ' => 'New Zealand', + 'NI' => 'Nicaragua', + 'NE' => 'Niger', + 'NG' => 'Nigeria', + 'NU' => 'Niue', + 'NF' => 'Norfolk Island', + 'KP' => 'North Korea', + 'MP' => 'Northern Mariana Islands', + 'NO' => 'Norway', + 'OM' => 'Oman', + 'PK' => 'Pakistan', + 'PW' => 'Palau', + 'PS' => 'Palestinian Territory', + 'PA' => 'Panama', + 'PG' => 'Papua New Guinea', + 'PY' => 'Paraguay', + 'PE' => 'Peru', + 'PH' => 'Philippines', + 'PN' => 'Pitcairn', + 'PL' => 'Poland', + 'PT' => 'Portugal', + 'PR' => 'Puerto Rico', + 'QA' => 'Qatar', + 'CG' => 'Republic of the Congo', + 'RE' => 'Reunion', + 'RO' => 'Romania', + 'RU' => 'Russia', + 'RW' => 'Rwanda', + 'BL' => 'Saint Barthelemy', + 'SH' => 'Saint Helena', + 'KN' => 'Saint Kitts and Nevis', + 'LC' => 'Saint Lucia', + 'MF' => 'Saint Martin', + 'PM' => 'Saint Pierre and Miquelon', + 'VC' => 'Saint Vincent and the Grenadines', + 'WS' => 'Samoa', + 'SM' => 'San Marino', + 'ST' => 'Sao Tome and Principe', + 'SA' => 'Saudi Arabia', + 'SN' => 'Senegal', + 'RS' => 'Serbia', + 'SC' => 'Seychelles', + 'SL' => 'Sierra Leone', + 'SG' => 'Singapore', + 'SX' => 'Sint Maarten', + 'SK' => 'Slovakia', + 'SI' => 'Slovenia', + 'SB' => 'Solomon Islands', + 'SO' => 'Somalia', + 'ZA' => 'South Africa', + 'GS' => 'South Georgia and the South Sandwich Islands', + 'KR' => 'South Korea', + 'SS' => 'South Sudan', + 'ES' => 'Spain', + 'LK' => 'Sri Lanka', + 'SD' => 'Sudan', + 'SR' => 'Suriname', + 'SJ' => 'Svalbard and Jan Mayen', + 'SZ' => 'Swaziland', + 'SE' => 'Sweden', + 'CH' => 'Switzerland', + 'SY' => 'Syria', + 'TW' => 'Taiwan', + 'TJ' => 'Tajikistan', + 'TZ' => 'Tanzania', + 'TH' => 'Thailand', + 'TG' => 'Togo', + 'TK' => 'Tokelau', + 'TO' => 'Tonga', + 'TT' => 'Trinidad and Tobago', + 'TN' => 'Tunisia', + 'TR' => 'Turkey', + 'TM' => 'Turkmenistan', + 'TC' => 'Turks and Caicos Islands', + 'TV' => 'Tuvalu', + 'VI' => 'U.S. Virgin Islands', + 'UG' => 'Uganda', + 'UA' => 'Ukraine', + 'AE' => 'United Arab Emirates', + 'GB' => 'United Kingdom', + 'US' => 'United States', + 'UM' => 'United States Minor Outlying Islands', + 'UY' => 'Uruguay', + 'UZ' => 'Uzbekistan', + 'VU' => 'Vanuatu', + 'VA' => 'Vatican', + 'VE' => 'Venezuela', + 'VN' => 'Vietnam', + 'WF' => 'Wallis and Futuna', + 'EH' => 'Western Sahara', + 'YE' => 'Yemen', + 'ZM' => 'Zambia', + 'ZW' => 'Zimbabwe', + ) ?> + <td><label><span><?php fs_esc_html_echo_inline( 'Country', 'country', $slug ) ?>:</span> <select id="address_country_code"> + <?php if ( empty( $billing->address_country_code ) ) : ?> + <option value="" selected><?php fs_esc_html_echo_inline( 'Select Country', 'select-country', $slug ) ?></option> + <?php endif ?> + <?php foreach ( $countries as $code => $country ) : ?> + <option + value="<?php echo $code ?>" <?php selected( $billing->address_country_code, $code ) ?>><?php echo $country ?></option> + <?php endforeach ?> + </select></label></td> + <td><label><span><?php fs_esc_html_echo_inline( 'State', 'state', $slug ) ?> / <?php fs_esc_html_echo_inline( 'Province', 'province', $slug ) ?>:</span> + <input id="address_state" value="<?php echo $billing->address_state ?>" placeholder="<?php fs_esc_html_echo_inline( 'State', 'state', $slug ) ?> / <?php fs_esc_html_echo_inline( 'Province', 'province', $slug ) ?>"></label></td> + </tr> + <tr> + <td colspan="2"> + <button + class="button"><?php echo esc_html( $has_billing ? + $edit_text : + $update_text + ) ?></button> + </td> + </tr> + </table> + </div> +</div> +<!--/ Billing --> +<script type="text/javascript"> + (function($){ + var $billingAddress = $('#fs_billing_address'), + $billingInputs = $billingAddress.find('input, select'); + + var setPrevValues = function () { + $billingInputs.each(function () { + $(this).attr('data-val', $(this).val()); + }); + }; + + setPrevValues(); + + var hasBillingChanged = function () { + for (var i = 0, len = $billingInputs.length; i < len; i++){ + var $this = $($billingInputs[i]); + if ($this.attr('data-val') !== $this.val()) { + return true; + } + } + + return false; + }; + + var isEditAllFieldsMode = false; + + $billingAddress.find('.button').click(function(){ + $billingAddress.toggleClass('fs-read-mode'); + + var isEditMode = !$billingAddress.hasClass('fs-read-mode'); + + $(this) + .html(isEditMode ? '<?php echo esc_js( $update_text ) ?>' : '<?php echo esc_js( $edit_text ) ?>') + .toggleClass('button-primary'); + + if (isEditMode) { + $('#business_name').focus().select(); + isEditAllFieldsMode = true; + } else { + isEditAllFieldsMode = false; + + if (!hasBillingChanged()) + return; + + var billing = {}; + + $billingInputs.each(function(){ + if ($(this).attr('data-val') !== $(this).val()) { + billing[$(this).attr('id')] = $(this).val(); + } + }); + + $.ajax({ + url : ajaxurl, + method : 'POST', + data : { + action : '<?php echo $fs->get_ajax_action( 'update_billing' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'update_billing' ) ?>', + module_id: '<?php echo $fs->get_id() ?>', + billing : billing + }, + success: function (resultObj) { + if (resultObj.success) { + setPrevValues(); + } else { + alert(resultObj.error); + } + } + }); + } + }); + + $billingInputs + // Get into edit mode upon selection. + .focus(function () { + var isEditMode = !$billingAddress.hasClass('fs-read-mode'); + + if (isEditMode) { + return; + } + + $billingAddress.toggleClass('fs-read-mode'); + $billingAddress.find('.button') + .html('<?php echo esc_js( $update_text ) ?>') + .toggleClass('button-primary'); + }) + // If blured after editing only one field without changes, exit edit mode. + .blur(function () { + if (!isEditAllFieldsMode && !hasBillingChanged()) { + $billingAddress.toggleClass('fs-read-mode'); + $billingAddress.find('.button') + .html('<?php echo esc_js( $edit_text ) ?>') + .toggleClass('button-primary'); + } + }); + })(jQuery); +</script> +<?php + endif; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/activate-license-button.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/activate-license-button.php new file mode 100644 index 000000000..216473e09 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/activate-license-button.php @@ -0,0 +1,54 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + * @var FS_Plugin_License $available_license + * @var string $slug + */ + $fs = $VARS['freemius']; + $available_license = $VARS['license']; + $premium_plan = $VARS['plan']; + $slug = $VARS['slug']; + + $blog_id = ! empty( $VARS['blog_id'] ) && is_numeric( $VARS['blog_id'] ) ? + $VARS['blog_id'] : + ''; + $install_id = ! empty( $VARS['install_id'] ) && FS_Site::is_valid_id( $VARS['install_id'] ) ? + $VARS['install_id'] : + ''; + + $activate_plan_text = fs_text_inline( 'Activate %s Plan', 'activate-x-plan', $slug ); + + $action = 'activate_license'; +?> +<form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $action ?>"> + <?php wp_nonce_field( trim("{$action}:{$blog_id}:{$install_id}", ':') ) ?> + <input type="hidden" name="install_id" value="<?php echo $install_id ?>"> + <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>"> + <input type="hidden" name="license_id" value="<?php echo $available_license->id ?>"> + <input type="submit" class="fs-activate-license button<?php echo ! empty( $VARS['class'] ) ? ' ' . $VARS['class'] : '' ?>" + value="<?php echo esc_attr( sprintf( + $activate_plan_text . '%s', + $premium_plan->title, + ( $VARS['is_localhost'] && $available_license->is_free_localhost ) ? + ' [' . fs_text_inline( 'Localhost', 'localhost', $slug ) . ']' : + ( $available_license->is_single_site() ? + '' : + ' [' . ( 1 < $available_license->left() ? + sprintf( fs_text_x_inline( '%s left', 'as 5 licenses left', 'x-left', $slug ), $available_license->left() ) : + strtolower( fs_text_inline( 'Last license', 'last-license', $slug ) ) ) . ']' + ) + ) ) ?> "> +</form> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/addon.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/addon.php new file mode 100644 index 000000000..bb878552c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/addon.php @@ -0,0 +1,345 @@ +<?php + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = $VARS['parent_fs']; + $addon_id = $VARS['addon_id']; + $odd = $VARS['odd']; + $slug = $fs->get_slug(); + + + $addon = $fs->get_addon( $addon_id ); + $is_addon_activated = $fs->is_addon_activated( $addon_id ); + $is_addon_connected = $fs->is_addon_connected( $addon_id ); + + $fs_addon = $is_addon_connected ? + freemius( $addon_id ) : + false; + + // Aliases. + $download_latest_text = fs_text_x_inline( 'Download Latest', 'as download latest version', 'download-latest', $slug ); + $downgrade_x_confirm_text = fs_text_inline( 'Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s.', 'downgrade-x-confirm', $slug ); + $cancel_trial_confirm_text = fs_text_inline( 'Cancelling the trial will immediately block access to all premium features. Are you sure?', 'cancel-trial-confirm', $slug ); + $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s updates and support.', 'after-downgrade-non-blocking', $slug ); + $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); + /* translators: %s: Plan title (e.g. "Professional") */ + $activate_plan_text = fs_text_inline( 'Activate %s Plan', 'activate-x-plan', $slug ); + $version_text = fs_text_x_inline( 'Version', 'product version', 'version', $slug ); + /* translators: %s: Time period (e.g. Auto renews in "2 months") */ + $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); + /* translators: %s: Time period (e.g. Expires in "2 months") */ + $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); + $sync_license_text = fs_text_x_inline( 'Sync License', 'as synchronize license', 'sync-license', $slug ); + $cancel_trial_text = fs_text_inline( 'Cancel Trial', 'cancel-trial', $slug ); + $change_plan_text = fs_text_inline( 'Change Plan', 'change-plan', $slug ); + $upgrade_text = fs_text_x_inline( 'Upgrade', 'verb', 'upgrade', $slug ); + $addons_text = fs_text_inline( 'Add-Ons', 'add-ons', $slug ); + $downgrade_text = fs_text_x_inline( 'Downgrade', 'verb', 'downgrade', $slug ); + $trial_text = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); + $free_text = fs_text_inline( 'Free', 'free', $slug ); + $activate_text = fs_text_inline( 'Activate', 'activate', $slug ); + $plan_text = fs_text_x_inline( 'Plan', 'as product pricing plan', 'plan', $slug ); + + // Defaults. + $plan = null; + $is_paid_trial = false; + $license = null; + $site = null; + $is_active_subscription = false; + $subscription = null; + $is_paying = false; + + if ( is_object( $fs_addon ) ) { + $is_paying = $fs_addon->is_paying(); + $user = $fs_addon->get_user(); + $site = $fs_addon->get_site(); + $license = $fs_addon->_get_license(); + $subscription = ( is_object( $license ) ? + $fs_addon->_get_subscription( $license->id ) : + null ); + $plan = $fs_addon->get_plan(); + $is_active_subscription = ( is_object( $subscription ) && $subscription->is_active() ); + $is_paid_trial = $fs_addon->is_paid_trial(); + $show_upgrade = ( $fs_addon->has_paid_plan() && ! $is_paying && ! $is_paid_trial && ! $fs_addon->_has_premium_license() ); + $is_current_license_expired = is_object( $license ) && $license->is_expired(); + } +?> +<tr<?php if ( $odd ) { + echo ' class="alternate"'; +} ?>> + <td> + <!-- Title --> + <?php echo $addon->title ?> + </td> + <?php if ( $is_addon_connected ) : ?> + <!-- ID --> + <td><?php echo $site->id ?></td> + <!--/ ID --> + + <!-- Version --> + <td><?php echo $fs_addon->get_plugin_version() ?></td> + <!--/ Version --> + + <!-- Plan Title --> + <td><?php echo strtoupper( is_string( $plan->name ) ? $plan->title : $free_text ) ?></td> + <!--/ Plan Title --> + + <?php if ( $fs_addon->is_trial() || is_object( $license ) ) : ?> + + <!-- Expiration --> + <td> + <?php + $tags = array(); + + if ( $fs_addon->is_trial() ) { + $tags[] = array( 'label' => $trial_text, 'type' => 'success' ); + + $tags[] = array( + 'label' => sprintf( + ( $is_paid_trial ? + $renews_in_text : + $expires_in_text ), + human_time_diff( time(), strtotime( $site->trial_ends ) ) + ), + 'type' => ( $is_paid_trial ? 'success' : 'warn' ) + ); + } else { + if ( is_object( $license ) ) { + if ( $license->is_cancelled ) { + $tags[] = array( + 'label' => fs_text_inline( 'Cancelled', 'cancelled', $slug ), + 'type' => 'error' + ); + } else if ( $license->is_expired() ) { + $tags[] = array( + 'label' => fs_text_inline( 'Expired', 'expired', $slug ), + 'type' => 'error' + ); + } else if ( $license->is_lifetime() ) { + $tags[] = array( + 'label' => fs_text_inline( 'No expiration', 'no-expiration', $slug ), + 'type' => 'success' + ); + } else if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) { + $tags[] = array( + 'label' => sprintf( $expires_in_text, human_time_diff( time(), strtotime( $license->expiration ) ) ), + 'type' => 'warn' + ); + } else if ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) { + $tags[] = array( + 'label' => sprintf( $renews_in_text, human_time_diff( time(), strtotime( $subscription->next_payment ) ) ), + 'type' => 'success' + ); + } + } + } + + foreach ( $tags as $t ) { + printf( '<label class="fs-tag fs-%s">%s</label>' . "\n", $t['type'], $t['label'] ); + } + ?> + </td> + <!--/ Expiration --> + + <?php endif ?> + + <?php + $buttons = array(); + if ( $is_addon_activated ) { + if ( $is_paying ) { + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + 'deactivate_license', + fs_text_inline( 'Deactivate License', 'deactivate-license', $slug ), + '', + array( 'plugin_id' => $addon_id ), + false + ); + + $human_readable_license_expiration = human_time_diff( time(), strtotime( $license->expiration ) ); + $downgrade_confirmation_message = sprintf( + $downgrade_x_confirm_text, + $plan->title, + $human_readable_license_expiration + ); + + $after_downgrade_message = ! $license->is_block_features ? + sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs_addon->get_module_label( true ) ) : + sprintf( $after_downgrade_blocking_text, $plan->title ); + + if ( ! $license->is_lifetime() && $is_active_subscription ) { + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + 'downgrade_account', + esc_html( $fs_addon->is_only_premium() ? fs_text_inline( 'Cancel Subscription', 'cancel-subscription', $slug ) : $downgrade_text ), + '', + array( 'plugin_id' => $addon_id ), + false, + false, + false, + ( $downgrade_confirmation_message . ' ' . $after_downgrade_message ), + 'POST' + ); + } + } else if ( $is_paid_trial ) { + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + 'cancel_trial', + esc_html( $cancel_trial_text ), + '', + array( 'plugin_id' => $addon_id ), + false, + false, + 'dashicons dashicons-download', + $cancel_trial_confirm_text, + 'POST' + ); + } else { + $premium_license = $fs_addon->_get_available_premium_license(); + + if ( is_object( $premium_license ) ) { + $premium_plan = $fs_addon->_get_plan_by_id( $premium_license->plan_id ); + $site = $fs_addon->get_site(); + + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + 'activate_license', + esc_html( sprintf( $activate_plan_text, $premium_plan->title, ( $site->is_localhost() && $premium_license->is_free_localhost ) ? '[localhost]' : ( 1 < $premium_license->left() ? $premium_license->left() . ' left' : '' ) ) ), + '', + array( + 'plugin_id' => $addon_id, + 'license_id' => $premium_license->id, + ) + ); + } + } + + if ( 0 == count( $buttons ) ) { + if ( $show_upgrade && $fs_addon->is_premium() ) { + $fs_addon->_add_license_activation_dialog_box(); + + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + 'activate_license', + fs_esc_html_inline( 'Activate License', 'activate-license', $slug ), + 'activate-license-trigger ' . $fs_addon->get_unique_affix(), + array( + 'plugin_id' => $addon_id, + ), + false, + true + ); + } + + // Add sync license only if non of the other CTAs are visible. + $buttons[] = fs_ui_get_action_button( + $fs->get_id(), + 'account', + $fs->get_unique_affix() . '_sync_license', + esc_html( $sync_license_text ), + '', + array( 'plugin_id' => $addon_id ), + false, + true + ); + + } + } else if ( ! $show_upgrade ) { + if ( $fs->is_addon_installed( $addon_id ) ) { + $addon_file = $fs->get_addon_basename( $addon_id ); + $buttons[] = sprintf( + '<a class="button button-primary edit" href="%s" title="%s">%s</a>', + wp_nonce_url( 'plugins.php?action=activate&plugin=' . $addon_file, 'activate-plugin_' . $addon_file ), + fs_esc_attr_inline( 'Activate this add-on', 'activate-this-addon', $slug ), + $activate_text + ); + } else { + if ( $fs->is_allowed_to_install() ) { + $buttons[] = sprintf( + '<a class="button button-primary edit" href="%s">%s</a>', + wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $addon->slug ), 'install-plugin_' . $addon->slug ), + fs_text_inline( 'Install Now', 'install-now', $slug ) + ); + } else { + $buttons[] = sprintf( + '<a target="_blank" class="button button-primary edit" href="%s">%s</a>', + $fs->_get_latest_download_local_url( $addon_id ), + esc_html( $download_latest_text ) + ); + } + } + } + + if ( $show_upgrade ) { + $buttons[] = sprintf( '<a href="%s" class="thickbox button button-small button-primary" aria-label="%s" data-title="%s"><i class="dashicons dashicons-cart"></i> %s</a>', + esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&parent_plugin_id=' . $fs->get_id() . '&plugin=' . $addon->slug . + '&TB_iframe=true&width=600&height=550' ) ), + esc_attr( sprintf( fs_text_inline( 'More information about %s', 'more-information-about-x', $slug ), $addon->title ) ), + esc_attr( $addon->title ), + ( $fs_addon->has_free_plan() ? + $upgrade_text : + fs_text_x_inline( 'Purchase', 'verb', 'purchase', $slug ) ) + ); + } + + $buttons_count = count( $buttons ); + ?> + + <!-- Actions --> + <td><?php if ( $buttons_count > 1 ) : ?> + <div class="button-group"><?php endif ?> + <?php foreach ( $buttons as $button ) { + echo $button; + } ?> + <?php if ( $buttons_count > 1 ) : ?></div><?php endif ?></td> + <!--/ Actions --> + + <?php else : ?> + <?php // Add-on NOT Installed or was never connected. + ?> + <!-- Action --> + <td colspan="4"> + <?php if ( $fs->is_addon_installed( $addon_id ) ) : ?> + <?php $addon_file = $fs->get_addon_basename( $addon_id ) ?> + <a class="button button-primary" + href="<?php echo wp_nonce_url( 'plugins.php?action=activate&plugin=' . $addon_file, 'activate-plugin_' . $addon_file ) ?>" + title="<?php fs_esc_attr_echo_inline( 'Activate this add-on', 'activate-this-addon', $slug ) ?>" + class="edit"><?php echo esc_html( $activate_text ) ?></a> + <?php else : ?> + <?php if ( $fs->is_allowed_to_install() ) : ?> + <a class="button button-primary" + href="<?php echo wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $addon->slug ), 'install-plugin_' . $addon->slug ) ?>"><?php fs_esc_html_echo_inline( 'Install Now', 'install-now', $slug ) ?></a> + <?php else : ?> + <a target="_blank" class="button button-primary" + href="<?php echo $fs->_get_latest_download_local_url( $addon_id ) ?>"><?php echo esc_html( $download_latest_text ) ?></a> + <?php endif ?> + <?php endif ?> + </td> + <!--/ Action --> + <?php endif ?> + <?php if ( ! $is_paying && WP_FS__DEV_MODE ) : ?> + <!-- Optional Delete Action --> + <td> + <?php + if ( $is_addon_activated ) { + fs_ui_action_button( + $fs->get_id(), 'account', + 'delete_account', + fs_text_x_inline( 'Delete', 'verb', 'delete', $slug ), + '', + array( 'plugin_id' => $addon_id ), + false, + $show_upgrade + ); + } + ?> + </td> + <!--/ Optional Delete Action --> + <?php endif ?> +</tr> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/deactivate-license-button.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/deactivate-license-button.php new file mode 100644 index 000000000..123b092f7 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/deactivate-license-button.php @@ -0,0 +1,36 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + * @var string $slug + */ + $slug = $VARS['slug']; + $fs = $VARS['freemius']; + + $blog_id = ! empty( $VARS['blog_id'] ) && is_numeric( $VARS['blog_id'] ) ? + $VARS['blog_id'] : + ''; + $install_id = ! empty( $VARS['install_id'] ) && FS_Site::is_valid_id( $VARS['install_id'] ) ? + $VARS['install_id'] : + ''; + + $action = 'deactivate_license'; +?> +<form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $action ?>"> + <?php wp_nonce_field( trim("{$action}:{$blog_id}:{$install_id}", ':') ) ?> + <input type="hidden" name="install_id" value="<?php echo $install_id ?>"> + <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>"> + <button type="button" class="fs-deactivate-license button<?php echo ! empty( $VARS['class'] ) ? ' ' . $VARS['class'] : '' ?>"><?php fs_echo_inline( 'Deactivate License', 'deactivate-license', $slug ) ?></button> +</form> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/site.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/site.php new file mode 100644 index 000000000..6629e9b71 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/partials/site.php @@ -0,0 +1,331 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + * @var FS_Plugin_License $main_license + */ + $fs = $VARS['freemius']; + $slug = $fs->get_slug(); + $site = $VARS['site']; + $main_license = $VARS['license']; + $has_paid_plan = $fs->has_paid_plan(); + $is_premium = $fs->is_premium(); + $main_user = $fs->get_user(); + $blog_id = $site['blog_id']; + + $install = $VARS['install']; + $is_registered = ! empty( $install ); + $license = null; + $trial_plan = $fs->get_trial_plan(); + $free_text = fs_text_inline( 'Free', 'free', $slug ); +?> + <tr class="fs-site-details" data-blog-id="<?php echo $blog_id ?>"<?php if ( $is_registered ) : ?> data-install-id="<?php echo $install->id ?>"<?php endif ?>> + <!-- Install ID or Opt-in option --> + <td><?php if ( $is_registered ) : ?> + <?php echo $install->id ?> + <?php else : ?> + <?php $action = 'opt_in' ?> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $action ?>"> + <?php wp_nonce_field( trim( "{$action}:{$blog_id}", ':' ) ) ?> + <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>"> + <button class="fs-opt-in button button-small"><?php fs_esc_html_echo_inline( 'Opt In', 'opt-in', $slug ) ?></button> + </form> + <?php endif ?> + </td> + <!--/ Install ID or Opt-in option --> + + <!-- Site URL --> + <td class="fs-field-url fs-main-column"><?php echo fs_strip_url_protocol( $site['url'] ) ?></td> + <!--/ Site URL --> + + <!-- License Activation / Deactivation --> + <td><?php if ( $has_paid_plan ) { + $view_params = array( + 'freemius' => $fs, + 'slug' => $slug, + 'blog_id' => $blog_id, + 'class' => 'button-small', + ); + + $license = null; + if ( $is_registered ) { + $view_params['install_id'] = $install->id; + $view_params['is_localhost'] = $install->is_localhost(); + + $has_license = FS_Plugin_License::is_valid_id( $install->license_id ); + $license = $has_license ? + $fs->_get_license_by_id( $install->license_id ) : + null; + } else { + $view_params['is_localhost'] = FS_Site::is_localhost_by_address( $site['url'] ); + } + + if ( is_object( $license ) ) { + $view_params['license'] = $license; + + // Show license deactivation button. + fs_require_template( 'account/partials/deactivate-license-button.php', $view_params ); + } else { + if ( is_object( $main_license ) && $main_license->can_activate( $view_params['is_localhost'] ) ) { + // Main license is available for activation. + $available_license = $main_license; + } else { + // Try to find any available license for activation. + $available_license = $fs->_get_available_premium_license( $view_params['is_localhost'] ); + } + + if ( is_object( $available_license ) ) { + $premium_plan = $fs->_get_plan_by_id( $available_license->plan_id ); + + $view_params['license'] = $available_license; + $view_params['class'] .= ' button-primary'; + $view_params['plan'] = $premium_plan; + + fs_require_template( 'account/partials/activate-license-button.php', $view_params ); + } + } + } ?></td> + <!--/ License Activation / Deactivation --> + + <!-- Plan --> + <td><?php if ( $is_registered ) : ?> + <?php + if ( ! $has_paid_plan ) { + $plan_title = $free_text; + } else { + if ( $install->is_trial() ) { + if ( $trial_plan->id == $install->trial_plan_id ) { + $plan_title = is_string( $trial_plan->name ) ? + strtoupper( $trial_plan->title ) : + fs_text_inline( 'Trial', 'trial', $slug ); + } else { + $plan_title = fs_text_inline( 'Trial', 'trial', $slug ); + } + } else { + $plan = $fs->_get_plan_by_id( $install->plan_id ); + $plan_title = strtoupper( is_string( $plan->title ) ? + $plan->title : + strtoupper( $free_text ) + ); + } + } + ?> + <code><?php echo $plan_title ?></code> + <?php endif ?></td> + <!--/ Plan --> + + <!-- More details button --> + <td><?php if ( $is_registered ) : ?> + <button class="fs-show-install-details button button-small">More details <i + class="dashicons dashicons-arrow-right-alt2"></i> + </button><?php endif ?></td> + <!--/ More details button --> + </tr> +<?php if ( $is_registered ) : ?> + <!-- More details --> + <tr class="fs-install-details" data-install-id="<?php echo $install->id ?>" style="display: none"> + <td colspan="5"> + <table class="widefat fs-key-value-table"> + <tbody> + <?php $row_index = 0 ?> + <!-- Blog ID --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Blog ID', 'blog-id', $slug ) ?>:</nobr> + </td> + <td><code><?php echo $blog_id ?></code></td> + <td><?php if ( ! FS_Plugin_License::is_valid_id( $install->license_id ) ) : ?> + <!-- Toggle Usage Tracking --> + <?php $action = 'toggle_tracking' ?> + <form action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $action ?>"> + <?php wp_nonce_field( trim( "{$action}:{$blog_id}:{$install->id}", ':' ) ) ?> + <input type="hidden" name="install_id" value="<?php echo $install->id ?>"> + <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>"> + <button class="fs-toggle-tracking button button-small<?php if ( $install->is_disconnected ) { + echo ' button-primary'; + } ?>" data-is-disconnected="<?php echo $install->is_disconnected ? 'true' : 'false' ?>"><?php $install->is_disconnected ? fs_esc_html_echo_inline( 'Opt In', 'opt-in', $slug ) : fs_esc_html_echo_inline( 'Opt Out', 'opt-out', $slug ) ?></button> + </form> + <!--/ Toggle Usage Tracking --> + <?php endif ?></td> + </tr> + <?php $row_index ++ ?> + <!--/ Blog ID --> + + <?php if ( $is_registered && $install->user_id != $main_user->id ) : ?> + <?php + /** + * @var FS_User $user + */ + $user = Freemius::_get_user_by_id( $install->user_id ) ?> + <?php if ( is_object( $user ) ) : ?> + <!-- User Name --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Owner Name', 'owner-name', $slug ) ?>:</nobr> + </td> + <td colspan="2"><code><?php echo htmlspecialchars( $user->get_name() ) ?></code></td> + </tr> + <?php $row_index ++ ?> + <!--/ User Name --> + + <!-- User Email --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Owner Email', 'owner-email', $slug ) ?>:</nobr> + </td> + <td colspan="2"><code><?php echo htmlspecialchars( $user->email ) ?></code></td> + </tr> + <?php $row_index ++ ?> + <!--/ User Email --> + + <!-- User ID --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Owner ID', 'owner-id', $slug ) ?>:</nobr> + </td> + <td colspan="2"><code><?php echo $user->id ?></code></td> + </tr> + <?php $row_index ++ ?> + <!--/ User ID --> + <?php endif ?> + <?php endif ?> + + <!-- Public Key --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Public Key', 'public-key', $slug ) ?>:</nobr> + </td> + <td colspan="2"><code><?php echo htmlspecialchars( $install->public_key ) ?></code></td> + </tr> + <?php $row_index ++ ?> + <!--/ Public Key --> + + <!-- Secret Key --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Secret Key', 'secret-key', $slug ) ?>:</nobr> + </td> + <td> + <code><?php echo htmlspecialchars( substr( $install->secret_key, 0, 6 ) ) . str_pad( '', 23 * 6, '•' ) . htmlspecialchars( substr( $install->secret_key, - 3 ) ) ?></code> + <input type="text" value="<?php echo htmlspecialchars( $install->secret_key ) ?>" + style="display: none" readonly/></td> + <td><button class="button button-small fs-toggle-visibility"><?php fs_esc_html_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?></button></td> + </tr> + <?php $row_index ++ ?> + <!--/ Secret Key --> + + <?php if ( is_object( $license ) ) : ?> + <!-- License Key --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'License Key', 'license-key', $slug ) ?>:</nobr> + </td> + <td> + <code><?php echo htmlspecialchars( substr( $license->secret_key, 0, 6 ) ) . str_pad( '', 23 * 6, '•' ) . htmlspecialchars( substr( $license->secret_key, - 3 ) ) ?></code> + <input type="text" value="<?php echo htmlspecialchars( $license->secret_key ) ?>" + style="display: none" readonly/></td> + <td> + <button class="button button-small fs-toggle-visibility"><?php fs_esc_html_echo_x_inline( 'Show', 'verb', 'show', $slug ) ?></button> + <button class="button button-small activate-license-trigger <?php echo $fs->get_unique_affix() ?>"><?php fs_esc_html_echo_inline( 'Change License', 'change-license', $slug ) ?></button> + </td> + </tr> + <?php $row_index ++ ?> + <!--/ License Key --> + + <?php if ( ! is_object( $main_license ) || $main_license->id != $license->id ) : ?> + <?php $subscription = $fs->_get_subscription( $license->id ) ?> + <?php if ( ! $license->is_lifetime() && is_object( $subscription ) ) : ?> + <!-- Subscription --> + <tr <?php if ( 1 == $row_index % 2 ) { + echo ' class="alternate"'; + } ?>> + <td> + <nobr><?php fs_esc_html_echo_inline( 'Subscription', 'subscription', $slug ) ?>:</nobr> + </td> + <?php + $is_active_subscription = $subscription->is_active(); + + $renews_in_text = fs_text_inline( 'Auto renews in %s', 'renews-in', $slug ); + /* translators: %s: Time period (e.g. Expires in "2 months") */ + $expires_in_text = fs_text_inline( 'Expires in %s', 'expires-in', $slug ); + ?> + <td> + <code><?php echo $subscription->id ?> - <?php + echo ( 12 == $subscription->billing_cycle ? + _fs_text_inline( 'Annual', 'annual', $slug ) : + _fs_text_inline( 'Monthly', 'monthly', $slug ) + ); + ?> + </code> + <?php if ( ! $is_active_subscription && ! $license->is_first_payment_pending() ) : ?> + <label class="fs-tag fs-warn"><?php echo esc_html( sprintf( $expires_in_text, human_time_diff( time(), strtotime( $license->expiration ) ) ) ) ?></label> + <?php elseif ( $is_active_subscription && ! $subscription->is_first_payment_pending() ) : ?> + <label class="fs-tag fs-success"><?php echo esc_html( sprintf( $renews_in_text, human_time_diff( time(), strtotime( $subscription->next_payment ) ) ) ) ?></label> + <?php endif ?> + </td> + <td><?php if ( $is_active_subscription ) : ?> + <?php + $downgrade_x_confirm_text = fs_text_inline( 'Downgrading your plan will immediately stop all future recurring payments and your %s plan license will expire in %s.', 'downgrade-x-confirm', $slug ); + $after_downgrade_non_blocking_text = fs_text_inline( 'You can still enjoy all %s features but you will not have access to %s updates and support.', 'after-downgrade-non-blocking', $slug ); + $after_downgrade_blocking_text = fs_text_inline( 'Once your license expires you can still use the Free version but you will NOT have access to the %s features.', 'after-downgrade-blocking', $slug ); + $downgrade_text = fs_text_x_inline( 'Downgrade', 'verb', 'downgrade', $slug ); + + $human_readable_license_expiration = human_time_diff( time(), strtotime( $license->expiration ) ); + $downgrade_confirmation_message = sprintf( + $downgrade_x_confirm_text, + $plan->title, + $human_readable_license_expiration + ); + + $after_downgrade_message = ! $license->is_block_features ? + sprintf( $after_downgrade_non_blocking_text, $plan->title, $fs->get_module_label( true ) ) : + sprintf( $after_downgrade_blocking_text, $plan->title ); + ?> + <?php $action = 'downgrade_account' ?> + <form id="fs_downgrade" action="<?php echo $fs->_get_admin_page_url( 'account' ) ?>" method="POST"> + <input type="hidden" name="fs_action" value="<?php echo $action ?>"> + <?php wp_nonce_field( trim( "{$action}:{$blog_id}", ':' ) ) ?> + <input type="hidden" name="blog_id" value="<?php echo $blog_id ?>"> + <button class="button button-small" onclick="if (confirm('<?php echo ( $downgrade_confirmation_message . ' ' . $after_downgrade_message ) ?>')) { this.parentNode.submit(); } else { return false; }"><?php echo $downgrade_text ?></button> + </form> + <?php endif ?></td> + </tr> + <?php $row_index ++ ?> + <?php endif ?> + <!--/ Subscription --> + <?php endif ?> + <?php endif ?> + + </tbody> + </table> + </td> + </tr> + <!--/ More details --> +<?php endif ?> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/account/payments.php b/wp-content/plugins/nextgen-gallery/freemius/templates/account/payments.php new file mode 100644 index 000000000..ad01fe317 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/account/payments.php @@ -0,0 +1,59 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2016, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + $payments = $fs->_fetch_payments(); + + $show_payments = ( is_array( $payments ) && 0 < count( $payments ) ); + + if ( $show_payments ) : +?> +<div class="postbox"> + <div id="fs_payments"> + <h3><span class="dashicons dashicons-paperclip"></span> <?php fs_esc_html_echo_inline( 'Payments', 'payments', $slug ) ?></h3> + + <div class="inside"> + <table class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id', $slug ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Date', 'date', $slug ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Amount', 'amount', $slug ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Invoice', 'invoice', $slug ) ?></th> + </tr> + </thead> + <tbody> + <?php $odd = true ?> + <?php foreach ( $payments as $payment ) : ?> + <tr<?php echo $odd ? ' class="alternate"' : '' ?>> + <td><?php echo $payment->id ?></td> + <td><?php echo date( 'M j, Y', strtotime( $payment->created ) ) ?></td> + <td>$<?php echo $payment->gross ?></td> + <td><?php if (! $payment->is_migrated() ) : ?><a href="<?php echo $fs->_get_invoice_api_url( $payment->id ) ?>" + class="button button-small" + target="_blank"><?php fs_esc_html_echo_inline( 'Invoice', 'invoice', $slug ) ?></a><?php endif ?></td> + </tr> + <?php $odd = ! $odd; endforeach ?> + </tbody> + </table> + </div> + </div> +</div> +<?php + endif; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/add-ons.php b/wp-content/plugins/nextgen-gallery/freemius/templates/add-ons.php index c1dc5195f..bf8c58fb0 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/add-ons.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/add-ons.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ @@ -12,12 +12,11 @@ /** * @var array $VARS - */ - $slug = $VARS['slug']; - /** * @var Freemius */ - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); $open_addon_slug = fs_request_get( 'slug' ); @@ -29,17 +28,21 @@ $addons = $fs->get_addons(); $has_addons = ( is_array( $addons ) && 0 < count( $addons ) ); + + $has_tabs = $fs->_add_tabs_before_content(); ?> - <div id="fs_addons" class="wrap"> - <h2><?php printf( __fs( 'add-ons-for-x', $slug ), $fs->get_plugin_name() ) ?></h2> + <div id="fs_addons" class="wrap fs-section"> + <?php if ( ! $has_tabs ) : ?> + <h2><?php echo esc_html( sprintf( fs_text_inline( 'Add Ons for %s', 'add-ons-for-x', $slug ), $fs->get_plugin_name() ) ) ?></h2> + <?php endif ?> <div id="poststuff"> <?php if ( ! $has_addons ) : ?> - <h3><?php printf( + <h3><?php echo esc_html( sprintf( '%s... %s', - __fs( 'oops', $slug ), - __fs( 'add-ons-missing', $slug ) - ) ?></h3> + fs_text_x_inline( 'Oops', 'exclamation', 'oops', $slug ), + fs_text_inline( 'We could\'nt load the add-ons list. It\'s probably an issue on our side, please try to come back in few minutes.', 'add-ons-missing', $slug ) + ) ) ?></h3> <?php endif ?> <ul class="fs-cards-list"> <?php if ( $has_addons ) : ?> @@ -47,34 +50,49 @@ <?php $open_addon = ( $open_addon || ( $open_addon_slug === $addon->slug ) ); - $price = 0; - $plan = null; - $plans_result = $fs->get_api_site_or_plugin_scope()->get( "/addons/{$addon->id}/plans.json" ); - if ( ! isset( $plans_result->error ) ) { - $plans = $plans_result->plans; + $price = 0; + $has_trial = false; + $has_free_plan = false; + $has_paid_plan = false; + + $result = $fs->get_api_plugin_scope()->get( $fs->add_show_pending( "/addons/{$addon->id}/pricing.json?type=visible" ) ); + if ( ! isset( $result->error ) ) { + $plans = $result->plans; + if ( is_array( $plans ) && 0 < count( $plans ) ) { - $plan = new FS_Plugin_Plan( $plans[0] ); - $pricing_result = $fs->get_api_site_or_plugin_scope()->get( "/addons/{$addon->id}/plans/{$plan->id}/pricing.json" ); - if ( ! isset( $pricing_result->error ) ) { - // Update plan's pricing. - $plan->pricing = $pricing_result->pricing; - - if ( is_array( $plan->pricing ) && 0 < count( $plan->pricing ) ) { - $min_price = 999999; - foreach ( $plan->pricing as $pricing ) { - if ( ! is_null( $pricing->annual_price ) && $pricing->annual_price > 0 ) { - $min_price = min( $min_price, $pricing->annual_price ); - } else if ( ! is_null( $pricing->monthly_price ) && $pricing->monthly_price > 0 ) { - $min_price = min( $min_price, 12 * $pricing->monthly_price ); - } - } + foreach ( $plans as $plan ) { + if ( ! isset( $plan->pricing ) || + ! is_array( $plan->pricing ) || + 0 == count( $plan->pricing ) + ) { + // No pricing means a free plan. + $has_free_plan = true; + continue; + } + - if ( $min_price < 999999 ) { - $price = $min_price; + $has_paid_plan = true; + $has_trial = $has_trial || ( is_numeric( $plan->trial_period ) && ( $plan->trial_period > 0 ) ); + + $min_price = 999999; + foreach ( $plan->pricing as $pricing ) { + if ( ! is_null( $pricing->annual_price ) && $pricing->annual_price > 0 ) { + $min_price = min( $min_price, $pricing->annual_price ); + } else if ( ! is_null( $pricing->monthly_price ) && $pricing->monthly_price > 0 ) { + $min_price = min( $min_price, 12 * $pricing->monthly_price ); } } + + if ( $min_price < 999999 ) { + $price = $min_price; + } + } } + + if ( ! $has_paid_plan && ! $has_free_plan ) { + continue; + } } ?> <li class="fs-card fs-addon" data-slug="<?php echo $addon->slug ?>"> @@ -82,7 +100,7 @@ echo sprintf( '<a href="%s" class="thickbox fs-overlay" aria-label="%s" data-title="%s"></a>', esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&parent_plugin_id=' . $fs->get_id() . '&plugin=' . $addon->slug . '&TB_iframe=true&width=600&height=550' ) ), - esc_attr( sprintf( __fs( 'more-information-about-x', $slug ), $addon->title ) ), + esc_attr( sprintf( fs_text_inline( 'More information about %s', 'more-information-about-x', $slug ), $addon->title ) ), esc_attr( $addon->title ) ); ?> @@ -101,14 +119,24 @@ <ul> <li class="fs-card-banner" style="background-image: url('<?php echo $addon->info->card_banner_url ?>');"></li> -<!-- <li class="fs-tag"></li>--> + <!-- <li class="fs-tag"></li> --> <li class="fs-title"><?php echo $addon->title ?></li> <li class="fs-offer"> <span - class="fs-price"><?php echo ( 0 == $price ) ? __fs( 'free', $slug ) : ('$' . number_format( $price, 2 ) . ($plan->has_trial() ? ' - ' . __fs('trial', $slug) : '')) ?></span> + class="fs-price"><?php + $descriptors = array(); + + if ($has_free_plan) + $descriptors[] = fs_text_inline( 'Free', 'free', $slug ); + if ($has_paid_plan && $price > 0) + $descriptors[] = '$' . number_format( $price, 2 ); + if ($has_trial) + $descriptors[] = fs_text_x_inline( 'Trial', 'trial period', 'trial', $slug ); + + echo implode(' - ', $descriptors) ?></span> </li> <li class="fs-description"><?php echo ! empty( $addon->info->short_description ) ? $addon->info->short_description : 'SHORT DESCRIPTION' ?></li> - <li class="fs-cta"><a class="button"><?php _efs( 'view-details', $slug ) ?></a></li> + <li class="fs-cta"><a class="button"><?php fs_esc_html_echo_inline( 'View details', 'view-details', $slug ) ?></a></li> </ul> </div> </li> @@ -123,6 +151,17 @@ var interval = setInterval(function () { // Open add-on information page. + <?php + /** + * @author Vova Feldman + * + * This code does NOT expose an XSS vulnerability because: + * 1. This page only renders for admins, so if an attacker manage to get + * admin access, they can do more harm. + * 2. This code won't be rendered unless $open_addon_slug matches any of + * the plugin's add-ons slugs. + */ + ?> $('.fs-card[data-slug=<?php echo $open_addon_slug ?>] a').click(); if ($('#TB_iframeContent').length > 0) { clearInterval(interval); @@ -144,11 +183,15 @@ })(jQuery); </script> <?php + if ( $has_tabs ) { + $fs->_add_tabs_after_content(); + } + $params = array( 'page' => 'addons', 'module_id' => $fs->get_id(), + 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); - fs_require_template( 'powered-by.php', $params ); -?> \ No newline at end of file + fs_require_template( 'powered-by.php', $params ); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/add-trial-to-pricing.php b/wp-content/plugins/nextgen-gallery/freemius/templates/add-trial-to-pricing.php index 169ae855b..24fc88502 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/add-trial-to-pricing.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/add-trial-to-pricing.php @@ -5,7 +5,7 @@ * * @package Freemius * @copyright Copyright (c) 2016, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.1.5 */ @@ -14,14 +14,14 @@ } /** - * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; + $fs = freemius( $VARS['id'] ); ?> <script type="text/javascript"> (function ($) { $(document).ready(function () { - var $pricingMenu = $('.fs-submenu-item.<?php echo $slug ?>.pricing'), + var $pricingMenu = $('.fs-submenu-item.<?php echo $fs->get_unique_affix() ?>.pricing'), $pricingMenuLink = $pricingMenu.parents('a'); // Add trial querystring param. diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/admin-notice.php b/wp-content/plugins/nextgen-gallery/freemius/templates/admin-notice.php index db205eb7d..3dd86eda2 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/admin-notice.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/admin-notice.php @@ -2,15 +2,17 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ if ( ! defined( 'ABSPATH' ) ) { exit; } + + $dismiss_text = fs_text_x_inline( 'Dismiss', 'as close a window', 'dismiss' ); ?> -<div<?php if ( ! empty( $VARS['id'] ) ) : ?> data-id="<?php echo $VARS['id'] ?>"<?php endif ?><?php if ( ! empty( $VARS['slug'] ) ) : ?> data-slug="<?php echo $VARS['slug'] ?>"<?php endif ?> +<div<?php if ( ! empty( $VARS['id'] ) ) : ?> data-id="<?php echo $VARS['id'] ?>"<?php endif ?><?php if ( ! empty( $VARS['manager_id'] ) ) : ?> data-manager-id="<?php echo $VARS['manager_id'] ?>"<?php endif ?> class="<?php switch ( $VARS['type'] ) { case 'error': @@ -36,7 +38,7 @@ <?php endif ?> <?php if ( ! empty( $VARS['sticky'] ) ) : ?> <div class="fs-close"><i class="dashicons dashicons-no" - title="<?php _efs( 'dismiss' ) ?>"></i> <span><?php _efs( 'dismiss' ) ?></span> + title="<?php echo esc_attr( $dismiss_text ) ?>"></i> <span><?php echo esc_html( $dismiss_text ) ?></span> </div> <?php endif ?> <div class="fs-notice-body"> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/ajax-loader.php b/wp-content/plugins/nextgen-gallery/freemius/templates/ajax-loader.php new file mode 100644 index 000000000..bc116f877 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/ajax-loader.php @@ -0,0 +1 @@ +<div class="fs-ajax-loader" style="display: none"><?php for ( $i = 1; $i <= 8; $i ++ ) : ?><div class="fs-ajax-loader-bar fs-ajax-loader-bar-<?php echo $i ?>"></div><?php endfor ?></div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/auto-installation.php b/wp-content/plugins/nextgen-gallery/freemius/templates/auto-installation.php new file mode 100644 index 000000000..1fc12784c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/auto-installation.php @@ -0,0 +1,249 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.1.5 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $slug = $VARS['slug']; + $plugin_id = $VARS['target_module_id']; + + $fs = freemius( $VARS['id'] ); + + $action = $fs->is_tracking_allowed() ? + 'stop_tracking' : + 'allow_tracking'; + + $title = $fs->get_plugin_title(); + + if ( $plugin_id != $fs->get_id() ) { + $addon = $fs->get_addon( $plugin_id ); + + if ( is_object( $addon ) ) { + $title = $addon->title . ' ' . fs_text_inline( 'Add-On', 'addon', $slug ); + } + } + + $plugin_title = sprintf( + '<strong>%s</strong>', + esc_html( $title ) + ); + + $sec_countdown = 30; + $countdown_html = sprintf( + esc_js( + /* translators: %s: Number of seconds */ + fs_text_inline( '%s sec', 'x-sec', $slug ) + ), + sprintf( '<span class="fs-countdown">%s</span>', $sec_countdown ) + ); + + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); + fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + + $params = array(); + $loader_html = fs_get_template( 'ajax-loader.php', $params ); + + // Pass unique auto installation URL if WP_Filesystem is needed. + $install_url = $fs->_get_sync_license_url( + $plugin_id, + true, + array( 'auto_install' => 'true' ) + ); + + + ob_start(); + + $method = ''; // Leave blank so WP_Filesystem can populate it as necessary. + + $credentials = request_filesystem_credentials( + esc_url_raw( $install_url ), + $method, + false, + WP_PLUGIN_DIR, + array() + ); + + $credentials_form = ob_get_clean(); + + $require_credentials = ! empty( $credentials_form ); +?> +<div class="fs-modal fs-modal-auto-install"> + <div class="fs-modal-dialog"> + <div class="fs-modal-header"> + <h4><?php echo esc_js( fs_text_inline( 'Automatic Installation', 'auto-installation', $slug ) ) ?></h4> + </div> + <div class="fs-modal-body"> + <div class="fs-notice-error" style="display: none"><p></p></div> + <?php if ( $require_credentials ) : ?> + <div id="request-filesystem-credentials-dialog"> + <?php echo $credentials_form ?> + </div> + <?php else : ?> + <p class="fs-installation-notice"><?php echo sprintf( + fs_esc_html_inline( 'An automated download and installation of %s (paid version) from %s will start in %s. If you would like to do it manually - click the cancellation button now.', 'installing-in-n', $slug ), + $plugin_title, + sprintf( + '<a href="%s" target="_blank">%s</a>', + 'https://freemius.com', + 'freemius.com' + ), + $countdown_html + ) ?></p> + <?php endif ?> + <p class="fs-installing" + style="display: none"><?php echo sprintf( fs_esc_html_inline( 'The installation process has started and may take a few minutes to complete. Please wait until it is done - do not refresh this page.', 'installing-module-x', $slug ), $plugin_title ) ?></p> + </div> + <div class="fs-modal-footer"> + <?php echo $loader_html ?> + <button + class="button button-secondary button-cancel"><?php fs_esc_html_echo_inline( 'Cancel Installation', 'cancel-installation', $slug ) ?><?php if ( ! $require_credentials ) : ?> (<?php echo $countdown_html ?>)<?php endif ?></button> + <button + class="button button-primary"><?php fs_esc_html_echo_inline( 'Install Now', 'install-now', $slug ) ?></button> + </div> + </div> +</div>' + +<script type="text/javascript"> + (function ($) { + $(document).ready(function () { + var $modal = $('.fs-modal-auto-install'), + $body = $('body'), + $countdown = $modal.find('.fs-countdown'), + requireCredentials = <?php echo json_encode( $require_credentials ) ?>, + $credentialsForm = $('#request-filesystem-credentials-dialog'), + $errorNotice = $modal.find('.fs-notice-error'), + installing = false; + + $modal.appendTo($body); + + var startAutoInstall = function () { + if (installing) + return; + + installing = true; + + // Start auto-install. + $modal.addClass('fs-warn'); + if (requireCredentials) { + $credentialsForm.hide(); + } else { + $modal.find('.fs-installation-notice').hide(); + } + + $errorNotice.hide(); + $modal.find('.fs-installing').show(); + $modal.find('button').hide(); + $modal.find('.fs-ajax-loader').show(); + + var data = { + action : '<?php echo $fs->get_ajax_action( 'install_premium_version' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'install_premium_version' ) ?>', + slug : '<?php echo $slug ?>', + module_id : '<?php echo $fs->get_id() ?>', + target_module_id: '<?php echo $plugin_id ?>' + }; + + if (requireCredentials) { + // Add filesystem credentials. + data.hostname = $('#hostname').val(); + data.username = $('#username').val(); + data.password = $('#password').val(); + data.connection_type = $('input[name="connection_type"]:checked').val(); + data.public_key = $('#public_key').val(); + data.private_key = $('#private_key').val(); + } + + $.ajax({ + url : ajaxurl, + method : 'POST', + data : data, + success: function (resultObj) { + var reloadAccount = false; + + if (resultObj.success) { + // Reload account page to show new data. + reloadAccount = true; + } else { + switch (resultObj.error.code) { + case 'invalid_module_id': + case 'premium_installed': + reloadAccount = true; + break; + case 'invalid_license': + case 'premium_version_missing': + case 'unable_to_connect_to_filesystem': + default: + $modal.removeClass('fs-warn'); + $modal.find('.fs-installing').hide(); + $modal.find('.fs-ajax-loader').hide(); + $modal.find('.button-cancel').html(<?php fs_json_encode_echo_inline( 'Cancel Installation', 'cancel-installation', $slug ) ?>); + $modal.find('button').show(); + + $errorNotice.find('p').text(resultObj.error.message); + $errorNotice.addClass('notice notice-alt notice-error').show(); + if (requireCredentials) { + $credentialsForm.show(); + } + break; + } + } + + if (reloadAccount) { + window.location = '<?php echo $fs->get_account_url() ?>'; + } + + installing = false; + } + }); + }; + + var clearCountdown = function () { + clearInterval(countdownInterval); + countdownInterval = null; + }; + + var cancelAutoInstall = function () { + $modal.fadeOut(function () { + $modal.remove(); + $body.removeClass('has-fs-modal'); + }); + }; + + var countdown = <?php echo $sec_countdown ?>, + countdownInterval = requireCredentials ? null : setInterval(function () { + $countdown.html(--countdown); + if (0 == countdown) { + clearCountdown(); + startAutoInstall(); + } + }, 1000); + + $modal.addClass('active'); + $body.addClass('has-fs-modal'); + + $modal.find('.button-primary').click(function () { + clearCountdown(); + startAutoInstall(); + }); + + $modal.find('.button-cancel').click(function () { + clearCountdown(); + cancelAutoInstall(); + }); + + if (requireCredentials) { + + } + }); + })(jQuery); +</script> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/checkout.php b/wp-content/plugins/nextgen-gallery/freemius/templates/checkout.php index f3241c30b..0e0f13f10 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/checkout.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/checkout.php @@ -2,10 +2,37 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ + /** + * Note for WordPress.org Theme/Plugin reviewer: + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This code (and page) will not run for wp.org themes (only plugins). + * + * In addition, this page loads an i-frame. We intentionally named it 'frame' + * so it will pass the "Theme Check" that is looking for the string "i" . "frame". + * + * UPDATE: + * After ongoing conversations with the WordPress.org TRT we received + * an official approval for including i-frames in the theme's WP Admin setting's + * page tab (the SDK will never add any i-frames on the sitefront). i-frames + * were never against the guidelines, but we wanted to get the team's blessings + * before we move forward. For the record, I got the final approval from + * Ulrich Pogson (@grapplerulrich), a team lead at the TRT during WordCamp + * Europe 2017 (June 16th, 2017). + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -16,24 +43,56 @@ fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + fs_enqueue_local_style( 'fs_checkout', '/admin/checkout.css' ); + /** - * @var array $VARS + * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); $timestamp = time(); $context_params = array( - 'plugin_id' => $fs->get_id(), - 'plugin_public_key' => $fs->get_public_key(), - 'plugin_version' => $fs->get_plugin_version(), + 'plugin_id' => $fs->get_id(), + 'public_key' => $fs->get_public_key(), + 'plugin_version' => $fs->get_plugin_version(), + 'mode' => 'dashboard', + 'trial' => fs_request_get_bool( 'trial' ), ); + $plan_id = fs_request_get( 'plan_id' ); + if ( FS_Plugin_Plan::is_valid_id( $plan_id ) ) { + $context_params['plan_id'] = $plan_id; + } + + $licenses = fs_request_get( 'licenses' ); + if ( $licenses === strval( intval( $licenses ) ) && $licenses > 0 ) { + $context_params['licenses'] = $licenses; + } + + $plugin_id = fs_request_get( 'plugin_id' ); + if ( ! FS_Plugin::is_valid_id( $plugin_id ) ) { + $plugin_id = $fs->get_id(); + } + + if ( $plugin_id == $fs->get_id() ) { + $is_premium = $fs->is_premium(); + } else { + // Identify the module code version of the checkout context module. + if ( $fs->is_addon_activated( $plugin_id ) ) { + $fs_addon = Freemius::get_instance_by_id( $plugin_id ); + $is_premium = $fs_addon->is_premium(); + } else { + // If add-on isn't activated assume the premium version isn't installed. + $is_premium = false; + } + } + // Get site context secure params. if ( $fs->is_registered() ) { - $site = $fs->get_site(); - $plugin_id = fs_request_get( 'plugin_id', $fs->get_id() ); + $site = $fs->get_site(); if ( $plugin_id != $fs->get_id() ) { if ( $fs->is_addon_activated( $plugin_id ) ) { @@ -62,7 +121,7 @@ $fs_user = Freemius::_get_user_by_email( $current_user->user_email ); - if ( is_object( $fs_user ) ) { + if ( is_object( $fs_user ) && $fs_user->is_verified() ) { $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( $fs_user, $timestamp, @@ -87,19 +146,35 @@ } } - $return_url = $fs->_get_sync_license_url( isset( $_GET['plugin_id'] ) ? $_GET['plugin_id'] : $fs->get_id() ); + $return_url = $fs->_get_sync_license_url( $plugin_id ); + + $can_user_install = ( + ( $fs->is_plugin() && current_user_can( 'install_plugins' ) ) || + ( $fs->is_theme() && current_user_can( 'install_themes' ) ) + ); $query_params = array_merge( $context_params, $_GET, array( // Current plugin version. 'plugin_version' => $fs->get_plugin_version(), 'sdk_version' => WP_FS__SDK_VERSION, + 'is_premium' => $is_premium ? 'true' : 'false', + 'can_install' => $can_user_install ? 'true' : 'false', 'return_url' => $return_url, - // Admin CSS URL for style/design competability. -// 'wp_admin_css' => get_bloginfo('wpurl') . "/wp-admin/load-styles.php?c=1&load=buttons,wp-admin,dashicons", ) ); + + $xdebug_session = fs_request_get( 'XDEBUG_SESSION' ); + if ( false !== $xdebug_session ) { + $query_params['XDEBUG_SESSION'] = $xdebug_session; + } + + $view_params = array( + 'id' => $VARS['id'], + 'page' => strtolower( $fs->get_text_inline( 'Checkout', 'checkout' ) ) . ' ' . $fs->get_text_inline( 'PCI compliant', 'pci-compliant' ), + ); + fs_require_once_template('secure-https-header.php', $view_params); ?> - <div id="fs_checkout" class="wrap" style="margin: 0 0 -65px -20px;"> - <div id="iframe"></div> + <div id="fs_checkout" class="wrap fs-section fs-full-size-wrapper"> + <div id="frame"></div> <script type="text/javascript"> // http://stackoverflow.com/questions/4583703/jquery-post-request-not-ajax jQuery(function ($) { @@ -151,51 +226,60 @@ $(function () { var - // Keep track of the iframe height. - iframe_height = 800, - base_url = '<?php echo WP_FS__ADDRESS ?>', - // Pass the parent page URL into the Iframe in a meaningful way (this URL could be + // Keep track of the i-frame height. + frame_height = 800, + base_url = '<?php echo FS_CHECKOUT__ADDRESS ?>', + // Pass the parent page URL into the i-frame in a meaningful way (this URL could be // passed via query string or hard coded into the child page, it depends on your needs). - src = base_url + '/checkout/?<?php echo ( isset( $_REQUEST['XDEBUG_SESSION'] ) ? 'XDEBUG_SESSION=' . $_REQUEST['XDEBUG_SESSION'] . '&' : '' ) . http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href), - - // Append the Iframe into the DOM. - iframe = $('<iframe " src="' + src + '" width="100%" height="' + iframe_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/iframe>') - .appendTo('#iframe'); + src = base_url + '/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href), + // Append the i-frame into the DOM. + frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent; width: 1px; min-width: 100%;"><\/i' + 'frame>') + .appendTo('#frame'); - FS.PostMessage.init(base_url, [iframe[0]]); + FS.PostMessage.init(base_url, [frame[0]]); FS.PostMessage.receiveOnce('height', function (data) { var h = data.height; - if (!isNaN(h) && h > 0 && h != iframe_height) { - iframe_height = h; - iframe.height(iframe_height + 'px'); + if (!isNaN(h) && h > 0 && h != frame_height) { + frame_height = h; + frame.height(frame_height + 'px'); - FS.PostMessage.postScroll(iframe[0]); + FS.PostMessage.postScroll(frame[0]); } }); FS.PostMessage.receiveOnce('install', function (data) { - // Post data to activation URL. - $.form('<?php echo fs_nonce_url( $fs->_get_admin_page_url( 'account', array( - 'fs_action' => $slug . '_activate_new', - 'plugin_id' => isset( $_GET['plugin_id'] ) ? $_GET['plugin_id'] : $fs->get_id() - ) ), $slug . '_activate_new' ) ?>', { + var requestData = { user_id : data.user.id, user_secret_key : data.user.secret_key, user_public_key : data.user.public_key, install_id : data.install.id, install_secret_key: data.install.secret_key, install_public_key: data.install.public_key - }).submit(); + }; + + if (true === data.auto_install) + requestData.auto_install = true; + + // Post data to activation URL. + $.form('<?php echo fs_nonce_url( $fs->_get_admin_page_url( 'account', array( + 'fs_action' => $fs->get_unique_affix() . '_activate_new', + 'plugin_id' => $plugin_id + ) ), $fs->get_unique_affix() . '_activate_new' ) ?>', requestData).submit(); }); FS.PostMessage.receiveOnce('pending_activation', function (data) { + var requestData = { + user_email: data.user_email + }; + + if (true === data.auto_install) + requestData.auto_install = true; + $.form('<?php echo fs_nonce_url( $fs->_get_admin_page_url( 'account', array( - 'fs_action' => $slug . '_activate_new', - 'plugin_id' => fs_request_get( 'plugin_id', $fs->get_id() ), + 'fs_action' => $fs->get_unique_affix() . '_activate_new', + 'plugin_id' => $plugin_id, 'pending_activation' => true, - ) ), $slug . '_activate_new' ) ?>', { - user_email: data.user_email - }).submit(); + ) ), $fs->get_unique_affix() . '_activate_new' ) ?>', requestData).submit(); }); FS.PostMessage.receiveOnce('get_context', function () { @@ -210,33 +294,36 @@ array( 'activation_url' => fs_nonce_url( $fs->_get_admin_page_url( '', array( - 'fs_action' => $slug . '_activate_new', - 'plugin_id' => fs_request_get( 'plugin_id', $fs->get_id() ), + 'fs_action' => $fs->get_unique_affix() . '_activate_new', + 'plugin_id' => $plugin_id, ) ), - $slug . '_activate_new' ) + $fs->get_unique_affix() . '_activate_new' ) ) ) ?> - FS.PostMessage.post('context', <?php echo json_encode( $install_data ) ?>, iframe[0]); + FS.PostMessage.post('context', <?php echo json_encode( $install_data ) ?>, frame[0]); }); + FS.PostMessage.receiveOnce('purchaseCompleted', <?php echo $fs->apply_filters('checkout/purchaseCompleted', 'function (data) { + console.log("checkout", "purchaseCompleted"); + }') ?>); + FS.PostMessage.receiveOnce('get_dimensions', function (data) { console.debug('receiveOnce', 'get_dimensions'); FS.PostMessage.post('dimensions', { height : $(document.body).height(), scrollTop: $(document).scrollTop() - }, iframe[0]); + }, frame[0]); }); + + var updateHeight = function () { + frame.css('min-height', $(document.body).height() + 'px'); + }; + + $(document).ready(updateHeight); + + $(window).resize(updateHeight); }); })(jQuery); </script> - </div> -<?php - $params = array( - 'page' => 'checkout', - 'module_id' => $fs->get_id(), - 'module_slug' => $slug, - 'module_version' => $fs->get_plugin_version(), - ); - fs_require_template( 'powered-by.php', $params ); -?> \ No newline at end of file + </div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/connect.php b/wp-content/plugins/nextgen-gallery/freemius/templates/connect.php index 520bc74c5..8320fc9d3 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/connect.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/connect.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.7 */ @@ -11,10 +11,12 @@ } /** - * @var array $VARS + * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); + $is_pending_activation = $fs->is_pending_activation(); $is_premium_only = $fs->is_only_premium(); $has_paid_plans = $fs->has_paid_plan(); @@ -36,15 +38,19 @@ $site_url = substr( $site_url, $protocol_pos + 3 ); } - $freemius_site_url = $fs->has_paid_plan() ? - 'https://freemius.com/wordpress/' : - // Insights platform information. - 'https://freemius.com/wordpress/usage-tracking/'; + $freemius_site_www = 'https://freemius.com'; + + $freemius_site_url = $freemius_site_www . '/' . ( $fs->is_premium() ? + 'wordpress/' : + // Insights platform information. + 'wordpress/usage-tracking/' . $fs->get_id() . "/{$slug}/" ); - $freemius_site_url .= '?' . http_build_query( array( - 'id' => $fs->get_id(), - 'slug' => $slug, - ) ); + if ( $fs->is_premium() ) { + $freemius_site_url .= '?' . http_build_query( array( + 'id' => $fs->get_id(), + 'slug' => $slug, + ) ); + } $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="1">freemius.com</a>'; @@ -61,245 +67,651 @@ $fs->_add_license_activation_dialog_box(); } - $fs_user = Freemius::_get_user_by_email( $current_user->user_email ); - $activate_with_current_user = is_object( $fs_user ) && ! $is_pending_activation; + $is_optin_dialog = ( + $fs->is_theme() && + $fs->is_themes_page() && + ( ! $fs->has_settings_menu() || $fs->is_free_wp_org_theme() ) + ); + + if ( $is_optin_dialog ) { + $show_close_button = false; + $previous_theme_activation_url = ''; + + if ( ! $is_premium_code ) { + $show_close_button = true; + } else if ( $is_premium_only ) { + $previous_theme_activation_url = $fs->get_previous_theme_activation_url(); + $show_close_button = ( ! empty( $previous_theme_activation_url ) ); + } + } + + $is_network_level_activation = ( + fs_is_network_admin() && + $fs->is_network_active() && + ! $fs->is_network_delegated_connection() + ); + + $fs_user = Freemius::_get_user_by_email( $current_user->user_email ); + + $activate_with_current_user = ( + is_object( $fs_user ) && + ! $is_pending_activation && + // If requires a license for activation, use the user associated with the license for the opt-in. + ! $require_license_key && + ! $is_network_level_activation + ); + + $optin_params = $fs->get_opt_in_params( array(), $is_network_level_activation ); + $sites = isset( $optin_params['sites'] ) ? $optin_params['sites'] : array(); + + $is_network_upgrade_mode = ( fs_is_network_admin() && $fs->is_network_upgrade_mode() ); + + /* translators: %s: name (e.g. Hey John,) */ + $hey_x_text = esc_html( sprintf( fs_text_x_inline( 'Hey %s,', 'greeting', 'hey-x', $slug ), $first_name ) ); + + $is_gdpr_required = ( ! $is_pending_activation && ! $require_license_key ) ? + FS_GDPR_Manager::instance()->is_required() : + false; + + if ( is_null( $is_gdpr_required ) ) { + $is_gdpr_required = $fs->fetch_and_store_current_user_gdpr_anonymously(); + } ?> -<div id="fs_connect" - class="wrap<?php if ( ! $fs->is_enable_anonymous() || $is_pending_activation || $require_license_key ) { - echo ' fs-anonymous-disabled'; - } ?>"> - <div class="fs-visual"> - <b class="fs-site-icon"><i class="dashicons dashicons-wordpress"></i></b> - <i class="dashicons dashicons-plus fs-first"></i> - <?php - $vars = array( 'slug' => $slug ); - fs_require_once_template( 'plugin-icon.php', $vars ); - ?> - <i class="dashicons dashicons-plus fs-second"></i> - <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/> - </div> - <div class="fs-content"> - <?php if ( ! empty( $error ) ) : ?> - <p class="fs-error"><?php echo $error ?></p> - <?php endif ?> - <p><?php - $button_label = 'opt-in-connect'; - - if ( $is_pending_activation ) { - $button_label = 'resend-activation-email'; - - echo $fs->apply_filters( 'pending_activation_message', sprintf( - __fs( 'thanks-x', $slug ) . '<br>' . - __fs( 'pending-activation-message', $slug ), - $first_name, - '<b>' . $fs->get_plugin_name() . '</b>', - '<b>' . $current_user->user_email . '</b>', - __fs( 'complete-the-install', $slug ) - ) ); - } else if ( $require_license_key ) { - $button_label = 'agree-activate-license'; - - echo $fs->apply_filters( 'connect-message_on-premium', - sprintf( __fs( 'hey-x', $slug ), $first_name ) . '<br>' . - sprintf( __fs( 'thanks-for-purchasing', $slug ), '<b>' . $fs->get_plugin_name() . '</b>' ), - $first_name, - $fs->get_plugin_name() - ); - } else { - $filter = 'connect_message'; - $default_optin_message = 'connect-message'; - - if ( $fs->is_plugin_update() ) { - // If Freemius was added on a plugin update, set different - // opt-in message. - $default_optin_message = 'connect-message_on-update'; - - // If user customized the opt-in message on update, use - // that message. Otherwise, fallback to regular opt-in - // custom message if exist. - if ( $fs->has_filter( 'connect_message_on_update' ) ) { - $filter = 'connect_message_on_update'; +<?php + if ( $is_optin_dialog ) { ?> +<div id="fs_theme_connect_wrapper"> + <?php + if ( $show_close_button ) { ?> + <button class="close dashicons dashicons-no"><span class="screen-reader-text">Close connect dialog</span> + </button> + <?php + } + ?> + <?php + } + ?> + <div id="fs_connect" + class="wrap<?php if ( ! fs_is_network_admin() && ( ! $fs->is_enable_anonymous() || $is_pending_activation || $require_license_key ) ) { + echo ' fs-anonymous-disabled'; + } ?><?php echo $require_license_key ? ' require-license-key' : '' ?>"> + <div class="fs-visual"> + <b class="fs-site-icon"><i class="dashicons dashicons-wordpress"></i></b> + <i class="dashicons dashicons-plus fs-first"></i> + <?php + $vars = array( 'id' => $fs->get_id() ); + fs_require_once_template( 'plugin-icon.php', $vars ); + ?> + <i class="dashicons dashicons-plus fs-second"></i> + <img class="fs-connect-logo" width="80" height="80" src="//img.freemius.com/connect-logo.png"/> + </div> + <div class="fs-content"> + <?php if ( ! empty( $error ) ) : ?> + <p class="fs-error"><?php echo esc_html( $error ) ?></p> + <?php endif ?> + <p><?php + $button_label = fs_text_inline( 'Allow & Continue', 'opt-in-connect', $slug ); + $message = ''; + + if ( $is_pending_activation ) { + $button_label = fs_text_inline( 'Re-send activation email', 'resend-activation-email', $slug ); + + $message = $fs->apply_filters( 'pending_activation_message', sprintf( + /* translators: %s: name (e.g. Thanks John!) */ + fs_text_inline( 'Thanks %s!', 'thanks-x', $slug ) . '<br>' . + fs_text_inline( 'You should receive an activation email for %s to your mailbox at %s. Please make sure you click the activation button in that email to %s.', 'pending-activation-message', $slug ), + $first_name, + '<b>' . $fs->get_plugin_name() . '</b>', + '<b>' . $current_user->user_email . '</b>', + fs_text_inline( 'complete the install', 'complete-the-install', $slug ) + ) ); + } else if ( $require_license_key ) { + $button_label = $is_network_upgrade_mode ? + fs_text_inline( 'Activate License', 'agree-activate-license', $slug ) : + fs_text_inline( 'Agree & Activate License', 'agree-activate-license', $slug ); + + $message = $fs->apply_filters( + 'connect-message_on-premium', + ($is_network_upgrade_mode ? + '' : + /* translators: %s: name (e.g. Hey John,) */ + $hey_x_text . '<br>' + ) . + sprintf( fs_text_inline( 'Thanks for purchasing %s! To get started, please enter your license key:', 'thanks-for-purchasing', $slug ), '<b>' . $fs->get_plugin_name() . '</b>' ), + $first_name, + $fs->get_plugin_name() + ); + } else { + $filter = 'connect_message'; + $default_optin_message = $is_gdpr_required ? + fs_text_inline( 'Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s.', 'connect-message', $slug) : + fs_text_inline( 'Never miss an important update - opt in to our security and feature updates notifications, and non-sensitive diagnostic tracking with %4$s.', 'connect-message', $slug); + + if ( $fs->is_plugin_update() ) { + // If Freemius was added on a plugin update, set different + // opt-in message. + $default_optin_message = $is_gdpr_required ? + fs_text_inline( 'Never miss an important update - opt in to our security & feature updates notifications, educational content, offers, and non-sensitive diagnostic tracking with %4$s. If you skip this, that\'s okay! %1$s will still work just fine.', 'connect-message_on-update', $slug ) : + fs_text_inline( 'Never miss an important update - opt in to our security & feature updates notifications, and non-sensitive diagnostic tracking with %4$s. If you skip this, that\'s okay! %1$s will still work just fine.', 'connect-message_on-update', $slug ); + + // If user customized the opt-in message on update, use + // that message. Otherwise, fallback to regular opt-in + // custom message if exist. + if ( $fs->has_filter( 'connect_message_on_update' ) ) { + $filter = 'connect_message_on_update'; + } } - } - echo $fs->apply_filters( $filter, - sprintf( __fs( 'hey-x', $slug ), $first_name ) . '<br>' . - sprintf( - __fs( $default_optin_message, $slug ), - '<b>' . $fs->get_plugin_name() . '</b>', - '<b>' . $current_user->user_login . '</b>', + $message = $fs->apply_filters( + $filter, + ($is_network_upgrade_mode ? + '' : + /* translators: %s: name (e.g. Hey John,) */ + $hey_x_text . '<br>' + ) . + sprintf( + esc_html( $default_optin_message ), + '<b>' . esc_html( $fs->get_plugin_name() ) . '</b>', + '<b>' . $current_user->user_login . '</b>', + '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>', + $freemius_link + ), + $first_name, + $fs->get_plugin_name(), + $current_user->user_login, '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>', - $freemius_link - ), - $first_name, - $fs->get_plugin_name(), - $current_user->user_login, - '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>', - $freemius_link - ); - } - ?></p> - <?php if ( $require_license_key ) : ?> - <div class="fs-license-key-container"> - <input id="fs_license_key" name="fs_key" type="text" required maxlength="32" - placeholder="<?php _efs( 'license-key', $slug ) ?>" tabindex="1"/> - <i class="dashicons dashicons-admin-network"></i> - <a class="show-license-resend-modal show-license-resend-modal-<?php echo $slug; ?>" - href="#"><?php _efs( 'cant-find-license-key' ); ?></a> - </div> - <?php endif ?> - </div> - <div class="fs-actions"> - <?php if ( $fs->is_enable_anonymous() && ! $is_pending_activation && ! $require_license_key ) : ?> - <a href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $slug . '_skip_activation' ) ), $slug . '_skip_activation' ) ?>" - class="button button-secondary" tabindex="2"><?php _efs( 'skip', $slug ) ?></a> - <?php endif ?> + $freemius_link, + $is_gdpr_required + ); + } - <?php if ( $activate_with_current_user ) : ?> - <form action="" method="POST"> - <input type="hidden" name="fs_action" value="<?php echo $slug ?>_activate_existing"> - <?php wp_nonce_field( 'activate_existing_' . $fs->get_public_key() ) ?> - <button class="button button-primary" tabindex="1" - type="submit"<?php if ( $require_license_key ) { - echo ' disabled="disabled"'; - } ?>><?php _efs( $button_label, $slug ) ?></button> - </form> - <?php else : ?> - <form method="post" action="<?php echo WP_FS__ADDRESS ?>/action/service/user/install/"> - <?php $params = $fs->get_opt_in_params() ?> - <?php foreach ( $params as $name => $value ) : ?> - <input type="hidden" name="<?php echo $name ?>" value="<?php echo esc_attr( $value ) ?>"> - <?php endforeach ?> - <button class="button button-primary" tabindex="1" - type="submit"<?php if ( $require_license_key ) { - echo ' disabled="disabled"'; - } ?>><?php _efs( $button_label, $slug ) ?></button> - </form> - <?php endif ?> - </div><?php - - // Set core permission list items. - $permissions = array( - 'profile' => array( - 'icon-class' => 'dashicons dashicons-admin-users', - 'label' => __fs( 'permissions-profile' ), - 'desc' => __fs( 'permissions-profile_desc' ), - 'priority' => 5, - ), - 'site' => array( - 'icon-class' => 'dashicons dashicons-admin-settings', - 'label' => __fs( 'permissions-site' ), - 'desc' => __fs( 'permissions-site_desc' ), - 'priority' => 10, - ), - 'notices' => array( - 'icon-class' => 'dashicons dashicons-testimonial', - 'label' => __fs( 'permissions-admin-notices' ), - 'desc' => __fs( 'permissions-newsletter_desc' ), - 'priority' => 13, - ), - 'events' => array( - 'icon-class' => 'dashicons dashicons-admin-plugins', - 'label' => __fs( 'permissions-events' ), - 'desc' => __fs( 'permissions-events_desc' ), - 'priority' => 20, - ), -// 'plugins_themes' => array( -// 'icon-class' => 'dashicons dashicons-admin-settings', -// 'label' => __fs( 'permissions-plugins_themes' ), -// 'desc' => __fs( 'permissions-plugins_themes_desc' ), -// 'priority' => 30, -// ), - ); - - // Add newsletter permissions if enabled. - if ( $fs->is_permission_requested( 'newsletter' ) ) { - $permissions['newsletter'] = array( - 'icon-class' => 'dashicons dashicons-email-alt', - 'label' => __fs( 'permissions-newsletter' ), - 'desc' => __fs( 'permissions-newsletter_desc' ), - 'priority' => 15, + if ( $is_network_upgrade_mode ) { + $network_integration_text = esc_html( fs_text_inline( 'We\'re excited to introduce the Freemius network-level integration.', 'connect_message_network_upgrade', $slug ) ); + + if ($is_premium_code){ + $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %d site(s) that are still pending license activation.', 'connect_message_network_upgrade-premium', $slug ), count( $sites ) ); + + $message .= '<br><br>' . sprintf( fs_text_inline( 'If you\'d like to use the %s on those sites, please enter your license key below and click the activation button.', 'connect_message_network_upgrade-premium-activate-license', $slug ), $is_premium_only ? $fs->get_module_label( true ) : sprintf( + /* translators: %s: module type (plugin, theme, or add-on) */ + fs_text_inline( "%s's paid features", 'x-paid-features', $slug ), + $fs->get_module_label( true ) + ) ); + + /* translators: %s: module type (plugin, theme, or add-on) */ + $message .= ' ' . sprintf( fs_text_inline( 'Alternatively, you can skip it for now and activate the license later, in your %s\'s network-level Account page.', 'connect_message_network_upgrade-premium-skip-license', $slug ), $fs->get_module_label( true ) ); + }else { + $message = $network_integration_text . ' ' . sprintf( fs_text_inline( 'During the update process we detected %s site(s) in the network that are still pending your attention.', 'connect_message_network_upgrade-free', $slug ), count( $sites ) ) . '<br><br>' . ( fs_starts_with( $message, $hey_x_text . '<br>' ) ? substr( $message, strlen( $hey_x_text . '<br>' ) ) : $message ); + } + } + + echo $message; + ?></p> + <?php if ( $require_license_key ) : ?> + <div class="fs-license-key-container"> + <input id="fs_license_key" name="fs_key" type="text" required maxlength="<?php echo $fs->apply_filters('license_key_maxlength', 32) ?>" + placeholder="<?php fs_esc_attr_echo_inline( 'License key', 'license-key', $slug ) ?>" tabindex="1"/> + <i class="dashicons dashicons-admin-network"></i> + <a class="show-license-resend-modal show-license-resend-modal-<?php echo $fs->get_unique_affix() ?>" + href="#"><?php fs_esc_html_echo_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); ?></a> + </div> + + <?php + /** + * Allows developers to include custom HTML after the license input container. + * + * @author Vova Feldman + * @since 2.1.2 + */ + $fs->do_action( 'connect/after_license_input' ); + ?> + + <?php + $send_updates_text = sprintf( + '%s<span class="action-description"> - %s</span>', + $fs->get_text_inline( 'Yes', 'yes' ), + $fs->get_text_inline( 'send me security & feature updates, educational content and offers.', 'send-updates' ) + ); + + $do_not_send_updates_text = sprintf( + '%s<span class="action-description"> - %s</span>', + $fs->get_text_inline( 'No', 'no' ), + sprintf( + $fs->get_text_inline( 'do %sNOT%s send me security & feature updates, educational content and offers.', 'do-not-send-updates' ), + '<span class="underlined">', + '</span>' + ) + ); + ?> + <div id="fs_marketing_optin"> + <span class="fs-message"><?php fs_echo_inline( "Please let us know if you'd like us to contact you for security & feature updates, educational content, and occasional offers:", 'contact-for-updates' ) ?></span> + <div class="fs-input-container"> + <label> + <input type="radio" name="allow-marketing" value="true" tabindex="1" /> + <span class="fs-input-label"><?php echo $send_updates_text ?></span> + </label> + <label> + <input type="radio" name="allow-marketing" value="false" tabindex="1" /> + <span class="fs-input-label"><?php echo $do_not_send_updates_text ?></span> + </label> + </div> + </div> + <?php endif ?> + <?php if ( $is_network_level_activation ) : ?> + <?php + $vars = array( + 'id' => $fs->get_id(), + 'sites' => $sites, + 'require_license_key' => $require_license_key + ); + + echo fs_get_template( 'partials/network-activation.php', $vars ); + ?> + <?php endif ?> + </div> + <div class="fs-actions"> + <?php if ( $fs->is_enable_anonymous() && ! $is_pending_activation && ( ! $require_license_key || $is_network_upgrade_mode ) ) : ?> + <a id="skip_activation" href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_skip_activation' ), $is_network_level_activation ), $fs->get_unique_affix() . '_skip_activation' ) ?>" + class="button button-secondary" tabindex="2"><?php fs_esc_html_echo_x_inline( 'Skip', 'verb', 'skip', $slug ) ?></a> + <?php endif ?> + <?php if ( $is_network_level_activation ) : ?> + <a id="delegate_to_site_admins" class="fs-tooltip-trigger <?php echo is_rtl() ? ' rtl' : '' ?>" href="<?php echo fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_delegate_activation' ) ), $fs->get_unique_affix() . '_delegate_activation' ) ?>"><?php fs_esc_html_echo_inline( 'Delegate to Site Admins', 'delegate-to-site-admins', $slug ) ?><span class="fs-tooltip"><?php fs_esc_html_echo_inline( 'If you click it, this decision will be delegated to the sites administrators.', 'delegate-sites-tooltip', $slug ) ?></span></a> + <?php endif ?> + <?php if ( $activate_with_current_user ) : ?> + <form action="" method="POST"> + <input type="hidden" name="fs_action" + value="<?php echo $fs->get_unique_affix() ?>_activate_existing"> + <?php wp_nonce_field( 'activate_existing_' . $fs->get_public_key() ) ?> + <button class="button button-primary" tabindex="1" + type="submit"><?php echo esc_html( $button_label ) ?></button> + </form> + <?php else : ?> + <form method="post" action="<?php echo WP_FS__ADDRESS ?>/action/service/user/install/"> + <?php unset( $optin_params['sites']); ?> + <?php foreach ( $optin_params as $name => $value ) : ?> + <input type="hidden" name="<?php echo $name ?>" value="<?php echo esc_attr( $value ) ?>"> + <?php endforeach ?> + <button class="button button-primary" tabindex="1" + type="submit"<?php if ( $require_license_key ) { + echo ' disabled="disabled"'; + } ?>><?php echo esc_html( $button_label ) ?></button> + </form> + <?php endif ?> + </div><?php + + // Set core permission list items. + $permissions = array( + 'profile' => array( + 'icon-class' => 'dashicons dashicons-admin-users', + 'label' => $fs->get_text_inline( 'Your Profile Overview', 'permissions-profile' ), + 'desc' => $fs->get_text_inline( 'Name and email address', 'permissions-profile_desc' ), + 'priority' => 5, + ), + 'site' => array( + 'icon-class' => 'dashicons dashicons-admin-settings', + 'label' => $fs->get_text_inline( 'Your Site Overview', 'permissions-site' ), + 'desc' => $fs->get_text_inline( 'Site URL, WP version, PHP info, plugins & themes', 'permissions-site_desc' ), + 'priority' => 10, + ), + 'notices' => array( + 'icon-class' => 'dashicons dashicons-testimonial', + 'label' => $fs->get_text_inline( 'Admin Notices', 'permissions-admin-notices' ), + 'desc' => $fs->get_text_inline( 'Updates, announcements, marketing, no spam', 'permissions-newsletter_desc' ), + 'priority' => 13, + ), + 'events' => array( + 'icon-class' => 'dashicons dashicons-admin-plugins', + 'label' => sprintf( $fs->get_text_inline( 'Current %s Events', 'permissions-events' ), ucfirst( $fs->get_module_type() ) ), + 'desc' => $fs->get_text_inline( 'Activation, deactivation and uninstall', 'permissions-events_desc' ), + 'priority' => 20, + ), ); - } - // Allow filtering of the permissions list. - $permissions = $fs->apply_filters( 'permission_list', $permissions ); - - // Sort by priority. - uasort( $permissions, 'fs_sort_by_priority' ); - - if ( ! empty( $permissions ) ) : ?> - <div class="fs-permissions"> - <?php if ( $require_license_key ) : ?> - <p class="fs-license-sync-disclaimer"><?php printf( __fs( 'license-sync-disclaimer', $slug ), $freemius_link ) ?></p> - <?php endif ?> - <a class="fs-trigger" href="#" tabindex="1"><?php _efs( 'what-permissions', $slug ) ?></a> - <ul><?php - foreach ( $permissions as $id => $permission ) : ?> - <li id="fs-permission-<?php echo esc_attr( $id ); ?>" - class="fs-permission fs-<?php echo esc_attr( $id ); ?>"> - <i class="<?php echo esc_attr( $permission['icon-class'] ); ?>"></i> - - <div> - <span><?php echo esc_html( $permission['label'] ); ?></span> - - <p><?php echo esc_html( $permission['desc'] ); ?></p> - </div> - </li> - <?php endforeach; ?> - </ul> + // Add newsletter permissions if enabled. + if ( $is_gdpr_required || $fs->is_permission_requested( 'newsletter' ) ) { + $permissions['newsletter'] = array( + 'icon-class' => 'dashicons dashicons-email-alt', + 'label' => $fs->get_text_inline( 'Newsletter', 'permissions-newsletter' ), + 'desc' => $fs->get_text_inline( 'Updates, announcements, marketing, no spam', 'permissions-newsletter_desc' ), + 'priority' => 15, + ); + } + + // Allow filtering of the permissions list. + $permissions = $fs->apply_filters( 'permission_list', $permissions ); + + // Sort by priority. + uasort( $permissions, 'fs_sort_by_priority' ); + + if ( ! empty( $permissions ) ) : ?> + <div class="fs-permissions"> + <?php if ( $require_license_key ) : ?> + <p class="fs-license-sync-disclaimer"><?php + echo sprintf( + fs_esc_html_inline( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ), + $fs->get_module_label( true ), + $freemius_link + ) ?></p> + <?php endif ?> + <a class="fs-trigger" href="#" tabindex="1"><?php fs_esc_html_echo_inline( 'What permissions are being granted?', 'what-permissions', $slug ) ?></a> + <ul><?php + foreach ( $permissions as $id => $permission ) : ?> + <li id="fs-permission-<?php echo esc_attr( $id ); ?>" + class="fs-permission fs-<?php echo esc_attr( $id ); ?>"> + <i class="<?php echo esc_attr( $permission['icon-class'] ); ?>"></i> + + <div> + <span><?php echo esc_html( $permission['label'] ); ?></span> + + <p><?php echo esc_html( $permission['desc'] ); ?></p> + </div> + </li> + <?php endforeach; ?> + </ul> + </div> + <?php endif ?> + <?php if ( $is_premium_code && $is_freemium ) : ?> + <div class="fs-freemium-licensing"> + <p> + <?php if ( $require_license_key ) : ?> + <?php fs_esc_html_echo_inline( 'Don\'t have a license key?', 'dont-have-license-key', $slug ) ?> + <a data-require-license="false" tabindex="1"><?php fs_esc_html_echo_inline( 'Activate Free Version', 'activate-free-version', $slug ) ?></a> + <?php else : ?> + <?php fs_echo_inline( 'Have a license key?', 'have-license-key', $slug ) ?> + <a data-require-license="true" tabindex="1"><?php fs_esc_html_echo_inline( 'Activate License', 'activate-license', $slug ) ?></a> + <?php endif ?> + </p> </div> <?php endif ?> - <?php if ( $is_premium_code && $is_freemium ) : ?> - <div class="fs-freemium-licensing"> - <p> - <?php if ( $require_license_key ) : ?> - <?php _efs( 'dont-have-license-key', $slug ) ?> - <a data-require-license="false" tabindex="1"><?php _efs( 'activate-free-version', $slug ) ?></a> - <?php else : ?> - <?php _efs( 'have-license-key', $slug ) ?> - <a data-require-license="true" tabindex="1"><?php _efs( 'activate-license', $slug ) ?></a> - <?php endif ?> - </p> + <div class="fs-terms"> + <a href="https://freemius.com/privacy/" target="_blank" + tabindex="1"><?php fs_esc_html_echo_inline( 'Privacy Policy', 'privacy-policy', $slug ) ?></a> + - + <a href="<?php echo $freemius_site_www ?>/terms/" target="_blank" tabindex="1"><?php fs_echo_inline( 'Terms of Service', 'tos', $slug ) ?></a> </div> - <?php endif ?> - <div class="fs-terms"> - <a href="https://freemius.com/privacy/" target="_blank" - tabindex="1"><?php _efs( 'privacy-policy', $slug ) ?></a> - - - <a href="https://freemius.com/terms/" target="_blank" tabindex="1"><?php _efs( 'tos', $slug ) ?></a> </div> + <?php + if ( $is_optin_dialog ) { ?> </div> +<?php + } +?> <script type="text/javascript"> (function ($) { - var $primaryCta = $('.fs-actions .button.button-primary'), - $form = $('.fs-actions form'), - requireLicenseKey = <?php echo $require_license_key ? 'true' : 'false' ?>, - hasContextUser = <?php echo $activate_with_current_user ? 'true' : 'false' ?>, + var $html = $('html'); + + <?php + if ( $is_optin_dialog ) { + if ( $show_close_button ) { ?> + var $themeConnectWrapper = $('#fs_theme_connect_wrapper'); + + $themeConnectWrapper.find('button.close').on('click', function () { + <?php if ( ! empty( $previous_theme_activation_url ) ) { ?> + location.href = '<?php echo html_entity_decode( $previous_theme_activation_url ); ?>'; + <?php } else { ?> + $themeConnectWrapper.remove(); + $html.css({overflow: $html.attr('fs-optin-overflow')}); + <?php } ?> + }); + <?php + } + ?> + + $html.attr('fs-optin-overflow', $html.css('overflow')); + $html.css({overflow: 'hidden'}); + + <?php + } + ?> + + var $primaryCta = $('.fs-actions .button.button-primary'), + primaryCtaLabel = $primaryCta.html(), + $form = $('.fs-actions form'), + isNetworkActive = <?php echo $is_network_level_activation ? 'true' : 'false' ?>, + requireLicenseKey = <?php echo $require_license_key ? 'true' : 'false' ?>, + hasContextUser = <?php echo $activate_with_current_user ? 'true' : 'false' ?>, + isNetworkUpgradeMode = <?php echo $is_network_upgrade_mode ? 'true' : 'false' ?>, $licenseSecret, - $licenseKeyInput = $('#fs_license_key'); + $licenseKeyInput = $('#fs_license_key'), + pauseCtaLabelUpdate = false, + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + resetLoadingMode = function() { + // Reset loading mode. + $primaryCta.html(primaryCtaLabel); + $primaryCta.prop('disabled', false); + $(document.body).css({'cursor': 'auto'}); + $('.fs-loading').removeClass('fs-loading'); + + console.log('resetLoadingMode - Primary button was enabled'); + }, + setLoadingMode = function () { + $(document.body).css({'cursor': 'wait'}); + }; $('.fs-actions .button').on('click', function () { - // Set loading mode. - $(document.body).css({'cursor': 'wait'}); + setLoadingMode(); var $this = $(this); - $this.css({'cursor': 'wait'}); setTimeout(function () { - $this.attr('disabled', 'disabled'); + if ( ! requireLicenseKey || ! $marketingOptin.hasClass( 'error' ) ) { + $this.attr('disabled', 'disabled'); + } }, 200); }); + if ( isNetworkActive ) { + var + $multisiteOptionsContainer = $( '#multisite_options_container' ), + $allSitesOptions = $( '#all_sites_options' ), + $applyOnAllSites = $( '#apply_on_all_sites' ), + $sitesListContainer = $( '#sites_list_container' ), + totalSites = <?php echo count( $sites ) ?>, + maxSitesListHeight = null, + $skipActivationButton = $( '#skip_activation' ), + $delegateToSiteAdminsButton = $( '#delegate_to_site_admins' ); + + $applyOnAllSites.click(function() { + var isChecked = $( this ).is( ':checked' ); + + if ( isChecked ) { + $multisiteOptionsContainer.find( '.action' ).removeClass( 'selected' ); + updatePrimaryCtaText( 'allow' ); + } + + $multisiteOptionsContainer.find( '.action-allow' ).addClass( 'selected' ); + + $skipActivationButton.toggle(); + + $delegateToSiteAdminsButton.toggle(); + + $multisiteOptionsContainer.toggleClass( 'apply-on-all-sites', isChecked ); + + $sitesListContainer.toggle( ! isChecked ); + if ( ! isChecked && null === maxSitesListHeight ) { + /** + * Set the visible number of rows to 5 (5 * height of the first row). + * + * @author Leo Fajardo (@leorw) + */ + maxSitesListHeight = ( 5 * $sitesListContainer.find( 'tr:first' ).height() ); + $sitesListContainer.css( 'max-height', maxSitesListHeight ); + } + }); + + $allSitesOptions.find( '.action' ).click(function( evt ) { + var actionType = $( evt.target ).data( 'action-type' ); + + $multisiteOptionsContainer.find( '.action' ).removeClass( 'selected' ); + $multisiteOptionsContainer.find( '.action-' + actionType ).toggleClass( 'selected' ); + + updatePrimaryCtaText( actionType ); + }); + + $sitesListContainer.delegate( '.action', 'click', function( evt ) { + var $this = $( evt.target ); + if ( $this.hasClass( 'selected' ) ) { + return false; + } + + $this.parents( 'tr:first' ).find( '.action' ).removeClass( 'selected' ); + $this.toggleClass( 'selected' ); + + var + singleSiteActionType = $this.data( 'action-type' ), + totalSelected = $sitesListContainer.find( '.action-' + singleSiteActionType + '.selected' ).length; + + $allSitesOptions.find( '.action.selected' ).removeClass( 'selected' ); + + if ( totalSelected === totalSites ) { + $allSitesOptions.find( '.action-' + singleSiteActionType ).addClass( 'selected' ); + + updatePrimaryCtaText( singleSiteActionType ); + } else { + updatePrimaryCtaText( 'mixed' ); + } + }); + + if (isNetworkUpgradeMode) { + $skipActivationButton.click(function(){ + $delegateToSiteAdminsButton.hide(); + + $skipActivationButton.html('<?php fs_esc_js_echo_inline( 'Skipping, please wait', 'skipping-wait', $slug ) ?>...'); + + pauseCtaLabelUpdate = true; + + // Check all sites to be skipped. + $allSitesOptions.find('.action.action-skip').click(); + + $form.submit(); + + pauseCtaLabelUpdate = false; + + return false; + }); + + $delegateToSiteAdminsButton.click(function(){ + $delegateToSiteAdminsButton.html('<?php fs_esc_js_echo_inline( 'Delegating, please wait', 'delegating-wait', $slug ) ?>...'); + + pauseCtaLabelUpdate = true; + + // Check all sites to be skipped. + $allSitesOptions.find('.action.action-delegate').click(); + + $form.submit(); + + pauseCtaLabelUpdate = false; + + return false; + }); + } + } + + /** + * @author Leo Fajardo (@leorw) + */ + function updatePrimaryCtaText( actionType ) { + if (pauseCtaLabelUpdate) + return; + + var text = '<?php fs_esc_js_echo_inline( 'Continue', 'continue', $slug ) ?>'; + + switch ( actionType ) { + case 'allow': + text = '<?php fs_esc_js_echo_inline( 'Allow & Continue', 'opt-in-connect', $slug ) ?>'; + break; + case 'delegate': + text = '<?php fs_esc_js_echo_inline( 'Delegate to Site Admins & Continue', 'delegate-to-site-admins-and-continue', $slug ) ?>'; + break; + case 'skip': + text = '<?php fs_esc_js_echo_x_inline( 'Skip', 'verb', 'skip', $slug ) ?>'; + break; + } + + $primaryCta.html( text ); + } + + var ajaxOptin = ( requireLicenseKey || isNetworkActive ); + $form.on('submit', function () { /** * @author Vova Feldman (@svovaf) * @since 1.1.9 */ - if (requireLicenseKey) { - if (!hasContextUser) { + if ( ajaxOptin ) { + if (!hasContextUser || isNetworkUpgradeMode) { + <?php $action = $require_license_key ? 'activate_license' : 'network_activate' ?> + $('.fs-error').remove(); + var + licenseKey = $licenseKeyInput.val(), + data = { + action : '<?php echo $fs->get_ajax_action( $action ) ?>', + security : '<?php echo $fs->get_ajax_security( $action ) ?>', + license_key: licenseKey, + module_id : '<?php echo $fs->get_id() ?>' + }; + + if (requireLicenseKey && + isMarketingAllowedByLicense.hasOwnProperty(licenseKey) + ) { + var + isMarketingAllowed = null, + $isMarketingAllowed = $marketingOptin.find( 'input[type="radio"][name="allow-marketing"]:checked'); + + + if ($isMarketingAllowed.length > 0) + isMarketingAllowed = ('true' == $isMarketingAllowed.val()); + + if ( null == isMarketingAllowedByLicense[ licenseKey ] && + null == isMarketingAllowed + ) { + $marketingOptin.addClass( 'error' ).show(); + resetLoadingMode(); + return false; + } else if ( null == isMarketingAllowed ) { + isMarketingAllowed = isMarketingAllowedByLicense[ licenseKey ]; + } + + data.is_marketing_allowed = isMarketingAllowed; + } + + $marketingOptin.removeClass( 'error' ); + + if ( isNetworkActive ) { + var + sites = [], + applyOnAllSites = $applyOnAllSites.is( ':checked' ); + + $sitesListContainer.find( 'tr' ).each(function() { + var + $this = $( this ), + includeSite = ( ! requireLicenseKey || applyOnAllSites || $this.find( 'input' ).is( ':checked' ) ); + + if ( ! includeSite ) + return; + + var site = { + uid : $this.find( '.uid' ).val(), + url : $this.find( '.url' ).val(), + title : $this.find( '.title' ).val(), + language: $this.find( '.language' ).val(), + charset : $this.find( '.charset' ).val(), + blog_id : $this.find( '.blog-id' ).find( 'span' ).text() + }; + + if ( ! requireLicenseKey) { + site.action = $this.find('.action.selected').data('action-type'); + } + + sites.push( site ); + }); + + data.sites = sites; + } + /** * Use the AJAX opt-in when license key is required to potentially * process the after install failure hook. @@ -310,26 +722,21 @@ $.ajax({ url : ajaxurl, method : 'POST', - data : { - action : 'fs_activate_license_<?php echo $slug ?>', - slug : '<?php echo $slug ?>', - license_key: $licenseKeyInput.val() - }, + data : data, success: function (result) { var resultObj = $.parseJSON(result); if (resultObj.success) { // Redirect to the "Account" page and sync the license. window.location.href = resultObj.next_page; } else { - // Show error. - $('.fs-content').prepend('<p class="fs-error">' + resultObj.error + '</p>'); + resetLoadingMode(); - // Reset loading mode. - $primaryCta.removeClass('fs-loading').css({'cursor': 'auto'}); - $primaryCta.html(<?php echo json_encode(__fs( $button_label, $slug )) ?>); - $primaryCta.prop('disabled', false); - $(document.body).css({'cursor': 'auto'}); + // Show error. + $('.fs-content').prepend('<p class="fs-error">' + (resultObj.error.message ? resultObj.error.message : resultObj.error) + '</p>'); } + }, + error: function () { + resetLoadingMode(); } }); @@ -350,12 +757,19 @@ }); $primaryCta.on('click', function () { + console.log('Primary button was clicked'); + $(this).addClass('fs-loading'); - $(this).html(<?php echo json_encode(__fs( $is_pending_activation ? 'sending-email' : 'activating' , $slug )) ?> +'...'); + $(this).html('<?php echo esc_js( $is_pending_activation ? + fs_text_x_inline( 'Sending email', 'as in the process of sending an email', 'sending-email', $slug ) : + fs_text_x_inline( 'Activating', 'as activating plugin', 'activating', $slug ) + ) ?>...'); }); $('.fs-permissions .fs-trigger').on('click', function () { $('.fs-permissions').toggleClass('fs-open'); + + return false; }); if (requireLicenseKey) { @@ -382,11 +796,26 @@ */ $licenseKeyInput.on('keyup paste delete cut', function () { setTimeout(function () { - if ('' === $licenseKeyInput.val()) { + var key = $licenseKeyInput.val(); + + if (key == previousLicenseKey){ + return; + } + + if ('' === key) { $primaryCta.attr('disabled', 'disabled'); + $marketingOptin.hide(); } else { - $primaryCta.prop('disabled', false); + $primaryCta.prop('disabled', false); + + if (32 <= key.length){ + fetchIsMarketingAllowedFlagAndToggleOptin(); + } else { + $marketingOptin.hide(); + } } + + previousLicenseKey = key; }, 100); }).focus(); } @@ -397,9 +826,105 @@ * @author Vova Feldman (@svovaf) * @since 1.1.9 */ - var $connectLicenseModeTrigger = $('#fs_connect .fs-freemium-licensing a'); + var + $connectLicenseModeTrigger = $('#fs_connect .fs-freemium-licensing a'), + href = window.location.href; + + if (href.indexOf('?') > 0) { + href += '&'; + } else { + href += '?'; + } + if ($connectLicenseModeTrigger.length > 0) { - $connectLicenseModeTrigger.attr('href', window.location.href + '&require_license=' + $connectLicenseModeTrigger.attr('data-require-license')) + $connectLicenseModeTrigger.attr( + 'href', + href + 'require_license=' + $connectLicenseModeTrigger.attr('data-require-license') + ); } + + //-------------------------------------------------------------------------------- + //region GDPR + //-------------------------------------------------------------------------------- + var isMarketingAllowedByLicense = {}, + $marketingOptin = $('#fs_marketing_optin'), + previousLicenseKey = null; + + if (requireLicenseKey) { + + var + afterMarketingFlagLoaded = function () { + var licenseKey = $licenseKeyInput.val(); + + if (null == isMarketingAllowedByLicense[licenseKey]) { + $marketingOptin.show(); + + if ($marketingOptin.find('input[type=radio]:checked').length > 0){ + // Focus on button if GDPR opt-in already selected is already selected. + $primaryCta.focus(); + } else { + // Focus on the GDPR opt-in radio button. + $($marketingOptin.find('input[type=radio]')[0]).focus(); + } + } else { + $marketingOptin.hide(); + $primaryCta.focus(); + } + }, + /** + * @author Leo Fajardo (@leorw) + * @since 2.1.0 + */ + fetchIsMarketingAllowedFlagAndToggleOptin = function () { + var licenseKey = $licenseKeyInput.val(); + + if (licenseKey.length < 32) { + $marketingOptin.hide(); + return; + } + + if (isMarketingAllowedByLicense.hasOwnProperty(licenseKey)) { + afterMarketingFlagLoaded(); + return; + } + + $marketingOptin.hide(); + + setLoadingMode(); + + $primaryCta.addClass('fs-loading'); + $primaryCta.attr('disabled', 'disabled'); + $primaryCta.html('<?php fs_esc_js_echo_inline( 'Please wait', 'please-wait', $slug ) ?>...'); + + $.ajax({ + url : ajaxurl, + method : 'POST', + data : { + action : '<?php echo $fs->get_ajax_action( 'fetch_is_marketing_required_flag_value' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'fetch_is_marketing_required_flag_value' ) ?>', + license_key: licenseKey, + module_id : '<?php echo $fs->get_id() ?>' + }, + success: function (result) { + resetLoadingMode(); + + if (result.success) { + result = result.data; + + // Cache result. + isMarketingAllowedByLicense[licenseKey] = result.is_marketing_allowed; + } + + afterMarketingFlagLoaded(); + } + }); + }; + + $marketingOptin.find( 'input' ).click(function() { + $marketingOptin.removeClass( 'error' ); + }); + } + + //endregion })(jQuery); </script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/contact.php b/wp-content/plugins/nextgen-gallery/freemius/templates/contact.php index e11d44823..a066a3f8f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/contact.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/contact.php @@ -2,10 +2,37 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.3 */ + /** + * Note for WordPress.org Theme/Plugin reviewer: + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This code (and page) will not run for wp.org themes (only plugins). + * + * In addition, this page loads an i-frame. We intentionally named it 'frame' + * so it will pass the "Theme Check" that is looking for the string "i" . "frame". + * + * UPDATE: + * After ongoing conversations with the WordPress.org TRT we received + * an official approval for including i-frames in the theme's WP Admin setting's + * page tab (the SDK will never add any i-frames on the sitefront). i-frames + * were never against the guidelines, but we wanted to get the team's blessings + * before we move forward. For the record, I got the final approval from + * Ulrich Pogson (@grapplerulrich), a team lead at the TRT during WordCamp + * Europe 2017 (June 16th, 2017). + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -17,10 +44,11 @@ fs_enqueue_local_style( 'fs_checkout', '/admin/common.css' ); /** - * @var array $VARS + * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); $context_params = array( 'plugin_id' => $fs->get_id(), @@ -44,33 +72,41 @@ 'site_url' => get_site_url(), // 'wp_admin_css' => get_bloginfo('wpurl') . "/wp-admin/load-styles.php?c=1&load=buttons,wp-admin,dashicons", ) ) ); + + $view_params = array( + 'id' => $VARS['id'], + 'page' => strtolower( $fs->get_text_inline( 'Contact', 'contact' ) ), + ); + fs_require_once_template('secure-https-header.php', $view_params); + + $has_tabs = $fs->_add_tabs_before_content(); + + if ( $has_tabs ) { + $query_params['tabs'] = 'true'; + } ?> - <div class="fs-secure-notice"> - <i class="dashicons dashicons-lock"></i> - <span><b>Secure HTTPS contact page</b>, running via iframe from external domain</span> - </div> - <div id="fs_contact" class="wrap" style="margin: 40px 0 -65px -20px;"> - <div id="iframe"></div> + <div id="fs_contact" class="wrap fs-section fs-full-size-wrapper"> + <div id="frame"></div> <script type="text/javascript"> (function ($) { $(function () { var - // Keep track of the iframe height. - iframe_height = 800, + // Keep track of the i-frame height. + frame_height = 800, base_url = '<?php echo WP_FS__ADDRESS ?>', src = base_url + '/contact/?<?php echo http_build_query($query_params) ?>#' + encodeURIComponent(document.location.href), - // Append the Iframe into the DOM. - iframe = $('<iframe " src="' + src + '" width="100%" height="' + iframe_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/iframe>') - .appendTo('#iframe'); + // Append the i-frame into the DOM. + frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent; width: 1px; min-width: 100%;"><\/i' + 'frame>') + .appendTo('#frame'); FS.PostMessage.init(base_url); FS.PostMessage.receive('height', function (data) { var h = data.height; - if (!isNaN(h) && h > 0 && h != iframe_height) { - iframe_height = h; - $("#iframe iframe").height(iframe_height + 'px'); + if (!isNaN(h) && h > 0 && h != frame_height) { + frame_height = h; + $('#frame i' + 'frame').height(frame_height + 'px'); } }); }); @@ -78,11 +114,15 @@ </script> </div> <?php + if ( $has_tabs ) { + $fs->_add_tabs_after_content(); + } + $params = array( 'page' => 'contact', 'module_id' => $fs->get_id(), + 'module_type' => $fs->get_module_type(), 'module_slug' => $slug, 'module_version' => $fs->get_plugin_version(), ); - fs_require_template( 'powered-by.php', $params ); -?> \ No newline at end of file + fs_require_template( 'powered-by.php', $params ); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug.php index df0c46749..0ee3ebf9c 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/debug.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug.php @@ -1,367 +1,724 @@ <?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.1.1 - */ + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.1.1 + */ - if ( ! defined( 'ABSPATH' ) ) { - exit; - } + if ( ! defined( 'ABSPATH' ) ) { + exit; + } - global $fs_active_plugins; + global $fs_active_plugins; - $fs_options = FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); + $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); + + $off_text = fs_text_x_inline( 'Off', 'as turned off' ); + $on_text = fs_text_x_inline( 'On', 'as turned on' ); ?> - <h1><?php echo __fs( 'Freemius Debug' ) . ' - ' . __fs( 'SDK' ) . ' v.' . $fs_active_plugins->newest->version ?></h1> - <div> - <!-- Debugging Switch --> - <?php //$debug_mode = get_option( 'fs_debug_mode', null ) ?> - <span class="switch-label"><?php _efs( 'debugging' ) ?></span> - - <div class="switch <?php echo WP_FS__DEBUG_SDK ? 'off' : 'on' ?>"> - <div class="toggle"></div> - <span class="on"><?php _efs( 'on' ) ?></span> - <span class="off"><?php _efs( 'off' ) ?></span> - </div> - <script type="text/javascript"> - (function ($) { - $(document).ready(function () { - // Switch toggle - $('.switch').click(function () { - $(this) - .toggleClass('on') - .toggleClass('off'); - - $.post(ajaxurl, { - action: 'fs_toggle_debug_mode', - is_on : ($(this).hasClass('off') ? 1 : 0) - }, function (response) { - if (1 == response) { - // Refresh page on success. - location.reload(); - } - }); - }); - }); - }(jQuery)); - </script> - </div> - <h2><?php _efs( 'actions' ) ?></h2> - <table> - <tbody> - <tr> - <td> - <!-- Delete All Accounts --> - <form action="" method="POST"> - <input type="hidden" name="fs_action" value="restart_freemius"> - <?php wp_nonce_field( 'restart_freemius' ) ?> - <button class="button button-primary" - onclick="if (confirm('<?php _efs( 'delete-all-confirm' ) ?>')) this.parentNode.submit(); return false;"><?php _efs( 'delete-all-accounts' ) ?></button> - </form> - </td> - <td> - <!-- Clear API Cache --> - <form action="" method="POST"> - <input type="hidden" name="fs_clear_api_cache" value="true"> - <button class="button button-primary"><?php _efs( 'clear-api-cache' ) ?></button> - </form> - </td> - <td> - <!-- Sync Data with Server --> - <form action="" method="POST"> - <input type="hidden" name="background_sync" value="true"> - <button class="button button-primary"><?php _efs( 'sync-data-from-server' ) ?></button> - </form> - </td> - </tr> - </tbody> - </table> +<h1><?php echo fs_text_inline( 'Freemius Debug' ) . ' - ' . fs_text_inline( 'SDK' ) . ' v.' . $fs_active_plugins->newest->version ?></h1> +<div> + <!-- Debugging Switch --> + <?php //$debug_mode = get_option( 'fs_debug_mode', null ) ?> + <span class="switch-label"><?php fs_esc_html_echo_x_inline( 'Debugging', 'as code debugging' ) ?></span> + + <div class="switch <?php echo WP_FS__DEBUG_SDK ? 'off' : 'on' ?>"> + <div class="toggle"></div> + <span class="on"><?php echo esc_html( $on_text ) ?></span> + <span class="off"><?php echo esc_html( $off_text ) ?></span> + </div> + <script type="text/javascript"> + (function ($) { + $(document).ready(function () { + // Switch toggle + $('.switch').click(function () { + $(this) + .toggleClass('on') + .toggleClass('off'); + + $.post(ajaxurl, { + action: 'fs_toggle_debug_mode', + is_on : ($(this).hasClass('off') ? 1 : 0) + }, function (response) { + if (1 == response) { + // Refresh page on success. + location.reload(); + } + }); + }); + }); + }(jQuery)); + </script> +</div> +<h2><?php fs_esc_html_echo_inline( 'Actions', 'actions' ) ?></h2> +<table> + <tbody> + <tr> + <td> + <!-- Delete All Accounts --> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="restart_freemius"> + <?php wp_nonce_field( 'restart_freemius' ) ?> + <button class="button button-primary" + onclick="if (confirm('<?php fs_esc_attr_echo_inline( 'Are you sure you want to delete all Freemius data?', 'delete-all-confirm' ) ?>')) this.parentNode.submit(); return false;"><?php fs_esc_html_echo_inline( 'Delete All Accounts' ) ?></button> + </form> + </td> + <td> + <!-- Clear API Cache --> + <form action="" method="POST"> + <input type="hidden" name="fs_clear_api_cache" value="true"> + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Clear API Cache' ) ?></button> + </form> + </td> + <td> + <!-- Clear Updates Transients --> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="clear_updates_data"> + <?php wp_nonce_field( 'clear_updates_data' ) ?> + <button class="button"><?php fs_esc_html_echo_inline( 'Clear Updates Transients' ) ?></button> + </form> + </td> + <td> + <!-- Sync Data with Server --> + <form action="" method="POST"> + <input type="hidden" name="background_sync" value="true"> + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Sync Data From Server' ) ?></button> + </form> + </td> + <?php if ( fs_is_network_admin() && true !== $fs_options->get_option( 'ms_migration_complete', false, true ) ) : ?> + <td> + <!-- Migrate Options to Network --> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="migrate_options_to_network"> + <?php wp_nonce_field( 'migrate_options_to_network' ) ?> + <button class="button button-primary"><?php fs_esc_html_echo_inline( 'Migrate Options to Network' ) ?></button> + </form> + </td> + <?php endif ?> + <td> + <button id="fs_load_db_option" class="button"><?php fs_esc_html_echo_inline( 'Load DB Option' ) ?></button> + </td> + <td> + <button id="fs_set_db_option" class="button"><?php fs_esc_html_echo_inline( 'Set DB Option' ) ?></button> + </td> + </tr> + </tbody> +</table> +<script type="text/javascript"> + (function ($) { + $('#fs_load_db_option').click(function () { + var optionName = prompt('Please enter the option name:'); + + if (optionName) { + $.post(ajaxurl, { + action : 'fs_get_db_option', + option_name: optionName + }, function (response) { + if (response.data.value) + prompt('The option value is:', response.data.value); + else + alert('Oops... Option does not exist in the DB.'); + }); + } + }); + + $('#fs_set_db_option').click(function () { + var optionName = prompt('Please enter the option name:'); + + if (optionName) { + var optionValue = prompt('Please enter the option value:'); + + if (optionValue) { + $.post(ajaxurl, { + action : 'fs_set_db_option', + option_name : optionName, + option_value: optionValue + }, function () { + alert('Option was successfully set.'); + }); + } + } + }); + })(jQuery); +</script> <?php - if ( ! defined( 'FS_API__ADDRESS' ) ) { - define( 'FS_API__ADDRESS', '://api.freemius.com' ); - } - if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { - define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' ); - } - - $defines = array( - array( - 'key' => 'WP_FS__REMOTE_ADDR', - 'val' => WP_FS__REMOTE_ADDR, - ), - array( - 'key' => 'WP_FS__ADDRESS_PRODUCTION', - 'val' => WP_FS__ADDRESS_PRODUCTION, - ), - array( - 'key' => 'FS_API__ADDRESS', - 'val' => FS_API__ADDRESS, - ), - array( - 'key' => 'FS_API__SANDBOX_ADDRESS', - 'val' => FS_API__SANDBOX_ADDRESS, - ), - array( - 'key' => 'WP_FS__DIR', - 'val' => WP_FS__DIR, - ), - ) + if ( ! defined( 'FS_API__ADDRESS' ) ) { + define( 'FS_API__ADDRESS', '://api.freemius.com' ); + } + if ( ! defined( 'FS_API__SANDBOX_ADDRESS' ) ) { + define( 'FS_API__SANDBOX_ADDRESS', '://sandbox-api.freemius.com' ); + } + + $defines = array( + array( + 'key' => 'WP_FS__REMOTE_ADDR', + 'val' => WP_FS__REMOTE_ADDR, + ), + array( + 'key' => 'WP_FS__ADDRESS_PRODUCTION', + 'val' => WP_FS__ADDRESS_PRODUCTION, + ), + array( + 'key' => 'FS_API__ADDRESS', + 'val' => FS_API__ADDRESS, + ), + array( + 'key' => 'FS_API__SANDBOX_ADDRESS', + 'val' => FS_API__SANDBOX_ADDRESS, + ), + array( + 'key' => 'WP_FS__DIR', + 'val' => WP_FS__DIR, + ), + ) ?> - <br> - <table class="widefat"> - <thead> - <tr> - <th><?php _efs( 'key' ) ?></th> - <th><?php _efs( 'value' ) ?></th> - </tr> - </thead> - <tbody> - <?php $alternate = false; - foreach ( $defines as $p ) : ?> - <tr<?php if ( $alternate ) { - echo ' class="alternate"'; - } ?>> - <td><?php echo $p['key'] ?></td> - <td><?php echo $p['val'] ?></td> - </tr> - <?php $alternate = ! $alternate ?> - <?php endforeach ?> - </tbody> - </table> - <h2><?php _efs( 'sdk-versions' ) ?></h2> - <table id="fs_sdks" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'version' ) ?></th> - <th><?php _efs( 'sdk-path' ) ?></th> - <th><?php _efs( 'plugin-path' ) ?></th> - <th><?php _efs( 'is-active' ) ?></th> - </tr> - </thead> - <tbody> - <?php foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) : ?> - <?php $is_active = ( WP_FS__SDK_VERSION == $data->version ) ?> - <tr<?php if ( $is_active ) { - echo ' style="background: #E6FFE6; font-weight: bold"'; - } ?>> - <td><?php echo $data->version ?></td> - <td><?php echo $sdk_path ?></td> - <td><?php echo $data->plugin_path ?></td> - <td><?php echo ( $is_active ) ? 'Active' : 'Inactive' ?></td> - </tr> - <?php endforeach ?> - </tbody> - </table> -<?php $plugins = $fs_options->get_option( 'plugins' ) ?> -<?php if ( is_array( $plugins ) && 0 < count( $plugins ) ) : ?> - <h2><?php _efs( 'plugins' ) ?></h2> - <table id="fs_plugins" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'slug' ) ?></th> - <th><?php _efs( 'version' ) ?></th> - <th><?php _efs( 'title' ) ?></th> - <th><?php _efs( 'api' ) ?></th> - <th><?php _efs( 'freemius-state' ) ?></th> - <th><?php _efs( 'plugin-path' ) ?></th> - <th><?php _efs( 'public-key' ) ?></th> - <th><?php _efs( 'actions' ) ?></th> - </tr> - </thead> - <tbody> - <?php foreach ( $plugins as $slug => $data ) : ?> - <?php $is_active = is_plugin_active( $data->file ) ?> - <?php $fs = $is_active ? freemius( $slug ) : null ?> - <tr<?php if ( $is_active ) { - if ($fs->has_api_connectivity() && $fs->is_on()) { - echo ' style="background: #E6FFE6; font-weight: bold"'; - }else{ - echo ' style="background: #ffd0d0; font-weight: bold"'; - } - } ?>> - <td><?php echo $data->id ?></td> - <td><?php echo $slug ?></td> - <td><?php echo $data->version ?></td> - <td><?php echo $data->title ?></td> - <td<?php if ( $is_active && ! $fs->has_api_connectivity() ) { - echo ' style="color: red; text-transform: uppercase;"'; - } ?>><?php if ( $is_active ) { - echo $fs->has_api_connectivity() ? - __fs( 'connected' ) : - __fs( 'blocked' ); - } ?></td> - <td<?php if ( $is_active && ! $fs->is_on() ) { - echo ' style="color: red; text-transform: uppercase;"'; - } ?>><?php if ( $is_active ) { - echo $fs->is_on() ? - __fs( 'on' ) : - __fs( 'off' ); - } ?></td> - <td><?php echo $data->file ?></td> - <td><?php echo $data->public_key ?></td> - <td> - <?php if ($is_active && $fs->has_trial_plan()) : ?> - <form action="" method="POST"> - <input type="hidden" name="fs_action" value="simulate_trial"> - <input type="hidden" name="slug" value="<?php echo $slug ?>"> - <?php wp_nonce_field( 'simulate_trial' ) ?> - - <button type="submit" class="button button-primary simulate-trial"><?php _efs( 'Simulate Trial' ) ?></button> - <?php endif ?> - </td> - </tr> - <?php endforeach ?> - </tbody> - </table> -<?php endif ?> +<br> +<table class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'Key', 'key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Value', 'value' ) ?></th> + </tr> + </thead> + <tbody> + <?php $alternate = false; + foreach ( $defines as $p ) : ?> + <tr<?php if ( $alternate ) { + echo ' class="alternate"'; + } ?>> + <td><?php echo $p['key'] ?></td> + <td><?php echo $p['val'] ?></td> + </tr> + <?php $alternate = ! $alternate ?> + <?php endforeach ?> + </tbody> +</table> +<h2><?php fs_esc_html_echo_x_inline( 'SDK Versions', 'as software development kit versions', 'sdk-versions' ) ?></h2> +<table id="fs_sdks" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'SDK Path' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Is Active' ) ?></th> + </tr> + </thead> + <tbody> + <?php foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) : ?> + <?php $is_active = ( WP_FS__SDK_VERSION == $data->version ) ?> + <tr<?php if ( $is_active ) { + echo ' style="background: #E6FFE6; font-weight: bold"'; + } ?>> + <td><?php echo $data->version ?></td> + <td><?php echo $sdk_path ?></td> + <td><?php echo $data->plugin_path ?></td> + <td><?php echo ( $is_active ) ? 'Active' : 'Inactive' ?></td> + </tr> + <?php endforeach ?> + </tbody> +</table> + <?php - /** - * @var array $VARS - * @var FS_Site[] $sites - */ - $sites = $VARS['sites']; + $module_types = array( + WP_FS__MODULE_TYPE_PLUGIN, + WP_FS__MODULE_TYPE_THEME + ); ?> -<?php if ( is_array( $sites ) && 0 < count( $sites ) ) : ?> - <h2><?php _efs( 'plugin-installs' ) ?> / <?php _efs( 'sites' ) ?></h2> - <table id="fs_installs" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'slug' ) ?></th> - <th><?php _efs( 'plan' ) ?></th> - <th><?php _efs( 'public-key' ) ?></th> - <th><?php _efs( 'secret-key' ) ?></th> - </tr> - </thead> - <tbody> - <?php foreach ( $sites as $slug => $site ) : ?> - <tr> - <td><?php echo $site->id ?></td> - <td><?php echo $slug ?></td> - <td><?php - echo is_object( $site->plan ) ? - base64_decode( $site->plan->name ) : - '' - ?></td> - <td><?php echo $site->public_key ?></td> - <td><?php echo $site->secret_key ?></td> - </tr> - <?php endforeach ?> - </tbody> - </table> -<?php endif ?> + +<?php foreach ( $module_types as $module_type ) : ?> + <?php $modules = $fs_options->get_option( $module_type . 's' ) ?> + <?php if ( is_array( $modules ) && count( $modules ) > 0 ) : ?> + <h2><?php echo esc_html( ( WP_FS__MODULE_TYPE_PLUGIN == $module_type ) ? fs_text_inline( 'Plugins', 'plugins' ) : fs_text_inline( 'Themes', 'themes' ) ) ?></h2> + <table id="fs_<?php echo $module_type ?>" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'API', 'as application program interface' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Freemius State' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Module Path' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th> + <?php if ( is_multisite() ) : ?> + <th><?php fs_esc_html_echo_inline( 'Network Blog' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Network User' ) ?></th> + <?php endif ?> + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th> + </tr> + </thead> + <tbody> + <?php foreach ( $modules as $slug => $data ) : ?> + <?php + if ( WP_FS__MODULE_TYPE_THEME !== $module_type ) { + $is_active = is_plugin_active( $data->file ); + } else { + $current_theme = wp_get_theme(); + $is_active = ( $current_theme->stylesheet === $data->file ); + + if ( ! $is_active && is_child_theme() ) { + $parent_theme = $current_theme->parent(); + + $is_active = ( ( $parent_theme instanceof WP_Theme ) && $parent_theme->stylesheet === $data->file ); + } + } + ?> + <?php $fs = $is_active ? freemius( $data->id ) : null ?> + <tr<?php if ( $is_active ) { + if ( $fs->has_api_connectivity() && $fs->is_on() ) { + echo ' style="background: #E6FFE6; font-weight: bold"'; + } else { + echo ' style="background: #ffd0d0; font-weight: bold"'; + } + } ?>> + <td><?php echo $data->id ?></td> + <td><?php echo $slug ?></td> + <td><?php echo $data->version ?></td> + <td><?php echo $data->title ?></td> + <td<?php if ( $is_active && ! $fs->has_api_connectivity() ) { + echo ' style="color: red; text-transform: uppercase;"'; + } ?>><?php if ( $is_active ) { + echo esc_html( $fs->has_api_connectivity() ? + fs_text_x_inline( 'Connected', 'as connection was successful' ) : + fs_text_x_inline( 'Blocked', 'as connection blocked' ) + ); + } ?></td> + <td<?php if ( $is_active && ! $fs->is_on() ) { + echo ' style="color: red; text-transform: uppercase;"'; + } ?>><?php if ( $is_active ) { + echo esc_html( $fs->is_on() ? + $on_text : + $off_text + ); + } ?></td> + <td><?php echo $data->file ?></td> + <td><?php echo $data->public_key ?></td> + <?php if ( is_multisite() ) : ?> + <?php + $network_blog_id = null; + $network_user = null; + + if ( is_object( $fs ) ) { + $network_blog_id = $fs->get_network_install_blog_id(); + $network_user = $fs->get_network_user(); + } + ?> + <td><?php echo is_numeric( $network_blog_id ) ? $network_blog_id : '' ?></td> + <td><?php if ( is_object( $network_user ) ) { + echo $network_user->email; + } ?></td> + <?php endif ?> + <td> + <?php if ( $is_active ) : ?> + <?php if ( $fs->has_trial_plan() ) : ?> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="simulate_trial"> + <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>"> + <?php wp_nonce_field( 'simulate_trial' ) ?> + + <button type="submit" class="button button-primary simulate-trial"><?php fs_esc_html_echo_inline( 'Simulate Trial' ) ?></button> + </form> + <?php endif ?> + <?php if ( $fs->is_registered() ) : ?> + <a class="button" href="<?php echo $fs->get_account_url() ?>"><?php fs_esc_html_echo_inline( 'Account', 'account' ) ?></a> + <?php endif ?> + <?php if ( fs_is_network_admin() && ! $fs->is_network_upgrade_mode() ) : ?> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="simulate_network_upgrade"> + <input type="hidden" name="module_id" value="<?php echo $fs->get_id() ?>"> + <?php wp_nonce_field( 'simulate_network_upgrade' ) ?> + + <button type="submit" class="button button-small"><?php fs_esc_html_echo_inline( 'Simulate Network Upgrade' ) ?></button> + </form> + <?php endif ?> + <?php endif ?> + </td> + </tr> + <?php endforeach ?> + </tbody> + </table> + <?php endif ?> +<?php endforeach ?> +<?php foreach ( $module_types as $module_type ) : ?> + <?php + /** + * @var array $VARS + * @var array[string]FS_Site|array[string]FS_Site[] $sites_map + */ + $sites_map = $VARS[ $module_type . '_sites' ]; + + $is_multisite = is_multisite(); + $all_plans = false; + $plans = false; + ?> + <?php if ( is_array( $sites_map ) && count( $sites_map ) > 0 ) : ?> + <h2><?php echo esc_html( sprintf( + /* translators: %s: 'plugin' or 'theme' */ + fs_text_inline( '%s Installs', 'module-installs' ), + ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) ) + ) ) ?> / <?php fs_esc_html_echo_x_inline( 'Sites', 'like websites', 'sites' ) ?></h2> + <table id="fs_<?php echo $module_type ?>_installs" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <?php if ( $is_multisite ) : ?> + <th><?php fs_esc_html_echo_inline( 'Blog ID' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Address' ) ?></th> + <?php endif ?> + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'Plan', 'as product pricing plan', 'plan' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th> + </tr> + </thead> + <tbody> + <?php foreach ( $sites_map as $slug => $sites ) : ?> + <?php if ( ! is_array( $sites ) ) { + $sites = array( $sites ); + } ?> + <?php foreach ( $sites as $site ) : ?> + <tr> + <td><?php echo $site->id ?></td> + <?php if ( $is_multisite ) : ?> + <td><?php echo $site->blog_id ?></td> + <td><?php echo fs_strip_url_protocol( $site->url ) ?></td> + <?php endif ?> + <td><?php echo $slug ?></td> + <td><?php echo $site->user_id ?></td> + <td><?php + $plan_name = ''; + if ( FS_Plugin_Plan::is_valid_id( $site->plan_id ) ) { + if ( false === $all_plans ) { + $option_name = 'plans'; + if ( WP_FS__MODULE_TYPE_PLUGIN !== $module_type ) { + $option_name = $module_type . '_' . $option_name; + } + + $all_plans = $fs_options->get_option( $option_name, array() ); + } + + if ( false === $plans ) { + $plans = $all_plans[ $slug ]; + } + + foreach ( $plans as $plan ) { + $plan_id = Freemius::_decrypt( $plan->id ); + + if ( $site->plan_id == $plan_id ) { + $plan_name = Freemius::_decrypt( $plan->name ); + break; + } + } + } + + echo $plan_name; + ?></td> + <td><?php echo $site->public_key ?></td> + <td><?php echo esc_html( $site->secret_key ) ?></td> + <td> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="delete_install"> + <?php wp_nonce_field( 'delete_install' ) ?> + <input type="hidden" name="module_id" value="<?php echo $site->plugin_id ?>"> + <?php if ( $is_multisite ) : ?> + <input type="hidden" name="blog_id" value="<?php echo $site->blog_id ?>"> + <?php endif ?> + <input type="hidden" name="module_type" value="<?php echo $module_type ?>"> + <input type="hidden" name="slug" value="<?php echo $slug ?>"> + <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button> + </form> + </td> + </tr> + <?php endforeach ?> + <?php endforeach ?> + </tbody> + </table> + <?php endif ?> +<?php endforeach ?> <?php - $addons = $VARS['addons']; + $addons = $VARS['addons']; ?> <?php foreach ( $addons as $plugin_id => $plugin_addons ) : ?> - <h2><?php printf( __fs( 'addons-of-x' ), $plugin_id ) ?></h2> - <table id="fs_addons" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'title' ) ?></th> - <th><?php _efs( 'slug' ) ?></th> - <th><?php _efs( 'version' ) ?></th> - <th><?php _efs( 'public-key' ) ?></th> - <th><?php _efs( 'secret-key' ) ?></th> - </tr> - </thead> - <tbody> - <?php - /** - * @var FS_Plugin[] $plugin_addons - */ - foreach ( $plugin_addons as $addon ) : ?> - <tr> - <td><?php echo $addon->id ?></td> - <td><?php echo $addon->title ?></td> - <td><?php echo $addon->slug ?></td> - <td><?php echo $addon->version ?></td> - <td><?php echo $addon->public_key ?></td> - <td><?php echo $addon->secret_key ?></td> - </tr> - <?php endforeach ?> - </tbody> - </table> + <h2><?php echo esc_html( sprintf( fs_text_inline( 'Add Ons of module %s', 'addons-of-x' ), $plugin_id ) ) ?></h2> + <table id="fs_addons" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Title' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'Version', 'product version' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th> + </tr> + </thead> + <tbody> + <?php + /** + * @var FS_Plugin[] $plugin_addons + */ + foreach ( $plugin_addons as $addon ) : ?> + <tr> + <td><?php echo $addon->id ?></td> + <td><?php echo $addon->title ?></td> + <td><?php echo $addon->slug ?></td> + <td><?php echo $addon->version ?></td> + <td><?php echo $addon->public_key ?></td> + <td><?php echo esc_html( $addon->secret_key ) ?></td> + </tr> + <?php endforeach ?> + </tbody> + </table> <?php endforeach ?> <?php - /** - * @var FS_User[] $users - */ - $users = $VARS['users']; + /** + * @var FS_User[] $users + */ + $users = $VARS['users']; ?> <?php if ( is_array( $users ) && 0 < count( $users ) ) : ?> - <h2><?php _efs( 'users' ) ?></h2> - <table id="fs_users" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'name' ) ?></th> - <th><?php _efs( 'email' ) ?></th> - <th><?php _efs( 'verified' ) ?></th> - <th><?php _efs( 'public-key' ) ?></th> - <th><?php _efs( 'secret-key' ) ?></th> - </tr> - </thead> - <tbody> - <?php foreach ( $users as $user_id => $user ) : ?> - <tr> - <td><?php echo $user->id ?></td> - <td><?php echo $user->get_name() ?></td> - <td><a href="mailto:<?php echo esc_attr( $user->email ) ?>"><?php echo $user->email ?></a></td> - <td><?php echo json_encode( $user->is_verified ) ?></td> - <td><?php echo $user->public_key ?></td> - <td><?php echo $user->secret_key ?></td> - </tr> - <?php endforeach ?> - </tbody> - </table> + <h2><?php fs_esc_html_echo_inline( 'Users' ) ?></h2> + <table id="fs_users" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Name' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Email' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Verified' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Public Key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Secret Key' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Actions' ) ?></th> + </tr> + </thead> + <tbody> + <?php foreach ( $users as $user_id => $user ) : ?> + <tr> + <td><?php echo $user->id ?></td> + <td><?php echo $user->get_name() ?></td> + <td><a href="mailto:<?php echo esc_attr( $user->email ) ?>"><?php echo $user->email ?></a></td> + <td><?php echo json_encode( $user->is_verified ) ?></td> + <td><?php echo $user->public_key ?></td> + <td><?php echo esc_html( $user->secret_key ) ?></td> + <td> + <form action="" method="POST"> + <input type="hidden" name="fs_action" value="delete_user"> + <?php wp_nonce_field( 'delete_user' ) ?> + <input type="hidden" name="user_id" value="<?php echo $user->id ?>"> + <button type="submit" class="button"><?php fs_esc_html_echo_x_inline( 'Delete', 'verb', 'delete' ) ?></button> + </form> + </td> + </tr> + <?php endforeach ?> + </tbody> + </table> +<?php endif ?> +<?php foreach ( $module_types as $module_type ) : ?> + <?php $licenses = $VARS[ $module_type . '_licenses' ] ?> + <?php if ( is_array( $licenses ) && count( $licenses ) > 0 ) : ?> + <h2><?php echo esc_html( sprintf( fs_text_inline( '%s Licenses', 'module-licenses' ), ( WP_FS__MODULE_TYPE_PLUGIN === $module_type ? fs_text_inline( 'Plugin', 'plugin' ) : fs_text_inline( 'Theme', 'theme' ) ) ) ) ?></h2> + <table id="fs_<?php echo $module_type ?>_licenses" class="widefat"> + <thead> + <tr> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Plugin ID' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'User ID' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Plan ID' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Quota' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Activated' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Blocking' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'License Key' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'Expiration', 'as expiration date' ) ?></th> + </tr> + </thead> + <tbody> + <?php foreach ( $licenses as $license ) : ?> + <tr> + <td><?php echo $license->id ?></td> + <td><?php echo $license->plugin_id ?></td> + <td><?php echo $license->user_id ?></td> + <td><?php echo $license->plan_id ?></td> + <td><?php echo $license->is_unlimited() ? 'Unlimited' : ( $license->is_single_site() ? 'Single Site' : $license->quota ) ?></td> + <td><?php echo $license->activated ?></td> + <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td> + <td><?php echo esc_html( $license->secret_key ) ?></td> + <td><?php echo $license->expiration ?></td> + </tr> + <?php endforeach ?> + </tbody> + </table> + <?php endif ?> +<?php endforeach ?> +<?php if ( FS_Logger::is_storage_logging_on() ) : ?> + + <h2><?php fs_esc_html_echo_inline( 'Debug Log', 'debug-log' ) ?></h2> + + <div id="fs_debug_filters"> + <select name="type"> + <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Types', 'all-types' ) ?></option> + <option value="warn_error">Warnings & Errors</option> + <option value="error">Errors</option> + <option value="warn">Warnings</option> + <option value="info">Info</option> + </select> + <select name="request_type"> + <option value="" selected="selected"><?php fs_esc_html_echo_inline( 'All Requests', 'all-requests' ) ?></option> + <option value="call">Sync</option> + <option value="ajax">AJAX</option> + <option value="cron">WP Cron</option> + </select> + <input name="file" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'File' ) ?>"/> + <input name="function" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Function' ) ?>"/> + <input name="process_id" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Process ID' ) ?>"/> + <input name="logger" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Logger' ) ?>"/> + <input name="message" type="text" placeholder="<?php fs_esc_attr_echo_inline( 'Message' ) ?>"/> + <div style="margin: 10px 0"> + <button id="fs_filter" class="button" style="float: left"><i class="dashicons dashicons-filter"></i> <?php fs_esc_html_echo_inline( 'Filter', 'filter' ) ?> + </button> + + <form action="" method="POST" style="float: left; margin-left: 10px;"> + <input type="hidden" name="fs_action" value="download_logs"> + <?php wp_nonce_field( 'download_logs' ) ?> + <div class="fs-filters"></div> + <button id="fs_download" class="button" type="submit"><i + class="dashicons dashicons-download"></i> <?php fs_esc_html_echo_inline( 'Download' ) ?></button> + </form> + <div style="clear: both"></div> + </div> + </div> + + <div id="fs_log_book" style="height: 300px; overflow: auto;"> + <table class="widefat"> + <thead> + <tr> + <th>#</th> + <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Function' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Message' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'File' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Timestamp' ) ?></th> + </tr> + </thead> + <tbody> + <tr style="display: none"> + <td>{$log.log_order}.</td> + <td class="fs-col--type">{$log.type}</td> + <td class="fs-col--logger">{$log.logger}</td> + <td class="fs-col--function">{$log.function}</td> + <td class="fs-col--message"> + <a href="#" onclick="jQuery(this).parent().find('div').toggle(); return false;"> + <nobr>{$log.message_short}</nobr> + </a> + <div style="display: none;">{$log.message}</div> + </td> + <td class="fs-col--file">{$log.file}:{$log.line}</td> + <td class="fs-col--timestamp">{$log.created}</td> + </tr> + + </tbody> + </table> + </div> + <script type="text/javascript"> + jQuery(document).ready(function ($) { + var filtersChanged = false, + offset = 0, + limit = 200, + prevFiltersSignature = null; + + var getFilters = function () { + var filters = {}, + signature = ''; + + $('#fs_debug_filters').find('select, input').each(function (i, e) { + var $element = $(e); + + if ('hidden' === $element.attr('type')) + return; + + var val = $element.val(); + if ('' !== val.trim()) { + var name = $(e).attr('name'); + filters[name] = val; + signature += name + '=' + val + '~'; + } + }); + + if (signature != prevFiltersSignature) { + filtersChanged = true; + prevFiltersSignature = signature; + } else { + filtersChanged = false; + } + + return filters; + }; + + $('#fs_download').parent().submit(function () { + var filters = getFilters(), + hiddenFields = ''; + + for (var f in filters) { + if (filters.hasOwnProperty(f)) { + hiddenFields += '<input type="hidden" name="filters[' + f + ']" value="' + filters[f] + '" />'; + } + } + + $(this).find('.fs-filters').html(hiddenFields); + }); + + var loadLogs = function () { + var $tbody = $('#fs_log_book tbody'), + template = $tbody.find('tr:first-child').html(), + filters = getFilters(); + + if (!filtersChanged) { + offset += limit; + } else { + // Cleanup table for new filter (only keep template row). + $tbody.find('tr').each(function (i, e) { + if (0 == i) + return; + + $(e).remove(); + }); + + offset = 0; + } + + $.post(ajaxurl, { + action : 'fs_get_debug_log', + filters: filters, + offset : offset, + limit : limit + }, function (response) { + + for (var i = 0; i < response.data.length; i++) { + var templateCopy = template; + + response.data[i].message_short = (response.data[i].message.length > 32) ? + response.data[i].message.substr(0, 32) + '...' : + response.data[i].message; + + for (var p in response.data[i]) { + if (response.data[i].hasOwnProperty(p)) { + templateCopy = templateCopy.replace('{$log.' + p + '}', response.data[i][p]); + } + } + + $tbody.append('<tr' + (i % 2 ? ' class="alternate"' : '') + '>' + templateCopy + '</tr>'); + } + }); + }; + + $('#fs_filter').click(function () { + loadLogs(); + + return false; + }); + + loadLogs(); + }); + </script> <?php endif ?> -<?php - /** - * @var FS_Plugin_License[] $licenses - */ - $licenses = $VARS['licenses']; -?> -<?php if ( is_array( $licenses ) && 0 < count( $licenses ) ) : ?> - <h2><?php _efs( 'licenses' ) ?></h2> - <table id="fs_users" class="widefat"> - <thead> - <tr> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'plugin-id' ) ?></th> - <th><?php _efs( 'user-id' ) ?></th> - <th><?php _efs( 'plan-id' ) ?></th> - <th><?php _efs( 'quota' ) ?></th> - <th><?php _efs( 'activated' ) ?></th> - <th><?php _efs( 'blocking' ) ?></th> - <th><?php _efs( 'license-key' ) ?></th> - <th><?php _efs( 'expiration' ) ?></th> - </tr> - </thead> - <tbody> - <?php foreach ( $licenses as $slug => $module_licenses ) : ?> - <?php foreach ( $module_licenses as $id => $licenses ) : ?> - <?php if ( is_array( $licenses ) && 0 < count( $licenses ) ) : ?> - <?php foreach ( $licenses as $license ) : ?> - <tr> - <td><?php echo $license->id ?></td> - <td><?php echo $license->plugin_id ?></td> - <td><?php echo $license->user_id ?></td> - <td><?php echo $license->plan_id ?></td> - <td><?php echo $license->is_unlimited() ? 'Unlimited' : ( $license->is_single_site() ? 'Single Site' : $license->quota ) ?></td> - <td><?php echo $license->activated ?></td> - <td><?php echo $license->is_block_features ? 'Blocking' : 'Flexible' ?></td> - <td><?php echo htmlentities( $license->secret_key ) ?></td> - <td><?php echo $license->expiration ?></td> - </tr> - <?php endforeach ?> - <?php endif ?> - <?php endforeach ?> - <?php endforeach ?> - </tbody> - </table> -<?php endif ?> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/api-calls.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/api-calls.php index c795c8e73..ea4e823b5 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/api-calls.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/api-calls.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -10,8 +10,8 @@ exit; } - if ( class_exists( 'Freemius_Api' ) ) { - $logger = Freemius_Api::GetLogger(); + if ( class_exists( 'Freemius_Api_WordPress' ) ) { + $logger = Freemius_Api_WordPress::GetLogger(); } else { $logger = array(); } @@ -34,9 +34,26 @@ $pretty_print = $show_body && defined( 'JSON_PRETTY_PRINT' ) && version_compare( phpversion(), '5.3', '>=' ); + /** + * This template is used for debugging, therefore, when possible + * we'd like to prettify the output of a JSON encoded variable. + * This will only be executed when $pretty_print is `true`, and + * the var is `true` only for PHP 5.3 and higher. Due to the + * limitations of the current Theme Check, it throws an error + * that using the "options" parameter (the 2nd param) is not + * supported in PHP 5.2 and lower. Thus, we added this alias + * variable to work around that false-positive. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + $encode = 'json_encode'; + $root_path_len = strlen( ABSPATH ); + + $ms_text = fs_text_x_inline( 'ms', 'milliseconds' ); ?> -<h1><?php _efs( 'API' ) ?></h1> +<h1><?php fs_echo_inline( 'API' ) ?></h1> <h2><span>Total Time:</span><?php echo Freemius_Debug_Bar_Panel::total_time() ?></h2> @@ -48,16 +65,16 @@ <thead> <tr> <th>#</th> - <th><?php _efs( 'Method' ) ?></th> - <th><?php _efs( 'Code' ) ?></th> - <th><?php _efs( 'Length' ) ?></th> - <th><?php _efs( 'Path' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Method' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Code' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Length' ) ?></th> + <th><?php fs_esc_html_echo_x_inline( 'Path', 'as file/folder path' ) ?></th> <?php if ( $show_body ) : ?> - <th><?php _efs( 'Body' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Body' ) ?></th> <?php endif ?> - <th><?php _efs( 'Result' ) ?></th> - <th><?php _efs( 'Start' ) ?></th> - <th><?php _efs( 'End' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Result' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Start' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'End' ) ?></th> </tr> </thead> <tbody> @@ -66,7 +83,7 @@ <td><?php echo $log['id'] ?>.</td> <td><?php echo $log['method'] ?></td> <td><?php echo $log['code'] ?></td> - <td><?php echo number_format( 100 * $log['total'], 2 ) . ' ' . __fs( 'ms' ) ?></td> + <td><?php echo number_format( 100 * $log['total'], 2 ) . ' ' . $ms_text ?></td> <td> <?php printf( '<a href="#" onclick="jQuery(this).parent().find(\'table\').toggle(); return false;">%s</a>', @@ -99,7 +116,7 @@ substr( $body, 0, 32 ) . ( 32 < strlen( $body ) ? '...' : '' ) ); if ( $pretty_print ) { - $body = json_encode( json_decode( $log['body'] ), JSON_PRETTY_PRINT ); + $body = $encode( json_decode( $log['body'] ), JSON_PRETTY_PRINT ); } ?> <pre style="display: none"><code><?php echo esc_html( $body ) ?></code></pre> @@ -122,7 +139,7 @@ if ( $is_not_empty_result && $pretty_print ) { $decoded = json_decode( $result ); if ( ! is_null( $decoded ) ) { - $result = json_encode( $decoded, JSON_PRETTY_PRINT ); + $result = $encode( $decoded, JSON_PRETTY_PRINT ); } } else { $result = is_string( $result ) ? $result : json_encode( $result ); @@ -130,8 +147,8 @@ ?> <pre<?php if ( $is_not_empty_result ) : ?> style="display: none"<?php endif ?>><code><?php echo esc_html( $result ) ?></code></pre> </td> - <td><?php echo number_format( 100 * ( $log['start'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . __fs( 'ms' ) ?></td> - <td><?php echo number_format( 100 * ( $log['end'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . __fs( 'ms' ) ?></td> + <td><?php echo number_format( 100 * ( $log['start'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . $ms_text ?></td> + <td><?php echo number_format( 100 * ( $log['end'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . $ms_text ?></td> </tr> <?php endforeach ?> </tbody> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/logger.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/logger.php index 111d49823..852497a19 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/logger.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/logger.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -12,18 +12,18 @@ $log_book = FS_Logger::get_log(); ?> -<h1><?php _efs( 'Log' ) ?></h1> +<h1><?php fs_echo_inline( 'Log' ) ?></h1> <table class="widefat" style="font-size: 11px;"> <thead> <tr> <th>#</th> - <th><?php _efs( 'id' ) ?></th> - <th><?php _efs( 'type' ) ?></th> - <th><?php _efs( 'function' ) ?></th> - <th><?php _efs( 'message' ) ?></th> - <th><?php _efs( 'file' ) ?></th> - <th><?php _efs( 'timestamp' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'ID', 'id' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Type' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Function' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Message' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'File' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Timestamp' ) ?></th> </tr> </thead> <tbody> @@ -41,8 +41,8 @@ } ?>> <td><?php echo $log['cnt'] ?>.</td> <td><?php echo $logger->get_id() ?></td> - <td><?php echo $log['type'] ?></td> - <td><b><code style="color: blue;"><?php echo $log['function'] ?></code></b></td> + <td><?php echo $log['log_type'] ?></td> + <td><b><code style="color: blue;"><?php echo ( ! empty( $log['class'] ) ? $log['class'] . $log['type'] : '' ) . $log['function'] ?></code></b></td> <td> <?php printf( @@ -56,10 +56,10 @@ </td> <td><?php if ( isset( $log['file'] ) ) { - echo substr( $log['file'], $logger->get_file() ) . ':' . $log['line'] . ')'; + echo substr( $log['file'], $logger->get_file() ) . ':' . $log['line']; } ?></td> - <td><?php echo number_format( 100 * ( $log['timestamp'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . __fs( 'ms' ) ?></td> + <td><?php echo number_format( 100 * ( $log['timestamp'] - WP_FS__SCRIPT_START_TIME ), 2 ) . ' ' . fs_text_x_inline( 'ms', 'milliseconds' ) ?></td> </tr> <?php $i ++; endforeach ?> </tbody> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/plugins-themes-sync.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/plugins-themes-sync.php index a7616220a..8508cd16a 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/plugins-themes-sync.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/plugins-themes-sync.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -10,56 +10,64 @@ exit; } - $fs_options = FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); + $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); $all_plugins = $fs_options->get_option( 'all_plugins' ); $all_themes = $fs_options->get_option( 'all_themes' ); + + /* translators: %s: time period (e.g. In "2 hours") */ + $in_x_text = fs_text_inline( 'In %s', 'in-x' ); + /* translators: %s: time period (e.g. "2 hours" ago) */ + $x_ago_text = fs_text_inline( '%s ago', 'x-ago' ); + $sec_text = fs_text_x_inline( 'sec', 'seconds' ); ?> -<h1><?php _efs( 'plugins-themes-sync' ) ?></h1> +<h1><?php fs_esc_html_echo_inline( 'Plugins & Themes Sync', 'plugins-themes-sync' ) ?></h1> <table class="widefat"> <thead> <tr> <th></th> - <th><?php _efs( 'total' ) ?></th> - <th><?php _efs( 'Last' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Total', 'total' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Last', 'last' ) ?></th> </tr> </thead> <tbody> <?php if ( is_object( $all_plugins ) ) : ?> <tr> - <td><?php _efs( 'plugins' ) ?></td> + <td><?php fs_esc_html_echo_inline( 'Plugins', 'plugins' ) ?></td> <td><?php echo count( $all_plugins->plugins ) ?></td> <td><?php if ( isset( $all_plugins->timestamp ) && is_numeric( $all_plugins->timestamp ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $all_plugins->timestamp ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? - $diff . ' ' . __fs( 'sec' ) : + $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $all_plugins->timestamp ); - if ( WP_FS__SCRIPT_START_TIME < $all_plugins->timestamp ) { - printf( __fs( 'in-x' ), $human_diff ); - } else { - printf( __fs( 'x-ago' ), $human_diff ); - } + echo esc_html( sprintf( + ( ( WP_FS__SCRIPT_START_TIME < $all_plugins->timestamp ) ? + $in_x_text : + $x_ago_text ), + $human_diff + ) ); } ?></td> </tr> <?php endif ?> <?php if ( is_object( $all_themes ) ) : ?> <tr> - <td><?php _efs( 'themes' ) ?></td> + <td><?php fs_esc_html_echo_inline( 'Themes', 'themes' ) ?></td> <td><?php echo count( $all_themes->themes ) ?></td> <td><?php if ( isset( $all_themes->timestamp ) && is_numeric( $all_themes->timestamp ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $all_themes->timestamp ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? - $diff . ' ' . __fs( 'sec' ) : + $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $all_themes->timestamp ); - if ( WP_FS__SCRIPT_START_TIME < $all_themes->timestamp ) { - printf( __fs( 'in-x' ), $human_diff ); - } else { - printf( __fs( 'x-ago' ), $human_diff ); - } + echo esc_html( sprintf( + ( ( WP_FS__SCRIPT_START_TIME < $all_themes->timestamp ) ? + $in_x_text : + $x_ago_text ), + $human_diff + ) ); } ?></td> </tr> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/scheduled-crons.php b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/scheduled-crons.php index c17324ecc..1751e60ec 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/debug/scheduled-crons.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/debug/scheduled-crons.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.7.3 */ @@ -10,96 +10,123 @@ exit; } - $fs_options = FS_Option_Manager::get_manager( WP_FS__ACCOUNTS_OPTION_NAME, true ); - $plugins = $fs_options->get_option( 'plugins' ); + $fs_options = FS_Options::instance( WP_FS__ACCOUNTS_OPTION_NAME, true ); $scheduled_crons = array(); - if ( is_array( $plugins ) && 0 < count( $plugins ) ) { - foreach ( $plugins as $slug => $data ) { - /** - * @author Vova Feldman - * - * @since 1.2.1 Don't load data from inactive modules. - */ - if ( is_plugin_active( $data->file ) ) { - $fs = freemius( $slug ); - $next_execution = $fs->next_sync_cron(); - $last_execution = $fs->last_sync_cron(); + $module_types = array( + WP_FS__MODULE_TYPE_PLUGIN, + WP_FS__MODULE_TYPE_THEME + ); - if ( false !== $next_execution ) { - $scheduled_crons[ $slug ][] = array( - 'name' => $fs->get_plugin_name(), - 'slug' => $slug, - 'type' => 'sync_cron', - 'last' => $last_execution, - 'next' => $next_execution, - ); + foreach ( $module_types as $module_type ) { + $modules = $fs_options->get_option( $module_type . 's' ); + if ( is_array( $modules ) && count( $modules ) > 0 ) { + foreach ( $modules as $slug => $data ) { + if ( WP_FS__MODULE_TYPE_THEME === $module_type ) { + $current_theme = wp_get_theme(); + $is_active = ( $current_theme->stylesheet === $data->file ); + } else { + $is_active = is_plugin_active( $data->file ); } - $next_install_execution = $fs->next_install_sync(); - $last_install_execution = $fs->last_install_sync(); + /** + * @author Vova Feldman + * + * @since 1.2.1 Don't load data from inactive modules. + */ + if ( $is_active ) { + $fs = freemius( $data->id ); - if ( false !== $next_install_execution || - false !== $last_install_execution - ) { - $scheduled_crons[ $slug ][] = array( - 'name' => $fs->get_plugin_name(), - 'slug' => $slug, - 'type' => 'install_sync', - 'last' => $last_install_execution, - 'next' => $next_install_execution, - ); + $next_execution = $fs->next_sync_cron(); + $last_execution = $fs->last_sync_cron(); + + if ( false !== $next_execution ) { + $scheduled_crons[ $slug ][] = array( + 'name' => $fs->get_plugin_name(), + 'slug' => $slug, + 'module_type' => $fs->get_module_type(), + 'type' => 'sync_cron', + 'last' => $last_execution, + 'next' => $next_execution, + ); + } + + $next_install_execution = $fs->next_install_sync(); + $last_install_execution = $fs->last_install_sync(); + + if (false !== $next_install_execution || + false !== $last_install_execution + ) { + $scheduled_crons[ $slug ][] = array( + 'name' => $fs->get_plugin_name(), + 'slug' => $slug, + 'module_type' => $fs->get_module_type(), + 'type' => 'install_sync', + 'last' => $last_install_execution, + 'next' => $next_install_execution, + ); + } } } } } + + $sec_text = fs_text_x_inline( 'sec', 'seconds' ); ?> -<h1><?php _efs( 'scheduled-crons' ) ?></h1> +<h1><?php fs_esc_html_echo_inline( 'Scheduled Crons' ) ?></h1> <table class="widefat"> <thead> <tr> - <th><?php _efs( 'slug' ) ?></th> - <th><?php _efs( 'plugin' ) ?></th> - <th><?php _efs( 'type' ) ?></th> - <th><?php _efs( 'Last' ) ?></th> - <th><?php _efs( 'Next' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Slug' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Module' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Module Type' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Cron Type' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Last' ) ?></th> + <th><?php fs_esc_html_echo_inline( 'Next' ) ?></th> </tr> </thead> <tbody> + <?php + /* translators: %s: time period (e.g. In "2 hours") */ + $in_x_text = fs_text_inline( 'In %s', 'in-x' ); + /* translators: %s: time period (e.g. "2 hours" ago) */ + $x_ago_text = fs_text_inline( '%s ago', 'x-ago' ); + ?> <?php foreach ( $scheduled_crons as $slug => $crons ) : ?> <?php foreach ( $crons as $cron ) : ?> <tr> <td><?php echo $slug ?></td> <td><?php echo $cron['name'] ?></td> + <td><?php echo $cron['module_type'] ?></td> <td><?php echo $cron['type'] ?></td> <td><?php if ( is_numeric( $cron['last'] ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $cron['last'] ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? - $diff . ' ' . __fs( 'sec' ) : + $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $cron['last'] ); - if ( WP_FS__SCRIPT_START_TIME < $cron['last'] ) { - printf( __fs( 'in-x' ), $human_diff ); - } else { - printf( __fs( 'x-ago' ), $human_diff ); - } - -// echo ' ' . $cron['last']; + echo esc_html( sprintf( + ( ( WP_FS__SCRIPT_START_TIME < $cron['last'] ) ? + $in_x_text : + $x_ago_text ), + $human_diff + ) ); } ?></td> <td><?php if ( is_numeric( $cron['next'] ) ) { $diff = abs( WP_FS__SCRIPT_START_TIME - $cron['next'] ); $human_diff = ( $diff < MINUTE_IN_SECONDS ) ? - $diff . ' ' . __fs( 'sec' ) : + $diff . ' ' . $sec_text : human_time_diff( WP_FS__SCRIPT_START_TIME, $cron['next'] ); - if ( WP_FS__SCRIPT_START_TIME < $cron['next'] ) { - printf( __fs( 'in-x' ), $human_diff ); - } else { - printf( __fs( 'x-ago' ), $human_diff ); - } + echo esc_html( sprintf( + ( ( WP_FS__SCRIPT_START_TIME < $cron['next'] ) ? + $in_x_text : + $x_ago_text ), + $human_diff + ) ); } ?></td> </tr> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/email.php b/wp-content/plugins/nextgen-gallery/freemius/templates/email.php index 66c82b170..598c78346 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/email.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/email.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.1 */ @@ -20,7 +20,7 @@ foreach ( $sections as $section_id => $section ) { ?> <thead> - <tr><th colspan="2" style="text-align: left; background: #333; color: #fff; padding: 5px;"><?php echo $section['title']; ?></th></tr> + <tr><th colspan="2" style="text-align: left; background: #333; color: #fff; padding: 5px;"><?php echo esc_html($section['title']) ?></th></tr> </thead> <tbody> <?php @@ -30,10 +30,10 @@ <tr> <?php if ( 1 === $col_count ) { ?> - <td style="vertical-align: top;" colspan="2"><?php echo $row[0]; ?></td> + <td style="vertical-align: top;" colspan="2"><?php echo $row[0] ?></td> <?php } else { ?> - <td style="vertical-align: top;"><b><?php echo $row[0]; ?>:</b></td> + <td style="vertical-align: top;"><b><?php echo esc_html($row[0]) ?>:</b></td> <td><?php echo $row[1]; ?></td> <?php } diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/firewall-issues-js.php b/wp-content/plugins/nextgen-gallery/freemius/templates/firewall-issues-js.php index a27b548dd..2abfbc0e7 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/firewall-issues-js.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/firewall-issues-js.php @@ -6,7 +6,7 @@ * * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.9 */ @@ -15,42 +15,41 @@ } ?> <script type="text/javascript"> - jQuery(document).ready(function ($) { - $('#fs_firewall_issue_options a.fs-resolve').click(function () { + jQuery( document ).ready(function( $ ) { + $( '#fs_firewall_issue_options a.fs-resolve' ).click(function() { var - error_type = $(this).attr('data-type'), - notice = $(this).parents('.fs-notice'), - slug = notice.attr('data-slug'); + error_type = $( this ).attr( 'data-type' ), + notice = $( this ).parents( '.fs-notice' ), + ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' ); var data = { - action : 'fs_resolve_firewall_issues_' + slug, - slug : slug, + action : 'fs_resolve_firewall_issues_' + ajaxActionSuffix, error_type: error_type }; - if ('squid' === error_type) { - data.hosting_company = prompt('What is the name or URL of your hosting company?'); - if (null == data.hosting_company) + if ( 'squid' === error_type ) { + data.hosting_company = prompt( 'What is the name or URL of your hosting company?' ); + if ( null == data.hosting_company ) return false; - if ('' === data.hosting_company) { - alert('We won\'t be able to help without knowing your hosting company.'); + if ( '' === data.hosting_company ) { + alert( 'We won\'t be able to help without knowing your hosting company.' ); return false; } } - if ('retry_ping' === error_type) { - data.action = 'fs_retry_connectivity_test_' + slug; + if ( 'retry_ping' === error_type ) { + data.action = 'fs_retry_connectivity_test_' + ajaxActionSuffix; } - $(this).css({'cursor': 'wait'}); + $( this ).css({'cursor': 'wait'}); // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php - $.post(ajaxurl, data, function (response) { - if (1 == response) { + $.post( ajaxurl, data, function( response ) { + if ( 1 == response ) { // Refresh page on success. location.reload(); - } else if ('http' === response.substr(0, 4)) { + } else if ( 'http' === response.substr( 0, 4 ) ) { // Ping actually worked, redirect. window.location = response; } diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/affiliation.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/affiliation.php new file mode 100644 index 000000000..14edd6450 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/affiliation.php @@ -0,0 +1,486 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.3 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + $user = $fs->get_user(); + $affiliate = $fs->get_affiliate(); + $affiliate_terms = $fs->get_affiliate_terms(); + + $plugin_title = $fs->get_plugin_title(); + $module_type = $fs->is_plugin() ? + WP_FS__MODULE_TYPE_PLUGIN : + WP_FS__MODULE_TYPE_THEME; + + $commission = $affiliate_terms->get_formatted_commission(); + + $readonly = false; + $is_affiliate = is_object( $affiliate ); + $is_pending_affiliate = false; + $email_address = ( is_object( $user ) ? + $user->email : + '' ); + $full_name = ( is_object( $user ) ? + $user->get_name() : + '' ); + $paypal_email_address = ''; + $domain = ''; + $extra_domains = array(); + $promotion_method_social_media = false; + $promotion_method_mobile_apps = false; + $statistics_information = false; + $promotion_method_description = false; + $members_dashboard_login_url = 'https://members.freemius.com/login/'; + + $affiliate_application_data = $fs->get_affiliate_application_data(); + + if ( $is_affiliate && $affiliate->is_pending() ) { + $readonly = 'readonly'; + $is_pending_affiliate = true; + + $paypal_email_address = $affiliate->paypal_email; + $domain = $affiliate->domain; + $statistics_information = $affiliate_application_data['stats_description']; + $promotion_method_description = $affiliate_application_data['promotion_method_description']; + + if ( ! empty( $affiliate_application_data['additional_domains'] ) ) { + $extra_domains = $affiliate_application_data['additional_domains']; + } + + if ( ! empty( $affiliate_application_data['promotion_methods'] ) ) { + $promotion_methods = explode( ',', $affiliate_application_data['promotion_methods'] ); + $promotion_method_social_media = in_array( 'social_media', $promotion_methods ); + $promotion_method_mobile_apps = in_array( 'mobile_apps', $promotion_methods ); + } + } else { + $current_user = Freemius::_get_current_wp_user(); + $full_name = trim( $current_user->user_firstname . ' ' . $current_user->user_lastname ); + $email_address = $current_user->user_email; + $domain = fs_strip_url_protocol( get_site_url() ); + } + + $affiliate_tracking = 30; + + if ( is_object( $affiliate_terms ) ) { + $affiliate_tracking = ( ! is_null( $affiliate_terms->cookie_days ) ? + ( $affiliate_terms->cookie_days . '-day' ) : + fs_text_inline( 'Non-expiring', 'non-expiring', $slug ) ); + } + + $apply_to_become_affiliate_text = fs_text_inline( 'Apply to become an affiliate', 'apply-to-become-an-affiliate', $slug ); +?> +<div id="fs_affiliation_content_wrapper" class="wrap"> + <form method="post" action=""> + <div id="poststuff"> + <div class="postbox"> + <div class="inside"> + <div id="messages"> + <div id="error_message" class="error" style="display: none"> + <p><strong></strong></p> + </div> + <div id="message" class="updated" style="display: none"> + <p><strong></strong></p> + </div> + <?php if ( $is_affiliate ) : ?> + <?php if ( $affiliate->is_active() ) : ?> + <div class="updated"> + <p><strong><?php + echo sprintf( + fs_esc_html_inline( "Your affiliate application for %s has been accepted! Log in to your affiliate area at: %s.", 'affiliate-application-accepted', $slug ), + $plugin_title, + sprintf( + '<a href="%s" target="_blank">%s</a>', + $members_dashboard_login_url, + $members_dashboard_login_url + ) + ); + ?></strong></p> + </div> + <?php else : ?> + <?php + $message_text = ''; + + if ( $is_pending_affiliate ) { + $message_text = fs_text_inline( "Thank you for applying for our affiliate program, we'll review your details during the next 14 days and will get back to you with further information.", 'affiliate-application-thank-you', $slug ); + $message_container_class = 'updated'; + } else if ( $affiliate->is_suspended() ) { + $message_text = fs_text_inline( 'Your affiliation account was temporarily suspended.', 'affiliate-account-suspended', $slug ); + $message_container_class = 'notice notice-warning'; + } else if ( $affiliate->is_rejected() ) { + $message_text = fs_text_inline( "Thank you for applying for our affiliate program, unfortunately, we've decided at this point to reject your application. Please try again in 30 days.", 'affiliate-application-rejected', $slug ); + $message_container_class = 'error'; + } else if ( $affiliate->is_blocked() ) { + $message_text = fs_text_inline( 'Due to violation of our affiliation terms, we decided to temporarily block your affiliation account. If you have any questions, please contact support.', 'affiliate-account-blocked', $slug ); + $message_container_class = 'error'; + } + ?> + <div class="<?php echo $message_container_class ?>"> + <p><strong><?php echo esc_html( $message_text ) ?></strong></p> + </div> + <?php endif ?> + <?php endif ?> + </div> + <div class="entry-content"> + <?php if ( ! $is_affiliate ) : ?> + <div id="application_messages_container"> + <p><?php echo esc_html( sprintf( fs_text_inline( 'Like the %s? Become our ambassador and earn cash ;-)', 'become-an-ambassador', $slug ), $module_type ) ) ?></p> + <p><?php echo esc_html( sprintf( fs_text_inline( 'Refer new customers to our %s and earn %s commission on each successful sale you refer!', 'refer-new-customers', $slug ), $module_type, $commission ) ) ?></p> + </div> + <?php endif ?> + <h3><?php fs_esc_html_echo_inline( 'Program Summary', 'program-summary', $slug ) ?></h3> + <ul> + <li><?php echo esc_html( sprintf( fs_text_inline( '%s commission when a customer purchases a new license.', 'commission-on-new-license-purchase', $slug ), $commission ) ) ?></li> + <?php if ( is_object( $affiliate_terms ) && $affiliate_terms->has_renewals_commission() ) : ?> + <li><?php echo esc_html( sprintf( fs_text_inline( 'Get commission for automated subscription renewals.', 'renewals-commission', $slug ) ) ) ?></li> + <?php endif ?> + <?php if ( is_object( $affiliate_terms ) && ( ! $affiliate_terms->is_session_cookie() ) ) : ?> + <li><?php echo esc_html( sprintf( fs_text_inline( '%s tracking cookie after the first visit to maximize earnings potential.', 'affiliate-tracking', $slug ), $affiliate_tracking ) ) ?></li> + <?php endif ?> + <?php if ( is_object( $affiliate_terms ) && $affiliate_terms->has_lifetime_commission() ) : ?> + <li><?php fs_esc_html_echo_inline( 'Unlimited commissions.', 'unlimited-commissions', $slug ) ?></li> + <?php endif ?> + <li><?php echo esc_html( sprintf( fs_text_inline( '%s minimum payout amount.', 'minimum-payout-amount', $slug ), '$100' ) ) ?></li> + <li><?php fs_esc_html_echo_inline( 'Payouts are in USD and processed monthly via PayPal.', 'payouts-unit-and-processing', $slug ) ?></li> + <li><?php fs_esc_html_echo_inline( 'As we reserve 30 days for potential refunds, we only pay commissions that are older than 30 days.', 'commission-payment', $slug ) ?></li> + </ul> + <div id="application_form_container" <?php echo ( $is_pending_affiliate ) ? '' : 'style="display: none"' ?>> + <h3><?php fs_esc_html_echo_inline( 'Affiliate', 'affiliate', $slug ) ?></h3> + <form> + <div class="input-container input-container-text"> + <label class="input-label"><?php fs_esc_html_echo_inline( 'Email address', 'email-address', $slug ) ?></label> + <input id="email_address" type="text" value="<?php echo esc_attr( $email_address ) ?>" class="regular-text" <?php echo ( $readonly || is_object( $user ) ) ? 'readonly' : '' ?>> + </div> + <div class="input-container input-container-text"> + <label class="input-label"><?php fs_esc_html_echo_inline( 'Full name', 'full-name', $slug ) ?></label> + <input id="full_name" type="text" value="<?php echo esc_attr( $full_name ) ?>" class="regular-text" <?php echo $readonly ?>> + </div> + <div class="input-container input-container-text"> + <label class="input-label"><?php fs_esc_html_echo_inline( 'PayPal account email address', 'paypal-account-email-address', $slug ) ?></label> + <input id="paypal_email" type="text" value="<?php echo esc_attr( $paypal_email_address ) ?>" class="regular-text" <?php echo $readonly ?>> + </div> + <div class="input-container input-container-text"> + <label class="input-label"><?php echo esc_html( sprintf( fs_text_inline( 'Where are you going to promote the %s?', 'domain-field-label', $slug ), $module_type ) ) ?></label> + <input id="domain" type="text" value="<?php echo esc_attr( $domain ) ?>" class="domain regular-text" <?php echo $readonly ?>> + <p class="description"><?php echo esc_html( sprintf( fs_text_inline( 'Enter the domain of your website or other websites from where you plan to promote the %s.', 'domain-field-desc', $slug ), $module_type ) ) ?></p> + <?php if ( ! $is_affiliate ) : ?> + <a id="add_domain" href="#" class="disabled">+ <?php fs_esc_html_echo_inline( 'Add another domain', 'add-another-domain', $slug ) ?>...</a> + <?php endif ?> + </div> + <div id="extra_domains_container" class="input-container input-container-text" <?php echo $is_pending_affiliate ? '' : 'style="display: none"' ?>> + <label class="input-label"><?php fs_esc_html_echo_inline( 'Extra Domains', 'extra-domain-fields-label', $slug ) ?></label> + <p class="description"><?php fs_esc_html_echo_inline( 'Extra domains where you will be marketing the product from.', 'extra-domain-fields-desc', $slug ) ?></p> + <?php if ( $is_pending_affiliate && ! empty( $extra_domains ) ) : ?> + <?php foreach ( $extra_domains as $extra_domain ) : ?> + <div class="extra-domain-input-container"> + <input type="text" value="<?php echo esc_attr( $extra_domain ) ?>" class="domain regular-text" <?php echo $readonly ?>> + </div> + <?php endforeach ?> + <?php endif ?> + </div> + <div class="input-container"> + <label class="input-label"><?php fs_esc_html_echo_inline( 'Promotion methods', 'promotion-methods', $slug ) ?></label> + <div> + <input id="promotion_method_social_media" type="checkbox" <?php checked( $promotion_method_social_media ) ?> <?php disabled( $is_affiliate ) ?>/> + <label for="promotion_method_social_media"><?php fs_esc_html_echo_inline( 'Social media (Facebook, Twitter, etc.)', 'social-media', $slug ) ?></label> + </div> + <div> + <input id="promotion_method_mobile_apps" type="checkbox" <?php checked( $promotion_method_mobile_apps ) ?> <?php disabled( $is_affiliate ) ?>/> + <label for="promotion_method_mobile_apps"><?php fs_esc_html_echo_inline( 'Mobile apps', 'mobile-apps', $slug ) ?></label> + </div> + </div> + <div class="input-container input-container-text"> + <label class="input-label"><nobr><?php fs_esc_html_echo_inline( 'Website, email, and social media statistics (optional)', 'statistics-information-field-label', $slug ) ?></nobr></label> + <textarea id="statistics_information" rows="5" <?php echo $readonly ?> class="regular-text"><?php echo $statistics_information ?></textarea> + <?php if ( ! $is_affiliate ) : ?> + <p class="description"><?php fs_esc_html_echo_inline( 'Please feel free to provide any relevant website or social media statistics, e.g. monthly unique site visits, number of email subscribers, followers, etc. (we will keep this information confidential).', 'statistics-information-field-desc', $slug ) ?></p> + <?php endif ?> + </div> + <div class="input-container input-container-text"> + <label class="input-label"><?php fs_esc_html_echo_inline( 'How will you promote us?', 'promotion-method-desc-field-label', $slug ) ?></label> + <textarea id="promotion_method_description" rows="5" <?php echo $readonly ?> class="regular-text"><?php echo $promotion_method_description ?></textarea> + <?php if ( ! $is_affiliate ) : ?> + <p class="description"><?php echo esc_html( sprintf( fs_text_inline( 'Please provide details on how you intend to promote %s (please be as specific as possible).', 'promotion-method-desc-field-desc', $slug ), $plugin_title ) ) ?></p> + <?php endif ?> + </div> + </form> + </div> + <?php if ( ! $is_affiliate ) : ?> + <a id="cancel_button" href="#" class="button button-secondary button-cancel" style="display: none"><?php fs_esc_html_echo_inline( 'Cancel', 'cancel', $slug ) ?></a> + <a id="submit_button" class="button button-primary" href="#" style="display: none"><?php echo esc_html( $apply_to_become_affiliate_text ) ?></a> + <a id="apply_button" class="button button-primary" href="#"><?php fs_esc_html_echo_inline( 'Become an affiliate', 'become-an-affiliate', $slug ) ?></a> + <?php endif ?> + </div> + </div> + </div> + </div> + </form> + <script type="text/javascript"> + jQuery(function ($) { + var + $contentWrapper = $('#fs_affiliation_content_wrapper'), + $socialMedia = $('#promotion_method_social_media'), + $mobileApps = $('#promotion_method_mobile_apps'), + $applyButton = $('#apply_button'), + $submitButton = $('#submit_button'), + $cancelButton = $('#cancel_button'), + $applicationFormContainer = $('#application_form_container'), + $errorMessageContainer = $('#error_message'), + $domain = $('#domain'), + $addDomain = $('#add_domain'), + $extraDomainsContainer = $('#extra_domains_container'); + + $applyButton.click(function (evt) { + evt.preventDefault(); + + var $this = $(this); + $this.hide(); + + $applicationFormContainer.show(); + $cancelButton.show(); + $submitButton.show(); + + $contentWrapper.find('input[type="text"]:first').focus(); + }); + + $submitButton.click(function (evt) { + evt.preventDefault(); + + var $this = $(this); + + if ($this.hasClass('disabled')) { + return; + } + + $errorMessageContainer.hide(); + + var + $emailAddress = $('#email_address'), + emailAddress = null, + paypalEmailAddress = $('#paypal_email').val().trim(); + + if (1 === $emailAddress.length) { + emailAddress = $emailAddress.val().trim(); + + if (0 === emailAddress.length) { + showErrorMessage('<?php fs_esc_js_echo_inline( 'Email address is required.', 'email-address-is-required', $slug ) ?>'); + return; + } + } + + if (0 === paypalEmailAddress.length) { + showErrorMessage('<?php fs_esc_js_echo_inline( 'PayPal email address is required.', 'paypal-email-address-is-required', $slug ) ?>'); + return; + } + + var + $extraDomains = $extraDomainsContainer.find('.domain'), + domain = $domain.val().trim().toLowerCase(), + extraDomains = []; + + if (0 === domain.length) { + showErrorMessage('<?php fs_esc_js_echo_inline( 'Domain is required.', 'domain-is-required', $slug ) ?>'); + return; + } else if ('freemius.com' === domain) { + showErrorMessage('<?php fs_esc_js_echo_inline( 'Invalid domain', 'invalid-domain', $slug ) ?>' + ' [' + domain + '].'); + return; + } + + if ($extraDomains.length > 0) { + var hasError = false; + + $extraDomains.each(function () { + var + $this = $(this), + extraDomain = $this.val().trim().toLowerCase(); + if (0 === extraDomain.length || extraDomain === domain) { + return true; + } else if ('freemius.com' === extraDomain) { + showErrorMessage('<?php fs_esc_js_echo_inline( 'Invalid domain', 'invalid-domain', $slug ) ?>' + ' [' + extraDomain + '].'); + hasError = true; + return false; + } + + extraDomains.push(extraDomain); + }); + + if (hasError) { + return; + } + } + + var + promotionMethods = [], + statisticsInformation = $('#statistics_information').val(), + promotionMethodDescription = $('#promotion_method_description').val(); + + if ($socialMedia.attr('checked')) { + promotionMethods.push('social_media'); + } + + if ($mobileApps.attr('checked')) { + promotionMethods.push('mobile_apps'); + } + + var affiliate = { + full_name : $('#full_name').val().trim(), + paypal_email : paypalEmailAddress, + stats_description : statisticsInformation, + promotion_method_description: promotionMethodDescription + }; + + if (null !== emailAddress) { + affiliate.email = emailAddress; + } + + affiliate.domain = domain; + affiliate.additional_domains = extraDomains; + + if (promotionMethods.length > 0) { + affiliate.promotion_methods = promotionMethods.join(','); + } + + $.ajax({ + url : ajaxurl, + method : 'POST', + data : { + action : '<?php echo $fs->get_ajax_action( 'submit_affiliate_application' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'submit_affiliate_application' ) ?>', + module_id: '<?php echo $fs->get_id() ?>', + affiliate: affiliate + }, + beforeSend: function () { + $cancelButton.addClass('disabled'); + $submitButton.addClass('disabled'); + $submitButton.text('<?php fs_esc_js_echo_inline( 'Submitting', 'submitting' ) ?>...'); + }, + success : function (result) { + if (result.success) { + location.reload(); + } else { + if (result.error && result.error.length > 0) { + showErrorMessage(result.error); + } + + $cancelButton.removeClass('disabled'); + $submitButton.removeClass('disabled'); + $submitButton.text('<?php echo esc_js( $apply_to_become_affiliate_text ) ?>') + } + } + }); + }); + + $cancelButton.click(function (evt) { + evt.preventDefault(); + + var $this = $(this); + + if ($this.hasClass('disabled')) { + return; + } + + $applicationFormContainer.hide(); + $this.hide(); + $submitButton.hide(); + + $applyButton.show(); + + window.scrollTo(0, 0); + }); + + $domain.on('input propertychange', onDomainChange); + + $addDomain.click(function (evt) { + evt.preventDefault(); + + var + $this = $(this), + domain = $domain.val().trim(); + + if ($this.hasClass('disabled') || 0 === domain.length) { + return; + } + + $domain.off('input propertychange'); + $this.addClass('disabled'); + + var + $extraDomainInputContainer = $('<div class="extra-domain-input-container"><input type="text" class="domain regular-text"/></div>'), + $extraDomainInput = $extraDomainInputContainer.find('input'), + $removeDomain = $('<a href="#" class="remove-domain"><i class="dashicons dashicons-no" title="<?php fs_esc_js_echo_inline( 'Remove', 'remove', $slug ) ?>"></i></a>'); + + $extraDomainInputContainer.append($removeDomain); + + $extraDomainInput.on('input propertychange', onDomainChange); + + $removeDomain.click(function (evt) { + evt.preventDefault(); + + var + $extraDomainInputs = $('.extra-domain-input-container .domain'); + + if (1 === $extraDomainInputs.length) + $extraDomainInputs.val('').focus(); + else + $(this).parent().remove(); + }); + + $extraDomainsContainer.show(); + + $extraDomainInputContainer.appendTo($extraDomainsContainer); + $extraDomainInput.focus(); + + $this.appendTo($extraDomainsContainer); + }); + + /** + * @author Leo Fajardo (@leorw) + */ + function onDomainChange() { + var + domain = $(this).val().trim(); + + if (domain.length > 0) { + $addDomain.removeClass('disabled'); + } else { + $addDomain.addClass('disabled'); + } + } + + /** + * @author Leo Fajardo (@leorw) + * + * @param {String} message + */ + function showErrorMessage(message) { + $errorMessageContainer.find('strong').text(message); + $errorMessageContainer.show(); + + window.scrollTo(0, 0); + } + }); + </script> + </div> +<?php + $params = array( + 'page' => 'affiliation', + 'module_id' => $fs->get_id(), + 'module_slug' => $slug, + 'module_version' => $fs->get_plugin_version(), + ); + fs_require_template( 'powered-by.php', $params ); +?> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/contact.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/contact.php index 3c1db5d6d..24d67e723 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/contact.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/contact.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.0 */ @@ -10,14 +10,14 @@ exit; } - /** - * @var array $VARS - */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + /** + * @var array $VARS + */ + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); - echo __fs( 'contact-support-before-deactivation', $slug ) + echo fs_text_inline( 'Sorry for the inconvenience and we are here to help if you give us a chance.', 'contact-support-before-deactivation', $slug ) . sprintf(" <a href='%s' class='button button-small button-primary'>%s</a>", $fs->contact_url( 'technical_support' ), - __fs( 'contact-support', $slug ) + fs_text_inline( 'Contact Support', 'contact-support', $slug ) ); diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/form.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/form.php index a0abfc24e..93f08b32b 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/form.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/form.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.2 */ @@ -10,11 +10,8 @@ exit; } - /** - * @var array $VARS - */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); $confirmation_message = $fs->apply_filters( 'uninstall_confirmation_message', '' ); @@ -31,11 +28,14 @@ } else { $reason_internal_message = ''; } - + + $reason_input_type = ( ! empty( $reason['input_type'] ) ? $reason['input_type'] : '' ); + $reason_input_placeholder = ( ! empty( $reason['input_placeholder'] ) ? $reason['input_placeholder'] : '' ); + $reason_list_item_html = <<< HTML <li class="{$list_item_classes}" - data-input-type="{$reason['input_type']}" - data-input-placeholder="{$reason['input_placeholder']}"> + data-input-type="{$reason_input_type}" + data-input-placeholder="{$reason_input_placeholder}"> <label> <span> <input type="radio" name="selected-reason" value="{$reason['id']}"/> @@ -51,15 +51,20 @@ HTML; $is_anonymous = ( ! $fs->is_registered() ); if ( $is_anonymous ) { - $anonymous_feedback_checkbox_html = - '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> ' - . __fs( 'anonymous-feedback', $slug ) - . '</label>'; + $anonymous_feedback_checkbox_html = sprintf( + '<label class="anonymous-feedback-label"><input type="checkbox" class="anonymous-feedback-checkbox"> %s</label>', + fs_esc_html_inline( 'Anonymous feedback', 'anonymous-feedback', $slug ) + ); } else { $anonymous_feedback_checkbox_html = ''; } - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' ); + // Aliases. + $deactivate_text = fs_text_inline( 'Deactivate', 'deactivate', $slug ); + $theme_text = fs_text_inline( 'Theme', 'theme', $slug ); + $activate_x_text = fs_text_inline( 'Activate %s', 'activate-x', $slug ); + + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> <script type="text/javascript"> (function ($) { @@ -68,37 +73,65 @@ HTML; '<div class="fs-modal fs-modal-deactivation-feedback<?php echo empty( $confirmation_message ) ? ' no-confirmation-message' : ''; ?>">' + ' <div class="fs-modal-dialog">' + ' <div class="fs-modal-header">' - + ' <h4><?php _efs('quick-feedback' , $slug) ?></h4>' + + ' <h4><?php fs_esc_attr_echo_inline( 'Quick feedback', 'quick-feedback' , $slug ) ?></h4>' + ' </div>' + ' <div class="fs-modal-body">' + ' <div class="fs-modal-panel" data-panel-id="confirm"><p><?php echo $confirmation_message; ?></p></div>' - + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php printf( __fs( 'deactivation-share-reason' , $slug ) ); ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>' + + ' <div class="fs-modal-panel active" data-panel-id="reasons"><h3><strong><?php echo esc_js( sprintf( fs_text_inline( 'If you have a moment, please let us know why you are %s', 'deactivation-share-reason' , $slug ), ( $fs->is_plugin() ? fs_text_inline( 'deactivating', 'deactivating', $slug ) : fs_text_inline( 'switching', 'switching', $slug ) ) ) ) ?>:</strong></h3><ul id="reasons-list">' + reasonsHtml + '</ul></div>' + ' </div>' + ' <div class="fs-modal-footer">' + ' <?php echo $anonymous_feedback_checkbox_html ?>' + ' <a href="#" class="button button-secondary button-deactivate"></a>' - + ' <a href="#" class="button button-primary button-close"><?php _efs( 'cancel' , $slug ) ?></a>' + + ' <a href="#" class="button button-primary button-close"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel' , $slug ) ?></a>' + ' </div>' + ' </div>' + '</div>', - $modal = $(modalHtml), - $deactivateLink = $('#the-list .deactivate > [data-slug=<?php echo $VARS['slug']; ?>].fs-slug').prev(), + $modal = $(modalHtml), + $deactivateLink = $('#the-list .deactivate > [data-module-id=<?php echo $fs->get_id() ?>].fs-module-id').prev(), + selectedReasonID = false, + redirectLink = '', $anonymousFeedback = $modal.find( '.anonymous-feedback-label' ), isAnonymous = <?php echo ( $is_anonymous ? 'true' : 'false' ); ?>, - selectedReasonID = false, otherReasonID = <?php echo Freemius::REASON_OTHER; ?>, - dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>; + dontShareDataReasonID = <?php echo Freemius::REASON_DONT_LIKE_TO_SHARE_MY_INFORMATION; ?>, + deleteThemeUpdateData = <?php echo $fs->is_theme() && $fs->is_premium() && ! $fs->has_any_active_valid_license() ? 'true' : 'false' ?>; $modal.appendTo($('body')); registerEventHandlers(); function registerEventHandlers() { + <?php + if ( $fs->is_plugin() ) { ?> $deactivateLink.click(function (evt) { evt.preventDefault(); + redirectLink = $(this).attr('href'); + + showModal(); + }); + <?php + /** + * For "theme" module type, the modal is shown when the current user clicks on + * the "Activate" button of any other theme. The "Activate" button is actually + * a link to the "Themes" page (/wp-admin/themes.php) containing query params + * that tell WordPress to deactivate the current theme and activate a different theme. + * + * @author Leo Fajardo (@leorw) + * @since 1.2.2 + * + * @since 1.2.2.7 Don't trigger the deactivation feedback form if activating the premium version of the theme. + */ + } else { ?> + $('body').on('click', '.theme-browser .theme:not([data-slug=<?php echo $slug ?>-premium]) .theme-actions .button.activate', function (evt) { + evt.preventDefault(); + + redirectLink = $(this).attr('href'); + showModal(); }); + <?php + } ?> $modal.on('input propertychange', '.reason-input input', function () { if (!isOtherReasonSelected()) { @@ -150,8 +183,28 @@ HTML; var $radio = $('input[type="radio"]:checked'); if (0 === $radio.length) { - // If no selected reason, just deactivate the plugin. - window.location.href = $deactivateLink.attr('href'); + if ( ! deleteThemeUpdateData ) { + // If no selected reason, just deactivate the plugin. + window.location.href = redirectLink; + } else { + $.ajax({ + url : ajaxurl, + method : 'POST', + data : { + action : '<?php echo $fs->get_ajax_action( 'delete_theme_update_data' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'delete_theme_update_data' ) ?>', + module_id: '<?php echo $fs->get_id() ?>' + }, + beforeSend: function() { + _parent.find( '.fs-modal-footer .button' ).addClass( 'disabled' ); + _parent.find( '.fs-modal-footer .button-secondary' ).text( 'Processing...' ); + }, + complete : function() { + window.location.href = redirectLink; + } + }); + } + return; } @@ -167,11 +220,12 @@ HTML; url : ajaxurl, method : 'POST', data : { - 'action' : '<?php echo $fs->get_action_tag( 'submit_uninstall_reason' ) ?>', - 'slug' : '<?php echo $slug ?>', - 'reason_id' : $radio.val(), - 'reason_info' : userReason, - 'is_anonymous': isAnonymousFeedback() + action : '<?php echo $fs->get_ajax_action( 'submit_uninstall_reason' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'submit_uninstall_reason' ) ?>', + module_id : '<?php echo $fs->get_id() ?>', + reason_id : $radio.val(), + reason_info : userReason, + is_anonymous: isAnonymousFeedback() }, beforeSend: function () { _parent.find('.fs-modal-footer .button').addClass('disabled'); @@ -179,7 +233,7 @@ HTML; }, complete : function () { // Do not show the dialog box, deactivate the plugin. - window.location.href = $deactivateLink.attr('href'); + window.location.href = redirectLink; } }); } else if (_this.hasClass('button-deactivate')) { @@ -211,7 +265,12 @@ HTML; $modal.find('.reason-input').remove(); $modal.find( '.internal-message' ).hide(); - $modal.find('.button-deactivate').text('<?php printf( __fs( 'deactivation-modal-button-submit' , $slug ) ); ?>'); + $modal.find('.button-deactivate').html('<?php echo esc_js( sprintf( + fs_text_inline( 'Submit & %s', 'deactivation-modal-button-submit' , $slug ), + $fs->is_plugin() ? + $deactivate_text : + sprintf( $activate_x_text, $theme_text ) + ) ) ?>'); enableDeactivateButton(); @@ -228,7 +287,7 @@ HTML; _parent.find('input, textarea').attr('placeholder', inputPlaceholder).focus(); if (isOtherReasonSelected()) { - showMessage('<?php printf( __fs( 'ask-for-reason-message' , $slug ) ); ?>'); + showMessage('<?php echo esc_js( fs_text_inline( 'Kindly tell us the reason so we can improve.', 'ask-for-reason-message' , $slug ) ); ?>'); disableDeactivateButton(); } } @@ -348,9 +407,19 @@ HTML; // Reset the deactivate button's text. if ('confirm' === getCurrentPanel()) { - $deactivateButton.text('<?php printf( __fs( 'deactivation-modal-button-confirm' , $slug ) ); ?>'); + $deactivateButton.text('<?php echo esc_js( sprintf( + fs_text_inline( 'Yes - %s', 'deactivation-modal-button-confirm' , $slug ), + $fs->is_plugin() ? + $deactivate_text : + sprintf( $activate_x_text, $theme_text ) + ) ) ?>'); } else { - $deactivateButton.text('<?php printf( __fs( 'skip-deactivate' , $slug ) ); ?>'); + $deactivateButton.html('<?php echo esc_js( sprintf( + fs_text_inline('Skip & %s', 'skip-and-x', $slug ), + $fs->is_plugin() ? + $deactivate_text : + sprintf( $activate_x_text, $theme_text ) + ) ) ?>'); } } diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/retry-skip.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/retry-skip.php index 1e2408900..17321029d 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/retry-skip.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/deactivation/retry-skip.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.0 */ @@ -10,15 +10,15 @@ exit; } - /** - * @var array $VARS - */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + /** + * @var array $VARS + */ + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); - $skip_url = fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $slug . '_skip_activation' ) ), $slug . '_skip_activation' ); - $skip_text = strtolower( __fs( 'skip', $slug ) ); - $use_plugin_anonymously_text = __fs( 'click-here-to-use-plugin-anonymously', $slug ); + $skip_url = fs_nonce_url( $fs->_get_admin_page_url( '', array( 'fs_action' => $fs->get_unique_affix() . '_skip_activation' ) ), $fs->get_unique_affix() . '_skip_activation' ); + $skip_text = strtolower( fs_text_x_inline( 'Skip', 'verb', 'skip', $slug ) ); + $use_plugin_anonymously_text = fs_text_inline( 'Click here to use the plugin anonymously', 'click-here-to-use-plugin-anonymously', $slug ); - echo sprintf( __fs( 'dont-have-to-share-any-data', $slug ), "<a href='{$skip_url}'>{$skip_text}</a>" ) - . " <a href='{$skip_url}' class='button button-small button-secondary'>{$use_plugin_anonymously_text}</a>"; + echo sprintf( fs_text_inline( "You might have missed it, but you don't have to share any data and can just %s the opt-in.", 'dont-have-to-share-any-data', $slug ), "<a href='{$skip_url}'>{$skip_text}</a>" ) + . " <a href='{$skip_url}' class='button button-small button-secondary'>{$use_plugin_anonymously_text}</a>"; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/license-activation.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/license-activation.php index 88608b26a..0b455b12a 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/license-activation.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/license-activation.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.9 */ @@ -11,16 +11,18 @@ } /** - * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); - $cant_find_license_key_text = __fs( 'cant-find-license-key', $slug ); - $message_above_input_field = __fs( 'activate-license-message', $slug ); + $cant_find_license_key_text = fs_text_inline( "Can't find your license key?", 'cant-find-license-key', $slug ); + $message_above_input_field = fs_text_inline( 'Please enter the license key that you received in the email right after the purchase:', 'activate-license-message', $slug ); $message_below_input_field = ''; - $header_title = __fs( $fs->is_free_plan() ? 'activate-license' : 'update-license', $slug ); + $header_title = $fs->is_free_plan() ? + fs_text_inline( 'Activate License', 'activate-license', $slug ) : + fs_text_inline( 'Update License', 'update-license', $slug ); if ( $fs->is_registered() ) { $activate_button_text = $header_title; @@ -32,12 +34,150 @@ $freemius_link = '<a href="' . $freemius_site_url . '" target="_blank" tabindex="0">freemius.com</a>'; - $message_below_input_field = sprintf( __fs( 'license-sync-disclaimer', $slug ), $freemius_link ); + $message_below_input_field = sprintf( + fs_text_inline( 'The %1$s will be periodically sending data to %2$s to check for security and feature updates, and verify the validity of your license.', 'license-sync-disclaimer', $slug ), + $fs->get_module_label( true ), + $freemius_link + ); - $activate_button_text = __fs( 'agree-activate-license', $slug ); + $activate_button_text = fs_text_inline( 'Agree & Activate License', 'agree-activate-license', $slug ); } - $license_key_text = __fs( 'license-key' , $slug ); + $license_key_text = fs_text_inline( 'License key', 'license-key' , $slug ); + + $is_network_activation = ( + $fs->is_network_active() && + fs_is_network_admin() && + ! $fs->is_delegated_connection() + ); + $network_activation_html = ''; + + $sites_details = array(); + if ( $is_network_activation ) { + $all_sites = Freemius::get_sites(); + + foreach ( $all_sites as $site ) { + $site_details = $fs->get_site_info( $site ); + + $blog_id = Freemius::get_site_blog_id( $site ); + $install = $fs->get_install_by_blog_id($blog_id); + + if ( is_object( $install ) && FS_Plugin_License::is_valid_id( $install->license_id ) ) { + $site_details['license_id'] = $install->license_id; + } + + $sites_details[] = $site_details; + } + + if ( $is_network_activation ) { + $vars = array( + 'id' => $fs->get_id(), + 'sites' => $sites_details, + 'require_license_key' => true + ); + + $network_activation_html = fs_get_template( 'partials/network-activation.php', $vars ); + } + } + + $premium_licenses = $fs->get_available_premium_licenses(); + $available_licenses = array(); + foreach ( $premium_licenses as $premium_license ) { + $activations_left = $premium_license->left(); + if ( ! ( $activations_left > 0 ) ) { + continue; + } + + $available_licenses[ $activations_left . '_' . $premium_license->id ] = $premium_license; + } + + $total_available_licenses = count( $available_licenses ); + if ( $total_available_licenses > 0 ) { + $license_input_html = <<< HTML + <div id="license_options_container"> + <table> + <tbody> + <tr id="available_license_key_container"> + <td><input type="radio" name="license_type" value="available"></td> + <td> +HTML; + + if ( $total_available_licenses > 1 ) { + // Sort the licenses by number of activations left in descending order. + krsort( $available_licenses ); + + $license_input_html .= '<select id="licenses">'; + + /** + * @var FS_Plugin_License $license + */ + foreach ( $available_licenses as $license ) { + $label = sprintf( + "%s-Site %s License - %s", + ( 1 == $license->quota ? + 'Single' : + $license->quota + ), + $fs->_get_plan_by_id( $license->plan_id )->title, + ( htmlspecialchars( substr( $license->secret_key, 0, 6 ) ) . + str_pad( '', 23 * 6, '•' ) . + htmlspecialchars( substr( $license->secret_key, - 3 ) ) ) + ); + + $license_input_html .= "<option data-id='{$license->id}' value='{$license->secret_key}' data-left='{$license->left()}'>{$label}</option>"; + } + + $license_input_html .= '</select>'; + } else { + $available_licenses = array_values( $available_licenses ); + + /** + * @var FS_Plugin_License $available_license + */ + $available_license = $available_licenses[0]; + $value = sprintf( + "%s-Site %s License - %s", + ( 1 == $available_license->quota ? + 'Single' : + $available_license->quota + ), + $fs->_get_plan_by_id( $available_license->plan_id )->title, + ( htmlspecialchars( substr( $available_license->secret_key, 0, 6 ) ) . + str_pad( '', 23 * 6, '•' ) . + htmlspecialchars( substr( $available_license->secret_key, - 3 ) ) ) + ); + + $license_input_html .= <<< HTML + <input + id="available_license_key" + type="text" + value="{$value}" + data-id="{$available_license->id}" + data-license-key="{$available_license->secret_key}" + data-left="{$available_license->left()}" + readonly /> +HTML; + } + + $license_input_html .= <<< HTML + </td> + </tr> + <tr> + <td><input type="radio" name="license_type" value="other"></td> + <td id="other_license_key_container"> + <label for="other_license_key">Other: </label> + <div> + <input id="other_license_key" class="license_key" type="text" placeholder="Enter license key" tabindex="1"> + </div> + </td> + </tr> + </tbody> + </table> + </div> +HTML; + } else { + $license_input_html = "<input class='license_key' type='text' placeholder='{$license_key_text}' tabindex='1' />"; + } /** * IMPORTANT: @@ -48,12 +188,13 @@ $modal_content_html = <<< HTML <div class="notice notice-error inline license-activation-message"><p></p></div> <p>{$message_above_input_field}</p> - <input class="license_key" type="text" placeholder="{$license_key_text}" tabindex="1" /> - <a class="show-license-resend-modal show-license-resend-modal-{$slug}" href="!#" tabindex="2">{$cant_find_license_key_text}</a> + {$license_input_html} + <a class="show-license-resend-modal show-license-resend-modal-{$fs->get_unique_affix()}" href="!#" tabindex="2">{$cant_find_license_key_text}</a> + {$network_activation_html} <p>{$message_below_input_field}</p> HTML; - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' ); + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> <script type="text/javascript"> (function( $ ) { @@ -63,32 +204,139 @@ HTML; '<div class="fs-modal fs-modal-license-activation">' + ' <div class="fs-modal-dialog">' + ' <div class="fs-modal-header">' - + ' <h4><?php echo $header_title ?></h4>' - + ' <a href="!#" class="fs-close"><i class="dashicons dashicons-no" title="<?php _efs( 'dismiss' ) ?>"></i></a>' + + ' <h4><?php echo esc_js($header_title) ?></h4>' + + ' <a href="!#" class="fs-close"><i class="dashicons dashicons-no" title="<?php echo esc_js( fs_text_x_inline( 'Dismiss', 'as close a window', 'dismiss', $slug ) ) ?>"></i></a>' + ' </div>' + ' <div class="fs-modal-body">' + ' <div class="fs-modal-panel active">' + modalContentHtml + '</div>' + ' </div>' + ' <div class="fs-modal-footer">' - + ' <button class="button button-secondary button-close" tabindex="4"><?php _efs('cancel', $slug); ?></button>' - + ' <button class="button button-primary button-activate-license" tabindex="3"><?php echo $activate_button_text; ?></button>' + + ' <button class="button button-secondary button-close" tabindex="4"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></button>' + + ' <button class="button button-primary button-activate-license" tabindex="3"><?php echo esc_js( $activate_button_text ) ?></button>' + ' </div>' + ' </div>' + '</div>', $modal = $(modalHtml), - $activateLicenseLink = $('span.activate-license.<?php echo $VARS['slug'] ?> a, .activate-license-trigger.<?php echo $VARS['slug'] ?>'), + $activateLicenseLink = $('span.activate-license.<?php echo $fs->get_unique_affix() ?> a, .activate-license-trigger.<?php echo $fs->get_unique_affix() ?>'), $activateLicenseButton = $modal.find('.button-activate-license'), $licenseKeyInput = $modal.find('input.license_key'), $licenseActivationMessage = $modal.find( '.license-activation-message' ), - pluginSlug = '<?php echo $slug ?>'; + isNetworkActivation = <?php echo $is_network_activation ? 'true' : 'false' ?>; $modal.appendTo($('body')); + var + $licensesDropdown = $( '#licenses' ), + $licenseTypes = $( 'input[type="radio"][name="license_type"]' ), + $applyOnAllSites = $( '#apply_on_all_sites' ), + $sitesListContainer = $( '#sites_list_container' ), + $availableLicenseKey = $( '#available_license_key' ), + $otherLicenseKey = $( '#other_license_key' ), + $multisiteOptionsContainer = $( '#multisite_options_container' ), + $activationsLeft = null, + hasLicensesDropdown = ( $licensesDropdown.length > 0 ), + hasLicenseTypes = ( $licenseTypes.length > 0 ), + maxSitesListHeight = null, + totalSites = <?php echo count( $sites_details ) ?>, + singleBlogID = null; + function registerEventHandlers() { - $activateLicenseLink.click(function (evt) { + var + $otherLicenseKeyContainer = $( '#other_license_key_container' ); + + if ( isNetworkActivation ) { + $applyOnAllSites.click(function() { + var applyOnAllSites = $( this ).is( ':checked' ); + + $multisiteOptionsContainer.toggleClass( 'apply-on-all-sites', applyOnAllSites ); + + showSites( ! applyOnAllSites ); + + if ( hasValidLicenseKey() && ( applyOnAllSites || hasSelectedSite() ) ) { + enableActivateLicenseButton(); + } else { + disableActivateLicenseButton(); + } + }); + + $sitesListContainer.delegate( 'td:not(:first-child)', 'click', function() { + // If a site row is clicked, trigger a click on the checkbox. + $( this ).parent().find( 'td:first-child input' ).click(); + }); + + $sitesListContainer.delegate( 'input[type="checkbox"]', 'click', function() { + enableDisableSitesSelection(); + + if ( hasValidLicenseKey() && hasSelectedSite() ) { + enableActivateLicenseButton(); + } else { + disableActivateLicenseButton(); + } + }); + } + + if ( hasLicensesDropdown ) { + $licensesDropdown.change(function() { + // When a license is selected, select the associated radio button. + $licenseTypes.filter( '[value="available"]' ).attr( 'checked', true ); + + if ( ! isNetworkActivation || $modal.hasClass( 'is-single-site-activation' ) ) { + enableActivateLicenseButton(); + return true; + } + + toggleActivationOnAllSites(); + }) + } + + if ( hasLicenseTypes ) { + $licenseTypes.change(function() { + var + licenseKey = $( 'input.license_key' ).val().trim(), + otherLicenseKeySelected = isOtherLicenseKeySelected(); + + if ( ( licenseKey.length > 0 || ( hasLicenseTypes && ! otherLicenseKeySelected ) ) && + ( $modal.hasClass( 'is-single-site-activation' ) || ! isNetworkActivation || hasSelectedSite() ) + ) { + /** + * If the "other" license is not empty or an available license is selected, enable the activate + * button. + * + * @author Leo Fajardo (@leorw) + */ + enableActivateLicenseButton(); + } else { + disableActivateLicenseButton(); + } + + if ( ! isNetworkActivation ) { + return; + } + + if ( otherLicenseKeySelected ) { + $applyOnAllSites.attr( 'disabled', false ); + enableDisableSitesSelection(); + resetActivateLicenseCheckboxLabel(); + } else if ( ! $modal.hasClass( 'is-single-site-activation' ) ) { + toggleActivationOnAllSites(); + } + }); + + if ( ! hasLicensesDropdown ) { + $availableLicenseKey.click(function() { + $licenseTypes.filter( '[value="available"]' ).click(); + }); + } + + $otherLicenseKeyContainer.click(function() { + $licenseTypes.filter( '[value="other"]' ).click(); + }); + } + + $activateLicenseLink.click(function (evt) { evt.preventDefault(); - showModal(); + showModal( evt ); }); $modal.on('input propertychange', 'input.license_key', function () { @@ -98,20 +346,25 @@ HTML; /** * If license key is not empty, enable the license activation button. */ - if (licenseKey.length > 0) { + if ( licenseKey.length > 0 && ( $modal.hasClass( 'is-single-site-activation' ) || ! isNetworkActivation || hasSelectedSite() ) ) { enableActivateLicenseButton(); } }); - $modal.on('blur', 'input.license_key', function () { - var licenseKey = $(this).val().trim(); - - /** - * If license key is empty, disable the license activation button. - */ - if (0 === licenseKey.length) { - disableActivateLicenseButton(); - } + $modal.on( 'blur', 'input.license_key', function( evt ) { + var + licenseKey = $(this).val().trim(), + $focusedElement = $( evt.relatedTarget ), + hasSelectedAvailableLicense = ( hasLicenseTypes && $focusedElement.parents( '#available_license_key_container' ).length > 0 ); + + /** + * If license key is empty, disable the license activation button. + */ + if ( ( 0 === licenseKey.length && ( ! hasLicenseTypes || ! hasSelectedAvailableLicense ) ) || + ( isNetworkActivation && ! hasSelectedSite() ) + ) { + disableActivateLicenseButton(); + } }); $modal.on('click', '.button-activate-license', function (evt) { @@ -121,7 +374,22 @@ HTML; return; } - var licenseKey = $licenseKeyInput.val().trim(); + var + licenseKey = ''; + + if ( hasLicenseTypes ) { + if ( isOtherLicenseKeySelected() ) { + licenseKey = $otherLicenseKey.val(); + } else { + if ( ! hasLicensesDropdown ) { + licenseKey = $availableLicenseKey.data( 'license-key' ); + } else { + licenseKey = $licensesDropdown.val(); + } + } + } else { + licenseKey = $licenseKeyInput.val().trim(); + } disableActivateLicenseButton(); @@ -129,16 +397,53 @@ HTML; return; } + var data = { + action : '<?php echo $fs->get_ajax_action( 'activate_license' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'activate_license' ) ?>', + license_key: licenseKey, + module_id : '<?php echo $fs->get_id() ?>' + }; + + if ( isNetworkActivation ) { + var + sites = []; + + if ( null === singleBlogID ) { + var + applyOnAllSites = $applyOnAllSites.is( ':checked' ); + + $sitesListContainer.find( 'tr' ).each(function() { + var + $this = $( this ), + includeSite = ( applyOnAllSites || $this.find( 'input' ).is( ':checked' ) ); + + if ( ! includeSite ) + return; + + var site = { + uid : $this.find( '.uid' ).val(), + url : $this.find( '.url' ).val(), + title : $this.find( '.title' ).val(), + language: $this.find( '.language' ).val(), + charset : $this.find( '.charset' ).val(), + blog_id : $this.find( '.blog-id' ).find( 'span' ).text() + }; + + sites.push( site ); + }); + } else { + data.blog_id = singleBlogID; + } + + data.sites = sites; + } + $.ajax({ url: ajaxurl, method: 'POST', - data: { - action : 'fs_activate_license_' + pluginSlug, - slug : pluginSlug, - license_key: licenseKey - }, + data: data, beforeSend: function () { - $activateLicenseButton.text( '<?php _efs( 'activating-license', $slug ); ?>' ); + $activateLicenseButton.text( '<?php fs_esc_js_echo_inline( 'Activating license', 'activating-license', $slug ) ?>...' ); }, success: function( result ) { var resultObj = $.parseJSON( result ); @@ -148,7 +453,7 @@ HTML; // Redirect to the "Account" page and sync the license. window.location.href = resultObj.next_page; } else { - showError( resultObj.error ); + showError( resultObj.error.message ? resultObj.error.message : resultObj.error ); resetActivateLicenseButton(); } } @@ -164,14 +469,199 @@ HTML; registerEventHandlers(); - function showModal() { + $('body').trigger('licenseActivationLoaded'); + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + function enableDisableSitesSelection() { + var + canApplyOnAllSites = $applyOnAllSites.is( ':enabled' ), + disableSitesSelection = null; + + if ( ! canApplyOnAllSites ) { + var + selectedSites = $sitesListContainer.find( 'input[type="checkbox"]:checked' ).length, + activationsLeft = Math.max( 0, $activationsLeft.data( 'left' ) - selectedSites ); + + disableSitesSelection = ( 0 === activationsLeft ); + + $activationsLeft.text( activationsLeft ); + } else { + disableSitesSelection = false; + } + + $sitesListContainer + .find( 'input[type="checkbox"]:not(:checked)' ) + .attr( 'disabled', disableSitesSelection ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @returns {Boolean} + */ + function isOtherLicenseKeySelected() { + return ( hasLicenseTypes && 'other' === $licenseTypes.filter( ':checked' ).val() ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @returns {Boolean} + */ + function hasValidLicenseKey() { + var licenseKey = ''; + if ( hasLicenseTypes ) { + if ( 'available' === $licenseTypes.filter( ':checked' ).val() ) { + return true; + } else { + licenseKey = $otherLicenseKey.val(); + } + } else { + licenseKey = $( 'input.license_key' ).val(); + } + + return ( licenseKey.trim().length > 0 ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @returns {Boolean} + */ + function hasSelectedSite() { + return ( $applyOnAllSites.is( ':checked' ) || + $sitesListContainer.find( 'input[type="checkbox"]:checked:not(:disabled)' ).length > 0 ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + function toggleActivationOnAllSites() { + var activationsLeft, + licenseID; + + if (hasLicensesDropdown) { + var $selectedOption = $licensesDropdown.find( ':selected' ); + activationsLeft = $selectedOption.data('left'); + licenseID = $selectedOption.data('id'); + } else { + activationsLeft = $availableLicenseKey.data('left'); + licenseID = $availableLicenseKey.data('id'); + } + + // Cleanup previously auto-selected site. + $('#sites_list_container input[type=checkbox]:disabled') + .attr('disabled', false) + .attr('checked', false); + + var $blogsWithActiveLicense = $('#sites_list_container tr[data-license-id=' + licenseID + '] input[type=checkbox]'); + + if ($blogsWithActiveLicense.length > 0) { + $blogsWithActiveLicense.attr('checked', true) + .attr('disabled', true); + + activationsLeft += $blogsWithActiveLicense.length; + } + + if ( activationsLeft >= totalSites ) { + $applyOnAllSites.attr( 'disabled', false ); + enableDisableSitesSelection(); + + resetActivateLicenseCheckboxLabel(); + + return; + } + + $applyOnAllSites.attr( 'checked', false ); + $applyOnAllSites.attr( 'disabled', true ); + + showSites( true ); + + var + activateLicenseCheckboxLabel = '<?php fs_esc_js_echo_inline( 'Choose up to %s site(s) to activate the license on.', 'choose-up-to-n-sites-to-activate-the-license-on', $slug ) ?>'; + + activateLicenseCheckboxLabel = activateLicenseCheckboxLabel.replace( '%s', '<span data-left="' + activationsLeft + '" class="activations-left">' + activationsLeft + '</span>' ); + + // Update the label of the "Activate license on all sites" checkbox. + $applyOnAllSites.parent().find( 'span' ).html( activateLicenseCheckboxLabel ); + $activationsLeft = $( '.activations-left' ); + + if ( hasSelectedSite() ) { + enableActivateLicenseButton(); + enableDisableSitesSelection(); + } else { + disableActivateLicenseButton(); + } + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + */ + function resetActivateLicenseCheckboxLabel() { + var activateLicenseCheckboxLabel = '<?php fs_esc_js_echo_inline( 'Activate license on all sites in the network.', 'activate-license-on-all-sites-in-the-network', $slug ) ?>'; + $applyOnAllSites.parent().find( 'span' ).text( activateLicenseCheckboxLabel ); + } + + /** + * @author Leo Fajardo (@leorw) + * @since 2.0.0 + * + * @param {Boolean} show + */ + function showSites( show ) { + $sitesListContainer.toggle( show ); + if ( show && null === maxSitesListHeight ) { + /** + * Set the visible number of rows to 5 (5 * height of the first row). + * + * @author Leo Fajardo (@leorw) + */ + maxSitesListHeight = ( 5 * $sitesListContainer.find( 'tr:first' ).height() ); + $sitesListContainer.css( 'max-height', maxSitesListHeight ); + } + } + + function showModal( evt ) { resetModal(); // Display the dialog box. $modal.addClass('active'); $('body').addClass('has-fs-modal'); - $licenseKeyInput.focus(); + var + $singleInstallDetails = $( evt.target ).parents( 'tr.fs-install-details' ), + isSingleSiteActivation = ( $singleInstallDetails.length > 0 ); + + $modal.toggleClass( 'is-single-site-activation', isSingleSiteActivation ); + + singleBlogID = isSingleSiteActivation ? + $singleInstallDetails.prev().data( 'blog-id' ) : + null; + + $multisiteOptionsContainer.toggle( isNetworkActivation && ! isSingleSiteActivation ); + + if ( hasLicenseTypes ) { + $licenseTypes.attr( 'checked', false ); + + if ( hasLicensesDropdown ) { + $licensesDropdown.find( 'option:first' ).attr( 'selected', true ).trigger( 'change' ); + } else { + $licenseTypes.filter( '[value="available"]' ).click(); + } + + $otherLicenseKey.val( '' ); + } else { + $licenseKeyInput.val( '' ); + $licenseKeyInput.focus(); + } } function closeModal() { @@ -181,13 +671,12 @@ HTML; function resetActivateLicenseButton() { enableActivateLicenseButton(); - $activateLicenseButton.text( '<?php echo $activate_button_text; ?>' ); + $activateLicenseButton.text( <?php echo json_encode( $activate_button_text ) ?> ); } function resetModal() { hideError(); resetActivateLicenseButton(); - $licenseKeyInput.val( '' ); } function enableActivateLicenseButton() { @@ -208,4 +697,4 @@ HTML; } }); })( jQuery ); -</script> +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/optout.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/optout.php index baf0e4237..a12e0f9b8 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/optout.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/optout.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.1.5 */ @@ -12,23 +12,34 @@ /** * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); $action = $fs->is_tracking_allowed() ? 'stop_tracking' : 'allow_tracking'; - $plugin_title = "<strong>{$fs->get_plugin()->title}</strong>"; - $opt_out_button_text = __fs( 'opt-out', $slug ); - // @todo Change 'plugin' with module type when migrating with 1.2.2 (themes version). - $opt_out_message_appreciation = sprintf( __fs( 'opt-out-message-appreciation', $slug ), 'plugin' ); - $opt_out_message_usage_tracking = sprintf( __fs( 'opt-out-message-usage-tracking', $slug ), - $plugin_title ); - $opt_out_message_clicking_opt_out = sprintf( __fs( 'opt-out-message-clicking-opt-out', $slug ), - $plugin_title, - '<a href="http://freemius.com" target="_blank">freemius.com</a>' ); + $reconnect_url = $fs->get_activation_url( array( + 'nonce' => wp_create_nonce( $fs->get_unique_affix() . '_reconnect' ), + 'fs_action' => ( $fs->get_unique_affix() . '_reconnect' ), + ) ); + + $plugin_title = "<strong>{$fs->get_plugin()->title}</strong>"; + $opt_out_text = fs_text_x_inline( 'Opt Out', 'verb', 'opt-out', $slug ); + $opt_in_text = fs_text_x_inline( 'Opt In', 'verb', 'opt-in', $slug ); + $opt_out_message_appreciation = sprintf( fs_text_inline( 'We appreciate your help in making the %s better by letting us track some usage data.', 'opt-out-message-appreciation', $slug ), $fs->get_module_type() ); + $opt_out_message_usage_tracking = sprintf( fs_text_inline( "Usage tracking is done in the name of making %s better. Making a better user experience, prioritizing new features, and more good things. We'd really appreciate if you'll reconsider letting us continue with the tracking.", 'opt-out-message-usage-tracking', $slug ), $plugin_title ); + $opt_out_message_clicking_opt_out = sprintf( + fs_text_inline( 'By clicking "Opt Out", we will no longer be sending any data from %s to %s.', 'opt-out-message-clicking-opt-out', $slug ), + $plugin_title, + sprintf( + '<a href="%s" target="_blank">%s</a>', + 'https://freemius.com', + 'freemius.com' + ) + ); $admin_notice_params = array( 'id' => '', @@ -48,164 +59,209 @@ <p>{$opt_out_message_clicking_opt_out}</p> HTML; - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' ); + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); ?> <script type="text/javascript"> -(function( $ ) { - $( document ).ready(function() { - var modalContentHtml = <?php echo json_encode( $modal_content_html ) ?>, - modalHtml = - '<div class="fs-modal fs-modal-opt-out">' - + ' <div class="fs-modal-dialog">' - + ' <div class="fs-modal-header">' - + ' <h4><?php echo $opt_out_button_text ?></h4>' - + ' </div>' - + ' <div class="fs-modal-body">' - + ' <div class="fs-modal-panel active">' + modalContentHtml + '</div>' - + ' </div>' - + ' <div class="fs-modal-footer">' - + ' <button class="button button-secondary button-opt-out" tabindex="1"><?php echo $opt_out_button_text ?></button>' - + ' <button class="button button-primary button-close" tabindex="2"><?php _efs( 'opt-out-cancel', $slug ) ?></button>' - + ' </div>' - + ' </div>' - + '</div>', - $modal = $( modalHtml ), - $adminNotice = $( <?php echo json_encode( $admin_notice_html ) ?> ), - action = '<?php echo $action ?>', - optOutActionTag = '<?php echo $fs->get_action_tag( 'stop_tracking' ) ?>', - optInActionTag = '<?php echo $fs->get_action_tag( 'allow_tracking' ) ?>', - $actionLink = $( 'span.opt-in-or-opt-out.<?php echo $VARS['slug'] ?> a' ), - $optOutButton = $modal.find( '.button-opt-out' ), - $optOutErrorMessage = $modal.find( '.opt-out-error-message' ), - pluginSlug = '<?php echo $slug ?>'; - - $actionLink.attr( 'data-action', action ); - $modal.appendTo( $( 'body' ) ); - - function registerEventHandlers() { - $actionLink.click(function( evt ) { - evt.preventDefault(); - - if ( 'stop_tracking' == $actionLink.attr( 'data-action' ) ) { - showModal(); - } else { - optIn(); - } - }); + (function( $ ) { + $( document ).ready(function() { + var modalContentHtml = <?php echo json_encode( $modal_content_html ) ?>, + modalHtml = + '<div class="fs-modal fs-modal-opt-out">' + + ' <div class="fs-modal-dialog">' + + ' <div class="fs-modal-header">' + + ' <h4><?php echo esc_js( $opt_out_text ) ?></h4>' + + ' </div>' + + ' <div class="fs-modal-body">' + + ' <div class="fs-modal-panel active">' + modalContentHtml + '</div>' + + ' </div>' + + ' <div class="fs-modal-footer">' + + ' <button class="button button-secondary button-opt-out" tabindex="1"><?php echo esc_js( $opt_out_text ) ?></button>' + + ' <button class="button button-primary button-close" tabindex="2"><?php fs_esc_js_echo_inline( 'On second thought - I want to continue helping', 'opt-out-cancel', $slug ) ?></button>' + + ' </div>' + + ' </div>' + + '</div>', + $modal = $( modalHtml ), + $adminNotice = $( <?php echo json_encode( $admin_notice_html ) ?> ), + action = '<?php echo $action ?>', + $actionLink = $( 'span.opt-in-or-opt-out.<?php echo $slug ?> a' ), + $optOutButton = $modal.find( '.button-opt-out' ), + $optOutErrorMessage = $modal.find( '.opt-out-error-message' ), + moduleID = '<?php echo $fs->get_id() ?>'; - $modal.on( 'click', '.button-opt-out', function( evt ) { - evt.preventDefault(); + $actionLink.attr( 'data-action', action ); + $modal.appendTo( $( 'body' ) ); - if ( $( this ).hasClass( 'disabled' ) ) { - return; - } + function registerActionLinkClick() { + $actionLink.click(function( evt ) { + evt.preventDefault(); - disableOptOutButton(); - optOut(); - }); - - // If the user has clicked outside the window, close the modal. - $modal.on( 'click', '.fs-close, .button-close', function() { - closeModal(); - return false; - }); - } - - registerEventHandlers(); - - function showModal() { - resetModal(); - - // Display the dialog box. - $modal.addClass( 'active' ); - $( 'body' ).addClass( 'has-fs-modal' ); - } - - function closeModal() { - $modal.removeClass( 'active' ); - $( 'body' ).removeClass( 'has-fs-modal' ); - } - - function resetOptOutButton() { - enableOptOutButton(); - $optOutButton.text( '<?php echo $opt_out_button_text; ?>' ); - } - - function resetModal() { - hideError(); - resetOptOutButton(); - } - - function optIn() { - sendRequest(); - } - - function optOut() { - sendRequest(); - } - - function sendRequest() { - $.ajax({ - url: ajaxurl, - method: 'POST', - data: { - action: ( 'stop_tracking' == action ? optOutActionTag : optInActionTag ), - slug : pluginSlug - }, - beforeSend: function() { - if ( 'opt-in' == action ) { - $actionLink.text( '<?php _efs( 'opting-in', $slug ) ?>' ) + if ( 'stop_tracking' == $actionLink.attr( 'data-action' ) ) { + showModal(); } else { - $optOutButton.text( '<?php _efs( 'opting-out', $slug ) ?>' ); + optIn(); + } + + return false; + }); + } + + function registerEventHandlers() { + registerActionLinkClick(); + + $modal.on( 'click', '.button-opt-out', function( evt ) { + evt.preventDefault(); + + if ( $( this ).hasClass( 'disabled' ) ) { + return; } - }, - success: function( resultObj ) { - if ( resultObj.success ) { - if ( 'allow_tracking' == action ) { - action = 'stop_tracking'; - $actionLink.text( '<?php _efs( 'opt-out', $slug ) ?>' ); - showOptInAppreciationMessageAndScrollToTop(); + + disableOptOutButton(); + optOut(); + }); + + // If the user has clicked outside the window, close the modal. + $modal.on( 'click', '.fs-close, .button-close', function() { + closeModal(); + return false; + }); + } + + registerEventHandlers(); + + function showModal() { + resetModal(); + + // Display the dialog box. + $modal.addClass( 'active' ); + $( 'body' ).addClass( 'has-fs-modal' ); + } + + function closeModal() { + $modal.removeClass( 'active' ); + $( 'body' ).removeClass( 'has-fs-modal' ); + } + + function resetOptOutButton() { + enableOptOutButton(); + $optOutButton.text( <?php echo json_encode( $opt_out_text ) ?> ); + } + + function resetModal() { + hideError(); + resetOptOutButton(); + } + + function optIn() { + sendRequest(); + } + + function optOut() { + sendRequest(); + } + + function sendRequest() { + $.ajax({ + url: ajaxurl, + method: 'POST', + data: { + action : ( 'stop_tracking' == action ? + '<?php echo $fs->get_ajax_action( 'stop_tracking' ) ?>' : + '<?php echo $fs->get_ajax_action( 'allow_tracking' ) ?>' + ), + security : ( 'stop_tracking' == action ? + '<?php echo $fs->get_ajax_security( 'stop_tracking' ) ?>' : + '<?php echo $fs->get_ajax_security( 'allow_tracking' ) ?>' + ), + module_id: moduleID + }, + beforeSend: function() { + if ( 'opt-in' == action ) { + $actionLink.text( '<?php fs_esc_js_echo_inline( 'Opting in', 'opting-in', $slug ) ?>...' ); } else { - action = 'allow_tracking'; - $actionLink.text( '<?php _efs( 'opt-in', $slug ) ?>' ); - closeModal(); + $optOutButton.text( '<?php fs_esc_js_echo_inline( 'Opting out', 'opting-out', $slug ) ?>...' ); + } + }, + success: function( resultObj ) { + if ( resultObj.success ) { + if ( 'allow_tracking' == action ) { + action = 'stop_tracking'; + $actionLink.text( '<?php echo esc_js( $opt_out_text ) ?>' ); + showOptInAppreciationMessageAndScrollToTop(); + } else { + action = 'allow_tracking'; + $actionLink.text( '<?php echo esc_js( $opt_in_text ) ?>' ); + closeModal(); - if ( $adminNotice.length > 0 ) { - $adminNotice.remove(); + if ( $adminNotice.length > 0 ) { + $adminNotice.remove(); + } } - } - $actionLink.attr( 'data-action', action ); - } else { - showError( resultObj.error ); - resetOptOutButton(); + $actionLink.attr( 'data-action', action ); + } else { + showError( resultObj.error ); + resetOptOutButton(); + } } + }); + } + + function enableOptOutButton() { + $optOutButton.removeClass( 'disabled' ); + } + + function disableOptOutButton() { + $optOutButton.addClass( 'disabled' ); + } + + function hideError() { + $optOutErrorMessage.hide(); + } + + function showOptInAppreciationMessageAndScrollToTop() { + $adminNotice.insertAfter( $( '#wpbody-content' ).find( ' > .wrap > h1' ) ); + window.scrollTo(0, 0); + } + + function showError( msg ) { + $optOutErrorMessage.find( ' > p' ).html( msg ); + $optOutErrorMessage.show(); + } + + <?php if ( $fs->is_theme() ) : ?> + /** + * Add opt-in/out button to the active theme's buttons collection + * in the theme's extended details overlay. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2.7 + */ + $('.theme-overlay').contentChange(function () { + if (!$(this).find('.theme-overlay').hasClass('active')) { + // Add opt-in/out button only to the currently active theme. + return; } + + if ($('#fs_theme_opt_in_out').length > 0){ + // Button already there. + return; + } + + var label = (('stop_tracking' == action) ? + '<?php echo esc_js( $opt_out_text ) ?>' : + '<?php echo esc_js( $opt_in_text ) ?>'), + href = (('stop_tracking' != action) ? + '<?php echo esc_js( $reconnect_url ) ?>' : + ''); + + $actionLink = $('<a id="fs_theme_opt_in_out" href="' + encodeURI(href) + '" class="button" data-action="' + action + '">' + label + '</a>'); + + $('.theme-wrap .theme-actions .active-theme').append($actionLink); + + registerActionLinkClick(); }); - } - - function enableOptOutButton() { - $optOutButton.removeClass( 'disabled' ); - } - - function disableOptOutButton() { - $optOutButton.addClass( 'disabled' ); - } - - function hideError() { - $optOutErrorMessage.hide(); - } - - function showOptInAppreciationMessageAndScrollToTop() { - $adminNotice.insertAfter( $( '#wpbody-content' ).find( ' > .wrap > h1' ) ); - window.scrollTo(0, 0); - } - - function showError( msg ) { - $optOutErrorMessage.find( ' > p' ).html( msg ); - $optOutErrorMessage.show(); - } - }); -})( jQuery ); + <?php endif ?> + }); + })( jQuery ); </script> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-handler.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-handler.php new file mode 100644 index 000000000..7802fedcc --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-handler.php @@ -0,0 +1,183 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.2 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); + + $plugin_data = $fs->get_plugin_data(); + $plugin_name = $plugin_data['Name']; + $plugin_basename = $fs->get_plugin_basename(); + + $message = sprintf( + fs_text_inline( 'There is a new version of %s available.', 'new-version-available-message', $slug ) . + fs_text_inline( ' %sRenew your license now%s to access version %s security & feature updates, and support.', 'renew-license-now', $slug ), + '<span id="plugin_name"></span>', + '<a id="pricing_url" href="">', + '</a>', + '<span id="new_version"></span>' + ); + + $modal_content_html = "<p>{$message}</p>"; + + $header_title = fs_text_inline( 'New Version Available', 'new-version-available', $slug ); + + $renew_license_button_text = fs_text_inline( 'Renew license', 'renew-license', $slug ); + + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); +?> +<script type="text/javascript"> +(function( $ ) { + $( document ).ready(function() { + if ( 0 === $( '.license-expired' ).length ) { + return; + } + + var modalContentHtml = <?php echo json_encode( $modal_content_html ) ?>, + modalHtml = + '<div class="fs-modal fs-modal-upgrade-premium-version">' + + ' <div class="fs-modal-dialog">' + + ' <div class="fs-modal-header">' + + ' <h4><?php echo esc_js( $header_title ) ?></h4>' + + ' <a href="!#" class="fs-close"><i class="dashicons dashicons-no" title="<?php echo esc_js( fs_text_x_inline( 'Dismiss', 'close a window', 'dismiss', $slug ) ) ?>"></i></a>' + + ' </div>' + + ' <div class="fs-modal-body">' + + ' <div class="fs-modal-panel active">' + modalContentHtml + '</div>' + + ' </div>' + + ' <div class="fs-modal-footer">' + + ' <a class="button button-primary button-renew-license" tabindex="3" href="<?php echo $fs->pricing_url() ?>"><?php echo esc_js( $renew_license_button_text ) ?></a>' + + ' <button class="button button-secondary button-close" tabindex="4"><?php fs_esc_js_echo_inline( 'Cancel', 'cancel', $slug ) ?></button>' + + ' </div>' + + ' </div>' + + '</div>', + $modal = $( modalHtml ), + isPluginsPage = <?php echo Freemius::is_plugins_page() ? 'true' : 'false' ?>; + + $modal.appendTo( $( 'body' ) ); + + function registerEventHandlers() { + $( 'body' ).on( 'click', '.license-expired', function( evt ) { + var $this = $( this ); + + if ( ! $this.is( ':checked' ) || + ( + isPluginsPage && + 'update-selected' !== $( '#bulk-action-selector-top' ).val() && + 'update-selected' !== $( '#bulk-action-selector-bottom' ).val() + ) + ) { + return true; + } + + evt.preventDefault(); + evt.stopImmediatePropagation(); + + showModal( $this ); + }); + + // If the user has clicked outside the window, close the modal. + $modal.on( 'click', '.fs-close, .button-secondary', function() { + closeModal(); + return false; + }); + + if ( isPluginsPage ) { + $( 'body' ).on( 'change', 'select[id*="bulk-action-selector"]', function() { + if ( 'update-selected' === $( this ).val() ) { + setTimeout(function() { + $( '.license-expired' ).prop( 'checked', false ); + $( '[id*="select-all"]' ).prop( 'checked', false ); + }, 0); + } + }); + } + + $( 'body' ).on( 'click', '[id*="select-all"]', function( evt ) { + var $this = $( this ); + + if ( ! $this.is( ':checked' ) ) { + return true; + } + + if ( isPluginsPage ) { + if ( 'update-selected' !== $( '#bulk-action-selector-top' ).val() && + 'update-selected' !== $( '#bulk-action-selector-bottom' ).val() ) { + return true; + } + } + + var $table = $this.closest( 'table' ), + controlChecked = $this.prop( 'checked' ), + toggle = ( event.shiftKey || $this.data( 'wp-toggle' ) ), + $modules = $table.children( 'tbody' ).filter( ':visible' ).children().children( '.check-column' ).find( ':checkbox' ), + $modulesWithNonActiveLicense = $modules.filter( '.license-expired' ); + + if ( 0 === $modulesWithNonActiveLicense.length ) { + /** + * It's possible that the context HTML table element doesn't have checkboxes with + * ".license-expired" class if for example only the themes table has such checkboxes and the user + * clicks on a "Select All" checkbox on the plugins table which has no such checkboxes. + * + * @author Leo Fajardo (@leorw) + */ + return true; + } else if ( 1 === $modulesWithNonActiveLicense.length ) { + showModal( $modulesWithNonActiveLicense ); + } + + /** + * Prevent the default WordPress handler from checking all checkboxes. + * + * @author Leo Fajardo (@leorw) + */ + evt.stopImmediatePropagation(); + + $modules.filter( ':not(.license-expired)' ) + .prop( 'checked', function() { + if ( $( this ).is( ':hidden,:disabled' ) ) { + return false; + } + + if ( toggle ) { + return ! $( this ).prop( 'checked' ); + } else if ( controlChecked ) { + return true; + } + + return false; + }); + + return false; + }); + } + + registerEventHandlers(); + + function showModal( $module ) { + $modal.find( '#plugin_name' ).text( $module.data( 'plugin-name' ) ); + $modal.find( '#pricing_url' ).attr( 'href', $module.data( 'pricing-url' ) ); + $modal.find( '#new_version' ).text( $module.data( 'new-version' ) ); + + // Display the dialog box. + $modal.addClass( 'active' ); + $( 'body' ).addClass( 'has-fs-modal' ); + } + + function closeModal() { + $modal.removeClass( 'active' ); + $( 'body' ).removeClass( 'has-fs-modal' ); + } + }); +})( jQuery ); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-metadata.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-metadata.php new file mode 100644 index 000000000..e77412fb2 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/premium-versions-upgrade-metadata.php @@ -0,0 +1,29 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.2 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); +?> +<script type="text/javascript"> +(function( $ ) { + $( document ).ready(function() { + var $premiumVersionCheckbox = $( 'input[type="checkbox"][value="<?php echo $fs->get_plugin_basename() ?>"]' ); + + $premiumVersionCheckbox.addClass( 'license-expired' ); + $premiumVersionCheckbox.data( 'plugin-name', <?php echo json_encode( $fs->get_plugin_data()['Name'] ) ?> ); + $premiumVersionCheckbox.data( 'pricing-url', <?php echo json_encode( $fs->pricing_url() ) ?> ); + $premiumVersionCheckbox.data( 'new-version', <?php echo json_encode( $VARS['new_version'] ) ?> ); + }); +})( jQuery ); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/resend-key.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/resend-key.php index ff33af2ee..f8cafb99d 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/resend-key.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/resend-key.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.0 */ @@ -12,85 +12,113 @@ /** * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); - $message_above_input_field = __fs( 'ask-for-upgrade-email-address', $slug ); - $send_button_text = __fs( 'send-license-key', $slug ); - $cancel_button_text = __fs( 'cancel', $slug ); - $email_address_placeholder = __fs( 'email-address', $slug ); + $slug = $fs->get_slug(); + $send_button_text = fs_text_inline( 'Send License Key', 'send-license-key', $slug ); + $cancel_button_text = fs_text_inline( 'Cancel', 'cancel', $slug ); + $email_address_placeholder = fs_esc_attr_inline( 'Email address', 'email-address', $slug ); + $other_text = fs_text_inline( 'Other', 'other', $slug ); + + $is_freemium = $fs->is_freemium(); + + $send_button_text_html = esc_html($send_button_text); + + $button_html = <<< HTML +<div class="button-container"> + <a href="#" class="button button-primary button-send-license-key" tabindex="2">{$send_button_text_html}</a> +</div> +HTML; + + if ( $is_freemium ) { + $current_user = Freemius::_get_current_wp_user(); + $email = $current_user->user_email; + $esc_email = esc_attr( $email ); + $form_html = <<< HTML +<div class="email-address-container"> + <label><input name="email-address" type="radio" checked="checked" tabindex="1" value="{$esc_email}"> {$email}</label> + <label><input name="email-address" type="radio" tabindex="1" value="other">{$other_text}: <input class="email-address" type="text" placeholder="{$email_address_placeholder}"></label> +</div> +{$button_html} +HTML; + } else { + $email = ''; + $form_html = <<< HTML +{$button_html} +<div class="email-address-container"> + <input class="email-address" type="text" placeholder="{$email_address_placeholder}" tabindex="1"> +</div> +HTML; + } + + $message_above_input_field = fs_esc_html_inline( "Enter the email address you've used for the upgrade below and we will resend you the license key.", 'ask-for-upgrade-email-address', $slug ); $modal_content_html = <<< HTML - <div class="notice notice-error inline license-resend-message"><p></p></div> - <p>{$message_above_input_field}</p> - <div class="input-container"> - <div class="button-container"> - <a href="#" class="button button-primary button-send-license-key disabled" tabindex="2">{$send_button_text}</a> - </div> - <div class="email-address-container"> - <input class="email-address" type="text" placeholder="{$email_address_placeholder}" tabindex="1"> - </div> + <div class="notice notice-error inline license-resend-message"><p></p></div> + <p>{$message_above_input_field}</p> + <div class="input-container"> + {$form_html} </div> HTML; - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' ); + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> <script type="text/javascript"> (function ($) { $(document).ready(function () { - var modalContentHtml = <?php echo json_encode( $modal_content_html ); ?>, - modalHtml = - '<div class="fs-modal fs-modal-license-key-resend">' - + ' <div class="fs-modal-dialog">' - + ' <div class="fs-modal-header">' - + ' <h4><?php echo $send_button_text ?></h4>' - + ' <a href="#!" class="fs-close" tabindex="3" title="Close"><i class="dashicons dashicons-no" title="<?php _efs( 'dismiss' ) ?>"></i></a>' - + ' </div>' - + ' <div class="fs-modal-body">' - + ' <div class="fs-modal-panel active">' + modalContentHtml + '</div>' - + ' </div>' - + ' </div>' + var contentHtml = <?php echo json_encode( $modal_content_html ); ?>, + modalHtml = + '<div class="fs-modal fs-modal-license-key-resend <?php echo $is_freemium ? 'fs-freemium' : 'fs-premium' ?>">' + + ' <div class="fs-modal-dialog">' + + ' <div class="fs-modal-header">' + + ' <h4><?php echo esc_js( $send_button_text ) ?></h4>' + + ' <a href="#!" class="fs-close" tabindex="3" title="Close"><i class="dashicons dashicons-no" title="<?php echo esc_js( fs_text_x_inline( 'Dismiss', 'as close a window', 'dismiss', $slug ) ) ?>"></i></a>' + + ' </div>' + + ' <div class="fs-modal-body">' + + ' <div class="fs-modal-panel active">' + contentHtml + '</div>' + + ' </div>' + + ' </div>' + '</div>', - $modal = $(modalHtml), - $sendLicenseKeyButton = $modal.find('.button-send-license-key'), - $emailAddressInput = $modal.find('input.email-address'), - $licenseResendMessage = $modal.find('.license-resend-message'), - moduleSlug = '<?php echo $slug; ?>', - isChild = false; + $modal = $(modalHtml), + $sendButton = $modal.find('.button-send-license-key'), + $emailInput = $modal.find('input.email-address'), + $feedbackMessage = $modal.find('.license-resend-message'), + isFreemium = <?php echo json_encode( $is_freemium ) ?>, + userEmail = <?php echo json_encode( $email ) ?>, + moduleID = '<?php echo $fs->get_id() ?>', + isChild = false; - $modal.appendTo($('body')); - registerEventHandlers(); + $modal.appendTo($('body')); function registerEventHandlers() { - $('a.show-license-resend-modal-' + moduleSlug).click(function (evt) { + $('a.show-license-resend-modal-<?php echo $fs->get_unique_affix() ?>').click(function (evt) { evt.preventDefault(); showModal(); }); - $modal.on('input propertychange', 'input.email-address', function () { + if (isFreemium) { + $modal.on('change', 'input[type=radio][name=email-address]', function () { + updateButtonState(); + }); - var emailAddress = $(this).val().trim(); + $modal.on('focus', 'input.email-address', function () { + // Check custom email radio button on email input focus. + $($modal.find('input[type=radio]')[1]).prop('checked', true); - /** - * If email address is not empty, enable the send license key button. - */ - if (emailAddress.length > 0) { - enableSendLicenseKeyButton(); - } + updateButtonState(); + }); + } + + $modal.on('input propertychange', 'input.email-address', function () { + updateButtonState(); }); $modal.on('blur', 'input.email-address', function () { - var emailAddress = $(this).val().trim(); - - /** - * If email address is empty, disable the send license key button. - */ - if (0 === emailAddress.length) { - disableSendLicenseKeyButton(); - } + updateButtonState(); }); $modal.on('click', '.fs-close', function (){ @@ -105,11 +133,11 @@ HTML; return; } - var emailAddress = $emailAddressInput.val().trim(); + var email = getEmail(); - disableSendLicenseKeyButton(); + disableButton(); - if (0 === emailAddress.length) { + if (!(-1 < email.indexOf('@'))) { return; } @@ -117,12 +145,13 @@ HTML; url : ajaxurl, method : 'POST', data : { - action: '<?php echo $fs->get_action_tag( 'resend_license_key' ) ?>', - slug : moduleSlug, - email : emailAddress + action : '<?php echo $fs->get_ajax_action( 'resend_license_key' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'resend_license_key' ) ?>', + module_id : moduleID, + email : email }, beforeSend: function () { - $sendLicenseKeyButton.text('<?php _efs( 'sending-license-key', $slug ) ?>...'); + $sendButton.text('<?php fs_esc_js_echo_inline( 'Sending license key', 'sending-license-key', $slug ) ?>...'); }, success : function (result) { var resultObj = $.parseJSON(result); @@ -130,19 +159,25 @@ HTML; closeModal(); } else { showError(resultObj.error); - resetSendLicenseKeyButton(); + resetButton(); } } }); }); } + registerEventHandlers(); + + resetButton(); + function showModal() { resetModal(); // Display the dialog box. $modal.addClass('active'); - $emailAddressInput.focus(); + + if (!isFreemium) + $emailInput.focus(); var $body = $('body'); @@ -165,32 +200,47 @@ HTML; $('body').removeClass('has-fs-modal'); } - function resetSendLicenseKeyButton() { - enableSendLicenseKeyButton(); - $sendLicenseKeyButton.text('<?php echo $send_button_text; ?>'); + function resetButton() { + updateButtonState(); + $sendButton.text(<?php echo json_encode($send_button_text) ?>); } function resetModal() { hideError(); - resetSendLicenseKeyButton(); - $emailAddressInput.val(''); + resetButton(); + $emailInput.val(''); + } + + function getEmail() { + var email = $emailInput.val().trim(); + + if (isFreemium) { + if ('other' != $modal.find('input[type=radio][name=email-address]:checked').val()) { + email = userEmail; + } + } + + return email; } - function enableSendLicenseKeyButton() { - $sendLicenseKeyButton.removeClass('disabled'); + function updateButtonState() { + /** + * If email address is not empty, enable the send license key button. + */ + $sendButton.toggleClass('disabled', !( -1 < getEmail().indexOf('@') )); } - function disableSendLicenseKeyButton() { - $sendLicenseKeyButton.addClass('disabled'); + function disableButton() { + $sendButton.addClass('disabled'); } function hideError() { - $licenseResendMessage.hide(); + $feedbackMessage.hide(); } function showError(msg) { - $licenseResendMessage.find(' > p').html(msg); - $licenseResendMessage.show(); + $feedbackMessage.find(' > p').html(msg); + $feedbackMessage.show(); } }); })(jQuery); diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/trial-start.php b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/trial-start.php index 5f9bf752b..cea597e88 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/forms/trial-start.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/forms/trial-start.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.2.0 */ @@ -12,18 +12,26 @@ /** * @var array $VARS + * @var Freemius $fs */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); $message_header = sprintf( - __fs( 'start-trial-prompt-header', $slug ), + /* translators: %1$s: Number of trial days; %2$s: Plan name; */ + fs_text_inline( 'You are 1-click away from starting your %1$s-day free trial of the %2$s plan.', 'start-trial-prompt-header', $slug ), '<span class="var-trial_period"></span>', '<span class="var-plan_title"></span>' ); $message_content = sprintf( - __fs( 'start-trial-prompt-message', $slug ), - '<a href="https://freemius.com" target="_blank">freemius.com</a>' + /* translators: %s: Link to freemius.com */ + fs_text_inline( 'For compliance with the WordPress.org guidelines, before we start the trial we ask that you opt in with your user and non-sensitive site information, allowing the %s to periodically send data to %s to check for version updates and to validate your trial.', 'start-trial-prompt-message', $slug ), + $fs->get_module_type(), + sprintf( + '<a href="%s" target="_blank">%s</a>', + 'https://freemius.com', + 'freemius.com' + ) ); $modal_content_html = <<< HTML @@ -32,7 +40,7 @@ <p>{$message_content}</p> HTML; - fs_enqueue_local_style( 'dialog-boxes', '/admin/dialog-boxes.css' ); + fs_enqueue_local_style( 'fs_dialog_boxes', '/admin/dialog-boxes.css' ); ?> <script type="text/javascript"> (function ($) { @@ -42,17 +50,16 @@ HTML; '<div class="fs-modal fs-modal-license-key-resend">' + ' <div class="fs-modal-dialog">' + ' <div class="fs-modal-header">' - + ' <h4><?php _efs( 'start-free-trial' ) ?></h4>' + + ' <h4><?php echo esc_js( fs_text_x_inline( 'Start free trial', 'call to action', 'start-free-trial', $slug ) ) ?></h4>' + ' </div>' + ' <div class="fs-modal-body">' + modalContentHtml + '</div>' + ' <div class="fs-modal-footer">' - + ' <button class="button button-secondary button-close">' + <?php echo json_encode( __fs( 'cancel', $slug ) ) ?> +'</button>' - + ' <button class="button button-primary button-connect">' + <?php echo json_encode( __fs( 'approve-start-trial', $slug ) ) ?> +'</button>' + + ' <button class="button button-secondary button-close">' + <?php fs_json_encode_echo_inline( 'Cancel', 'cancel', $slug ) ?> +'</button>' + + ' <button class="button button-primary button-connect">' + <?php fs_json_encode_echo_inline( 'Approve & Start Trial', 'approve-start-trial', $slug ) ?> +'</button>' + ' </div>' + ' </div>' + '</div>', - $modal = $(modalHtml), - moduleSlug = '<?php echo $slug; ?>', + $modal = $( modalHtml ), trialData; $modal.appendTo($('body')); @@ -76,27 +83,27 @@ HTML; url : ajaxurl, method : 'POST', data : { - action : '<?php echo $fs->get_action_tag( 'start_trial' ) ?>', - security: '<?php echo wp_create_nonce( $fs->get_action_tag( 'start_trial' ) ) ?>', - slug : moduleSlug, - trial : trialData + action : '<?php echo $fs->get_ajax_action( 'start_trial' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'start_trial' ) ?>', + module_id: '<?php echo $fs->get_id() ?>', + trial : trialData }, beforeSend: function () { // Disable all buttons during trial activation. $modal.find('.button').prop('disabled', true); - $button.text('<?php _efs( 'starting-trial', $slug ) ?>...'); + $button.text(<?php fs_json_encode_echo_inline( 'Starting trial', 'starting-trial', $slug ) ?> + '...'); setLoadingMode(); }, success : function (resultObj) { if (resultObj.success) { - $button.text('<?php _efs( 'please-wait', $slug ) ?>...'); + $button.text(<?php fs_json_encode_echo_inline( 'Please wait', 'please-wait', $slug ) ?> + '...'); // Redirect to the "Account" page and sync the license. window.location.href = resultObj.data.next_page; } else { - $button.text(<?php json_encode( __fs( 'approve-start-trial', $slug ) ) ?>); + $button.text(<?php fs_json_encode_echo( 'approve-start-trial', $slug ) ?>); resetLoadingMode(); showError(resultObj.error); diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/gdpr-optin-js.php b/wp-content/plugins/nextgen-gallery/freemius/templates/gdpr-optin-js.php new file mode 100644 index 000000000..4fdc5e38a --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/gdpr-optin-js.php @@ -0,0 +1,66 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.1.0 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + */ + $fs = freemius( $VARS['id'] ); +?> +<script type="text/javascript"> + (function( $ ) { + $( document ).ready(function() { + var $gdprOptinNotice = $( 'div[data-id^="gdpr_optin_actions"]' ); + if ( 0 === $gdprOptinNotice.length ) { + return; + } + + $gdprOptinNotice.on( 'click', '.button', function() { + var + $this = $( this ), + allowMarketing = $this.hasClass( 'allow-marketing' ), + cursor = $this.css( 'cursor' ), + $products = $gdprOptinNotice.find( 'span[data-plugin-id]' ), + pluginIDs = []; + + if ( $products.length > 0 ) { + $products.each(function() { + pluginIDs.push( $( this ).data( 'plugin-id' ) ); + }); + } + + $.ajax({ + url : ajaxurl + '?' + $.param({ + action : '<?php echo $fs->get_ajax_action( 'gdpr_optin_action' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'gdpr_optin_action' ) ?>', + module_id: '<?php echo $fs->get_id() ?>' + }), + method : 'POST', + data : { + is_marketing_allowed: allowMarketing, + plugin_ids : pluginIDs + }, + beforeSend: function() { + $this.text( <?php fs_json_encode_echo_inline( 'Thanks, please wait', 'thanks-please-wait', $fs->get_slug() ) ?> + '...' ); + $this.css({'cursor': 'wait'}); + + $gdprOptinNotice.find( '.button' ).addClass( 'disabled' ); + }, + complete : function() { + $this.css({'cursor': cursor}); + + $gdprOptinNotice.remove(); + } + }); + }); + }); + })( jQuery ); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/js/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/js/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/js/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/js/jquery.content-change.php b/wp-content/plugins/nextgen-gallery/freemius/templates/js/jquery.content-change.php new file mode 100644 index 000000000..d1821a290 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/js/jquery.content-change.php @@ -0,0 +1,58 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + */ + if ( ! defined( 'ABSPATH' ) ) { + exit; + } +?> +<script type="text/javascript"> + (function ($) { + if ($.fn.contentChange) + return; + + /** + * Content change event listener. + * + * @url http://stackoverflow.com/questions/3233991/jquery-watch-div/3234646#3234646 + * + * @param {function} callback + * + * @returns {object[]} + */ + $.fn.contentChange = function (callback) { + var elements = $(this); + + elements.each(function () { + var element = $(this); + + element.data("lastContents", element.html()); + + window.watchContentChange = window.watchContentChange ? + window.watchContentChange : + []; + + window.watchContentChange.push({ + "element" : element, + "callback": callback + }); + }); + + return elements; + }; + + setInterval(function() { + if ( window.watchContentChange ) { + for ( var i in window.watchContentChange ) { + if ( window.watchContentChange[ i ].element.data( 'lastContents' ) !== window.watchContentChange[ i ].element.html() ) { + window.watchContentChange[ i ].callback.apply( undefined, [ false ] ); + window.watchContentChange[ i ].element.data( 'lastContents', window.watchContentChange[ i ].element.html() ) + } + } + } + }, 500 ); + })(jQuery); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/js/open-license-activation.php b/wp-content/plugins/nextgen-gallery/freemius/templates/js/open-license-activation.php new file mode 100644 index 000000000..75b1968b1 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/js/open-license-activation.php @@ -0,0 +1,37 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 2.0.0 + */ + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + $license_id = $VARS['license_id']; +?> +<script type="text/javascript"> + (function ($) { + var prepareLicenseActivationDialog = function () { + var $dialog = $('.fs-modal-license-activation'); + + // Trigger the license activation dialog box. + $($('.activate-license-trigger')[0]).click(); + +// setTimeout(function(){ + $dialog.find('select#licenses option[data-id=<?php echo $license_id ?>]') + .prop('selected', true) + .change(); +// }, 100); + + }; + if ($('.fs-modal-license-activation').length > 0) { + prepareLicenseActivationDialog(); + } else { + $('body').on('licenseActivationLoaded', function () { + prepareLicenseActivationDialog(); + }); + } + })(jQuery); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/js/style-premium-theme.php b/wp-content/plugins/nextgen-gallery/freemius/templates/js/style-premium-theme.php new file mode 100644 index 000000000..2d42eec90 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/js/style-premium-theme.php @@ -0,0 +1,45 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + * + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + +?> +<script type="text/javascript"> + (function ($) { + // Select the premium theme version. + var $theme = $('#<?php echo $slug ?>-premium-name').parents('.theme'), + addPremiumMetadata = function (firstCall) { + if (!firstCall) { + // Seems like the original theme element is removed from the DOM, + // so we need to reselect the updated one. + $theme = $('#<?php echo $slug ?>-premium-name').parents('.theme'); + } + + if (0 === $theme.find('.fs-premium-theme-badge').length) { + $theme.addClass('fs-premium'); + + $theme.append('<span class="fs-premium-theme-badge">' + <?php echo json_encode( $fs->get_text_inline( 'Premium', 'premium' ) ) ?> +'</span>'); + } + }; + + addPremiumMetadata(true); + + $theme.contentChange(addPremiumMetadata); + })(jQuery); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/partials/network-activation.php b/wp-content/plugins/nextgen-gallery/freemius/templates/partials/network-activation.php new file mode 100644 index 000000000..4f9c96330 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/partials/network-activation.php @@ -0,0 +1,81 @@ +<?php + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + $sites = $VARS['sites']; + $require_license_key = $VARS['require_license_key']; +?> +<?php $separator = '<td>|</td>' ?> +<div id="multisite_options_container" class="apply-on-all-sites"> + <table id="all_sites_options"> + <tbody> + <tr> + <td width="600"> + <label> + <?php + if ( ! $fs->is_network_upgrade_mode() ) { + $apply_checkbox_label = $require_license_key ? + fs_text_inline( 'Activate license on all sites in the network.', 'activate-license-on-all-sites-in-the-network', $slug ) : + fs_text_inline( 'Apply on all sites in the network.', 'apply-on-all-sites-in-the-network', $slug ); + } else { + $apply_checkbox_label = $require_license_key ? + fs_text_inline( 'Activate license on all pending sites.', 'activate-license-on-pending-sites-in-the-network', $slug ) : + fs_text_inline( 'Apply on all pending sites.', 'apply-on-pending-sites-in-the-network', $slug ); + + } + ?> + <input id="apply_on_all_sites" type="checkbox" value="true" checked><span><?php echo esc_html( $apply_checkbox_label ) ?></span> + </label> + </td> + <?php if ( ! $require_license_key ) : ?> + <td><a class="action action-allow" data-action-type="allow" href="#"><?php fs_esc_html_echo_inline( 'allow', 'allow', $slug ) ?></a></td> + <?php echo $separator ?> + <td><a class="action action-delegate" data-action-type="delegate" href="#"><?php fs_esc_html_echo_inline( 'delegate', 'delegate', $slug ) ?></a></td> + <?php if ( $fs->is_enable_anonymous() ) : ?> + <?php echo $separator ?> + <td><a class="action action-skip" data-action-type="skip" href="#"><?php echo strtolower( fs_esc_html_inline( 'skip', 'skip', $slug ) ) ?></a></td> + <?php endif ?> + <?php endif ?> + </tr> + </tbody> + </table> + <div id="sites_list_container"> + <table cellspacing="0"> + <tbody> + <?php $site_props = array('uid', 'url', 'title', 'charset', 'language') ?> + <?php foreach ( $sites as $site ) : ?> + <tr<?php if ( ! empty( $site['license_id'] ) ) { + echo ' data-license-id="' . $site['license_id'] . '"'; + } ?>> + <?php if ( $require_license_key ) : ?> + <td><input type="checkbox" value="true" /></td> + <?php endif ?> + <td class="blog-id"><span><?php echo $site['blog_id'] ?></span>.</td> + <td width="600"><span><?php + $url = str_replace( 'http://', '', str_replace( 'https://', '', $site['url'] ) ); + echo $url; + ?></span> + <?php foreach ($site_props as $prop) : ?> + <input class="<?php echo $prop ?>" type="hidden" value="<?php echo esc_attr($site[$prop]) ?>" /> + <?php endforeach ?> + </td> + <?php if ( ! $require_license_key ) : ?> + <td><a class="action action-allow selected" data-action-type="allow" href="#"><?php fs_esc_html_echo_inline( 'allow', 'allow', $slug ) ?></a></td> + <?php echo $separator ?> + <td><a class="action action-delegate" data-action-type="delegate" href="#"><?php fs_esc_html_echo_inline( 'delegate', 'delegate', $slug ) ?></a></td> + <?php if ( $fs->is_enable_anonymous() ) : ?> + <?php echo $separator ?> + <td><a class="action action-skip" data-action-type="skip" href="#"><?php echo strtolower( fs_esc_html_inline( 'skip', 'skip', $slug ) ) ?></a></td> + <?php endif ?> + <?php endif ?> + </tr> + <?php endforeach ?> + </tbody> + </table> + </div> +</div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-icon.php b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-icon.php index ee24f1b03..ab0fb54e5 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-icon.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-icon.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.1.4 */ @@ -13,115 +13,8 @@ /** * @var array $VARS */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); - - /** - * @since 1.1.7.5 - */ - $local_path = $fs->apply_filters( 'plugin_icon', false ); - - if ( is_string( $local_path ) ) { - $icons = array( $local_path ); - } else { - global $fs_active_plugins; - - $img_dir = WP_FS__DIR_IMG; - - if ( 1 < count( $fs_active_plugins->plugins ) ) { - $plugin_or_theme_img_dir = WP_PLUGIN_DIR; - - foreach ( $fs_active_plugins->plugins as $sdk_path => &$data ) { - if ( $data->plugin_path == $fs->get_plugin_basename() ) { - $img_dir = $plugin_or_theme_img_dir - . '/' - . str_replace( '../themes/', '', $sdk_path ) - . '/assets/img'; - - break; - } - } - } - - $icons = glob( fs_normalize_path( $img_dir . '/' . $slug . '.*' ) ); - if ( ! is_array( $icons ) || 0 === count( $icons ) ) { - $icon_found = false; - $local_path = fs_normalize_path( $img_dir . '/' . $slug . '.png' ); - - $have_write_permissions = ( 'direct' === get_filesystem_method( array(), fs_normalize_path( $img_dir ) ) ); - - if ( WP_FS__IS_LOCALHOST && $fs->is_org_repo_compliant() && $have_write_permissions ) { - /** - * IMPORTANT: THIS CODE WILL NEVER RUN AFTER THE PLUGIN IS IN THE REPO. - * - * This code will only be executed once during the testing - * of the plugin in a local environment. The plugin icon file WILL - * already exist in the assets folder when the plugin is deployed to - * the repository. - */ - if ( ! function_exists( 'plugins_api' ) ) { - require_once( ABSPATH . 'wp-admin/includes/plugin-install.php' ); - } - - $plugin_information = plugins_api( 'plugin_information', array( - 'slug' => $slug, - 'fields' => array( - 'sections' => false, - 'tags' => false, - 'icons' => true - ) - ) ); - - if ( - ! is_wp_error( $plugin_information ) - && isset( $plugin_information->icons ) - && ! empty( $plugin_information->icons ) - ) { - /** - * Get the smallest icon. - * - * @author Leo Fajardo (@leorw) - * @since 1.2.2 - */ - $icon = end( $plugin_information->icons ); - - if ( 0 !== strpos( $icon, 'http' ) ) { - $icon = 'http:' . $icon; - } - - /** - * Get a clean file extension, e.g.: "jpg" and not "jpg?rev=1305765". - * - * @author Leo Fajardo (@leorw) - * @since 1.2.2 - */ - $ext = pathinfo( strtok( $icon, '?' ), PATHINFO_EXTENSION ); - - $local_path = fs_normalize_path( $img_dir . '/' . $slug . '.' . $ext ); - fs_download_image( $icon, $local_path ); - - $icon_found = true; - } - } - - if ( ! $icon_found ) { - // No icons found, fallback to default icon. - if ( $have_write_permissions ) { - // If have write permissions, copy default icon. - copy( fs_normalize_path( $img_dir . '/plugin-icon.png' ), $local_path ); - } else { - // If doesn't have write permissions, use default icon path. - $local_path = fs_normalize_path( $img_dir . '/plugin-icon.png' ); - } - } - - $icons = array( $local_path ); - } - } - - $icon_dir = dirname( $icons[0] ); - $relative_url = fs_img_url( substr( $icons[0], strlen( $icon_dir ) ), $icon_dir ); + $fs = freemius( $VARS['id'] ); ?> <div class="fs-plugin-icon"> - <img src="<?php echo $relative_url ?>" width="80" height="80"/> -</div> + <img src="<?php echo $fs->get_local_icon_url() ?>" width="80" height="80"/> +</div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/description.php b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/description.php index b3d92c822..26bc67b47 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/description.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/description.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.6 */ @@ -27,7 +27,7 @@ <?php if ( ! empty( $plugin->info->{'selling_point_' . $i} ) ) : ?> <li><i class="dashicons dashicons-yes"></i> - <h3><?php echo $plugin->info->{'selling_point_' . $i} ?></h3></li> + <h3><?php echo esc_html( $plugin->info->{'selling_point_' . $i} ) ?></h3></li> <?php endif ?> <?php endfor ?> </ul> @@ -52,14 +52,15 @@ <?php if ( ! empty( $plugin->info->screenshots ) ) : ?> <?php $screenshots = $plugin->info->screenshots ?> <div class="fs-screenshots clearfix"> - <h2><?php _efs( 'screenshots', $plugin->slug ) ?></h2> + <h2><?php fs_esc_html_echo_inline( 'Screenshots', 'screenshots', $plugin->slug ) ?></h2> <ul> <?php $i = 0; foreach ( $screenshots as $s => $url ) : ?> <?php // Relative URLs are replaced with WordPress.org base URL // therefore we need to set absolute URLs. - $url = 'http' . ( WP_FS__IS_HTTPS ? 's' : '' ) . ':' . $url; ?> + $url = 'http' . ( WP_FS__IS_HTTPS ? 's' : '' ) . ':' . $url; + ?> <li class="<?php echo ( 0 === $i % 2 ) ? 'odd' : 'even' ?>"> <style> #section-description .fs-screenshots <?php echo ".fs-screenshot-{$i}" ?> @@ -68,7 +69,7 @@ } </style> <a href="<?php echo $url ?>" - title="<?php printf( __fs( 'view-full-size-x', $plugin->slug ), $i ) ?>" + title="<?php echo esc_attr( sprintf( fs_text_inline( 'Click to view full-size screenshot %d', 'view-full-size-x', $plugin->slug ), $i ) ) ?>" class="fs-screenshot-<?php echo $i ?>"></a> </li> <?php $i ++; endforeach ?> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/features.php b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/features.php index c73dcd886..b3d0fc8b3 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/features.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/features.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.6 */ @@ -21,12 +21,14 @@ $features_plan_map = array(); foreach ( $plans as $plan ) { - foreach ( $plan->features as $feature ) { - if ( ! isset( $features_plan_map[ $feature->id ] ) ) { - $features_plan_map[ $feature->id ] = array( 'feature' => $feature, 'plans' => array() ); - } + if (!empty($plan->features) && is_array($plan->features)) { + foreach ( $plan->features as $feature ) { + if ( ! isset( $features_plan_map[ $feature->id ] ) ) { + $features_plan_map[ $feature->id ] = array( 'feature' => $feature, 'plans' => array() ); + } - $features_plan_map[ $feature->id ]['plans'][ $plan->id ] = $feature; + $features_plan_map[ $feature->id ]['plans'][ $plan->id ] = $feature; + } } // Add support as a feature. @@ -38,7 +40,7 @@ if ( ! isset( $features_plan_map['support'] ) ) { $support_feature = new stdClass(); $support_feature->id = 'support'; - $support_feature->title = __fs( 'Support', $plugin->slug ); + $support_feature->title = fs_text_inline( 'Support', $plugin->slug ); $features_plan_map[ $support_feature->id ] = array( 'feature' => $support_feature, 'plans' => array() ); } else { $support_feature = $features_plan_map['support']; @@ -51,7 +53,7 @@ // Add updates as a feature for all plans. $updates_feature = new stdClass(); $updates_feature->id = 'updates'; - $updates_feature->title = __fs( 'unlimited-updates', $plugin->slug ); + $updates_feature->title = fs_text_inline( 'Unlimited Updates', 'unlimited-updates', $plugin->slug ); $features_plan_map[ $updates_feature->id ] = array( 'feature' => $updates_feature, 'plans' => array() ); foreach ( $plans as $plan ) { $features_plan_map[ $updates_feature->id ]['plans'][ $plan->id ] = $updates_feature; @@ -65,13 +67,26 @@ <?php foreach ( $plans as $plan ) : ?> <th> <?php echo $plan->title ?> - <span class="fs-price"> - <?php foreach ( $plan->pricing as $pricing ) : ?> - <?php if ( 1 == $pricing->licenses ) : ?> - $<?php echo $pricing->annual_price ?> / year - <?php endif ?> - <?php endforeach ?> - </span> + <span class="fs-price"><?php + if ( empty( $plan->pricing ) ) { + fs_esc_html_echo_inline( 'Free', 'free', $plugin->slug ); + } else { + foreach ( $plan->pricing as $pricing ) { + /** + * @var FS_Pricing $pricing + */ + if ( 1 == $pricing->licenses ) { + if ( $pricing->has_annual() ) { + echo "\${$pricing->annual_price} / " . fs_esc_html_x_inline( 'year', 'as annual period', 'year', $plugin->slug ); + } else if ( $pricing->has_monthly() ) { + echo "\${$pricing->monthly_price} / " . fs_esc_html_x_inline( 'mo', 'as monthly period', 'mo', $plugin->slug ); + } else { + echo "\${$pricing->lifetime_price}"; + } + } + } + } + ?></span> </th> <?php endforeach ?> </tr> @@ -80,12 +95,12 @@ <?php $odd = true; foreach ( $features_plan_map as $feature_id => $data ) : ?> <tr class="fs-<?php echo $odd ? 'odd' : 'even' ?>"> - <td><?php echo ucfirst( $data['feature']->title ) ?></td> + <td><?php echo esc_html( ucfirst( $data['feature']->title ) ) ?></td> <?php foreach ( $plans as $plan ) : ?> <td> <?php if ( isset( $data['plans'][ $plan->id ] ) ) : ?> <?php if ( ! empty( $data['plans'][ $plan->id ]->value ) ) : ?> - <b><?php echo $data['plans'][ $plan->id ]->value ?></b> + <b><?php echo esc_html( $data['plans'][ $plan->id ]->value ) ?></b> <?php else : ?> <i class="dashicons dashicons-yes"></i> <?php endif ?> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/index.php b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/index.php new file mode 100644 index 000000000..0316c6a61 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/index.php @@ -0,0 +1,3 @@ +<?php + // Silence is golden. + // Hide file structure from users on unprotected servers. \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/screenshots.php b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/screenshots.php index f47e94f0b..20f1ef638 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/screenshots.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/plugin-info/screenshots.php @@ -2,7 +2,7 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.6 */ @@ -25,11 +25,10 @@ <?php // Relative URLs are replaced with WordPress.org base URL // therefore we need to set absolute URLs. - $url = 'http' . ( WP_FS__IS_HTTPS ? 's' : '' ) . ':' . $url; ?> + $url = 'http' . ( WP_FS__IS_HTTPS ? 's' : '' ) . ':' . $url; + ?> <li> - <a href="<?php echo $url ?>" - title="<?php printf( __fs( 'view-full-size-x', $plugin->slug ), $i ) ?>"><img - src="<?php echo $url ?>"></a> + <a href="<?php echo $url ?>" title="<?php echo esc_attr( sprintf( fs_text_inline( 'Click to view full-size screenshot %d', 'view-full-size-x', $plugin->slug ), $i ) ) ?>"><img src="<?php echo $url ?>"></a> </li> <?php $i ++; endforeach ?> </ol> diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/powered-by.php b/wp-content/plugins/nextgen-gallery/freemius/templates/powered-by.php index b9dcc4cc7..b7172160f 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/powered-by.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/powered-by.php @@ -2,10 +2,29 @@ /** * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.5 */ + /** + * Note for WordPress.org Theme/Plugin reviewer: + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This code will not run for wp.org themes (only plugins) + * since theme admin settings/options are now only allowed in the customizer. + * + * In addition, this page loads an i-frame. We intentionally named it 'frame' + * so it will pass the "Theme Check" that is looking for the string "i" . "frame". + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + if ( ! defined( 'ABSPATH' ) ) { exit; } @@ -18,14 +37,14 @@ fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); ?> -<div id="piframe"></div> +<div id="pframe"></div> <script type="text/javascript"> (function ($) { $(function () { var base_url = '<?php echo WP_FS__ADDRESS ?>', - piframe = $('<iframe id="fs_promo_tab" src="' + base_url + '/promotional-tab/?<?php echo http_build_query($VARS) ?>#' + encodeURIComponent(document.location.href) + '" height="350" width="60" frameborder="0" style=" background: transparent; position: fixed; top: 20%; right: 0;" scrolling="no"></iframe>') - .appendTo('#piframe'); + pframe = $('<i' + 'frame id="fs_promo_tab" src="' + base_url + '/promotional-tab/?<?php echo http_build_query($VARS) ?>#' + encodeURIComponent(document.location.href) + '" height="350" width="60" frameborder="0" style=" background: transparent; position: fixed; top: 20%; right: 0;" scrolling="no"></i' + 'frame>') + .appendTo('#pframe'); FS.PostMessage.init(base_url); FS.PostMessage.receive('state', function (state) { diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/pricing.php b/wp-content/plugins/nextgen-gallery/freemius/templates/pricing.php index 8d17e9f25..b657028a7 100644 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/pricing.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/pricing.php @@ -1,122 +1,171 @@ -<?php - /** - * @package Freemius - * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License - * @since 1.0.3 - */ - - if ( ! defined( 'ABSPATH' ) ) { - exit; - } - - wp_enqueue_script( 'jquery' ); - wp_enqueue_script( 'json2' ); - fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); - fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); - - /** - * @var array $VARS - */ - $slug = $VARS['slug']; - $fs = freemius( $slug ); - $timestamp = time(); - - $context_params = array( - 'plugin_id' => $fs->get_id(), - 'plugin_public_key' => $fs->get_public_key(), - 'plugin_version' => $fs->get_plugin_version(), - ); - - // Get site context secure params. - if ( $fs->is_registered() ) { - $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( - $fs->get_site(), - $timestamp, - 'upgrade' - ) ); - } else { - $context_params['home_url'] = home_url(); - } - - if ( $fs->is_payments_sandbox() ) // Append plugin secure token for sandbox mode authentication.) - { - $context_params['sandbox'] = FS_Security::instance()->get_secure_token( - $fs->get_plugin(), - $timestamp, - 'checkout' - ); - } - - $query_params = array_merge( $context_params, $_GET, array( - 'next' => $fs->_get_sync_license_url( false, false ), - 'plugin_version' => $fs->get_plugin_version(), - // Billing cycle. - 'billing_cycle' => fs_request_get( 'billing_cycle', WP_FS__PERIOD_ANNUALLY ), - ) ); -?> - <?php if ( ! $fs->is_registered() ) { - $template_data = array( - 'slug' => $slug, - ); - fs_require_template( 'forms/trial-start.php', $template_data); - } ?> - <div id="fs_pricing" class="wrap" style="margin: 0 0 -65px -20px;"> - <div id="iframe"></div> - <form action="" method="POST"> - <input type="hidden" name="user_id"/> - <input type="hidden" name="user_email"/> - <input type="hidden" name="site_id"/> - <input type="hidden" name="public_key"/> - <input type="hidden" name="secret_key"/> - <input type="hidden" name="action" value="account"/> - </form> - - <script type="text/javascript"> - (function ($, undef) { - $(function () { - var - // Keep track of the iframe height. - iframe_height = 800, - base_url = '<?php echo WP_FS__ADDRESS ?>', - // Pass the parent page URL into the Iframe in a meaningful way (this URL could be - // passed via query string or hard coded into the child page, it depends on your needs). - src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href), - - // Append the Iframe into the DOM. - iframe = $('<iframe " src="' + src + '" width="100%" height="' + iframe_height + 'px" scrolling="no" frameborder="0" style="background: transparent;"><\/iframe>') - .appendTo('#iframe'); - - FS.PostMessage.init(base_url); - - FS.PostMessage.receive('height', function (data) { - var h = data.height; - if (!isNaN(h) && h > 0 && h != iframe_height) { - iframe_height = h; - $("#iframe iframe").height(iframe_height + 'px'); - } - }); - - FS.PostMessage.receive('get_dimensions', function (data) { - FS.PostMessage.post('dimensions', { - height : $(document.body).height(), - scrollTop: $(document).scrollTop() - }, iframe[0]); - }); - - FS.PostMessage.receive('start_trial', function (data) { - openTrialConfirmationModal(data); - }); - }); - })(jQuery); - </script> - </div> -<?php - $params = array( - 'page' => 'pricing', - 'module_id' => $fs->get_id(), - 'module_slug' => $slug, - 'module_version' => $fs->get_plugin_version(), - ); - fs_require_template( 'powered-by.php', $params ); -?> \ No newline at end of file +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.0.3 + */ + + /** + * Note for WordPress.org Theme/Plugin reviewer: + * Freemius is an SDK for plugin and theme developers. Since the core + * of the SDK is relevant both for plugins and themes, for obvious reasons, + * we only develop and maintain one code base. + * + * This code (and page) will not run for wp.org themes (only plugins). + * + * In addition, this page loads an i-frame. We intentionally named it 'frame' + * so it will pass the "Theme Check" that is looking for the string "i" . "frame". + * + * UPDATE: + * After ongoing conversations with the WordPress.org TRT we received + * an official approval for including i-frames in the theme's WP Admin setting's + * page tab (the SDK will never add any i-frames on the sitefront). i-frames + * were never against the guidelines, but we wanted to get the team's blessings + * before we move forward. For the record, I got the final approval from + * Ulrich Pogson (@grapplerulrich), a team lead at the TRT during WordCamp + * Europe 2017 (June 16th, 2017). + * + * If you have any questions or need clarifications, please don't hesitate + * pinging me on slack, my username is @svovaf. + * + * @author Vova Feldman (@svovaf) + * @since 1.2.2 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + wp_enqueue_script( 'jquery' ); + wp_enqueue_script( 'json2' ); + fs_enqueue_local_script( 'postmessage', 'nojquery.ba-postmessage.min.js' ); + fs_enqueue_local_script( 'fs-postmessage', 'postmessage.js' ); + fs_enqueue_local_style( 'fs_common', '/admin/common.css' ); + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); + $timestamp = time(); + + $context_params = array( + 'plugin_id' => $fs->get_id(), + 'plugin_public_key' => $fs->get_public_key(), + 'plugin_version' => $fs->get_plugin_version(), + ); + + // Get site context secure params. + if ( $fs->is_registered() ) { + $context_params = array_merge( $context_params, FS_Security::instance()->get_context_params( + $fs->get_site(), + $timestamp, + 'upgrade' + ) ); + } else { + $context_params['home_url'] = home_url(); + } + + if ( $fs->is_payments_sandbox() ) // Append plugin secure token for sandbox mode authentication.) + { + $context_params['sandbox'] = FS_Security::instance()->get_secure_token( + $fs->get_plugin(), + $timestamp, + 'checkout' + ); + } + + $query_params = array_merge( $context_params, $_GET, array( + 'next' => $fs->_get_sync_license_url( false, false ), + 'plugin_version' => $fs->get_plugin_version(), + // Billing cycle. + 'billing_cycle' => fs_request_get( 'billing_cycle', WP_FS__PERIOD_ANNUALLY ), + 'is_network_admin' => fs_is_network_admin() ? 'true' : 'false', + ) ); + + if ( ! $fs->is_registered() ) { + $template_data = array( + 'id' => $fs->get_id(), + ); + fs_require_template( 'forms/trial-start.php', $template_data); + } + + $view_params = array( + 'id' => $VARS['id'], + 'page' => strtolower( $fs->get_text_x_inline( 'Pricing', 'noun', 'pricing' ) ), + ); + fs_require_once_template('secure-https-header.php', $view_params); + + $has_tabs = $fs->_add_tabs_before_content(); + + if ( $has_tabs ) { + $query_params['tabs'] = 'true'; + } +?> + <div id="fs_pricing" class="wrap fs-section fs-full-size-wrapper"> + <div id="frame"></div> + <form action="" method="POST"> + <input type="hidden" name="user_id"/> + <input type="hidden" name="user_email"/> + <input type="hidden" name="site_id"/> + <input type="hidden" name="public_key"/> + <input type="hidden" name="secret_key"/> + <input type="hidden" name="action" value="account"/> + </form> + + <script type="text/javascript"> + (function ($, undef) { + $(function () { + var + // Keep track of the i-frame height. + frame_height = 800, + base_url = '<?php echo WP_FS__ADDRESS ?>', + // Pass the parent page URL into the i-frame in a meaningful way (this URL could be + // passed via query string or hard coded into the child page, it depends on your needs). + src = base_url + '/pricing/?<?php echo http_build_query( $query_params ) ?>#' + encodeURIComponent(document.location.href), + + // Append the I-frame into the DOM. + frame = $('<i' + 'frame " src="' + src + '" width="100%" height="' + frame_height + 'px" scrolling="no" frameborder="0" style="background: transparent; width: 1px; min-width: 100%;"><\/i' + 'frame>') + .appendTo('#frame'); + + FS.PostMessage.init(base_url, [frame[0]]); + + FS.PostMessage.receive('height', function (data) { + var h = data.height; + if (!isNaN(h) && h > 0 && h != frame_height) { + frame_height = h; + frame.height(frame_height + 'px'); + + FS.PostMessage.postScroll(frame[0]); + } + }); + + FS.PostMessage.receive('get_dimensions', function (data) { + FS.PostMessage.post('dimensions', { + height : $(document.body).height(), + scrollTop: $(document).scrollTop() + }, frame[0]); + }); + + FS.PostMessage.receive('start_trial', function (data) { + openTrialConfirmationModal(data); + }); + }); + })(jQuery); + </script> + </div> +<?php + if ( $has_tabs ) { + $fs->_add_tabs_after_content(); + } + + $params = array( + 'page' => 'pricing', + 'module_id' => $fs->get_id(), + 'module_type' => $fs->get_module_type(), + 'module_slug' => $slug, + 'module_version' => $fs->get_plugin_version(), + ); + fs_require_template( 'powered-by.php', $params ); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/secure-https-header.php b/wp-content/plugins/nextgen-gallery/freemius/templates/secure-https-header.php new file mode 100644 index 000000000..fd12bc2e3 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/secure-https-header.php @@ -0,0 +1,39 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.1.8 + * + * @var array $VARS + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } +?> +<div class="fs-secure-notice"> + <i class="dashicons dashicons-lock"></i> + <span><?php + if ( ! empty( $VARS['message'] ) ) { + echo esc_html( $VARS['message'] ); + } else { + /** + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + echo esc_html( sprintf( + /* translators: %s: Page name */ + $fs->get_text_inline( 'Secure HTTPS %s page, running from an external domain', 'secure-x-page-header' ), + $VARS['page'] + ) ) . + ' - ' . + sprintf( + '<a class="fs-security-proof" href="%s" target="_blank">%s</a>', + 'https://www.mcafeesecure.com/verify?host=' . WP_FS__ROOT_DOMAIN_PRODUCTION, + 'Freemius Inc. [US]' + ); + } + ?></span> +</div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/sticky-admin-notice-js.php b/wp-content/plugins/nextgen-gallery/freemius/templates/sticky-admin-notice-js.php index 79eabb2c3..028a9661c 100755 --- a/wp-content/plugins/nextgen-gallery/freemius/templates/sticky-admin-notice-js.php +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/sticky-admin-notice-js.php @@ -5,7 +5,7 @@ * * @package Freemius * @copyright Copyright (c) 2015, Freemius, Inc. - * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 * @since 1.0.7 */ @@ -14,22 +14,21 @@ } ?> <script type="text/javascript" > - jQuery(document).ready(function($) { - $('.fs-notice.fs-sticky .fs-close').click(function(){ + jQuery( document ).ready(function( $ ) { + $( '.fs-notice.fs-sticky .fs-close' ).click(function() { var - notice = $(this).parents('.fs-notice'), - id = notice.attr('data-id'), - slug = notice.attr('data-slug'); + notice = $( this ).parents( '.fs-notice' ), + id = notice.attr( 'data-id' ), + ajaxActionSuffix = notice.attr( 'data-manager-id' ).replace( ':', '-' ); - notice.fadeOut('fast', function(){ + notice.fadeOut( 'fast', function() { var data = { - action: 'fs_dismiss_notice_action_' + slug, - slug: slug, + action : 'fs_dismiss_notice_action_' + ajaxActionSuffix, message_id: id }; // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php - $.post(ajaxurl, data, function(response) { + $.post( ajaxurl, data, function( response ) { }); diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/tabs-capture-js.php b/wp-content/plugins/nextgen-gallery/freemius/templates/tabs-capture-js.php new file mode 100644 index 000000000..236be3b9e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/tabs-capture-js.php @@ -0,0 +1,63 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + $slug = $fs->get_slug(); +?> +<script type="text/javascript"> + (function ($) { + $(document).ready(function () { + var $wrap = $( '.wrap' ); + if ( 0 === $wrap.length ) { + $wrap = $( '<div class="wrap">' ); + $wrap.insertBefore( $( '#wpbody-content .clear' ) ); + } + + $wrap = $wrap.clone().wrap( '<div>' ).parent(); + + var + settingHtml = $wrap.html(), + tabsPosition = settingHtml.indexOf('nav-tab-wrapper'), + aboveTabsHtml = ''; + + if (-1 < tabsPosition) { + // Find the tabs HTML beginning exact position. + while ('<' !== settingHtml[tabsPosition] && 0 < tabsPosition) { + tabsPosition--; + } + + if (-1 < tabsPosition) { + aboveTabsHtml = settingHtml.substr(0, tabsPosition); + + var tabsHtml = $('.wrap .nav-tab-wrapper').clone().wrap('<div>').parent().html(); + + $.ajax({ + url : ajaxurl + '?' + $.param({ + action : '<?php echo $fs->get_ajax_action( 'store_tabs' ) ?>', + security : '<?php echo $fs->get_ajax_security( 'store_tabs' ) ?>', + module_id: '<?php echo $fs->get_id() ?>' + }), + method : 'POST', + data : aboveTabsHtml + "\n" + tabsHtml + '</div>', + dataType : 'html', + // Avoid escaping the HTML. + processData: false + }); + } + } + }); + })(jQuery); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/freemius/templates/tabs.php b/wp-content/plugins/nextgen-gallery/freemius/templates/tabs.php new file mode 100644 index 000000000..4661ee11d --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/freemius/templates/tabs.php @@ -0,0 +1,186 @@ +<?php + /** + * @package Freemius + * @copyright Copyright (c) 2015, Freemius, Inc. + * @license https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License Version 3 + * @since 1.2.2.7 + */ + + if ( ! defined( 'ABSPATH' ) ) { + exit; + } + + /** + * @var array $VARS + * @var Freemius $fs + */ + $fs = freemius( $VARS['id'] ); + + $slug = $fs->get_slug(); + + $menu_items = $fs->get_menu_items(); + + $is_free_wp_org_theme = $fs->is_free_wp_org_theme(); + + $tabs = array(); + foreach ( $menu_items as $priority => $items ) { + foreach ( $items as $item ) { + if ( ! $item['show_submenu'] ) { + $submenu_name = ('wp-support-forum' === $item['menu_slug']) ? + 'support' : + $item['menu_slug']; + + if ( ! $is_free_wp_org_theme || ! $fs->is_submenu_item_visible( $submenu_name, true ) ) { + continue; + } + } + + $url = $fs->_get_admin_page_url( $item['menu_slug'] ); + $title = $item['menu_title']; + + $tab = array( + 'label' => $title, + 'href' => $url, + 'slug' => $item['menu_slug'], + ); + + if ( 'pricing' === $item['menu_slug'] && $fs->is_in_trial_promotion() ) { + $tab['href'] .= '&trial=true'; + } + + $tabs[] = $tab; + } + } +?> +<script type="text/javascript"> + (function ($) { + $(document).ready(function () { + var $wrap = $('.wrap'); + if (0 === $wrap.length) { + $wrap = $('<div class="wrap">'); + $wrap.insertBefore($('#wpbody-content .clear')); + } + + var + $tabsWrapper = $('.nav-tab-wrapper'), + $tabs = $tabsWrapper.find('.nav-tab'), + $tab = null; + + if (0 < $tabs.length) { + // Tries to set $tab to the first inactive tab. + for (var i = 0; i < $tabs.length; i++) { + $tab = $($tabs[i]); + + if (!$tab.hasClass('nav-tab-active')) { + break; + } + } + } + + <?php if (0 < count( $tabs )) : ?> + if (null == $tab) { + // No tabs found, therefore, create new tabs section if required. + var $h1 = $wrap.find('h1'); + + $tabsWrapper = $('<h2 class="nav-tab-wrapper"></h2>'); + + if (0 < $h1.length) { + $tabsWrapper.insertAfter($h1); + } else if (0 < $wrap.length) { + $wrap.prepend($tabsWrapper); + } + + $tab = $('<a href="#" class="nav-tab"></a>'); + } + + // Create a clone. + $tab = $tab.clone(); + // Open in current page. + $tab.removeAttr('target'); + $tab.removeClass('nav-tab-active'); + $tab.addClass('fs-tab'); + $tab.addClass('<?php echo $fs->get_unique_affix() ?>'); + + var $tabClone = null; + + <?php $freemius_context_page = null ?> + + <?php foreach ($tabs as $tab) : ?> + <?php $is_support_tab = ( 'wp-support-forum' == $tab['slug'] ) ?> + // Add the Freemius tabs. + $tabClone = $tab.clone(); + $tabClone.html(<?php echo json_encode( $tab['label'] ) ?>) + .attr('href', '<?php echo $is_support_tab ? $fs->get_support_forum_url() : $tab['href'] ?>') + .appendTo($tabsWrapper) + // Remove any custom click events. + .off('click', '**') + .addClass('<?php echo $tab['slug'] ?>') + // Avoid tab click triggering parent events. + .click(function (e) { + e.stopPropagation(); + }); + + <?php if ($is_support_tab) : ?> + // Open support in a new tab/page. + $tabClone.attr('target', '_blank'); + <?php endif ?> + + <?php if ($fs->is_admin_page( $tab['slug'] )) : ?> + <?php $freemius_context_page = $tab['slug'] ?> + // Select the relevant Freemius tab. + $tabs.removeClass('nav-tab-active'); + $tabClone.addClass('nav-tab-active'); + + <?php if (in_array( $freemius_context_page, array( 'pricing', 'contact', 'checkout' ) )) : ?> + // Add AJAX loader. + $tabClone.prepend('<i class="fs-ajax-spinner"></i>'); + // Hide loader after content fully loaded. + $('.wrap i' + 'frame').load(function () { + $(".fs-ajax-spinner").hide(); + }); + <?php endif ?> + + // Fix URLs that are starting with a hashtag. + $tabs.each(function (j, tab) { + if (0 === $(tab).attr('href').indexOf('#')) { + $(tab).attr('href', '<?php echo esc_js( $fs->main_menu_url() ) ?>' + $(tab).attr('href')); + } + }); + <?php endif ?> + <?php endforeach ?> + + var selectTab = function ($tab) { + $(window).load(function () { + $tab.click(); + + // Scroll to the top since the browser will auto scroll to the anchor. + document.body.scrollTop = 0; + document.body.scrollLeft = 0; +// window.scrollTo(0,0); + }); + }; + + // If the URL is loaded with a hashtag, find the context tab and select it. + if (window.location.hash) { + for (var j = 0; j < $tabs.length; j++) { + if (window.location.hash === $($tabs[j]).attr('href')) { + selectTab($($tabs[j])); + break; + } + } + } + + <?php if (is_string( $freemius_context_page ) && in_array( $freemius_context_page, array( + 'pricing', + 'contact', + 'checkout' + ) )) : ?> + // Add margin to the upper section of the tabs to give extra space for the HTTPS header. + // @todo This code assumes that the wrapper style is fully loaded, if there's a stylesheet that is not loaded via the HTML head, it may cause unpredicted margin-top. + var $tabsWrap = $tabsWrapper.parents('.wrap'); + $tabsWrap.css('marginTop', (parseInt($tabsWrap.css('marginTop'), 10) + 30) + 'px'); + <?php endif ?> + <?php endif ?> + }); + })(jQuery); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/nggallery.php b/wp-content/plugins/nextgen-gallery/nggallery.php index df29b189a..e4780e394 100644 --- a/wp-content/plugins/nextgen-gallery/nggallery.php +++ b/wp-content/plugins/nextgen-gallery/nggallery.php @@ -3,8 +3,8 @@ if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You /** * Plugin Name: NextGEN Gallery - * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 22 million downloads. - * Version: 3.0.8 + * Description: The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 23 million downloads. + * Version: 3.1.1 * Author: Imagely * Plugin URI: https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/ * Author URI: https://www.imagely.com @@ -396,8 +396,8 @@ class C_NextGEN_Bootstrap add_filter('simpletest_suites', array(&$this, 'add_testsuite')); // Ensure that settings manager is saved as an array - add_filter('pre_update_option_'.$this->_settings_option_name, array(&$this, 'persist_settings')); - add_filter('pre_update_site_option_'.$this->_settings_option_name, array(&$this, 'persist_settings')); + add_filter('pre_update_option_' . $this->_settings_option_name, array($this, 'persist_settings')); + add_filter('pre_update_site_option_' . $this->_settings_option_name, array($this, 'persist_settings')); // This plugin uses jQuery extensively if (NGG_FIX_JQUERY) { @@ -525,10 +525,10 @@ class C_NextGEN_Bootstrap /** * Ensure that C_Photocrati_Settings_Manager gets persisted as an array - * @param $settings + * @param C_Photocrati_Settings_Manager_Base|array $settings * @return array */ - function persist_settings($settings) + function persist_settings($settings = array()) { if (is_object($settings) && $settings instanceof C_Photocrati_Settings_Manager_Base) { $settings = $settings->to_array(); @@ -618,13 +618,24 @@ class C_NextGEN_Bootstrap $router = C_Router::get_instance(); // Set context to path if subdirectory install - $parts = parse_url($router->get_base_url(FALSE)); - if (isset($parts['path'])) { - $parts = explode('/index.php', $parts['path']); - $router->context = array_shift($parts); - } + $parts = parse_url($router->get_base_url(FALSE)); + $siteparts = parse_url(get_option('siteurl')); + + if (isset($parts['path']) && isset($siteparts['path'])) + { + if (strpos($parts['path'], '/index.php') === FALSE) + { + $router->context = $siteparts['path']; + } + else { + $new_parts = explode('/index.php', $parts['path']); + if (!empty($new_parts[0]) && $new_parts[0] == $siteparts['path']) { + $router->context = array_shift($new_parts); + } + } + } - // Provide a means for modules/third-parties to configure routes + // Provide a means for modules/third-parties to configure routes do_action_ref_array('ngg_routes', array(&$router)); // Serve the routes @@ -663,7 +674,7 @@ class C_NextGEN_Bootstrap define('NGG_PRODUCT_URL', path_join(str_replace("\\", '/', NGG_PLUGIN_URL), 'products')); define('NGG_MODULE_URL', path_join(str_replace("\\", '/', NGG_PRODUCT_URL), 'photocrati_nextgen/modules')); define('NGG_PLUGIN_STARTED_AT', microtime()); - define('NGG_PLUGIN_VERSION', '3.0.8'); + define('NGG_PLUGIN_VERSION', '3.1.1'); if (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) define('NGG_SCRIPT_VERSION', (string)mt_rand(0, mt_getrandmax())); @@ -759,24 +770,23 @@ class C_NextGEN_Bootstrap /** * Returns the path to a file within the plugin root folder - * @param type $file_name - * @return type + * + * @param string $file_name + * @return string */ function file_path($file_name=NULL) { $path = dirname(__FILE__); - if ($file_name != null) - { $path .= '/' . $file_name; - } return str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); } - /** * Gets the directory path used by the plugin + * + * @param string|null $dir (optional) * @return string */ function directory_path($dir=NULL) @@ -784,7 +794,6 @@ class C_NextGEN_Bootstrap return $this->file_path($dir); } - /** * Determines the location of the plugin - within a theme or plugin * @return string @@ -920,7 +929,7 @@ function ngg_fs_custom_connect_message( $freemius_link ) { return sprintf( - __fs( 'hey-x' ) . '<br>' . + __( 'Hey %s, ', 'nggallery' ) . '<br>' . __( 'Allow %6$s to collect some usage data with %5$s to make the plugin even more awesome. If you skip this, that\'s okay! %2$s will still work just fine.', 'nggallery' ), $user_first_name, '<b>' . __('NextGEN Gallery', 'nggallery') . '</b>', @@ -961,7 +970,7 @@ function fs_track_new_gallery() { * * @param bool $activate_for_all If true, activate Freemius for all users. Was added for testing. * - * @return \Freemius + * @return bool|\Freemius */ function ngg_fs( $activate_for_all = false ) { global $ngg_fs; diff --git a/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_settings.php b/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_settings.php index 2d2ad1f38..95d77bdf6 100644 --- a/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_settings.php +++ b/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_settings.php @@ -1,10 +1,11 @@ <?php - -if (!class_exists('C_NextGen_Settings')) { - class C_NextGen_Settings { +if (!class_exists('C_NextGen_Settings')) +{ + class C_NextGen_Settings + { /** - * @return C_NextGen_Settings + * @return C_Photocrati_Settings_Manager */ static function get_instance() { @@ -13,15 +14,16 @@ if (!class_exists('C_NextGen_Settings')) { } } -if (!class_exists('C_NextGen_Global_Settings')) { - class C_NextGen_Global_Settings extends C_NextGen_Settings { +if (!class_exists('C_NextGen_Global_Settings')) +{ + class C_NextGen_Global_Settings extends C_NextGen_Settings + { static function get_instance() { if (is_multisite()) return C_Photocrati_Global_Settings_Manager::get_instance(); - else { + else return C_Photocrati_Settings_Manager::get_instance(); - } } } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php b/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php index 338809dff..5aaf84009 100644 --- a/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php +++ b/wp-content/plugins/nextgen-gallery/non_pope/class.nextgen_shortcode_manager.php @@ -85,8 +85,9 @@ class C_NextGen_Shortcode_Manager /** * We're parsing our own shortcodes because WP can't yet handle nested shortcodes - * [ngg_images param="[slideshow]"] - * @param $content + * [ngg param="[slideshow]"] + * @param string $content + * @return string */ function fix_nested_shortcodes($content) { @@ -234,7 +235,7 @@ class C_NextGen_Shortcode_Manager function is_rest_request() { - return strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; + return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; } function __call($method, $args) diff --git a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_installer.php b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_installer.php index d35ba01ab..645e0a517 100644 --- a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_installer.php +++ b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_installer.php @@ -40,6 +40,10 @@ if (!class_exists('C_Photocrati_Installer')) class C_Photocrati_Installer { static $_instance = NULL; + + /** + * @return C_Photocrati_Installer + */ static function get_instance() { if (is_null(self::$_instance)) { @@ -49,7 +53,6 @@ if (!class_exists('C_Photocrati_Installer')) return self::$_instance; } - /** * Each product and module will register it's own handler (a class, with an install() and uninstall() method) * to be used for install/uninstall routines diff --git a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_resource_manager.php b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_resource_manager.php index 3e88d9ac8..ea80ff0bc 100644 --- a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_resource_manager.php +++ b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_resource_manager.php @@ -39,7 +39,6 @@ class C_Photocrati_Resource_Manager /** * Determines if the resource manager should perform it's routines for this request - * @return bool */ function validate_request() { @@ -74,7 +73,7 @@ class C_Photocrati_Resource_Manager function is_rest_request() { - return strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; + return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; } /** @@ -161,6 +160,8 @@ class C_Photocrati_Resource_Manager /** * When PHP has finished, we output the footer scripts and closing tags + * @param bool $in_shutdown + * @return string */ function output_buffer($in_shutdown=FALSE) { diff --git a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_settings_manager.php b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_settings_manager.php index d2c3e4ed4..8c8c06387 100644 --- a/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_settings_manager.php +++ b/wp-content/plugins/nextgen-gallery/non_pope/class.photocrati_settings_manager.php @@ -1,6 +1,7 @@ <?php -if (!class_exists('C_Photocrati_Settings_Manager_Base')) { +if (!class_exists('C_Photocrati_Settings_Manager_Base')) +{ /** * Provides a base abstraction for a Settings Manager * Class C_Settings_Manager_Base @@ -56,11 +57,12 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) { /** * Gets the value of a particular setting + * * @param $key * @param null $default - * @return null + * @return mixed */ - function get($key, $default=NULL) + function get($key, $default = NULL) { $retval = $default; @@ -71,9 +73,9 @@ if (!class_exists('C_Photocrati_Settings_Manager_Base')) { $retval = $this->_options[$key]; } - // In case a stdObject has been passed in as a value, we - // want to only return scalar values or arrays - if (is_object($retval)) $retval = (array) $retval; + // In case a stdObject has been passed in as a value, we want to only return scalar values or arrays + if (is_object($retval)) + $retval = (array) $retval; return $retval; } @@ -226,6 +228,10 @@ if (!class_exists('C_Photocrati_Global_Settings_Manager')) { class C_Photocrati_Global_Settings_Manager extends C_Photocrati_Settings_Manager_Base { static $_instance = NULL; + + /** + * @return C_Photocrati_Global_Settings_Manager + */ public static function get_instance() { if (is_null(self::$_instance)) { @@ -243,8 +249,10 @@ if (!class_exists('C_Photocrati_Global_Settings_Manager')) { function load() { $this->_options = get_site_option(self::$option_name, $this->to_array()); - if (!$this->_options) $this->_options = array(); - else if (is_string($this->_options)) $this->_options = unserialize($this->_options); + if (!$this->_options) + $this->_options = array(); + else if (is_string($this->_options)) + $this->_options = unserialize($this->_options); } function destroy() @@ -255,10 +263,15 @@ if (!class_exists('C_Photocrati_Global_Settings_Manager')) { } -if (!class_exists('C_Photocrati_Settings_Manager')) { +if (!class_exists('C_Photocrati_Settings_Manager')) +{ class C_Photocrati_Settings_Manager extends C_Photocrati_Settings_Manager_Base { static $_instance = NULL; + + /** + * @return C_Photocrati_Settings_Manager + */ public static function get_instance() { if (is_null(self::$_instance)) { diff --git a/wp-content/plugins/nextgen-gallery/pope/lib/class.base_module.php b/wp-content/plugins/nextgen-gallery/pope/lib/class.base_module.php index fc867fbbd..6e35b25d7 100755 --- a/wp-content/plugins/nextgen-gallery/pope/lib/class.base_module.php +++ b/wp-content/plugins/nextgen-gallery/pope/lib/class.base_module.php @@ -47,6 +47,14 @@ abstract class C_Base_Module /** * Defines the module + * @param string $id + * @param string $name + * @param string $description (optional) + * @param string $version (optional) + * @param string $uri (optional) + * @param string $author (optional) + * @param string $author_uri (optional) + * @param string|bool $context (optional) */ function define($id='pope-module', $name='Pope Module', $description='', $version='', $uri='', $author='', $author_uri='', $context=FALSE) { diff --git a/wp-content/plugins/nextgen-gallery/pope/lib/class.component.php b/wp-content/plugins/nextgen-gallery/pope/lib/class.component.php index 6a7cc3840..ecc8236b9 100755 --- a/wp-content/plugins/nextgen-gallery/pope/lib/class.component.php +++ b/wp-content/plugins/nextgen-gallery/pope/lib/class.component.php @@ -15,6 +15,7 @@ class C_Component extends ExtensibleObject /** * Many components will execute parent::define() + * @param bool|string $context (optional) */ function define($context=FALSE) { @@ -61,7 +62,7 @@ class C_Component extends ExtensibleObject /** * Assigns a particular context to the component - * @param type $context + * @param string $context */ function add_context($context) { @@ -75,7 +76,7 @@ class C_Component extends ExtensibleObject /** * Assigns one or more contexts to the component - * @param type $context + * @param string $context */ function assign_context($context) { @@ -84,7 +85,7 @@ class C_Component extends ExtensibleObject /** * Un-assigns one or more contexts from the component - * @param type $context + * @param string $context */ function remove_context($context) { @@ -99,7 +100,7 @@ class C_Component extends ExtensibleObject /** * Assigns one or more contexts to the component - * @param type $context + * @param string $context */ function unassign_context($context) { diff --git a/wp-content/plugins/nextgen-gallery/pope/lib/class.component_registry.php b/wp-content/plugins/nextgen-gallery/pope/lib/class.component_registry.php index cbdacd47e..b557b1bf3 100755 --- a/wp-content/plugins/nextgen-gallery/pope/lib/class.component_registry.php +++ b/wp-content/plugins/nextgen-gallery/pope/lib/class.component_registry.php @@ -39,7 +39,7 @@ class C_Component_Registry /** * Returns a singleton - * @return C_Component_Registry() + * @return C_Component_Registry */ static function &get_instance() { @@ -128,7 +128,7 @@ class C_Component_Registry /** * Retrieves the module path * @param string $module_id - * @return string + * @return null|string */ function get_module_path($module_id) { @@ -147,7 +147,7 @@ class C_Component_Registry /** * Retrieves the module installation directory * @param string $module_id - * @return string + * @return null|string */ function get_module_dir($module_id) { @@ -169,6 +169,7 @@ class C_Component_Registry /** * Loads a module's code according to its dependency list * @param string $module_id + * @return bool */ function load_module($module_id) { @@ -203,6 +204,7 @@ class C_Component_Registry /** * Initializes a previously loaded module * @param string $module_id + * @return bool */ function initialize_module($module_id) { @@ -286,7 +288,7 @@ class C_Component_Registry /** * Retrieves the instance of the registered module. Note: it's the instance of the module object, so the module needs to be loaded or this function won't return anything. For module info returned by scanning (with add_module_path), look at get_module_meta * @param string $module_id - * @return C_Base_Module + * @return null|C_Base_Module */ function get_module($module_id) { @@ -319,7 +321,7 @@ class C_Component_Registry /** * Retrieves a list of instantiated module ids, in their "loaded" order as defined by a product - * + * @param string|bool $for_product_id (optional) * @return array */ function get_module_list($for_product_id=FALSE) @@ -475,7 +477,7 @@ class C_Component_Registry /** * Retrieves the instance of the registered product * @param string $product_id - * @return C_Base_Module + * @return null|C_Base_Module */ function get_product($product_id) { @@ -510,7 +512,7 @@ class C_Component_Registry /** * Retrieves the module installation path for a specific product (Note: this is just the generic root container path for modules of this product) * @param string $product_id - * @return string + * @return null|string */ function get_product_module_path($product_id) { @@ -582,7 +584,7 @@ class C_Component_Registry * Registers an adapter for an interface with specific contexts * @param string $interface * @param string $class - * @param array $contexts + * @param array|bool $contexts (optional) */ function add_adapter($interface, $class, $contexts=FALSE) { @@ -610,7 +612,7 @@ class C_Component_Registry * contexts to remove the adapter from, leaving the rest intact * @param string $interface * @param string $class - * @param array $contexts + * @param array|bool $contexts (optional) */ function del_adapter($interface, $class, $contexts=FALSE) { @@ -671,7 +673,7 @@ class C_Component_Registry * Adds a utility for an interface, to be used in particular contexts * @param string $interface * @param string $class - * @param array $contexts + * @param array|bool $contexts (optional) */ function add_utility($interface, $class, $contexts=FALSE) { @@ -694,7 +696,7 @@ class C_Component_Registry /** * Deletes a registered utility for a particular interface. * @param string $interface - * @param array $contexts + * @param array|bool $contexts (optional) */ function del_utility($interface, $contexts=FALSE) { @@ -712,7 +714,7 @@ class C_Component_Registry /** * Gets the class name of the component providing a utility implementation * @param string $interface - * @param string|array $context + * @param string|array|bool $context (optional) * @return string */ function get_utility_class_name($interface, $context=FALSE) @@ -725,7 +727,7 @@ class C_Component_Registry * Retrieves an instantiates the registered utility for the provided instance. * The instance is a singleton and must provide the get_instance() method * @param string $interface - * @param string $context + * @param string|bool $context (optional) * @return C_Component */ function get_utility($interface, $context=FALSE) @@ -865,6 +867,7 @@ class C_Component_Registry } /** * Autoloads any classes, interfaces, or adapters needed by this module + * @param string $name */ function _module_autoload($name) { diff --git a/wp-content/plugins/nextgen-gallery/pope/lib/class.extensibleobject.php b/wp-content/plugins/nextgen-gallery/pope/lib/class.extensibleobject.php index de4ab4ee9..935b79a17 100755 --- a/wp-content/plugins/nextgen-gallery/pope/lib/class.extensibleobject.php +++ b/wp-content/plugins/nextgen-gallery/pope/lib/class.extensibleobject.php @@ -124,9 +124,9 @@ class ExtensibleObject extends PopeHelpers /** - * Adds an extension class to the object. The extension provides - * methods for this class to expose as it's own + * Adds an extension class to the object. The extension provides methods for this class to expose as it's own * @param string $class + * @return bool */ function add_mixin($class, $instantiate=FALSE) { @@ -207,6 +207,7 @@ class ExtensibleObject extends PopeHelpers /** * Returns the Mixin which provides the specified method * @param string $method + * @return bool|object */ function get_mixin_providing($method, $return_obj=FALSE) { @@ -304,8 +305,7 @@ class ExtensibleObject extends PopeHelpers /** * Wraps a class within an ExtensibleObject class. * @param string $klass - * @param array callback, used to tell ExtensibleObject how to instantiate - * the wrapped class + * @param array $callback Used to tell ExtensibleObject how to instantiate the wrapped class */ function wrap($klass, $callback=FALSE, $args=array()) { @@ -355,10 +355,8 @@ class ExtensibleObject extends PopeHelpers return $retval; } - /** * Provides a means of calling static methods, provided by extensions - * @param string $method * @return mixed */ static function get_class() @@ -369,7 +367,6 @@ class ExtensibleObject extends PopeHelpers return $obj; } - /** * Gets the name of the ExtensibleObject * @return string @@ -585,7 +582,7 @@ class ExtensibleObject extends PopeHelpers /** * Returns TRUE if the method in particular has been cached * @param string $method - * @return type + * @return bool */ function is_cached($method) { @@ -688,7 +685,7 @@ class ExtensibleObject extends PopeHelpers /** * Returns get_class_methods() optionally limited by Mixin * - * @param string (optional) Only show functions provided by a mixin + * @param string|null $name Show functions provided by a mixin * @return array Results from get_class_methods() */ public function get_instance_methods($name = null) @@ -757,7 +754,7 @@ class Mixin extends PopeHelpers /** * The name of the method called on the ExtensibleObject - * @var type + * @var string */ var $method_called; diff --git a/wp-content/plugins/nextgen-gallery/pope/lib/class.pope_cache.php b/wp-content/plugins/nextgen-gallery/pope/lib/class.pope_cache.php index a7f895615..869fca9b0 100644 --- a/wp-content/plugins/nextgen-gallery/pope/lib/class.pope_cache.php +++ b/wp-content/plugins/nextgen-gallery/pope/lib/class.pope_cache.php @@ -154,7 +154,7 @@ class C_Pope_Cache_MultiFile implements I_Pope_Cache_Driver $file = self::join_paths($dir, $file); if (is_dir($file) && self::$use_cache_subdir) { - self::flush($dir); + self::flush(); } else { if (!self::$use_cache_subdir && strpos(basename($file), implode('_', C_Pope_Cache::$key_prefix) . '_') === 0) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php index d08ca7327..b115eb7f4 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ajax/package.module.ajax.php @@ -48,7 +48,7 @@ class C_Ajax_Controller extends C_MVC_Controller } /** * Returns an instance of this class - * @param string $context + * @param string|bool $context * @return C_Ajax_Controller */ static function get_instance($context = FALSE) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php index bfb7833b3..d7d00a0b5 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php @@ -1,6 +1,7 @@ <?php define('NGG_ATTACH_TO_POST_SLUG', 'nextgen-attach_to_post'); +define('NGG_ATTACH_TO_POST_VERSION', '3.1.0'); class M_Attach_To_Post extends C_Base_Module { @@ -25,7 +26,7 @@ class M_Attach_To_Post extends C_Base_Module 'photocrati-attach_to_post', 'Attach To Post', 'Provides the "Attach to Post" interface for displaying galleries and albums', - '3.0.3', + NGG_ATTACH_TO_POST_VERSION, 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com', @@ -64,7 +65,6 @@ class M_Attach_To_Post extends C_Base_Module return $this->_event_publisher; } - /** * Registers requires the utilites that this module provides */ @@ -111,7 +111,6 @@ class M_Attach_To_Post extends C_Base_Module return $retval; } - function _register_hooks() { add_action('ngg_routes', array($this, 'define_routes'), 2); @@ -141,7 +140,10 @@ class M_Attach_To_Post extends C_Base_Module add_action('admin_init', array(&$this, 'route_insert_gallery_window')); add_action('media_buttons', array($this, 'add_media_button'), 15); - add_action('admin_init', array($this, 'enqueue_tinymce_plugin_css')); + add_action('admin_enqueue_scripts', array($this, 'enqueue_tinymce_resources')); + add_filter('mce_buttons', array(&$this, 'add_attach_to_post_button')); + add_filter('mce_external_plugins', array(&$this, 'add_attach_to_post_tinymce_plugin')); + add_filter('wp_mce_translation', array($this, 'add_attach_to_post_tinymce_i18n')); add_action('admin_print_scripts', array(&$this, 'print_tinymce_placeholder_template')); } @@ -164,21 +166,11 @@ class M_Attach_To_Post extends C_Base_Module )); } - /** - * Enqueues the CSS needed to style the IGW placeholders - */ - function enqueue_tinymce_plugin_css() - { - add_editor_style('https://fonts.googleapis.com/css?family=Lato'); - add_editor_style(M_Gallery_Display::get_fontawesome_url()); - add_editor_style(C_Router::get_instance()->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.css')); - } - /** * Prevents ATP preview image placeholders from being used as opengraph / twitter metadata * * @param string $image - * @return null + * @return null|string */ function hide_preview_image_from_yoast($image) { @@ -235,9 +227,8 @@ class M_Attach_To_Post extends C_Base_Module /** * In 2.0.66.X and earlier, ATP placeholder images used a different url than * what 2.0.69 uses. Therefore, we need to convert those - * @param $content - * - * @return mixed + * @param string $content + * @return string */ function fix_preview_images($content) { @@ -295,6 +286,9 @@ class M_Attach_To_Post extends C_Base_Module } } + /** + * @param C_Router $router + */ function define_routes($router) { $app = $router->create_app('/'.NGG_ATTACH_TO_POST_SLUG); @@ -349,9 +343,7 @@ class M_Attach_To_Post extends C_Base_Module $router = C_Router::get_instance(); // Enqueue resources needed at post/page level - if (preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME'])) { - $this->_enqueue_tinymce_resources(); - + if ($this->is_new_or_edit_post_screen()) { wp_enqueue_script('nextgen_admin_js'); wp_enqueue_style('nextgen_admin_css'); wp_enqueue_script('frame_event_publisher'); @@ -380,65 +372,101 @@ class M_Attach_To_Post extends C_Base_Module ); wp_localize_script('ngg-igw', 'ngg_igw_i18n', array( 'nextgen_gallery' => __('NextGEN Gallery', 'nggallery'), - 'edit' => __('Click to edit', 'nggallery'), - 'remove' => __('Click to remove', 'nggallery'), + 'edit' => __('Edit', 'nggallery'), + 'remove' => __('Delete', 'nggallery'), )); } elseif (isset($_REQUEST['attach_to_post']) OR (isset($_REQUEST['page']) && strpos($_REQUEST['page'], 'nggallery') !== FALSE)) { - wp_enqueue_script('iframely', $router->get_static_url('photocrati-attach_to_post#iframely.js'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_style('iframely', $router->get_static_url('photocrati-attach_to_post#iframely.css'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_script('nextgen_admin_js_atp', $router->get_static_url('photocrati-nextgen_admin#nextgen_admin_page.js'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_script( + 'iframely', + $router->get_static_url('photocrati-attach_to_post#iframely.js'), + array(), + NGG_SCRIPT_VERSION + ); + wp_enqueue_style( + 'iframely', + $router->get_static_url('photocrati-attach_to_post#iframely.css'), + array(), + NGG_SCRIPT_VERSION + ); + wp_enqueue_script('nextgen_admin_js'); } } + function is_new_or_edit_post_screen() + { + return preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME']); + } + + function can_use_tinymce() + { + $security = $this->get_registry()->get_utility('I_Security_Manager'); + $sec_actor = $security->get_current_actor(); + $checks = array( + $sec_actor->is_allowed('NextGEN Attach Interface'), + $sec_actor->is_allowed('NextGEN Use TinyMCE'), + get_user_option('rich_editing') == 'true' + ); + return !in_array(FALSE, $checks); + } /** * Enqueues resources needed by the TinyMCE editor */ - function _enqueue_tinymce_resources() + function enqueue_tinymce_resources() { - wp_localize_script( - 'media-editor', - 'nextgen_gallery_attach_to_post_url', - C_NextGen_Settings::get_instance()->attach_to_post_url - ); + if ($this->is_new_or_edit_post_screen()) { + $router = C_Router::get_instance(); - // Registers our tinymce button and plugin for attaching galleries - $security = $this->get_registry()->get_utility('I_Security_Manager'); - $sec_actor = $security->get_current_actor(); - $checks = array( - $sec_actor->is_allowed('NextGEN Attach Interface'), - $sec_actor->is_allowed('NextGEN Use TinyMCE') - ); - if (!in_array(FALSE, $checks)) { - if (get_user_option('rich_editing') == 'true') { - add_filter('mce_buttons', array(&$this, 'add_attach_to_post_button')); - add_filter('mce_external_plugins', array(&$this, 'add_attach_to_post_tinymce_plugin')); - add_filter('wp_mce_translation', array($this, 'add_attach_to_post_tinymce_i18n')); - } - } - } + add_editor_style('https://fonts.googleapis.com/css?family=Lato'); + add_editor_style($router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.css')); + wp_enqueue_script('photocrati_ajax'); + + wp_localize_script( + 'media-editor', + 'nextgen_gallery_attach_to_post_url', + C_NextGen_Settings::get_instance()->attach_to_post_url + ); + wp_localize_script( + 'photocrati_ajax', + 'ngg_tinymce_plugin', + array( + 'url' => add_query_arg( + 'ver', + NGG_SCRIPT_VERSION, + $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js') + ), + 'name' => $this->attach_to_post_tinymce_plugin, + 'i18n' => array( + 'button_label' => __('Add NextGEN Gallery', 'nextgen-gallery') + ) + ) + ); + } + } /** * Adds a TinyMCE button for the Attach To Post plugin * @param array $buttons - * @returns array + * @return array */ function add_attach_to_post_button($buttons) { - array_push( - $buttons, - 'separator', - $this->attach_to_post_tinymce_plugin - ); + if ($this->can_use_tinymce()) { + array_push( + $buttons, + 'separator', + $this->attach_to_post_tinymce_plugin + ); + } + return $buttons; } - /** * Adds the Attach To Post TinyMCE plugin * @param array $plugins @@ -447,13 +475,18 @@ class M_Attach_To_Post extends C_Base_Module */ function add_attach_to_post_tinymce_plugin($plugins) { - $router = C_Router::get_instance(); - wp_enqueue_script('photocrati_ajax'); - $plugins[$this->attach_to_post_tinymce_plugin] = $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js'); + if ($this->can_use_tinymce()) { + $router = C_Router::get_instance(); + $plugins[$this->attach_to_post_tinymce_plugin] = add_query_arg( + 'ver', + NGG_SCRIPT_VERSION, + $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js') + ); + } + return $plugins; } - /** * Adds the Attach To Post TinyMCE i18n strings * @param $mce_translation @@ -465,7 +498,6 @@ class M_Attach_To_Post extends C_Base_Module return $mce_translation; } - /** * Notify frames that a new gallery has been created * @param int $gallery_id @@ -518,6 +550,9 @@ class M_Attach_To_Post extends C_Base_Module $this->_get_frame_event_publisher()->add_event($event); } + /** + * @return array + */ function get_type_list() { return array( diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php index 7de50b688..fa439f980 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/package.module.attach_to_post.php @@ -21,7 +21,7 @@ class A_Attach_To_Post_Ajax extends Mixin } /** * Returns a list of image sources for the Attach to Post interface - * @return type + * @return array */ function get_attach_to_post_sources_action() { @@ -250,11 +250,11 @@ class C_Attach_Controller extends C_NextGen_Admin_Page_Controller { parent::initialize(); $this->_load_displayed_gallery(); - if (!has_action('wp_print_scripts', array(&$this, 'filter_scripts'))) { - add_action('wp_print_scripts', array(&$this, 'filter_scripts')); + if (!has_action('wp_print_scripts', array($this, 'filter_scripts'))) { + add_action('wp_print_scripts', array($this, 'filter_scripts')); } - if (!has_action('wp_print_scripts', array(&$this, 'filter_styles'))) { - add_action('wp_print_scripts', array(&$this, 'filter_styles')); + if (!has_action('wp_print_scripts', array($this, 'filter_styles'))) { + add_action('wp_print_scripts', array($this, 'filter_styles')); } } } @@ -269,6 +269,7 @@ class Mixin_Attach_To_Post extends Mixin } else { if (isset($_REQUEST['shortcode'])) { $params = str_replace('ngg_images', '', base64_decode($_REQUEST['shortcode'])); + $params = str_replace('ngg', '', base64_decode($_REQUEST['shortcode'])); $params = stripslashes($params); $params = str_replace(array('[', ']'), array('[', ']'), $params); $params = shortcode_parse_atts($params); @@ -471,7 +472,7 @@ class Mixin_Attach_To_Post extends Mixin usort($display_types, array($this->object, '_display_type_list_sort')); wp_enqueue_script('ngg_display_tab', $this->get_static_url('photocrati-attach_to_post#display_tab.js'), array('jquery', 'backbone', 'underscore.string', 'photocrati_ajax'), NGG_SCRIPT_VERSION); $this->object->mark_script('ngg_display_tab'); - wp_localize_script('ngg_display_tab', 'igw_data', array('displayed_gallery_preview_url' => $settings->gallery_preview_url, 'displayed_gallery' => $this->object->_displayed_gallery->get_entity(), 'sources' => $sources->get_all(), 'gallery_primary_key' => $gallery_mapper->get_primary_key_column(), 'galleries' => $gallery_mapper->find_all(), 'albums' => $album_mapper->find_all(), 'tags' => $tags, 'display_types' => $display_types, 'sec_token' => $security->get_request_token('nextgen_edit_displayed_gallery')->get_json(), 'image_primary_key' => $image_mapper->get_primary_key_column(), 'display_type_priority_base' => NGG_DISPLAY_PRIORITY_BASE, 'display_type_priority_step' => NGG_DISPLAY_PRIORITY_STEP, 'shortcode_ref' => isset($_REQUEST['ref']) ? floatval($_REQUEST['ref']) : null, 'i18n' => array('sources' => __('Are you inserting a Gallery (default), an Album, or images based on Tags?', 'nggallery'), 'optional' => __('(optional)', 'nggallery'), 'slug_tooltip' => __('Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox', 'nggallery'), 'slug_label' => __('Slug', 'nggallery'), 'no_entities' => __('No entities to display for this source', 'nggallery'), 'exclude_question' => __('Exclude?', 'nggallery'), 'select_gallery' => __('Select a Gallery', 'nggallery'), 'galleries' => __('Select one or more galleries (click in box to see available galleries).', 'nggallery'), 'albums' => __('Select one album (click in box to see available albums).', 'nggallery')))); + wp_localize_script('ngg_display_tab', 'igw_data', array('displayed_gallery_preview_url' => $settings->gallery_preview_url, 'displayed_gallery' => $this->object->_displayed_gallery->get_entity(), 'sources' => $sources->get_all(), 'gallery_primary_key' => $gallery_mapper->get_primary_key_column(), 'galleries' => $gallery_mapper->find_all(), 'albums' => $album_mapper->find_all(), 'tags' => $tags, 'display_types' => $display_types, 'sec_token' => $security->get_request_token('nextgen_edit_displayed_gallery')->get_json(), 'image_primary_key' => $image_mapper->get_primary_key_column(), 'display_type_priority_base' => NGG_DISPLAY_PRIORITY_BASE, 'display_type_priority_step' => NGG_DISPLAY_PRIORITY_STEP, 'shortcode_ref' => isset($_REQUEST['ref']) ? floatval($_REQUEST['ref']) : null, 'shortcode_defaults' => array('order_by' => $settings->galSort, 'order_direction' => $settings->galSortDir, 'returns' => 'included', 'maximum_entity_count' => $settings->maximum_entity_count), 'shortcode_attr_replacements' => array('source' => 'src', 'container_ids' => 'ids', 'display_type' => 'display'), 'i18n' => array('sources' => __('Are you inserting a Gallery (default), an Album, or images based on Tags?', 'nggallery'), 'optional' => __('(optional)', 'nggallery'), 'slug_tooltip' => __('Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox', 'nggallery'), 'slug_label' => __('Slug', 'nggallery'), 'no_entities' => __('No entities to display for this source', 'nggallery'), 'exclude_question' => __('Exclude?', 'nggallery'), 'select_gallery' => __('Select a Gallery', 'nggallery'), 'galleries' => __('Select one or more galleries (click in box to see available galleries).', 'nggallery'), 'albums' => __('Select one album (click in box to see available albums).', 'nggallery')))); } function start_resource_monitoring() { @@ -505,8 +506,8 @@ class Mixin_Attach_To_Post extends Mixin // Ensure that the Photocrati AJAX library is loaded wp_enqueue_script('photocrati_ajax'); // Enqueue logic for the Attach to Post interface as a whole - wp_enqueue_script('ngg_attach_to_post_js', $this->get_static_url('photocrati-attach_to_post#attach_to_post.js'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_style('ngg_attach_to_post', $this->get_static_url('photocrati-attach_to_post#attach_to_post.css'), FALSE, C_Component_Registry::get_instance()->get_module('photocrati-attach_to_post')->module_version); + wp_enqueue_script('ngg_attach_to_post_js', $this->get_static_url('photocrati-attach_to_post#attach_to_post.js'), array(), NGG_SCRIPT_VERSION); + wp_enqueue_style('ngg_attach_to_post', $this->get_static_url('photocrati-attach_to_post#attach_to_post.css'), array(), NGG_SCRIPT_VERSION); wp_dequeue_script('debug-bar-js'); wp_dequeue_style('debug-bar-css'); $this->enqueue_display_tab_js(); @@ -516,6 +517,8 @@ class Mixin_Attach_To_Post extends Mixin } /** * Renders the interface + * @param bool $return + * @return string */ function index_action($return = FALSE) { @@ -567,6 +570,8 @@ class Mixin_Attach_To_Post extends Mixin } /** * Filter for ngg_before_save_thumbnail + * @param stdClass $thumbnail + * @return stdClass */ function set_igw_placeholder_text($thumbnail) { @@ -596,7 +601,7 @@ class Mixin_Attach_To_Post extends Mixin } /** * Returns the main tabs displayed on the Attach to Post interface - * @returns array + * @return array */ function _get_main_tabs() { @@ -627,6 +632,7 @@ class Mixin_Attach_To_Post extends Mixin * Renders a NextGen Gallery page in an iframe, suited for the attach to post * interface * @param string $page + * @param null|int $tab_id (optional) * @return string */ function _render_ngg_page_in_frame($page, $tab_id = null) @@ -639,9 +645,8 @@ class Mixin_Attach_To_Post extends Mixin return "<iframe name='{$page}' frameBorder='0'{$tab_id} class='ngg-attach-to-post ngg-iframe-page-{$page}' scrolling='yes' src='{$frame_url}'></iframe>"; } /** - * Renders the display tab for adjusting how images/galleries will be - * displayed - * @return type + * Renders the display tab for adjusting how images/galleries will be displayed + * @return string */ function _render_display_tab() { @@ -649,7 +654,7 @@ class Mixin_Attach_To_Post extends Mixin } /** * Renders the tab used primarily for Gallery and Image creation - * @return type + * @return string */ function _render_create_tab() { @@ -740,7 +745,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin } /** * Renders the display settings tab for the Attach to Post interface - * @return type + * @return array */ function _render_display_settings_tab() { @@ -791,6 +796,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin $model = $form->get_model(); $current = $this->object->is_displayed_gallery_using_display_type($model->name); $css_class = $current ? 'display_settings_form' : 'display_settings_form hidden'; + $defaults = $model->settings; // If this form is used to provide the display settings for the current // displayed gallery, then we need to override the forms settings // with the displayed gallery settings @@ -799,7 +805,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin $model->settings = $settings; } // Output the display settings form - $retval[] = $this->object->render_partial('photocrati-attach_to_post#display_settings_form', array('settings' => $form->render(), 'display_type_name' => $model->name, 'css_class' => $css_class), TRUE); + $retval[] = $this->object->render_partial('photocrati-attach_to_post#display_settings_form', array('settings' => $form->render(), 'display_type_name' => $model->name, 'css_class' => $css_class, 'defaults' => $defaults), TRUE); } // In addition, we'll render a form that will be displayed when no // display type has been selected in the Attach to Post interface @@ -811,7 +817,7 @@ class Mixin_Attach_To_Post_Display_Tab extends Mixin } /** * Renders the tab used to preview included images - * @return string + * @return array */ function _render_preview_tab() { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css index 95b14047d..a1429dc90 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.css @@ -557,6 +557,10 @@ table { font-size: 13px; } +#save_displayed_gallery:disabled { + background: gray !important; +} + /* 3b. Display Tab: "Customize Display Settings" Subtab */ #display_settings_tab #display_settings_form table tr td:first-child { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css index 881e7aa84..bb63f7250 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post.min.css @@ -1 +1 @@ -body,html{width:100%;height:100%;padding:0;margin:0;font-size:13px;overflow:hidden}body{position:absolute;visibility:hidden;opacity:0;height:100%}.entity_errors{color:red}.entity_errors ul{margin-left:30px}.entity_errors ul li{list-style-type:disc}.ui-helper-reset{font-size:13px}#attach_to_post_tabs{border:0;background:0 0;height:100%;overflow:hidden;padding:0;position:relative;visibility:visible}#attach_to_post_tabs #attach_to_post_tabs.ui-tabs-hide{display:block!important;visibility:hidden;position:absolute;top:-5000px}#attach_to_post_tabs h3{text-transform:uppercase;color:#666;margin-top:0}h3#choose_display{margin-bottom:24px}#attach_to_post_tabs .main_menu_tab{padding:0;position:absolute;left:220px;right:0;top:0;bottom:0}#attach_to_post_tabs.ngg_atp_ios_detected{overflow-y:scroll;-webkit-overflow-scrolling:touch}#attach_to_post_tabs .ui-widget-header{border:0;border-bottom:1px solid #dfdfdf;background:0 0}iframe{width:100%;min-height:100%;border:none;padding:0;margin:0;background:0 0}.chrome_70_hack_frames{z-index:100000000!important}.chrome_70_hack_noframes{z-index:0!important}.clear{clear:both;float:none}table{font-size:13px}.select2-search input{width:100%!important}.select2-result-label{white-space:nowrap}.select2-results{font-family:'segoe ui',Arial,sans-serif;font-size:13px}.select2-container a{color:#444!important}#ngg_page_content .ngg_page_content_main .select2-container{width:100%!important;max-width:500px!important}#attach_to_post_tabs .ui-tabs-icon{background:#133148;border-right:1px solid #9cbe1b;box-sizing:border-box;color:#fff;font-family:Lato,sans-serif;float:none;font-size:20px;font-weight:700;height:100%;letter-spacing:1px;line-height:60px;margin-bottom:0;position:fixed;padding:10px 25px 30px 10px;text-transform:uppercase;width:220px;padding:0}#attach_to_post_tabs img.attach_to_post_logo{height:45px;padding:20px 0 10px;float:right;margin-right:26px}#attach_to_post_tabs .ui-tabs-nav{border:none;background:0 0;padding:0;margin-top:90px;list-style:none}#attach_to_post_tabs .ui-tabs-nav li{background:0 0;border:none;display:block;height:auto;margin:0;padding:0;width:100%;border-radius:0;box-sizing:border-box;border-bottom:1px solid #344a59;padding:24px 30px 24px 20px}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active{background:#2b4d65;background:#9dbd1b}#attach_to_post_tabs .ui-tabs-nav li.active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-focus,#attach_to_post_tabs .ui-tabs-nav li:focus{outline:0}#attach_to_post_tabs ul.ui-tabs-nav li:nth-of-type(1){list-style:none;border-top:1px solid #344a59}#attach_to_post_tabs:not(.ngg_atp_ios_detected) ul.ui-tabs-nav li:nth-of-type(2){list-style:none}#attach_to_post_tabs:not(.ngg_atp_ios_detected) ul.ui-tabs-nav li:nth-of-type(1) a{display:list-item}#attach_to_post_tabs ul.ui-tabs-nav li:nth-of-type(2) a{display:list-item}#attach_to_post_tabs .ui-tabs-nav li a{color:#fff;float:right;font-size:16px;letter-spacing:0;line-height:1;padding:10px 5px 5px 0!important;text-transform:none;font-family:lato,sans-serif;text-transform:uppercase;font-size:13px;letter-spacing:1px;font-weight:700;padding:0!important;font-size:12px;letter-spacing:1.2px}#attach_to_post_tabs .ui-tabs-nav li.ui-state-disabled a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:pointer}#attach_to_post_tabs .ui-tabs-nav li a.active_tab::before{border-right:solid .75em #fff;border-top:solid 1.2em transparent;border-bottom:solid 1.2em transparent;content:'';position:absolute;top:16px;right:-3px}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{color:#fff;font-weight:800}#displayed_tab.main_menu_tab{overflow-y:scroll;overflow-x:hidden}#displayed_tab #ngg_page_content{margin:0;width:100%}#displayed_tab #attach_to_post_tabs .ngg_page_content_header{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu{background:0 0;border:none;padding:10px 20px 10px 0;float:none;height:25px;margin-top:0;width:auto;border-bottom:1px solid #ddd;background:#fafafa}#displayed_tab #ngg_page_content .ngg_page_content_menu a,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{border:none;color:#888;display:inline;font-size:14px;font-weight:400;text-decoration:none;line-height:25px;padding:15px 20px;font-size:12px;background:0 0}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{background:0 0;font-weight:700;color:#123248;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:2px solid #fff;background:#fff}#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a:before{display:none}#displayed_tab #ngg_page_content .ngg_page_content_main{padding:30px;width:100%;box-shadow:none}#displayed_tab #ngg_page_content.ngg_settings_page{border:none}#displayed_tab .ngg_igw_promo{display:block!important;padding:10px 20px;position:relative;top:-187px;left:608px;background:#123248;color:#fff;border-bottom:5px solid #9ebc1b;font-family:Lato,sans-serif;letter-spacing:.5px;box-sizing:border-box;width:200px;height:172px;margin-bottom:-170px}#displayed_tab .ngg_igw_promo a{text-decoration:none;font-weight:600}#displayed_tab .ngg_igw_coupon{font-size:12px;margin-top:10px;margin-top:47px;color:#7298b1}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video{display:block!important;position:absolute;left:175px;top:69px}#displayed_tab .ngg_igw_video_open{background:#9ebc1b;color:#fff;cursor:pointer;font-family:Lato,sans-serif;font-size:13px;margin:0;padding:8px 10px}#displayed_tab .ngg_igw_video_inner{display:none;box-shadow:0 0 10px 5px rgba(0,0,0,.2);background:#fff}#displayed_tab .ngg_igw_video_close{color:#9ebc1b;width:100%;height:50px;display:block;background:#123248;text-align:center;line-height:50px;font-size:15px;font-weight:700;cursor:pointer;font-family:Lato,sans-serif;letter-spacing:.5px;background:#9ebc1b;color:#fff}#displayed_tab .ngg_igw_video iframe{width:525px;height:295px!important;min-height:auto;margin-bottom:-3px}#displayed_tab #displayed_gallery_source{width:400px}#displayed_tab #display_tip{color:rgba(42,52,61,.6);display:block;font-size:14px;width:960px;max-width:100%;padding:10px 0 0}#displayed_tab #slug_configuration{display:none}#displayed_tab #slug_configuration td,#displayed_tab #source_configuration td{vertical-align:top;padding:4px 0!important;min-width:200px}#displayed_tab #source_configuration label{color:#777!important;font-size:13px!important}#attach_to_post_tabs #displayed_tab #ngg_page_content #source_configuration tr td:first-of-type{white-space:normal;line-height:1.2;width:265px}#displayed_tab #ngg_page_content .select2-container{width:250px!important;line-height:20px}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#9fbb1a}#displayed_tab #slug_configuration #slug_label{width:52px}#displayed_tab #slug_configuration #slug_column input[type=text]{width:498px}#displayed_tab #display_type_selector{margin-top:14px}#displayed_tab .display_type_preview{float:left;margin:0 5px 5px 0;border:1px solid #ddd;background:#fff;width:145px;height:170px}#displayed_tab .display_type_preview .image_container{width:100%;vertical-align:middle;text-align:center;font-size:12px;font-weight:500;padding:8px;box-sizing:border-box}#displayed_tab .display_type_preview .image_container img{margin-top:10px;margin-bottom:10px;box-sizing:border-box;max-width:100px}#displayed_tab .display_type_preview .image_container p{display:inline-block}.display_type_preview label>div{font-size:12px}#displayed_tab .select2-chosen{color:#666!important}#ngg_page_content #save_displayed_gallery.button{font-weight:700;height:50px!important;line-height:50px!important;padding:0 30px!important;font-size:13px}#display_settings_tab #display_settings_form table tr td:first-child{vertical-align:top;text-align:right;padding-right:7px;width:180px}#display_settings_tab #display_settings_form table td{text-align:left}#display_settings_tab #display_settings_form table textarea{height:60px}#display_settings_tab #display_settings_form input[type=number],#display_settings_tab #display_settings_form input[type=text],#display_settings_tab #display_settings_form select,#display_settings_tab #display_settings_form textarea{width:157px}#display_settings_tab #display_settings_form .ngg_slideshow_gallery_height,#display_settings_tab #display_settings_form .ngg_slideshow_gallery_width,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_height,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_width{width:65px!important}#display_settings_tab #display_settings_form .nextgen_settings_colorpicker{width:85px!important;text-align:center}h3#preview_tab{margin-bottom:0}#preview_tab_content{padding:10px 0}#preview_tab_content a{text-decoration:none;font-weight:300}#preview_tab_content .previewed_entity{width:100%;border-bottom:solid 1px #e0e0d6;background-color:#fafaf0}#preview_tab_content .previewed_entity .container{padding-top:15px}#preview_tab_content .previewed_entity.header{background-color:#f0f0e6;padding-bottom:5px;padding-top:5px}#preview_tab_content .header label{font-size:12px;color:#649664;font-weight:600}#preview_tab_content .ui-sortable-helper{background:0 0}#preview_tab_content ul{list-style-type:none;display:block;padding:0;position:relative;margin-top:20px}#preview_tab_content .inclusion_checkbox{margin-right:7px;display:block;float:left}#preview_tab_content .preview_item{background-color:#fff;width:100px;padding:10px 10px 30px 10px;margin:0 5px 5px 0;border:solid 1px #eee;display:block;vertical-align:middle;text-align:center;position:relative}#preview_tab_content .image_container{background-repeat:no-repeat;background-position:center;background-size:cover;display:block;width:100%;height:75px}#preview_tab_content .image_container img{border:0}#preview_tab_content #entity_list li{float:left}#preview_tab_content #entity_list .ui-state-default{background:0 0;border:none}#preview_tab_content .placeholder{background-color:#e0ddc1;position:relative}#preview_tab_content #entity_list .exclude_container{background:#fff;display:block;text-align:center;margin:0 auto;color:#000;font-weight:400;height:1.4em;line-height:1.1em;font-size:.8em;position:absolute;bottom:.2em;left:0;width:100%;padding:5px 0}#preview_tab_content #entity_list .exclude_container input{vertical-align:middle;line-height:1.2em;margin:0 .5em}#preview_tab_content .header_row{margin-bottom:5px;font-weight:300}#preview_tab_content .header_row strong{width:70px;display:inline-block}#preview_tab_content .header_row .separator{display:inline-block;margin:0 5px}#preview_tab_content .header_row .selected{font-weight:700}#preview_tab_content #entity_list li.clear{float:none;clear:both}#preview_tab_content .refresh_button{float:right}@media (max-width:1120px){#displayed_tab .ngg_igw_promo{position:static;width:602px;height:125px;max-width:100%;margin-bottom:10px}#displayed_tab .ngg_igw_coupon{margin-top:10px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video,#displayed_tab .ngg_igw_video_inner{display:none!important}}@media (max-width:800px){#attach_to_post_tabs .ui-tabs-icon{width:100%;position:static;border-right:none;border-bottom:3px solid #9fbb1a;text-align:center;height:150px;padding:20px}#attach_to_post_tabs img.attach_to_post_logo{display:none}#attach_to_post_tabs .ui-tabs-nav{margin-top:0}#attach_to_post_tabs .ui-tabs-nav li{padding:5px;list-style:none!important;border-bottom:none;border-top:none!important}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active{background:0 0}#attach_to_post_tabs:not(.ngg_atp_ios_detected) .ui-tabs-nav li:nth-of-type(2)::after{display:none}#attach_to_post_tabs .ui-tabs-nav li a{float:none;padding:0!important;font-weight:400}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{color:#9ebc1b}#attach_to_post_tabs .ui-tabs-nav li a.active_tab::before{display:none}#attach_to_post_tabs .main_menu_tab{margin-left:0;min-height:auto;position:absolute;top:150px;right:0;left:0;bottom:0;height:auto}#displayed_tab #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#displayed_tab #slug_configuration tr,#displayed_tab #source_configuration tr{margin-bottom:24px}#ngg_page_content #save_displayed_gallery.button{position:static;margin-left:0;padding:0}}@media (max-width:781px){#attach_to_post_tabs.ngg_atp_ios_detected .ui-tabs-nav li:nth-of-type(1)::after{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td{width:100%!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration{display:table!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration tbody{display:table-row-group!important}#displayed_tab #ngg_page_content .responsive-menu-icon{padding:10px 0 15px!important}}@media (max-width:400px){#displayed_tab .display_type_preview{float:none;margin:20px auto;width:170px}} \ No newline at end of file +body,html,iframe{width:100%;padding:0}.ui-helper-reset,body,html,table{font-size:13px}body,html{height:100%;margin:0;overflow:hidden}body{position:absolute;visibility:hidden;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;height:100%}.entity_errors{color:red}.entity_errors ul{margin-left:30px}.entity_errors ul li{list-style-type:disc}#attach_to_post_tabs{border:0;background:0 0;height:100%;overflow:hidden;padding:0;position:relative;visibility:visible}#attach_to_post_tabs #attach_to_post_tabs.ui-tabs-hide{display:block!important;visibility:hidden;position:absolute;top:-5000px}#attach_to_post_tabs h3{text-transform:uppercase;color:#666;margin-top:0}h3#choose_display{margin-bottom:24px}#attach_to_post_tabs .main_menu_tab{padding:0;position:absolute;left:220px;right:0;top:0;bottom:0}#attach_to_post_tabs.ngg_atp_ios_detected{overflow-y:scroll;-webkit-overflow-scrolling:touch}#attach_to_post_tabs .ui-widget-header{border:0;border-bottom:1px solid #dfdfdf;background:0 0}iframe{min-height:100%;border:none;margin:0;background:0 0}.chrome_70_hack_frames{z-index:100000000!important}.chrome_70_hack_noframes{z-index:0!important}.clear{clear:both;float:none}.select2-search input{width:100%!important}.select2-result-label{white-space:nowrap}.select2-results{font-family:'segoe ui',Arial,sans-serif;font-size:13px}.select2-container a{color:#444!important}#ngg_page_content .ngg_page_content_main .select2-container{width:100%!important;max-width:500px!important}#attach_to_post_tabs .ui-tabs-icon{background:#133148;border-right:1px solid #9cbe1b;box-sizing:border-box;color:#fff;font-family:Lato,sans-serif;float:none;font-size:20px;font-weight:700;height:100%;letter-spacing:1px;line-height:60px;margin-bottom:0;position:fixed;text-transform:uppercase;width:220px;padding:0}#attach_to_post_tabs img.attach_to_post_logo{height:45px;padding:20px 0 10px;float:right;margin-right:26px}#attach_to_post_tabs .ui-tabs-nav{border:none;background:0 0;padding:0;margin-top:90px;list-style:none}#attach_to_post_tabs .ui-tabs-nav li{background:0 0;border:none;display:block;height:auto;margin:0;width:100%;border-radius:0;box-sizing:border-box;border-bottom:1px solid #344a59;padding:24px 30px 24px 20px}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active{background:#9dbd1b}#attach_to_post_tabs .ui-tabs-nav li.active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-active,#attach_to_post_tabs .ui-tabs-nav li.ui-state-focus,#attach_to_post_tabs .ui-tabs-nav li:focus{outline:0}#attach_to_post_tabs ul.ui-tabs-nav li:nth-of-type(1){list-style:none;border-top:1px solid #344a59}#attach_to_post_tabs:not(.ngg_atp_ios_detected) ul.ui-tabs-nav li:nth-of-type(2){list-style:none}#attach_to_post_tabs ul.ui-tabs-nav li:nth-of-type(2) a,#attach_to_post_tabs:not(.ngg_atp_ios_detected) ul.ui-tabs-nav li:nth-of-type(1) a{display:list-item}#attach_to_post_tabs .ui-tabs-nav li a{color:#fff;float:right;line-height:1;font-family:lato,sans-serif;text-transform:uppercase;font-weight:700;padding:0!important;font-size:12px;letter-spacing:1.2px}#attach_to_post_tabs .ui-tabs-nav li.ui-state-disabled a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active a,#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:pointer}#attach_to_post_tabs .ui-tabs-nav li a.active_tab::before{border-right:solid .75em #fff;border-top:solid 1.2em transparent;border-bottom:solid 1.2em transparent;content:'';position:absolute;top:16px;right:-3px}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{color:#fff;font-weight:800}#displayed_tab.main_menu_tab{overflow-y:scroll;overflow-x:hidden}#displayed_tab #ngg_page_content{margin:0;width:100%}#displayed_tab #attach_to_post_tabs .ngg_page_content_header{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu{border:none;padding:10px 20px 10px 0;float:none;height:25px;margin-top:0;width:auto;border-bottom:1px solid #ddd;background:#fafafa}#displayed_tab #ngg_page_content .ngg_page_content_menu a,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{border:none;color:#888;display:inline;font-weight:400;text-decoration:none;line-height:25px;padding:15px 20px;font-size:12px;background:0 0}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{font-weight:700;color:#123248;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:2px solid #fff;background:#fff}#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after,#displayed_tab #ngg_page_content .ngg_page_content_menu a:before{display:none}#displayed_tab #ngg_page_content .ngg_page_content_main{padding:30px;width:100%;box-shadow:none}#displayed_tab #ngg_page_content.ngg_settings_page{border:none}#displayed_tab .ngg_igw_promo{display:block!important;padding:10px 20px;position:relative;top:-187px;left:608px;background:#123248;color:#fff;border-bottom:5px solid #9ebc1b;font-family:Lato,sans-serif;letter-spacing:.5px;box-sizing:border-box;width:200px;height:172px;margin-bottom:-170px}#displayed_tab .ngg_igw_promo a{text-decoration:none;font-weight:600}#displayed_tab .ngg_igw_coupon{font-size:12px;margin-top:47px;color:#7298b1}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video{display:block!important;position:absolute;left:175px;top:69px}#displayed_tab .ngg_igw_video_open{background:#9ebc1b;color:#fff;cursor:pointer;font-family:Lato,sans-serif;font-size:13px;margin:0;padding:8px 10px}#displayed_tab .ngg_igw_video_inner{display:none;box-shadow:0 0 10px 5px rgba(0,0,0,.2);background:#fff}#displayed_tab .ngg_igw_video_close{width:100%;height:50px;display:block;text-align:center;line-height:50px;font-size:15px;font-weight:700;cursor:pointer;font-family:Lato,sans-serif;letter-spacing:.5px;background:#9ebc1b;color:#fff}#displayed_tab .ngg_igw_video iframe{width:525px;height:295px!important;min-height:auto;margin-bottom:-3px}#displayed_tab #displayed_gallery_source{width:400px}#displayed_tab #display_tip{color:rgba(42,52,61,.6);display:block;font-size:14px;width:960px;max-width:100%;padding:10px 0 0}#displayed_tab #slug_configuration{display:none}#displayed_tab #slug_configuration td,#displayed_tab #source_configuration td{vertical-align:top;padding:4px 0!important;min-width:200px}#displayed_tab #source_configuration label{color:#777!important;font-size:13px!important}#attach_to_post_tabs #displayed_tab #ngg_page_content #source_configuration tr td:first-of-type{white-space:normal;line-height:1.2;width:265px}#displayed_tab #ngg_page_content .select2-container{width:250px!important;line-height:20px}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#9fbb1a}#displayed_tab #slug_configuration #slug_label{width:52px}#displayed_tab #slug_configuration #slug_column input[type=text]{width:498px}#displayed_tab #display_type_selector{margin-top:14px}#displayed_tab .display_type_preview{float:left;margin:0 5px 5px 0;border:1px solid #ddd;background:#fff;width:145px;height:170px}#displayed_tab .display_type_preview .image_container{width:100%;vertical-align:middle;text-align:center;font-size:12px;font-weight:500;padding:8px;box-sizing:border-box}#displayed_tab .display_type_preview .image_container img{margin-top:10px;margin-bottom:10px;box-sizing:border-box;max-width:100px}#displayed_tab .display_type_preview .image_container p{display:inline-block}.display_type_preview label>div{font-size:12px}#displayed_tab .select2-chosen{color:#666!important}#ngg_page_content #save_displayed_gallery.button{font-weight:700;height:50px!important;line-height:50px!important;padding:0 30px!important;font-size:13px}#save_displayed_gallery:disabled{background:gray!important}#display_settings_tab #display_settings_form table tr td:first-child{vertical-align:top;text-align:right;padding-right:7px;width:180px}#display_settings_tab #display_settings_form table td{text-align:left}#display_settings_tab #display_settings_form table textarea{height:60px}#display_settings_tab #display_settings_form input[type=number],#display_settings_tab #display_settings_form input[type=text],#display_settings_tab #display_settings_form select,#display_settings_tab #display_settings_form textarea{width:157px}#display_settings_tab #display_settings_form .ngg_slideshow_gallery_height,#display_settings_tab #display_settings_form .ngg_slideshow_gallery_width,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_height,#display_settings_tab #display_settings_form .ngg_thumbnail_dimension_width{width:65px!important}#display_settings_tab #display_settings_form .nextgen_settings_colorpicker{width:85px!important;text-align:center}h3#preview_tab{margin-bottom:0}#preview_tab_content{padding:10px 0}#preview_tab_content a{text-decoration:none;font-weight:300}#preview_tab_content .previewed_entity{width:100%;border-bottom:solid 1px #E0E0D6;background-color:#FAFAF0}#preview_tab_content .previewed_entity .container{padding-top:15px}#preview_tab_content .previewed_entity.header{background-color:#F0F0E6;padding-bottom:5px;padding-top:5px}#preview_tab_content .header label{font-size:12px;color:#649664;font-weight:600}#preview_tab_content .ui-sortable-helper{background:0 0}#preview_tab_content ul{list-style-type:none;display:block;padding:0;position:relative;margin-top:20px}#preview_tab_content .inclusion_checkbox{margin-right:7px;display:block;float:left}#preview_tab_content .preview_item{background-color:#fff;width:100px;padding:10px 10px 30px;margin:0 5px 5px 0;border:1px solid #eee;display:block;vertical-align:middle;text-align:center;position:relative}#preview_tab_content .image_container{background-repeat:no-repeat;background-position:center;background-size:cover;display:block;width:100%;height:75px}#preview_tab_content .image_container img{border:0}#preview_tab_content #entity_list li{float:left}#preview_tab_content #entity_list .ui-state-default{background:0 0;border:none}#preview_tab_content .placeholder{background-color:#e0ddc1;position:relative}#preview_tab_content #entity_list .exclude_container{background:#fff;display:block;text-align:center;margin:0 auto;color:#000;font-weight:400;height:1.4em;line-height:1.1em;font-size:.8em;position:absolute;bottom:.2em;left:0;width:100%;padding:5px 0}#preview_tab_content #entity_list .exclude_container input{vertical-align:middle;line-height:1.2em;margin:0 .5em}#preview_tab_content .header_row{margin-bottom:5px;font-weight:300}#preview_tab_content .header_row strong{width:70px;display:inline-block}#preview_tab_content .header_row .separator{display:inline-block;margin:0 5px}#preview_tab_content .header_row .selected{font-weight:700}#preview_tab_content #entity_list li.clear{float:none;clear:both}#preview_tab_content .refresh_button{float:right}@media (max-width:1120px){#displayed_tab .ngg_igw_promo{position:static;width:602px;height:125px;max-width:100%;margin-bottom:10px}#displayed_tab .ngg_igw_coupon{margin-top:10px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div.ngg_igw_video,#displayed_tab .ngg_igw_video_inner{display:none!important}}@media (max-width:800px){#attach_to_post_tabs .ui-tabs-nav li a.active_tab::before,#attach_to_post_tabs img.attach_to_post_logo,#attach_to_post_tabs:not(.ngg_atp_ios_detected) .ui-tabs-nav li:nth-of-type(2)::after{display:none}#attach_to_post_tabs .ui-tabs-nav li.ui-tabs-active,#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#attach_to_post_tabs .ui-tabs-icon{width:100%;position:static;border-right:none;border-bottom:3px solid #9fbb1a;text-align:center;height:150px;padding:20px}#attach_to_post_tabs .ui-tabs-nav{margin-top:0}#attach_to_post_tabs .ui-tabs-nav li{padding:5px;list-style:none!important;border-bottom:none;border-top:none!important}#attach_to_post_tabs .ui-tabs-nav li a{float:none;padding:0!important;font-weight:400}#attach_to_post_tabs .ui-tabs-nav li a.active_tab{color:#9ebc1b}#attach_to_post_tabs .main_menu_tab{margin-left:0;min-height:auto;position:absolute;top:150px;right:0;left:0;bottom:0;height:auto}#displayed_tab #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#displayed_tab #slug_configuration tr,#displayed_tab #source_configuration tr{margin-bottom:24px}#ngg_page_content #save_displayed_gallery.button{position:static;margin-left:0;padding:0}}@media (max-width:781px){#attach_to_post_tabs.ngg_atp_ios_detected .ui-tabs-nav li:nth-of-type(1)::after{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td{width:100%!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration{display:table!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main #source_configuration tbody{display:table-row-group!important}#displayed_tab #ngg_page_content .responsive-menu-icon{padding:10px 0 15px!important}}@media (max-width:400px){#displayed_tab .display_type_preview{float:none;margin:20px auto;width:170px}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css index db0cd0655..c45f52303 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.css @@ -148,20 +148,21 @@ * placeholder is properly styled for Gutenberg. */ div[aria-label="Block: Classic"] .nggPlaceholder { + padding: 30px 30px 65px 30px; + text-align: center; background-color: #143650; box-sizing: border-box; - border-bottom: 5px solid #9fbb1a; - border-radius: 3px; - box-shadow: 0 0 4px 1px rgba(0,0,0,.05); - color: #9fbb1a; + border-radius: 2px; font-family: sans-serif; font-size: 20px; - height: 200px; - margin: 5px; + color: #fff; + color: #9fbb1a; + border-top: 5px solid #b8d330; outline: none !important; - padding: 30px 30px 50px 30px; - text-align: center; - width: 100%; + box-shadow: 0 0 4px 1px rgba(0,0,0,.05); + margin-top: 0; + position: relative; + z-index: 2; } div[aria-label="Block: Classic"] .nggPlaceholder h3 { @@ -173,26 +174,30 @@ div[aria-label="Block: Classic"] .nggPlaceholder h3 { margin: 24px 0 0 0; } -div[aria-label="Block: Classic"] .nggPlaceholderButton:hover { - margin: 0; - opacity: .8; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; - color: #9fbb1a; -} - div[aria-label="Block: Classic"] .nggPlaceholderButton { + background: #9ebd00 !important; + border-radius: 2px; + border: none !important; + box-shadow: none !important; + color: #fff !important; + display: inline-block !important; font-size: 13px; - font-size: 1.3rem; - margin: 0; - opacity: 1.0; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - color: #bbb; - padding: 4px 0px 0 12px; - color: rgba(159, 187, 26, 0.7) + font-weight: bold; + font-family: Lato, sans-serif !important !important; + height: 36px !important; + line-height: 36px !important; + letter-spacing: 1.2px; + margin: 2px; + padding: 0; + width: 110px; + text-align: center; + text-transform: uppercase !important; + text-shadow: none !important; + cursor: pointer; } -div[aria-label="Block: Classic"] .nggPlaceholderButton.nggIgwRemove { - border-left: 1px solid rgba(204, 204, 204, 0.4); +div[aria-label="Block: Classic"] .nggPlaceholderButton:hover { + background: #a5c31a !important; } @media (max-width: 781px) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css index 7ee2fc123..0e581d305 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/attach_to_post_dialog.min.css @@ -1 +1 @@ -#TB_window.ngg_tb_window{box-shadow:0 0 20px 10px rgba(0,0,0,.5)}.ngg_tb_window #TB_iframeContent{height:100.1%!important}.ngg_tb_window #TB_title{height:0!important;border:none!important}.ngg_tb_window #TB_closeWindowButton{background:0 0;top:10px;right:20px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window .tb-close-icon{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window #TB_closeWindowButton:hover .tb-close-icon{color:#fff}.ngg_tb_window .tb-close-icon:before{font:normal 18px dashicons}#ngg_attach_to_post_dialog{width:95%!important;left:2.5%!important}#ngg_attach_to_post_dialog-head #ngg_attach_to_post_dialog-title{display:none}#ngg_attach_to_post_dialog-body{width:100%!important}#ngg_attach_to_post_dialog-head{min-height:0;height:0;border:none}#ngg_attach_to_post_dialog-head .mce-close{position:absolute;background:0 0;top:10px!important;right:20px!important;z-index:2}#ngg_attach_to_post_dialog-head .mce-close i,#ngg_attach_to_post_dialog-head .mce-close:focus i{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}#ngg_attach_to_post_dialog-head .mce-close:focus i,#ngg_attach_to_post_dialog-head .mce-close:hover i{color:#fff}#ngg_attach_to_post_dialog-head .mce-close i:before{font:normal 17px dashicons;color:#fff;margin:1.2px 0 0 -8px}.ngg_attach_to_post_window{position:relative;border:none!important}.ngg_attach_to_post_window .mceBottom,.ngg_attach_to_post_window .mceCenter,.ngg_attach_to_post_window .mceLeft,.ngg_attach_to_post_window .mceResize,.ngg_attach_to_post_window .mceRight,.ngg_attach_to_post_window .mceTop{background:0 0!important;border:none!important}.ngg_attach_to_post_window .mceMiddle span{padding-top:6px!important}.ngg_attach_to_post_window .mceTop{display:block!important;height:0!important;font-size:0!important}.ngg_attach_to_post_window .mceClose{background:url(uploader-icons.png)!important;display:block!important;margin:0!important;padding:0!important;width:15px!important;height:15px!important;background-position:-100px 0!important;position:absolute!important;top:44px!important;right:30px!important}#ngg_attach_to_post_dialog-body{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:rgba(255,255,255,.6);border-top:none}div[aria-label="Block: Classic"] .nggPlaceholder{background-color:#143650;box-sizing:border-box;border-bottom:5px solid #9fbb1a;border-radius:3px;box-shadow:0 0 4px 1px rgba(0,0,0,.05);color:#9fbb1a;font-family:sans-serif;font-size:20px;height:200px;margin:5px;outline:0!important;padding:30px 30px 50px 30px;text-align:center;width:100%}div[aria-label="Block: Classic"] .nggPlaceholder h3{color:#fff;font-family:Lato,sans-serif;font-size:16px;font-size:1.6rem;font-weight:600;margin:24px 0 0 0}div[aria-label="Block: Classic"] .nggPlaceholderButton:hover{margin:0;opacity:.8;color:#9fbb1a}div[aria-label="Block: Classic"] .nggPlaceholderButton{font-size:13px;font-size:1.3rem;margin:0;opacity:1;color:#bbb;padding:4px 0 0 12px;color:rgba(159,187,26,.7)}div[aria-label="Block: Classic"] .nggPlaceholderButton.nggIgwRemove{border-left:1px solid rgba(204,204,204,.4)}@media (max-width:781px){#TB_window.ngg_tb_window{position:absolute!important}} \ No newline at end of file +#TB_window.ngg_tb_window{box-shadow:0 0 20px 10px rgba(0,0,0,.5)}.ngg_tb_window #TB_iframeContent{height:100.1%!important}.ngg_tb_window #TB_title{height:0!important;border:none!important}.ngg_tb_window #TB_closeWindowButton{background:0 0;top:10px;right:20px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window .tb-close-icon{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}.ngg_tb_window #TB_closeWindowButton:focus .tb-close-icon,.ngg_tb_window #TB_closeWindowButton:hover .tb-close-icon{color:#fff}.ngg_tb_window .tb-close-icon:before{font:400 18px dashicons}#ngg_attach_to_post_dialog{width:95%!important;left:2.5%!important}#ngg_attach_to_post_dialog-head #ngg_attach_to_post_dialog-title{display:none}#ngg_attach_to_post_dialog-body{width:100%!important}#ngg_attach_to_post_dialog-head{min-height:0;height:0;border:none}#ngg_attach_to_post_dialog-head .mce-close{position:absolute;background:0 0;top:10px!important;right:20px!important;z-index:2}#ngg_attach_to_post_dialog-head .mce-close i,#ngg_attach_to_post_dialog-head .mce-close:focus i{color:#fff;border:none;box-shadow:none;background:#9fbb1a;border-radius:50%;padding:1px;height:20px;width:20px;font-size:12px}#ngg_attach_to_post_dialog-head .mce-close:focus i,#ngg_attach_to_post_dialog-head .mce-close:hover i{color:#fff}#ngg_attach_to_post_dialog-head .mce-close i:before{font:400 17px dashicons;color:#fff;margin:1.2px 0 0 -8px}.ngg_attach_to_post_window{position:relative;border:none!important}.ngg_attach_to_post_window .mceBottom,.ngg_attach_to_post_window .mceCenter,.ngg_attach_to_post_window .mceLeft,.ngg_attach_to_post_window .mceResize,.ngg_attach_to_post_window .mceRight,.ngg_attach_to_post_window .mceTop{background:0 0!important;border:none!important}.ngg_attach_to_post_window .mceMiddle span{padding-top:6px!important}.ngg_attach_to_post_window .mceTop{display:block!important;height:0!important;font-size:0!important}.ngg_attach_to_post_window .mceClose{background:url(uploader-icons.png) -100px 0!important;display:block!important;margin:0!important;padding:0!important;width:15px!important;height:15px!important;position:absolute!important;top:44px!important;right:30px!important}#ngg_attach_to_post_dialog-body{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;background:rgba(255,255,255,.6);border-top:none}div[aria-label="Block: Classic"] .nggPlaceholder{padding:30px 30px 65px;text-align:center;background-color:#143650;box-sizing:border-box;border-radius:2px;font-family:sans-serif;font-size:20px;color:#9fbb1a;border-top:5px solid #b8d330;outline:0!important;box-shadow:0 0 4px 1px rgba(0,0,0,.05);margin-top:0;position:relative;z-index:2}div[aria-label="Block: Classic"] .nggPlaceholder h3{color:#fff;font-family:Lato,sans-serif;font-size:16px;font-size:1.6rem;font-weight:600;margin:24px 0 0}div[aria-label="Block: Classic"] .nggPlaceholderButton{background:#9ebd00!important;border-radius:2px;border:none!important;box-shadow:none!important;color:#fff!important;display:inline-block!important;font-size:13px;font-weight:700;font-family:Lato,sans-serif!important!important;height:36px!important;line-height:36px!important;letter-spacing:1.2px;margin:2px;padding:0;width:110px;text-align:center;text-transform:uppercase!important;text-shadow:none!important;cursor:pointer}div[aria-label="Block: Classic"] .nggPlaceholderButton:hover{background:#a5c31a!important}@media (max-width:781px){#TB_window.ngg_tb_window{position:absolute!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js index 151594989..d85bf5f12 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.js @@ -203,16 +203,6 @@ jQuery(function($){ // Create the select2 drop-down this.select_tag.$el.select2(this.select2_opts); - // Ensure that values are pre-populated - if (this.options.multiple) { - var selected = []; - _.each(this.collection.selected_ids(), function(id){ - selected.push(id.toString()); - }); - if (selected.length == 0) selected = ''; - this.select_tag.$el.select2('val', selected); - } - return this; } }); @@ -298,7 +288,7 @@ jQuery(function($){ * Ngg.DisplayTab.Models.Displayed_Gallery * Represents the displayed gallery being edited or created by the Display Tab **/ - Ngg.DisplayTab.Models.Displayed_Gallery = Backbone.Model.extend({ + Ngg.DisplayTab.Models.Displayed_Gallery = Backbone.Model.extend({ defaults: { source: null, container_ids: [], @@ -310,17 +300,30 @@ jQuery(function($){ slug: null }, - to_shortcode: function(){ + to_shortcode: function() { retval = null; - var get_shortcode_attr= function(object, key){ + var get_shortcode_attr = function(object, key) { var val = object[key]; + + // Prevent default shortcode attributes from being included + if (typeof igw_data.shortcode_defaults[key] !== 'undefined' + && igw_data.shortcode_defaults[key] == val) { + val = null; + } + if (_.isArray(val)) { val = val.length > 0 ? val.join(',') : null; } if (val) { val = val.toString().replace('[', '['); val = val.toString().replace(']', ']'); + + // Some keys have aliases to be used when writing shortcodes + if (typeof igw_data.shortcode_attr_replacements[key] !== 'undefined') { + key = igw_data.shortcode_attr_replacements[key]; + } + return key + '="' + val +'"'; } }; @@ -331,8 +334,9 @@ jQuery(function($){ obj.display_type = display_type.get_shortcode_value(); // Convert the displayed gallery to a shortcode - var snippet = '[ngg_images'; + var snippet = '[ngg'; var val = null; + if ((val = get_shortcode_attr(obj, 'source'))) snippet += ' ' + val; if ((val = get_shortcode_attr(obj, 'container_ids'))) snippet += ' ' + val; if ((val = get_shortcode_attr(obj, 'entity_ids'))) snippet += ' ' + val; @@ -352,15 +356,21 @@ jQuery(function($){ 'ID' ]; - if (skipped.indexOf(key) > -1) continue; + if (skipped.indexOf(key) > -1) { + continue; + } else if (key == 'display_settings') { for (var display_key in obj[key]) { - if ((val = get_shortcode_attr(obj[key], display_key))) snippet += ' ' + val; + if ((val = get_shortcode_attr(obj[key], display_key))) { + snippet += ' ' + val; + } } } else { val = get_shortcode_attr(obj, key); - if (val) snippet += ' ' + val; + if (val) { + snippet += ' ' + val; + } } } @@ -498,15 +508,14 @@ jQuery(function($){ return success; }, - - get_shortcode_value: function(){ + get_shortcode_value: function() { var retval = this.id; - // TODO: Uncomment for a later version - // var aliases = this.get('aliases'); - // if (_.isArray(aliases) && aliases.length > 0) { - // retval = aliases[0]; - // } + var aliases = this.get('aliases'); + if (_.isArray(aliases) && aliases.length > 0) { + retval = aliases[0]; + } + return retval; } }); @@ -1468,27 +1477,41 @@ jQuery(function($){ clicked: function(){ this.set_display_settings(); - insert_into_editor(this.displayed_gallery.to_shortcode(), (this.displayed_gallery.id ? this.displayed_gallery.id : igw_data.shortcode_ref)); + var shortcode = this.displayed_gallery.to_shortcode(); + insert_into_editor(shortcode, (this.displayed_gallery.id ? this.displayed_gallery.id : igw_data.shortcode_ref)); + var editor = null + if ((editor = location.toString().match(/editor=([^\&]+)/)) && editor.length >= 2) { + top.tinyMCE.editors[editor[1]].fire('ngg-inserted', {shortcode: shortcode}) + } + close_attach_to_post_window(); }, - set_display_settings: function(){ + set_display_settings: function() { var display_type = this.displayed_gallery.get('display_type'); if (display_type) { // Collect display settings - var form = $("form[rel='"+display_type+"']"); - var display_settings = (function(item){ + var form = $("form[rel='" + display_type + "']"); + var defaults = form.data('defaults') + var display_settings = (function(item) { var obj = {}; $.each(item.serializeArray(), function(key, item) { var parts = item.name.split('['); var current_obj = obj; - for (var i=0; i<parts.length; i++) { + for (var i = 0; i < parts.length; i++) { var part = parts[i].replace(/\]$/, ''); + + // Skip settings that haven't been changed from the default + if (defaults[part] == item.value) { + return true; + } + if (!current_obj[part]) { - if (i == parts.length-1) + if (i == (parts.length - 1)) { current_obj[part] = item.value; - else + } else { current_obj[part] = {}; + } } current_obj = current_obj[part]; } @@ -1574,7 +1597,17 @@ jQuery(function($){ }, this); // Bind to the 'selected' event for the source, updating the displayed gallery - this.sources.on('selected', function(){ + this.sources.on('selected', function() { + + // It is possible for fast acting users to get an invalid shortcode: by changing gallery source and + // then rushing to the 'insert gallery' button it's possible for the state to be unchanged when the new + // shortcode is written thus 'leaving behind' the old displayed gallery without the newly chosen attr. + // This just temporarily disables that button for one second for the internal state to catch up. + $('#save_displayed_gallery').prop('disabled', true); + setTimeout(function() { + $('#save_displayed_gallery').prop('disabled', false); + }, 1000); + this.displayed_gallery.set('source', this.sources.selected_value()); // If the source changed, and it's not the set to the original value, then diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js index aa88f2188..efc87a298 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/display_tab.min.js @@ -1 +1 @@ -jQuery(function(e){var t={Models:{},Views:{}};t.Models.SelectableItems=Backbone.Collection.extend({selected:function(){return this.filter(function(e){return 1==e.get("selected")})},deselect_all:function(){this.each(function(e){e.set("selected",!1)})},selected_ids:function(){return _.pluck(this.selected(),"id")},select:function(e){_.isArray(e)||(e=[e]),this.each(function(t){_.indexOf(e,t.id)>=0&&t.set("selected",!0)}),this.trigger("selected")}}),t.Views.SelectTag=Backbone.View.extend({tagName:"select",collection:null,multiple:!1,value_field:"id",text_field:"title",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.collection.on("add",this.render_new_option,this),this.collection.on("remove",this.remove_existing_option,this),this.collection.on("reset",this.empty_list,this)},events:{change:"selection_changed"},empty_list:function(){this.$el.empty()},render_new_option:function(e){this.$el.append(new this.Option({model:e,value_field:this.value_field,text_field:this.text_field}).render().el)},remove_existing_option:function(e){this.$el.find("option[value='"+e.id+"']").remove()},selection_changed:function(){var t=_.map(this.$el.find(":selected"),function(t){return e(t).val()});this.collection.each(function(e){_.indexOf(t,e.id)>=0||_.indexOf(t,e.id.toString())>=0?e.set("selected",!0):e.set("selected",!1)}),this.collection.trigger("selected")},render:function(){return this.$el.empty(),this.multiple&&(this.$el.prop("multiple",!0),this.$el.attr("multiple","multiple")),this.collection.each(function(e){var t=new this.Option({model:e,value_field:this.value_field,text_field:this.text_field});this.$el.append(t.render().el)},this),this.width&&this.$el.width(this.width),this},Option:Backbone.View.extend({tagName:"option",model:null,initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change",this.render,this)},render:function(){var e=this;return this.$el.html(this.model.get(this.text_field).replace(/\\&/g,"&").replace(/\\'/g,"'")),this.$el.prop({value:"id"==this.value_field?this.model.id:this.model.get(this.value_field)}),1==e.model.get("selected")&&this.$el.prop("selected",!0).attr("selected","selected"),this}})}),t.Views.Chosen=Backbone.View.extend({tagName:"span",initialize:function(e){this.options=e||{},this.collection=this.options.collection,this.select_tag=new t.Views.SelectTag(this.options),this.collection.on("change",this.selection_changed,this)},selection_changed:function(e){_.isUndefined(e.changed.selected)&&this.render()},render:function(){if(this.$el.append(this.select_tag.render().$el),this.options.width&&this.select_tag.$el.width(this.options.width),this.select2_opts={placeholder:this.options.placeholder},this.select_tag.$el.select2(this.select2_opts),this.options.multiple){var e=[];_.each(this.collection.selected_ids(),function(t){e.push(t.toString())}),0==e.length&&(e=""),this.select_tag.$el.select2("val",e)}return this}}),t.DisplayTab={Models:{},Views:{},App:{}},t.Models.Remote_Collection=t.Models.SelectableItems.extend({fetch_limit:5e3,in_progress:!1,fetch_url:photocrati_ajax.url,action:"",extra_data:{},_create_request:function(e,t){var i=_.extend({},igw_data.sec_token,{action:this.action,limit:e||this.fetch_limit,offset:t||0});for(var s in this.extra_data){var l=this.extra_data[s];void 0===i[s]&&(i[s]={}),void 0!==l.toJSON&&(l=l.toJSON()),i[s]=_.extend(i[s],l)}return i},_add_item:function(e){this.push(e)},fetch:function(t,i){var s=this;this.in_progress=!0,e.post(this.fetch_url,this._create_request(t,i),function(e){"undefined"!=typeof _&&(_.isObject(e)||(e=JSON.parse(e)),e.items&&(_.each(e.items,function(e){s._add_item(e)}),e.total>=e.limit+e.offset?s.fetch(e.limit,e.offset+e.limit):(s.in_progress=!1,s.trigger("finished_fetching"))))})}}),t.DisplayTab.Models.Displayed_Gallery=Backbone.Model.extend({defaults:{source:null,container_ids:[],entity_ids:[],display_type:null,display_settings:{},exclusions:[],sortorder:[],slug:null},to_shortcode:function(){retval=null;var e=function(e,t){var i=e[t];if(_.isArray(i)&&(i=i.length>0?i.join(","):null),i)return i=i.toString().replace("[","["),i=i.toString().replace("]","]"),t+'="'+i+'"'},i=t.DisplayTab.instance.display_types.find_by_name_or_alias(this.get("display_type")),s=this.toJSON();s.display_type=i.get_shortcode_value();var l="[ngg_images",n=null;(n=e(s,"source"))&&(l+=" "+n),(n=e(s,"container_ids"))&&(l+=" "+n),(n=e(s,"entity_ids"))&&(l+=" "+n),(n=e(s,"exclusions"))&&(l+=" "+n),(n=e(s,"sortorder"))&&(l+=" "+n);for(var a in s){if(!(["source","container_ids","entity_ids","exclusions","sortorder","__defaults_set","id_field","post_category","ID"].indexOf(a)>-1))if("display_settings"==a)for(var r in s[a])(n=e(s[a],r))&&(l+=" "+n);else(n=e(s,a))&&(l+=" "+n)}return l+="]"}}),t.DisplayTab.Models.Source=Backbone.Model.extend({idAttribute:"name",defaults:{title:"",name:"",selected:!1}}),t.DisplayTab.Models.Source_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Source,selected_value:function(){var e=null,t=this.selected();return t.length>0&&(e=t[0].get("name")),e},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Gallery=Backbone.Model.extend({idAttribute:igw_data.gallery_primary_key,defaults:{title:"",name:""}}),t.DisplayTab.Models.Gallery_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Gallery,action:"get_existing_galleries"}),t.DisplayTab.Models.Album=Backbone.Model.extend({defaults:{title:"",name:""}}),t.DisplayTab.Models.Album_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Album,action:"get_existing_albums"}),t.DisplayTab.Models.Tag=Backbone.Model.extend({defaults:{title:""}}),t.DisplayTab.Models.Tag_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Tag,action:"get_existing_image_tags"}),t.DisplayTab.Models.Display_Type=Backbone.Model.extend({idAttribute:"name",defaults:{title:""},is_compatible_with_source:function(e){var t=!0;for(index in e.get("returns")){var i=e.get("returns")[index];if(_.indexOf(this.get("entity_types"),i)<0){t=!1;break}}return t},get_shortcode_value:function(){return this.id}}),t.DisplayTab.Models.Display_Type_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Display_Type,selected_value:function(){var e=this.selected();return e.length>0?e[0].get("name"):null},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Entity=Backbone.Model.extend({entity_id:function(){return this.get(this.get("id_field"))},is_excluded:function(){return current_value=this.get("exclude"),!_.isUndefined(current_value)&&(_.isBoolean(current_value)?current_value:0!=parseInt(current_value))},is_included:function(){return!this.is_excluded()},is_gallery:function(){return retval=!1,1==this.get("is_gallery")&&(retval=!0),retval},is_album:function(){return retval=!1,1==this.get("is_album")&&(retval=!0),retval},is_image:function(){return!this.is_album()&&!this.is_gallery()},alttext:function(){return this.is_image()?this.get("alttext"):this.is_gallery()?this.get("title"):this.is_album()?this.get("name"):void 0}}),t.DisplayTab.Models.Entity_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Entity,action:"get_displayed_gallery_entities",_add_item:function(e){e.exclude=1==parseInt(e.exclude),e.is_gallery=1==parseInt(e.is_gallery),e.is_album=1==parseInt(e.is_album),this.push(e)},entity_ids:function(){return this.map(function(e){return e.entity_id()})},included_ids:function(){return _.compact(this.map(function(e){if(e.is_included())return e.entity_id()}))},excluded_ids:function(){return _.compact(this.map(function(e){if(!e.is_included())return e.entity_id()}))}}),t.DisplayTab.Models.SortOrder=Backbone.Model.extend({}),t.DisplayTab.Models.SortOrder_Options=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.SortOrder}),t.DisplayTab.Models.SortDirection=Backbone.Model.extend({}),t.DisplayTab.Models.SortDirection_Options=Backbone.Collection.extend({model:t.DisplayTab.Models.SortDirection}),t.DisplayTab.Models.Slug=Backbone.Model.extend({}),t.DisplayTab.Views.Source_Config=Backbone.View.extend({el:"#source_configuration",selected_view:null,initialize:function(){this.sources=t.DisplayTab.instance.sources,this.sources.on("selected",this.render,this),_.bindAll(this,"render"),this.render()},render:function(){var e=new t.Views.Chosen({id:"source_select",collection:this.sources,placeholder:"Select a source",width:500}),i=_.template('<tr><td id="source_column"></td><td><label><%- sources %></label></td></tr>');this.$el.html(i(igw_data.i18n)),this.$el.find("#source_column").append(e.render().el);var s=this.sources.selected();if(s.length){var l=_.str.capitalize(s.pop().id)+"Source";if(void 0!==t.DisplayTab.Views[l]){var n=new t.DisplayTab.Views[l];this.$el.append(n.render().el)}}return this}}),t.DisplayTab.Views.Slug_Config=Backbone.View.extend({el:"#slug_configuration",selected_view:null,initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.slug=t.DisplayTab.instance.displayed_gallery.get("slug"),this.render()},render:function(){var t=this,i=e("<input>").prop({type:"text",name:"slug",value:this.slug,placeholder:igw_data.i18n.optional,id:"field_slug"});i.on("input",function(){e(this).val(e(this).val().replace(/\s|\?|\\|\/|&|=|\[|]|#/gm,"-")),t.displayed_gallery.set("slug",e(this).val())}),i.on("change",function(){e(this).val(e(this).val().replace(/^-*/gm,"").replace(/-*$/gm,"")),t.displayed_gallery.set("slug",e(this).val())});var s=_.template('<tr><td id="slug_label"><label for="field_slug" class="tooltip" title="<%- slug_tooltip %><"><<%- slug_label %></label></td><td id="slug_column"></td></tr>');return this.$el.append(s(igw_data.i18n)),this.$el.find("#slug_column").append(i),this}}),t.DisplayTab.Views.Display_Type_Selector=Backbone.View.extend({el:"#display_type_selector",initialize:function(){this.display_types=t.DisplayTab.instance.display_types,this.display_type_order_base=t.DisplayTab.instance.display_type_order_base,this.display_type_order_step=t.DisplayTab.instance.display_type_order_step,this.sources=t.DisplayTab.instance.sources,this.render()},selection_changed:function(t){var i=null;this.display_types.each(function(e){e.get("name")==t?(i=e,e.set("selected",!0)):e.set("selected",!1)}),e(".display_settings_form").each(function(){$this=e(this),$this.attr("rel")==t?$this.removeClass("hidden"):$this.addClass("hidden")})},render:function(){var t=this.sources.selected(),i=0;t=t.length>0&&t[0],this.$el.empty();var s=this.display_type_order_base,l=this.display_type_order_step;return this.display_types.each(function(n){if(t&&!n.is_compatible_with_source(t)){var a=e("#display_type_tab_content:visible");if(0==a.length)return;if("hidden"==a.css("visibility"))return}var r=new this.DisplayType;r.model=n,r.on("selected",this.selection_changed,this),this.display_types.selected_value()||(n.set("selected",!0),this.selection_changed(n.id));var o=n.get("view_order");o||(o=s);var d=Math.floor(o/l);i=d,this.$el.append(r.render().el)},this),this.$el.append('<li class="clear" style="height: 10px; list-style-type:none" />'),this},DisplayType:Backbone.View.extend({className:"display_type_preview",events:{click:"clicked"},clicked:function(e){this.trigger("selected",this.model.get("name"))},render:function(){var t=e('<label style="display: block; cursor: pointer;"/>').addClass("image_container"),i=this.model.get("installed_at_version"),s=photocrati_ajax.wp_plugins_url,l=this.model.get("preview_image_relpath");void 0===i&&(s=photocrati_ajax.wp_site_url,s=s.replace(/(.*)\/index\.php$/i,"$1"),0==l.indexOf("/nextgen-gallery")&&(s=photocrati_ajax.wp_plugins_url));var n=e("<img/>").attr({src:s+"/"+l,title:this.model.get("title"),alt:this.model.get("alt")}),a=e("<div/>"),r=e("<input/>").prop({type:"radio",value:this.model.get("name"),title:this.model.get("title"),name:"display_type",checked:this.model.get("selected")}),o=e("<br>");return t.append(a),t.append(n),t.append("<br>"),t.append(this.model.get("title").replace(/nextgen /gi,"")),a.append(r),a.append(o),this.$el.append(t),this}})}),t.DisplayTab.Views.Preview_Area=Backbone.View.extend({el:"#preview_area",initialize:function(){this.entities=t.DisplayTab.instance.entities,this.sources=t.DisplayTab.instance.sources,this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entity_list=e("<ul/>").attr("id","entity_list").append('<li class="clear"/>'),this.entities.on("add",this.render_entity,this),this.entities.on("remove",this.remove_entity,this),this.entities.on("reset",this.entities_reset,this),this.entities.on("change:sortorder",function(e){this.entities.remove(e,{silent:!0}),this.entities.add(e,{at:e.changed.sortorder,silent:!0}),this.displayed_gallery.set("sortorder",this.entities.entity_ids()),"undefined"!=typeof console&&void 0!==console.log&&console.log(this.entities.entity_ids()),this.displayed_gallery.set("order_by","sortorder")},this),this.sources.on("selected",this.render,this),this.render()},events:{opened:"entities_reset"},entities_reset:function(e){this.entities.reset(null,{silent:!0}),this.entity_list.empty().append('<li class="clear"/>'),this.entities.in_progress||this.entities.fetch()},render_entity:function(e){var t=new this.EntityElement({model:e});this.entity_list.find(".clear").before(t.render().$el),t.$el.css("visibility","hidden"),setTimeout(function(){t.$el.css("visibility","visible")},0),1==this.$el.find(".no_entities").length?this.render():this.entities.length>1&&this.entity_list.sortable("refresh")},remove_entity:function(e){var t=this.id=e.get("id_field")+"_"+e.entity_id();this.entity_list.find("#"+t).remove();this.entity_list.sortable("refresh"),0==this.entities.length&&this.render_no_images_notice()},render_no_images_notice:function(){this.$el.empty(),this.$el.append("<p class='no_entities'>"+igw_data.i18n.no_entities+"</p>")},render:function(){return this.$el.empty(),this.entities.length>0&&this.displayed_gallery.get("container_ids").length>0?(this.$el.append(new this.RefreshButton({entities:this.entities}).render().el),this.$el.append(new this.SortButtons({entities:this.entities,displayed_gallery:this.displayed_gallery,sources:this.sources}).render().el),this.$el.append(new this.ExcludeButtons({entities:this.entities}).render().el),this.$el.append(this.entity_list),this.entity_list.sortable({placeholder:"placeholder",forcePlaceholderSize:!0,containment:"parent",opacity:.7,revert:!0,dropOnEmpty:!0,start:function(e,t){return t.placeholder.css({height:t.item.height()}),!0},stop:function(e,t){t.item.trigger("drop",t.item.index())}}),this.entity_list.disableSelection()):this.render_no_images_notice(),this},RefreshButton:Backbone.View.extend({className:"refresh_button button-primary",tagName:"input",label:"Refresh",events:{click:"clicked"},clicked:function(){this.entities.reset()},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){return this.$el.attr({value:this.label,type:"button"}),this}}),ExcludeButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){this.$el.empty(),this.$el.append('<span style="margin-right: 8px;">Exclude:</span>');var e=new this.Button({value:!0,text:"All",entities:this.entities});this.$el.append(e.render().el),this.$el.append('<span class="separator">|</span>');var t=new this.Button({value:!1,text:"None",entities:this.entities});return this.$el.append(t.render().el),this},Button:Backbone.View.extend({tagName:"a",value:1,text:"",events:{click:"clicked"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},clicked:function(e){e.preventDefault(),this.entities.each(function(e){e.set("exclude",this.value)},this)},render:function(){return this.$el.text(this.text).attr("href","#"),this}})}),SortButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.sortorder_options=new t.DisplayTab.Models.SortOrder_Options,this.sortorder_options.on("change:selected",this.sortoption_changed,this),this.sortdirection_options=new t.DisplayTab.Models.SortDirection_Options([{value:"ASC",title:"Ascending",selected:"ASC"==this.displayed_gallery.get("order_direction")},{value:"DESC",title:"Descending",selected:"DESC"==this.displayed_gallery.get("order_direction")}]),this.sortdirection_options.on("change:selected",this.sortdirection_changed,this),this.displayed_gallery.on("change:order_by",this.displayed_gallery_order_changed,this),this.displayed_gallery.on("change.order_direction",this.displayed_gallery_order_dir_changed,this)},populate_sorting_fields:function(){var e=this.sources.selected().pop().get("returns");-1!==_.indexOf(e,"image")?this.fill_image_sortorder_options():this.fill_gallery_sortorder_options()},create_sortorder_option:function(e,i){return new t.DisplayTab.Models.SortOrder({name:e,title:i,value:e,selected:this.displayed_gallery.get("order_by")==e})},fill_image_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option(t.DisplayTab.instance.image_key,"Image ID")),this.sortorder_options.push(this.create_sortorder_option("filename","Filename")),this.sortorder_options.push(this.create_sortorder_option("alttext","Alt/Title Text")),this.sortorder_options.push(this.create_sortorder_option("imagedate","Date/Time"))},fill_gallery_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option("name","Name")),this.sortorder_options.push(this.create_sortorder_option("galdesc","Description"))},displayed_gallery_order_changed:function(e){this.sortorder_options.findWhere({value:e.get("order_by")}).set("selected",!0)},displayed_gallery_order_dir_changed:function(e){this.sortdirection_options.findWhere({value:e.get("order_direction")}).set("selected",!0)},sortoption_changed:function(t){this.sortorder_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("sortorder",[]);var i=t.get("value");0==t.get("value").length&&(i="sortorder"),this.displayed_gallery.set("order_by",i),this.entities.reset(),this.$el.find("a.sortorder").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},sortdirection_changed:function(t){this.sortdirection_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("order_direction",t.get("value")),this.entities.reset(),this.$el.find("a.sortdirection").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},render:function(){return this.$el.empty(),this.populate_sorting_fields(),this.$el.append('<span style="margin-right: 8px;">Sort By:</span>'),this.sortorder_options.each(function(e,t){var i=new this.Button({model:e,className:"sortorder"});this.$el.append(i.render().el),this.sortorder_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this.$el.append('<span style="margin: 0 8px 0 40px;">Order By:</span>'),this.sortdirection_options.each(function(e,t){var i=new this.Button({model:e,className:"sortdirection"});this.$el.append(i.render().el),this.sortdirection_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this},Button:Backbone.View.extend({tagName:"a",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},events:{click:"clicked"},clicked:function(e){e.preventDefault(),this.model.set("selected",!0)},render:function(){return this.$el.prop({value:this.model.get("value"),href:"#"}),this.$el.text(this.model.get("title")),this.model.get("selected")&&this.$el.addClass("selected"),this}})}),EntityElement:Backbone.View.extend({tagName:"li",events:{drop:"item_dropped"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.initTime=(new Date).getTime(),this.model.on("change",this.render,this),0==this.model.get("sortorder")&&this.model.set("sortorder",-1,{silent:!0}),this.id=this.model.get("id_field")+"_"+this.model.entity_id()},item_dropped:function(e,i){t.DisplayTab.instance.displayed_gallery.set("order_by","sortorder"),this.model.set("sortorder",i)},render:function(){this.$el.empty();var t=e("<div/>").addClass("preview_item"),i=e("<div/>").addClass("image_container"),s=this.model.alttext().replace(/\\&/g,"&").replace(/\\'/g,"'"),l=this.initTime;i.attr({title:s,style:"background-image: url('"+this.model.get("thumb_url")+"?timestamp"+l+"')"}),this.$el.append(t).addClass("ui-state-default"),t.append(i);var n=e("<div/>").addClass("exclude_container"),a=e("<label/>");a.append(igw_data.i18n.exclude_question);var r=new this.ExcludeCheckbox({model:this.model});return a.append(r.render().el),n.append(a),t.append(n),this},ExcludeCheckbox:Backbone.View.extend({tagName:"input",events:{change:"entity_excluded"},type_set:!1,entity_excluded:function(e){this.model.set("exclude",e.target.checked)},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change:exclude",this.render,this)},render:function(){return this.type_set||(this.$el.attr("type","checkbox"),this.type_set=!0),this.model.is_excluded()?this.$el.prop("checked",!0):this.$el.prop("checked",!1),this}})})}),t.DisplayTab.Views.GalleriesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.galleries=t.DisplayTab.instance.galleries},render:function(){var i=new t.Views.Chosen({collection:this.galleries,placeholder:igw_data.i18n.select_gallery,multiple:!0,width:500}),s=e('<tr><td class="galleries_column"></td><td><label>'+igw_data.i18n.galleries+"</label></td></tr>");return this.$el.empty(),this.$el.append(s),this.$el.find(".galleries_column").append(i.render().el),this}}),t.DisplayTab.Views.AlbumsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.albums=t.DisplayTab.instance.albums},render:function(){var e=new t.Views.Chosen({collection:this.albums,multiple:!0,placeholder:"Select an album",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="albums_column"></td><td><label>'+igw_data.i18n.albums+"</label></td></tr>"),this.$el.find(".albums_column").append(e.render().el),this}}),t.DisplayTab.Views.TagsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.tags=t.DisplayTab.instance.tags},render:function(){var e=new t.Views.Chosen({collection:this.tags,multiple:!0,placeholder:"Select a tag",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="tags_column"></td><td><label>Tags</label></td></tr>'),this.$el.find(".tags_column").append(e.render().el),this}}),t.DisplayTab.Views.Recent_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.change(function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="recent_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".recent_images_column").append(i),this}}),t.DisplayTab.Views.Random_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.change(function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="random_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".random_images_column").append(i),this}}),t.DisplayTab.Views.SaveButton=Backbone.View.extend({el:"#save_displayed_gallery",errors_el:"#errors",displayed_gallery:null,events:{click:"clicked"},initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entities=t.DisplayTab.instance.entities,this.render()},clicked:function(){this.set_display_settings(),insert_into_editor(this.displayed_gallery.to_shortcode(),this.displayed_gallery.id?this.displayed_gallery.id:igw_data.shortcode_ref),close_attach_to_post_window()},set_display_settings:function(){var t=this.displayed_gallery.get("display_type");if(t){var i=e("form[rel='"+t+"']"),s=function(t){var i={};return e.each(t.serializeArray(),function(e,t){for(var s=t.name.split("["),l=i,n=0;n<s.length;n++){var a=s[n].replace(/\]$/,"");l[a]||(n==s.length-1?l[a]=t.value:l[a]={}),l=l[a]}}),i}(i);this.displayed_gallery.set("display_settings",s[t])}},render:function(){return this.$el.css("z-index",1e3),this}}),t.DisplayTab.App=Backbone.View.extend({initialize:function(){if(this.displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.original_displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.galleries=new t.DisplayTab.Models.Gallery_Collection(igw_data.galleries),this.albums=new t.DisplayTab.Models.Album_Collection(igw_data.albums),this.tags=new t.DisplayTab.Models.Tag_Collection(igw_data.tags),this.sources=new t.DisplayTab.Models.Source_Collection(igw_data.sources),this.display_types=new t.DisplayTab.Models.Display_Type_Collection(igw_data.display_types),this.display_type_order_base=igw_data.display_type_priority_base,this.display_type_order_step=igw_data.display_type_priority_step,this.entities=new t.DisplayTab.Models.Entity_Collection,this.entities.extra_data.displayed_gallery=this.displayed_gallery,this.image_key=igw_data.image_primary_key,this.displayed_gallery.get("source")){if(this.displayed_gallery.get("source")){var e=this.sources.find_by_name_or_alias(this.displayed_gallery.get("source"));e&&e.set("selected",!0)}if(this.displayed_gallery.get("container_ids")&&_.each(this.displayed_gallery.get("container_ids"),function(e){var t=this[this.displayed_gallery.get("source")].find(function(t){return t.id==e},this);t&&t.set("selected",!0)},this),this.displayed_gallery.get("display_type")){var i=this.display_types.find_by_name_or_alias(this.displayed_gallery.get("display_type"));i&&(i.set("selected",!0),this.displayed_gallery.set("display_type",i.get("name")))}}if(collections=["galleries","albums","tags"],_.each(collections,function(e){this[e].on("selected",function(){this.update_selected_containers(e)},this)},this),this.display_types.on("change:selected",function(){this.displayed_gallery.set("display_type",this.display_types.selected_value())},this),this.sources.on("selected",function(){this.displayed_gallery.set("source",this.sources.selected_value()),this.sources.selected_value()!=this.original_displayed_gallery.get("source")?this.displayed_gallery.set("exclusions",this.entities.excluded_ids()):this.displayed_gallery.set("exclusions",this.original_displayed_gallery.get("exclusions")),"random_images"!=this.sources.selected_value()&&"recent_images"!=this.sources.selected_value()||this.displayed_gallery.set("maximum_entity_count",20),this.galleries.deselect_all(),this.albums.deselect_all(),this.tags.deselect_all();var e=this.display_types.selected(),t=this.sources.selected();e.length>0&&t.length>0&&(e=e[0],t=t[0],e.is_compatible_with_source(t)||this.display_types.deselect_all(),this.display_type_selector&&this.display_type_selector.render()),this.preview_area&&this.preview_area.render()},this),this.entities.on("change:exclude finished_fetching",function(){this.displayed_gallery.set("exclusions",this.entities.excluded_ids())},this),!this.displayed_gallery.get("source")){var s=this.sources.find_by_name_or_alias("galleries");s&&(s.set("selected",!0),this.sources.trigger("selected"))}if(window.Frame_Event_Publisher){var l=this;Frame_Event_Publisher.listen_for("attach_to_post:new_gallery",function(){l.galleries.reset(),l.galleries.fetch()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_galleries attach_to_post:manage_images",function(e){l.galleries.reset(),l.galleries.fetch();var t=l.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&l.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_album",function(e){l.albums.reset(),l.albums.fetch();var t=l.sources.selected().pop();t&&_.indexOf(t.get("returns"),"album")>=0&&l.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_tags attach_to_post:manage_images",function(e){l.tags.reset(),l.tags.fetch();var t=l.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&l.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:thumbnail_modified",function(e){var t=l.sources.selected().pop(),i=e.image[e.image.id_field];if(t)if(_.indexOf(t.get("returns"),"image")>=0){var s=l.entities.find(function(e){return parseInt(e.entity_id())==parseInt(i)},this);s&&s.set("thumb_url",e.image.thumb_url)}else{var n=l.entities.find(function(e){return parseInt(e.get("previewpic"))==i},this);n&&n.trigger("change")}})}},update_selected_containers:function(e){this.displayed_gallery.set("container_ids",this[e].selected_ids())},render:function(){this.display_type_selector=new t.DisplayTab.Views.Display_Type_Selector,new t.DisplayTab.Views.Source_Config,new t.DisplayTab.Views.Slug_Config,this.preview_area=new t.DisplayTab.Views.Preview_Area,new t.DisplayTab.Views.SaveButton}}),t.DisplayTab.instance=new t.DisplayTab.App,t.DisplayTab.instance.render(),window.Ngg=t,e("span.tooltip, label.tooltip").tooltip()}); \ No newline at end of file +jQuery(function(e){var t={Models:{},Views:{}};t.Models.SelectableItems=Backbone.Collection.extend({selected:function(){return this.filter(function(e){return 1==e.get("selected")})},deselect_all:function(){this.each(function(e){e.set("selected",!1)})},selected_ids:function(){return _.pluck(this.selected(),"id")},select:function(e){_.isArray(e)||(e=[e]),this.each(function(t){_.indexOf(e,t.id)>=0&&t.set("selected",!0)}),this.trigger("selected")}}),t.Views.SelectTag=Backbone.View.extend({tagName:"select",collection:null,multiple:!1,value_field:"id",text_field:"title",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.collection.on("add",this.render_new_option,this),this.collection.on("remove",this.remove_existing_option,this),this.collection.on("reset",this.empty_list,this)},events:{change:"selection_changed"},empty_list:function(){this.$el.empty()},render_new_option:function(e){this.$el.append(new this.Option({model:e,value_field:this.value_field,text_field:this.text_field}).render().el)},remove_existing_option:function(e){this.$el.find("option[value='"+e.id+"']").remove()},selection_changed:function(){var t=_.map(this.$el.find(":selected"),function(t){return e(t).val()});this.collection.each(function(e){_.indexOf(t,e.id)>=0||_.indexOf(t,e.id.toString())>=0?e.set("selected",!0):e.set("selected",!1)}),this.collection.trigger("selected")},render:function(){return this.$el.empty(),this.multiple&&(this.$el.prop("multiple",!0),this.$el.attr("multiple","multiple")),this.collection.each(function(e){var t=new this.Option({model:e,value_field:this.value_field,text_field:this.text_field});this.$el.append(t.render().el)},this),this.width&&this.$el.width(this.width),this},Option:Backbone.View.extend({tagName:"option",model:null,initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change",this.render,this)},render:function(){var e=this;return this.$el.html(this.model.get(this.text_field).replace(/\\&/g,"&").replace(/\\'/g,"'")),this.$el.prop({value:"id"==this.value_field?this.model.id:this.model.get(this.value_field)}),1==e.model.get("selected")&&this.$el.prop("selected",!0).attr("selected","selected"),this}})}),t.Views.Chosen=Backbone.View.extend({tagName:"span",initialize:function(e){this.options=e||{},this.collection=this.options.collection,this.select_tag=new t.Views.SelectTag(this.options),this.collection.on("change",this.selection_changed,this)},selection_changed:function(e){_.isUndefined(e.changed.selected)&&this.render()},render:function(){return this.$el.append(this.select_tag.render().$el),this.options.width&&this.select_tag.$el.width(this.options.width),this.select2_opts={placeholder:this.options.placeholder},this.select_tag.$el.select2(this.select2_opts),this}}),t.DisplayTab={Models:{},Views:{},App:{}},t.Models.Remote_Collection=t.Models.SelectableItems.extend({fetch_limit:5e3,in_progress:!1,fetch_url:photocrati_ajax.url,action:"",extra_data:{},_create_request:function(e,t){var i=_.extend({},igw_data.sec_token,{action:this.action,limit:e||this.fetch_limit,offset:t||0});for(var s in this.extra_data){var l=this.extra_data[s];void 0===i[s]&&(i[s]={}),void 0!==l.toJSON&&(l=l.toJSON()),i[s]=_.extend(i[s],l)}return i},_add_item:function(e){this.push(e)},fetch:function(t,i){var s=this;this.in_progress=!0,e.post(this.fetch_url,this._create_request(t,i),function(e){"undefined"!=typeof _&&(_.isObject(e)||(e=JSON.parse(e)),e.items&&(_.each(e.items,function(e){s._add_item(e)}),e.total>=e.limit+e.offset?s.fetch(e.limit,e.offset+e.limit):(s.in_progress=!1,s.trigger("finished_fetching"))))})}}),t.DisplayTab.Models.Displayed_Gallery=Backbone.Model.extend({defaults:{source:null,container_ids:[],entity_ids:[],display_type:null,display_settings:{},exclusions:[],sortorder:[],slug:null},to_shortcode:function(){retval=null;var e=function(e,t){var i=e[t];if(void 0!==igw_data.shortcode_defaults[t]&&igw_data.shortcode_defaults[t]==i&&(i=null),_.isArray(i)&&(i=i.length>0?i.join(","):null),i)return i=i.toString().replace("[","["),i=i.toString().replace("]","]"),void 0!==igw_data.shortcode_attr_replacements[t]&&(t=igw_data.shortcode_attr_replacements[t]),t+'="'+i+'"'},i=t.DisplayTab.instance.display_types.find_by_name_or_alias(this.get("display_type")),s=this.toJSON();s.display_type=i.get_shortcode_value();var l="[ngg",n=null;(n=e(s,"source"))&&(l+=" "+n),(n=e(s,"container_ids"))&&(l+=" "+n),(n=e(s,"entity_ids"))&&(l+=" "+n),(n=e(s,"exclusions"))&&(l+=" "+n),(n=e(s,"sortorder"))&&(l+=" "+n);for(var a in s){if(!(["source","container_ids","entity_ids","exclusions","sortorder","__defaults_set","id_field","post_category","ID"].indexOf(a)>-1))if("display_settings"==a)for(var r in s[a])(n=e(s[a],r))&&(l+=" "+n);else(n=e(s,a))&&(l+=" "+n)}return l+="]"}}),t.DisplayTab.Models.Source=Backbone.Model.extend({idAttribute:"name",defaults:{title:"",name:"",selected:!1}}),t.DisplayTab.Models.Source_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Source,selected_value:function(){var e=null,t=this.selected();return t.length>0&&(e=t[0].get("name")),e},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Gallery=Backbone.Model.extend({idAttribute:igw_data.gallery_primary_key,defaults:{title:"",name:""}}),t.DisplayTab.Models.Gallery_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Gallery,action:"get_existing_galleries"}),t.DisplayTab.Models.Album=Backbone.Model.extend({defaults:{title:"",name:""}}),t.DisplayTab.Models.Album_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Album,action:"get_existing_albums"}),t.DisplayTab.Models.Tag=Backbone.Model.extend({defaults:{title:""}}),t.DisplayTab.Models.Tag_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Tag,action:"get_existing_image_tags"}),t.DisplayTab.Models.Display_Type=Backbone.Model.extend({idAttribute:"name",defaults:{title:""},is_compatible_with_source:function(e){var t=!0;for(index in e.get("returns")){var i=e.get("returns")[index];if(_.indexOf(this.get("entity_types"),i)<0){t=!1;break}}return t},get_shortcode_value:function(){var e=this.id,t=this.get("aliases");return _.isArray(t)&&t.length>0&&(e=t[0]),e}}),t.DisplayTab.Models.Display_Type_Collection=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.Display_Type,selected_value:function(){var e=this.selected();return e.length>0?e[0].get("name"):null},find_by_name_or_alias:function(e){return this.find(function(t){return t.get("name")==e||_.isArray(t.get("aliases"))&&t.get("aliases").indexOf(e)>-1})}}),t.DisplayTab.Models.Entity=Backbone.Model.extend({entity_id:function(){return this.get(this.get("id_field"))},is_excluded:function(){return current_value=this.get("exclude"),!_.isUndefined(current_value)&&(_.isBoolean(current_value)?current_value:0!=parseInt(current_value))},is_included:function(){return!this.is_excluded()},is_gallery:function(){return retval=!1,1==this.get("is_gallery")&&(retval=!0),retval},is_album:function(){return retval=!1,1==this.get("is_album")&&(retval=!0),retval},is_image:function(){return!this.is_album()&&!this.is_gallery()},alttext:function(){return this.is_image()?this.get("alttext"):this.is_gallery()?this.get("title"):this.is_album()?this.get("name"):void 0}}),t.DisplayTab.Models.Entity_Collection=t.Models.Remote_Collection.extend({model:t.DisplayTab.Models.Entity,action:"get_displayed_gallery_entities",_add_item:function(e){e.exclude=1==parseInt(e.exclude),e.is_gallery=1==parseInt(e.is_gallery),e.is_album=1==parseInt(e.is_album),this.push(e)},entity_ids:function(){return this.map(function(e){return e.entity_id()})},included_ids:function(){return _.compact(this.map(function(e){if(e.is_included())return e.entity_id()}))},excluded_ids:function(){return _.compact(this.map(function(e){if(!e.is_included())return e.entity_id()}))}}),t.DisplayTab.Models.SortOrder=Backbone.Model.extend({}),t.DisplayTab.Models.SortOrder_Options=t.Models.SelectableItems.extend({model:t.DisplayTab.Models.SortOrder}),t.DisplayTab.Models.SortDirection=Backbone.Model.extend({}),t.DisplayTab.Models.SortDirection_Options=Backbone.Collection.extend({model:t.DisplayTab.Models.SortDirection}),t.DisplayTab.Models.Slug=Backbone.Model.extend({}),t.DisplayTab.Views.Source_Config=Backbone.View.extend({el:"#source_configuration",selected_view:null,initialize:function(){this.sources=t.DisplayTab.instance.sources,this.sources.on("selected",this.render,this),_.bindAll(this,"render"),this.render()},render:function(){var e=new t.Views.Chosen({id:"source_select",collection:this.sources,placeholder:"Select a source",width:500}),i=_.template('<tr><td id="source_column"></td><td><label><%- sources %></label></td></tr>');this.$el.html(i(igw_data.i18n)),this.$el.find("#source_column").append(e.render().el);var s=this.sources.selected();if(s.length){var l=_.str.capitalize(s.pop().id)+"Source";if(void 0!==t.DisplayTab.Views[l]){var n=new t.DisplayTab.Views[l];this.$el.append(n.render().el)}}return this}}),t.DisplayTab.Views.Slug_Config=Backbone.View.extend({el:"#slug_configuration",selected_view:null,initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.slug=t.DisplayTab.instance.displayed_gallery.get("slug"),this.render()},render:function(){var t=this,i=e("<input>").prop({type:"text",name:"slug",value:this.slug,placeholder:igw_data.i18n.optional,id:"field_slug"});i.on("input",function(){e(this).val(e(this).val().replace(/\s|\?|\\|\/|&|=|\[|]|#/gm,"-")),t.displayed_gallery.set("slug",e(this).val())}),i.on("change",function(){e(this).val(e(this).val().replace(/^-*/gm,"").replace(/-*$/gm,"")),t.displayed_gallery.set("slug",e(this).val())});var s=_.template('<tr><td id="slug_label"><label for="field_slug" class="tooltip" title="<%- slug_tooltip %><"><<%- slug_label %></label></td><td id="slug_column"></td></tr>');return this.$el.append(s(igw_data.i18n)),this.$el.find("#slug_column").append(i),this}}),t.DisplayTab.Views.Display_Type_Selector=Backbone.View.extend({el:"#display_type_selector",initialize:function(){this.display_types=t.DisplayTab.instance.display_types,this.display_type_order_base=t.DisplayTab.instance.display_type_order_base,this.display_type_order_step=t.DisplayTab.instance.display_type_order_step,this.sources=t.DisplayTab.instance.sources,this.render()},selection_changed:function(t){var i=null;this.display_types.each(function(e){e.get("name")==t?(i=e,e.set("selected",!0)):e.set("selected",!1)}),e(".display_settings_form").each(function(){$this=e(this),$this.attr("rel")==t?$this.removeClass("hidden"):$this.addClass("hidden")})},render:function(){var t=this.sources.selected(),i=0;t=t.length>0&&t[0],this.$el.empty();var s=this.display_type_order_base,l=this.display_type_order_step;return this.display_types.each(function(n){if(t&&!n.is_compatible_with_source(t)){var a=e("#display_type_tab_content:visible");if(0==a.length)return;if("hidden"==a.css("visibility"))return}var r=new this.DisplayType;r.model=n,r.on("selected",this.selection_changed,this),this.display_types.selected_value()||(n.set("selected",!0),this.selection_changed(n.id));var o=n.get("view_order");o||(o=s);var d=Math.floor(o/l);i=d,this.$el.append(r.render().el)},this),this.$el.append('<li class="clear" style="height: 10px; list-style-type:none" />'),this},DisplayType:Backbone.View.extend({className:"display_type_preview",events:{click:"clicked"},clicked:function(e){this.trigger("selected",this.model.get("name"))},render:function(){var t=e('<label style="display: block; cursor: pointer;"/>').addClass("image_container"),i=this.model.get("installed_at_version"),s=photocrati_ajax.wp_plugins_url,l=this.model.get("preview_image_relpath");void 0===i&&(s=photocrati_ajax.wp_site_url,s=s.replace(/(.*)\/index\.php$/i,"$1"),0==l.indexOf("/nextgen-gallery")&&(s=photocrati_ajax.wp_plugins_url));var n=e("<img/>").attr({src:s+"/"+l,title:this.model.get("title"),alt:this.model.get("alt")}),a=e("<div/>"),r=e("<input/>").prop({type:"radio",value:this.model.get("name"),title:this.model.get("title"),name:"display_type",checked:this.model.get("selected")}),o=e("<br>");return t.append(a),t.append(n),t.append("<br>"),t.append(this.model.get("title").replace(/nextgen /gi,"")),a.append(r),a.append(o),this.$el.append(t),this}})}),t.DisplayTab.Views.Preview_Area=Backbone.View.extend({el:"#preview_area",initialize:function(){this.entities=t.DisplayTab.instance.entities,this.sources=t.DisplayTab.instance.sources,this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entity_list=e("<ul/>").attr("id","entity_list").append('<li class="clear"/>'),this.entities.on("add",this.render_entity,this),this.entities.on("remove",this.remove_entity,this),this.entities.on("reset",this.entities_reset,this),this.entities.on("change:sortorder",function(e){this.entities.remove(e,{silent:!0}),this.entities.add(e,{at:e.changed.sortorder,silent:!0}),this.displayed_gallery.set("sortorder",this.entities.entity_ids()),"undefined"!=typeof console&&void 0!==console.log&&console.log(this.entities.entity_ids()),this.displayed_gallery.set("order_by","sortorder")},this),this.sources.on("selected",this.render,this),this.render()},events:{opened:"entities_reset"},entities_reset:function(e){this.entities.reset(null,{silent:!0}),this.entity_list.empty().append('<li class="clear"/>'),this.entities.in_progress||this.entities.fetch()},render_entity:function(e){var t=new this.EntityElement({model:e});this.entity_list.find(".clear").before(t.render().$el),t.$el.css("visibility","hidden"),setTimeout(function(){t.$el.css("visibility","visible")},0),1==this.$el.find(".no_entities").length?this.render():this.entities.length>1&&this.entity_list.sortable("refresh")},remove_entity:function(e){var t=this.id=e.get("id_field")+"_"+e.entity_id();this.entity_list.find("#"+t).remove();this.entity_list.sortable("refresh"),0==this.entities.length&&this.render_no_images_notice()},render_no_images_notice:function(){this.$el.empty(),this.$el.append("<p class='no_entities'>"+igw_data.i18n.no_entities+"</p>")},render:function(){return this.$el.empty(),this.entities.length>0&&this.displayed_gallery.get("container_ids").length>0?(this.$el.append(new this.RefreshButton({entities:this.entities}).render().el),this.$el.append(new this.SortButtons({entities:this.entities,displayed_gallery:this.displayed_gallery,sources:this.sources}).render().el),this.$el.append(new this.ExcludeButtons({entities:this.entities}).render().el),this.$el.append(this.entity_list),this.entity_list.sortable({placeholder:"placeholder",forcePlaceholderSize:!0,containment:"parent",opacity:.7,revert:!0,dropOnEmpty:!0,start:function(e,t){return t.placeholder.css({height:t.item.height()}),!0},stop:function(e,t){t.item.trigger("drop",t.item.index())}}),this.entity_list.disableSelection()):this.render_no_images_notice(),this},RefreshButton:Backbone.View.extend({className:"refresh_button button-primary",tagName:"input",label:"Refresh",events:{click:"clicked"},clicked:function(){this.entities.reset()},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){return this.$el.attr({value:this.label,type:"button"}),this}}),ExcludeButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},render:function(){this.$el.empty(),this.$el.append('<span style="margin-right: 8px;">Exclude:</span>');var e=new this.Button({value:!0,text:"All",entities:this.entities});this.$el.append(e.render().el),this.$el.append('<span class="separator">|</span>');var t=new this.Button({value:!1,text:"None",entities:this.entities});return this.$el.append(t.render().el),this},Button:Backbone.View.extend({tagName:"a",value:1,text:"",events:{click:"clicked"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},clicked:function(e){e.preventDefault(),this.entities.each(function(e){e.set("exclude",this.value)},this)},render:function(){return this.$el.text(this.text).attr("href","#"),this}})}),SortButtons:Backbone.View.extend({className:"header_row",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.sortorder_options=new t.DisplayTab.Models.SortOrder_Options,this.sortorder_options.on("change:selected",this.sortoption_changed,this),this.sortdirection_options=new t.DisplayTab.Models.SortDirection_Options([{value:"ASC",title:"Ascending",selected:"ASC"==this.displayed_gallery.get("order_direction")},{value:"DESC",title:"Descending",selected:"DESC"==this.displayed_gallery.get("order_direction")}]),this.sortdirection_options.on("change:selected",this.sortdirection_changed,this),this.displayed_gallery.on("change:order_by",this.displayed_gallery_order_changed,this),this.displayed_gallery.on("change.order_direction",this.displayed_gallery_order_dir_changed,this)},populate_sorting_fields:function(){var e=this.sources.selected().pop().get("returns");-1!==_.indexOf(e,"image")?this.fill_image_sortorder_options():this.fill_gallery_sortorder_options()},create_sortorder_option:function(e,i){return new t.DisplayTab.Models.SortOrder({name:e,title:i,value:e,selected:this.displayed_gallery.get("order_by")==e})},fill_image_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option(t.DisplayTab.instance.image_key,"Image ID")),this.sortorder_options.push(this.create_sortorder_option("filename","Filename")),this.sortorder_options.push(this.create_sortorder_option("alttext","Alt/Title Text")),this.sortorder_options.push(this.create_sortorder_option("imagedate","Date/Time"))},fill_gallery_sortorder_options:function(){this.sortorder_options.reset(),this.sortorder_options.push(this.create_sortorder_option("","None")),this.sortorder_options.push(this.create_sortorder_option("sortorder","Custom")),this.sortorder_options.push(this.create_sortorder_option("name","Name")),this.sortorder_options.push(this.create_sortorder_option("galdesc","Description"))},displayed_gallery_order_changed:function(e){this.sortorder_options.findWhere({value:e.get("order_by")}).set("selected",!0)},displayed_gallery_order_dir_changed:function(e){this.sortdirection_options.findWhere({value:e.get("order_direction")}).set("selected",!0)},sortoption_changed:function(t){this.sortorder_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("sortorder",[]);var i=t.get("value");0==t.get("value").length&&(i="sortorder"),this.displayed_gallery.set("order_by",i),this.entities.reset(),this.$el.find("a.sortorder").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},sortdirection_changed:function(t){this.sortdirection_options.each(function(e){e.set("selected",t.get("value")==e.get("value"),{silent:!0})}),this.displayed_gallery.set("order_direction",t.get("value")),this.entities.reset(),this.$el.find("a.sortdirection").each(function(){var i=e(this);i.attr("value")==t.get("value")?i.addClass("selected"):i.removeClass("selected")})},render:function(){return this.$el.empty(),this.populate_sorting_fields(),this.$el.append('<span style="margin-right: 8px;">Sort By:</span>'),this.sortorder_options.each(function(e,t){var i=new this.Button({model:e,className:"sortorder"});this.$el.append(i.render().el),this.sortorder_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this.$el.append('<span style="margin: 0 8px 0 40px;">Order By:</span>'),this.sortdirection_options.each(function(e,t){var i=new this.Button({model:e,className:"sortdirection"});this.$el.append(i.render().el),this.sortdirection_options.length-1>t&&this.$el.append('<span class="separator">|</span>')},this),this},Button:Backbone.View.extend({tagName:"a",initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this)},events:{click:"clicked"},clicked:function(e){e.preventDefault(),this.model.set("selected",!0)},render:function(){return this.$el.prop({value:this.model.get("value"),href:"#"}),this.$el.text(this.model.get("title")),this.model.get("selected")&&this.$el.addClass("selected"),this}})}),EntityElement:Backbone.View.extend({tagName:"li",events:{drop:"item_dropped"},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.initTime=(new Date).getTime(),this.model.on("change",this.render,this),0==this.model.get("sortorder")&&this.model.set("sortorder",-1,{silent:!0}),this.id=this.model.get("id_field")+"_"+this.model.entity_id()},item_dropped:function(e,i){t.DisplayTab.instance.displayed_gallery.set("order_by","sortorder"),this.model.set("sortorder",i)},render:function(){this.$el.empty();var t=e("<div/>").addClass("preview_item"),i=e("<div/>").addClass("image_container"),s=this.model.alttext().replace(/\\&/g,"&").replace(/\\'/g,"'"),l=this.initTime;i.attr({title:s,style:"background-image: url('"+this.model.get("thumb_url")+"?timestamp"+l+"')"}),this.$el.append(t).addClass("ui-state-default"),t.append(i);var n=e("<div/>").addClass("exclude_container"),a=e("<label/>");a.append(igw_data.i18n.exclude_question);var r=new this.ExcludeCheckbox({model:this.model});return a.append(r.render().el),n.append(a),t.append(n),this},ExcludeCheckbox:Backbone.View.extend({tagName:"input",events:{change:"entity_excluded"},type_set:!1,entity_excluded:function(e){this.model.set("exclude",e.target.checked)},initialize:function(e){this.options=e||{},_.each(this.options,function(e,t){this[t]=e},this),this.model.on("change:exclude",this.render,this)},render:function(){return this.type_set||(this.$el.attr("type","checkbox"),this.type_set=!0),this.model.is_excluded()?this.$el.prop("checked",!0):this.$el.prop("checked",!1),this}})})}),t.DisplayTab.Views.GalleriesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.galleries=t.DisplayTab.instance.galleries},render:function(){var i=new t.Views.Chosen({collection:this.galleries,placeholder:igw_data.i18n.select_gallery,multiple:!0,width:500}),s=e('<tr><td class="galleries_column"></td><td><label>'+igw_data.i18n.galleries+"</label></td></tr>");return this.$el.empty(),this.$el.append(s),this.$el.find(".galleries_column").append(i.render().el),this}}),t.DisplayTab.Views.AlbumsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.albums=t.DisplayTab.instance.albums},render:function(){var e=new t.Views.Chosen({collection:this.albums,multiple:!0,placeholder:"Select an album",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="albums_column"></td><td><label>'+igw_data.i18n.albums+"</label></td></tr>"),this.$el.find(".albums_column").append(e.render().el),this}}),t.DisplayTab.Views.TagsSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.tags=t.DisplayTab.instance.tags},render:function(){var e=new t.Views.Chosen({collection:this.tags,multiple:!0,placeholder:"Select a tag",text_field:"name",width:500});return this.$el.empty(),this.$el.append('<tr><td class="tags_column"></td><td><label>Tags</label></td></tr>'),this.$el.find(".tags_column").append(e.render().el),this}}),t.DisplayTab.Views.Recent_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.change(function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="recent_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".recent_images_column").append(i),this}}),t.DisplayTab.Views.Random_imagesSource=Backbone.View.extend({tagName:"tbody",initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.maximum_entity_count=t.DisplayTab.instance.displayed_gallery.get("maximum_entity_count"),this.displayed_gallery.set("container_ids",[])},render:function(){var t=this,i=e("<input/>").prop({type:"text",value:this.maximum_entity_count,name:"maximum_entity_count"});return i.change(function(){t.displayed_gallery.set("maximum_entity_count",e(this).val())}),this.$el.empty(),this.$el.append('<tr><td class="random_images_column"></td><td><label># of Images To Display</label></td></tr>'),this.$el.find(".random_images_column").append(i),this}}),t.DisplayTab.Views.SaveButton=Backbone.View.extend({el:"#save_displayed_gallery",errors_el:"#errors",displayed_gallery:null,events:{click:"clicked"},initialize:function(){this.displayed_gallery=t.DisplayTab.instance.displayed_gallery,this.entities=t.DisplayTab.instance.entities,this.render()},clicked:function(){this.set_display_settings();var e=this.displayed_gallery.to_shortcode();insert_into_editor(e,this.displayed_gallery.id?this.displayed_gallery.id:igw_data.shortcode_ref);var t=null;(t=location.toString().match(/editor=([^\&]+)/))&&t.length>=2&&top.tinyMCE.editors[t[1]].fire("ngg-inserted",{shortcode:e}),close_attach_to_post_window()},set_display_settings:function(){var t=this.displayed_gallery.get("display_type");if(t){var i=e("form[rel='"+t+"']"),s=i.data("defaults"),l=function(t){var i={};return e.each(t.serializeArray(),function(e,t){for(var l=t.name.split("["),n=i,a=0;a<l.length;a++){var r=l[a].replace(/\]$/,"");if(s[r]==t.value)return!0;n[r]||(a==l.length-1?n[r]=t.value:n[r]={}),n=n[r]}}),i}(i);this.displayed_gallery.set("display_settings",l[t])}},render:function(){return this.$el.css("z-index",1e3),this}}),t.DisplayTab.App=Backbone.View.extend({initialize:function(){if(this.displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.original_displayed_gallery=new t.DisplayTab.Models.Displayed_Gallery(igw_data.displayed_gallery),this.galleries=new t.DisplayTab.Models.Gallery_Collection(igw_data.galleries),this.albums=new t.DisplayTab.Models.Album_Collection(igw_data.albums),this.tags=new t.DisplayTab.Models.Tag_Collection(igw_data.tags),this.sources=new t.DisplayTab.Models.Source_Collection(igw_data.sources),this.display_types=new t.DisplayTab.Models.Display_Type_Collection(igw_data.display_types),this.display_type_order_base=igw_data.display_type_priority_base,this.display_type_order_step=igw_data.display_type_priority_step,this.entities=new t.DisplayTab.Models.Entity_Collection,this.entities.extra_data.displayed_gallery=this.displayed_gallery,this.image_key=igw_data.image_primary_key,this.displayed_gallery.get("source")){if(this.displayed_gallery.get("source")){var i=this.sources.find_by_name_or_alias(this.displayed_gallery.get("source"));i&&i.set("selected",!0)}if(this.displayed_gallery.get("container_ids")&&_.each(this.displayed_gallery.get("container_ids"),function(e){var t=this[this.displayed_gallery.get("source")].find(function(t){return t.id==e},this);t&&t.set("selected",!0)},this),this.displayed_gallery.get("display_type")){var s=this.display_types.find_by_name_or_alias(this.displayed_gallery.get("display_type"));s&&(s.set("selected",!0),this.displayed_gallery.set("display_type",s.get("name")))}}if(collections=["galleries","albums","tags"],_.each(collections,function(e){this[e].on("selected",function(){this.update_selected_containers(e)},this)},this),this.display_types.on("change:selected",function(){this.displayed_gallery.set("display_type",this.display_types.selected_value())},this),this.sources.on("selected",function(){e("#save_displayed_gallery").prop("disabled",!0),setTimeout(function(){e("#save_displayed_gallery").prop("disabled",!1)},1e3),this.displayed_gallery.set("source",this.sources.selected_value()),this.sources.selected_value()!=this.original_displayed_gallery.get("source")?this.displayed_gallery.set("exclusions",this.entities.excluded_ids()):this.displayed_gallery.set("exclusions",this.original_displayed_gallery.get("exclusions")),"random_images"!=this.sources.selected_value()&&"recent_images"!=this.sources.selected_value()||this.displayed_gallery.set("maximum_entity_count",20),this.galleries.deselect_all(),this.albums.deselect_all(),this.tags.deselect_all();var t=this.display_types.selected(),i=this.sources.selected();t.length>0&&i.length>0&&(t=t[0],i=i[0],t.is_compatible_with_source(i)||this.display_types.deselect_all(),this.display_type_selector&&this.display_type_selector.render()),this.preview_area&&this.preview_area.render()},this),this.entities.on("change:exclude finished_fetching",function(){this.displayed_gallery.set("exclusions",this.entities.excluded_ids())},this),!this.displayed_gallery.get("source")){var l=this.sources.find_by_name_or_alias("galleries");l&&(l.set("selected",!0),this.sources.trigger("selected"))}if(window.Frame_Event_Publisher){var n=this;Frame_Event_Publisher.listen_for("attach_to_post:new_gallery",function(){n.galleries.reset(),n.galleries.fetch()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_galleries attach_to_post:manage_images",function(e){n.galleries.reset(),n.galleries.fetch();var t=n.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_album",function(e){n.albums.reset(),n.albums.fetch();var t=n.sources.selected().pop();t&&_.indexOf(t.get("returns"),"album")>=0&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:manage_tags attach_to_post:manage_images",function(e){n.tags.reset(),n.tags.fetch();var t=n.sources.selected().pop();t&&(_.indexOf(t.get("returns"),"image")>=0||_.indexOf(t.get("returns"),"gallery"))&&n.entities.reset()}),Frame_Event_Publisher.listen_for("attach_to_post:thumbnail_modified",function(e){var t=n.sources.selected().pop(),i=e.image[e.image.id_field];if(t)if(_.indexOf(t.get("returns"),"image")>=0){var s=n.entities.find(function(e){return parseInt(e.entity_id())==parseInt(i)},this);s&&s.set("thumb_url",e.image.thumb_url)}else{var l=n.entities.find(function(e){return parseInt(e.get("previewpic"))==i},this);l&&l.trigger("change")}})}},update_selected_containers:function(e){this.displayed_gallery.set("container_ids",this[e].selected_ids())},render:function(){this.display_type_selector=new t.DisplayTab.Views.Display_Type_Selector,new t.DisplayTab.Views.Source_Config,new t.DisplayTab.Views.Slug_Config,this.preview_area=new t.DisplayTab.Views.Preview_Area,new t.DisplayTab.Views.SaveButton}}),t.DisplayTab.instance=new t.DisplayTab.App,t.DisplayTab.instance.render(),window.Ngg=t,e("span.tooltip, label.tooltip").tooltip()}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css index 9d19439fd..d65353018 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/iframely.min.css @@ -1 +1 @@ -html#iframely{background:#fff!important}#iframely,#iframely body{background:#fff!important;padding:0;width:100%;height:100%}#iframely{opacity:0;background-position:center center;background-repeat:no-repeat;position:absolute;visibility:hidden}#iframely #wpbody-content{float:none;padding:0}#iframely #ngg_page_content.ngg_settings_page{background:#fff}#iframely #icon-nextgen-gallery,#iframely h2{display:none}#iframely #wpwrap{background-color:#fcfcfc}#iframely #ngg_page_content{margin:0;width:100%}#iframely .ngg-admin .notice,#iframely .ngg-admin div.error,#iframely .ngg-admin div.updated{display:none}#iframely #ngg_page_content .ngg_page_content_header{display:none}#iframely #ngg_page_content .ngg_page_content_menu{background:0 0;border:none;padding:10px 20px 10px 0;float:none;height:25px;margin-top:0;width:auto;border-bottom:1px solid #ddd;background:#fafafa}#iframely #ngg_page_content .ngg_page_content_menu a{border:none;color:#888;display:inline;font-size:14px;font-weight:400;text-decoration:none;line-height:25px;padding:15px 20px;font-size:12px}#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{background:0 0;font-weight:700;color:#123248;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:2px solid #fff;background:#fff}#iframely #ngg_page_content .ngg_page_content_menu a:before{display:none}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after{display:none}#iframely #ngg_page_content .ngg_page_content_main{padding:30px;width:100%;box-shadow:none}#iframely #ngg_page_content .ngg_page_content_main h3{display:none}#iframely #ngg_page_content .ngg_manage_albums .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_images .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_tags .ngg_page_content_main h3{display:block}#iframely #ngg_page_content .button-primary:active,#iframely #ngg_page_content .button-secondary:active,#iframely #ngg_page_content button:active{vertical-align:top}#iframely #ngg_page_content .ngg_manage_galleries .search-form{margin-top:-20px}#iframely #ngg_page_content .ngg_manage_galleries p.search-box{margin:0;position:relative;float:none;top:37px;left:460px;width:350px}#iframely #bulkaction,#iframely .search-box input[name="s"]{width:140px!important}#iframely .tablenav.top .displaying-num{display:none}#iframely .ngg_manage_galleries table #id{min-width:40px}#iframely .ngg_manage_galleries table #author{min-width:85px}#iframely .ngg_manage_galleries table #page_id{min-width:65px}#iframely .gallery_page_nggallery-manage-gallery .ui-dialog{height:auto!important;min-height:auto}@media (max-width:1140px){#iframely .plupload_buttons{display:inline;margin:0 0 0 10px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:130px!important}}@media (max-width:940px){#iframely .plupload_buttons{display:block;margin:10px 0 0 75px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:201px!important}}@media (max-width:800px){#iframely .ngg-admin #wpbody{padding:0}#iframely #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#iframely #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#iframely #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#iframely .plupload_buttons{margin-left:0}#iframely #ngg_page_content .plupload_droptext{line-height:60px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:100%!important;margin:4px 0;display:block}} \ No newline at end of file +#iframely,#iframely body,html#iframely{background:#fff!important}#iframely,#iframely body{padding:0;width:100%;height:100%}#iframely{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;background-position:center center;background-repeat:no-repeat;position:absolute;visibility:hidden}#iframely #wpbody-content{float:none;padding:0}#iframely #ngg_page_content.ngg_settings_page{background:#fff}#iframely #icon-nextgen-gallery,#iframely #ngg_page_content .ngg_page_content_header,#iframely .ngg-admin .notice,#iframely .ngg-admin div.error,#iframely .ngg-admin div.updated,#iframely h2{display:none}#iframely #wpwrap{background-color:#fcfcfc}#iframely #ngg_page_content{margin:0;width:100%}#iframely #ngg_page_content .ngg_page_content_menu{border:none;padding:10px 20px 10px 0;float:none;height:25px;margin-top:0;width:auto;border-bottom:1px solid #ddd;background:#fafafa}#iframely #ngg_page_content .ngg_page_content_menu a{border:none;color:#888;display:inline;font-weight:400;text-decoration:none;line-height:25px;padding:15px 20px;font-size:12px}#displayed_tab #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#displayed_tab #ngg_page_content .ngg_page_content_menu a:active:after,#iframely #ngg_page_content .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_page_content_menu a:before{display:none}#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active{font-weight:700;color:#123248;border-left:1px solid #ddd;border-right:1px solid #ddd;border-bottom:2px solid #fff;background:#fff}#iframely #ngg_page_content .ngg_page_content_main{padding:30px;width:100%;box-shadow:none}#iframely #ngg_page_content .ngg_manage_albums .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_images .ngg_page_content_main h3,#iframely #ngg_page_content .ngg_manage_tags .ngg_page_content_main h3{display:block}#iframely #ngg_page_content .button-primary:active,#iframely #ngg_page_content .button-secondary:active,#iframely #ngg_page_content button:active{vertical-align:top}#iframely #ngg_page_content .ngg_manage_galleries .search-form{margin-top:-20px}#iframely #ngg_page_content .ngg_manage_galleries p.search-box{margin:0;position:relative;float:none;top:37px;left:460px;width:350px}#iframely #bulkaction,#iframely .search-box input[name="s"]{width:140px!important}#iframely .tablenav.top .displaying-num{display:none}#iframely .ngg_manage_galleries table #id{min-width:40px}#iframely .ngg_manage_galleries table #author{min-width:85px}#iframely .ngg_manage_galleries table #page_id{min-width:65px}#iframely .gallery_page_nggallery-manage-gallery .ui-dialog{height:auto!important;min-height:auto}@media (max-width:1140px){#iframely .plupload_buttons{display:inline;margin:0 0 0 10px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:130px!important}}@media (max-width:940px){#iframely .plupload_buttons{display:block;margin:10px 0 0 75px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:201px!important}}@media (max-width:800px){#iframely .ngg-admin #wpbody{padding:0}#iframely #ngg_page_content .ngg_page_content_menu{padding:5px 0 0;background:0 0;border:none}#iframely #ngg_page_content .ngg_page_content_menu a{display:block;width:100%;float:left;padding:0;text-align:center;box-sizing:border-box}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#iframely #ngg_page_content .ngg_page_content_menu a:active{background:0 0}#iframely #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after{display:none}#iframely #ngg_page_content .ngg_page_content_menu a:last-of-type{padding-bottom:5px}#iframely .plupload_buttons{margin-left:0}#iframely #ngg_page_content .plupload_droptext{line-height:60px}#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-primary,#iframely .gallery_page_ngg_addgallery #ngg_page_content .button-secondary,#iframely .gallery_page_ngg_addgallery #ngg_page_content button{width:100%!important;margin:4px 0;display:block}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css index 009be2366..55547c1cc 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.css @@ -1,7 +1,7 @@ .nggPlaceholder { background-color: #143650; box-sizing: border-box; - border-bottom: 5px solid #9fbb1a; + border-top: 5px solid #9fbb1a; border-radius: 3px; box-shadow: 0 0 4px 1px rgba(0,0,0,.05); color: #9fbb1a; @@ -10,7 +10,7 @@ height: 230px; margin: 5px; outline: none !important; - padding: 30px 30px 50px 30px; + padding: 20px 30px 50px 30px; text-align: center; width: 400px; max-width: 98%; @@ -19,30 +19,43 @@ .nggPlaceholder h3 { color: #fff; font-family: Lato, sans-serif; - font-size: 16px; - font-size: 1.6rem; + font-size: 22px; font-weight: 600; margin: 40px 0 8px 0; + text-transform: uppercase; + font-weight: 900; + letter-spacing: 1.5px; + margin-left: 3px; } -.nggPlaceholderButton:hover { - margin: 0; - opacity: .8; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; - color: #9fbb1a; +.nggPlaceholderButton { + background: #9ebd00 !important; + border-radius: 2px; + border: none !important; + box-shadow: none !important; + color: #fff !important; + display: inline-block !important; + font-size: 13px; + font-weight: bold; + font-family: Lato, sans-serif !important !important; + height: 36px !important; + line-height: 36px !important; + letter-spacing: 1.2px; + margin: 4px; + padding: 0; + width: 106px; + text-align: center; + text-transform: uppercase !important; + text-shadow: none !important; + cursor: pointer; } -.nggPlaceholderButton { - font-size: 15px; - font-size: 1.5rem; - margin: 0; - opacity: 1.0; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - color: #bbb; - padding: 4px 0px 0 12px; - color: rgba(159, 187, 26, 0.7) +.nggPlaceholderButtonRow { + display: flex; + justify-content: center; + align-items: center; } -.nggPlaceholderButton.nggIgwRemove { - border-left: 1px solid rgba(204, 204, 204, 0.4); +.nggPlaceholderButton:hover { + background: #a5c31a !important; } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js index 2cad3d046..7a70c3e59 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.js @@ -58,11 +58,12 @@ * Listen for click events to our placeholder */ editor.on('mouseup touchend', function(e) { + tinymce.extend(self, { editor: editor, plugin: editor.plugins.NextGEN_AttachToPost }); - + // Support for IGW placeholder images. NGG <= 2.1.50 if (e.target.tagName == 'IMG') { if (self.get_class_name(e.target).indexOf('ngg_displayed_gallery') >= 0) { @@ -75,87 +76,99 @@ }); } } + // Support for IGW Visual Shortcodes. NGG >= 2.1.50.1 else { + var $target = $(e.target); - if ($target.parents('.nggPlaceholderButton')) { - $target = $target.parents('.nggPlaceholderButton'); - } + if ($target.hasClass('nggPlaceholderButton')) { // Remove button if ($target.hasClass('nggIgwRemove')) { - $target.parents('.nggPlaceholder').remove(); + var $placeholder = $target.parents('.nggPlaceholder') + var shortcode = $placeholder[0].getAttribute('data-shortcode') + editor.fire('ngg-removed', {shortcode: shortcode}) + $placeholder.remove(); } - + // Edit button else { - window.igw_shortcode= $(e.target).parents('.nggPlaceholder').data('shortcode'); + // Do not use jQuery's .data() here: it will use cached data + window.igw_shortcode = $(e.target).parents('.nggPlaceholder')[0].getAttribute('data-shortcode'); + self.render_attach_to_post_interface({ key: 'shortcode', val: Base64.encode(window.igw_shortcode), ref: $(e.target).parents('.nggPlaceholder').attr('id') }); } + } + } + }); /** * Find each shortcode and replace it with the placeholder, rendered using an underscore template * in templates/tinymce_placeholder.php */ - editor.on('BeforeSetContent', function(event){ - var shortcode_opening_tag = '[ngg_images '; - while (event.content.indexOf(shortcode_opening_tag)>=0) { - var start_of_shortcode = event.content.indexOf(shortcode_opening_tag); - var index = start_of_shortcode+shortcode_opening_tag.length; - var found_attribute_assignment = false; - var current_attribute_enclosure = null; - var last_found_char = false; - var content_length = event.content.length; - while (true) { - var char = event.content[index]; - if (char == '"' || char == "'" && last_found_char == '=') { - // Is this the closing quote for an already found attribute assignment? - if (found_attribute_assignment && current_attribute_enclosure == char) { - found_attribute_assignment = false; - current_attribute_enclosure = null; - } - else { - found_attribute_assignment = true; - current_attribute_enclosure = char; - } - } - else if (char == ']') { - // we've found a shortcode closing tag. But, we need to ensure - // that this ] isn't within the value of a shortcode attribute - if (!found_attribute_assignment) { - break; //exit loop - we've found the shortcode - } - } + editor.on('BeforeSetContent', function(event) { + function handle_shortcode(shortcode_opening_tag) { + while (event.content.indexOf(shortcode_opening_tag) >= 0) { + var start_of_shortcode = event.content.indexOf(shortcode_opening_tag); + var index = start_of_shortcode + shortcode_opening_tag.length; + var found_attribute_assignment = false; + var current_attribute_enclosure = null; + var last_found_char = false; + var content_length = event.content.length; + while (true) { + var char = event.content[index]; + if (char == '"' || char == "'" && last_found_char == '=') { + // Is this the closing quote for an already found attribute assignment? + if (found_attribute_assignment && current_attribute_enclosure == char) { + found_attribute_assignment = false; + current_attribute_enclosure = null; + } + else { + found_attribute_assignment = true; + current_attribute_enclosure = char; + } + } + else if (char == ']') { + // we've found a shortcode closing tag. But, we need to ensure + // that this ] isn't within the value of a shortcode attribute + if (!found_attribute_assignment) { + break; //exit loop - we've found the shortcode + } + } - last_found_char = char; + last_found_char = char; - if (index == content_length) { - break; - } + if (index == content_length) { + break; + } - index++; - } + index++; + } - // Replace the shortcode with a placeholder - var match = event.content.substring(start_of_shortcode, ++index); - var shortcode = match.substring(1, match.length-1); - shortcode = shortcode.replace('[', '['); - shortcode = shortcode.replace(']', ']'); - - var template = _.template($('#ngg-igw-placeholder').html()); - event.content = event.content.replace(match, template($.extend(ngg_igw_i18n, { - shortcode: shortcode, - ref: _.now() - }))); + // Replace the shortcode with a placeholder + var match = event.content.substring(start_of_shortcode, ++index); + var shortcode = match.substring(1, match.length-1); + shortcode = shortcode.replace('[', '['); + shortcode = shortcode.replace(']', ']'); + + var template = _.template($('#ngg-igw-placeholder').html()); + event.content = event.content.replace(match, template($.extend(ngg_igw_i18n, { + shortcode: shortcode, + ref: _.now() + }))); + } } + + handle_shortcode('[ngg_images '); + handle_shortcode('[ngg '); }); /** @@ -202,7 +215,8 @@ if (typeof(params['ref']) != 'undefined') { attach_to_post_url += '&ref='+encodeURIComponent(params.ref); } - } + } + attach_to_post_url += "&editor="+this.editor.id; var win = window; while (win.parent != null && win.parent != win) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css index 22b6ec5c9..4756c0ce9 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.css @@ -1 +1 @@ -.nggPlaceholder{background-color:#143650;box-sizing:border-box;border-bottom:5px solid #9fbb1a;border-radius:3px;box-shadow:0 0 4px 1px rgba(0,0,0,.05);color:#9fbb1a;font-family:sans-serif;font-size:20px;height:230px;margin:5px;outline:0!important;padding:30px 30px 50px 30px;text-align:center;width:400px;max-width:98%}.nggPlaceholder h3{color:#fff;font-family:Lato,sans-serif;font-size:16px;font-size:1.6rem;font-weight:600;margin:40px 0 8px 0}.nggPlaceholderButton:hover{margin:0;opacity:.8;color:#9fbb1a}.nggPlaceholderButton{font-size:15px;font-size:1.5rem;margin:0;opacity:1;color:#bbb;padding:4px 0 0 12px;color:rgba(159,187,26,.7)}.nggPlaceholderButton.nggIgwRemove{border-left:1px solid rgba(204,204,204,.4)} \ No newline at end of file +.nggPlaceholder{background-color:#143650;box-sizing:border-box;border-top:5px solid #9fbb1a;border-radius:3px;box-shadow:0 0 4px 1px rgba(0,0,0,.05);color:#9fbb1a;font-family:sans-serif;font-size:20px;height:230px;margin:5px;outline:0!important;padding:20px 30px 50px;text-align:center;width:400px;max-width:98%}.nggPlaceholder h3{color:#fff;font-family:Lato,sans-serif;font-size:22px;margin:40px 0 8px 3px;text-transform:uppercase;font-weight:900;letter-spacing:1.5px}.nggPlaceholderButton{background:#9ebd00!important;border-radius:2px;border:none!important;box-shadow:none!important;color:#fff!important;display:inline-block!important;font-size:13px;font-weight:700;font-family:Lato,sans-serif!important!important;height:36px!important;line-height:36px!important;letter-spacing:1.2px;margin:4px;padding:0;width:106px;text-align:center;text-transform:uppercase!important;text-shadow:none!important;cursor:pointer}.nggPlaceholderButtonRow{display:flex;justify-content:center;align-items:center}.nggPlaceholderButton:hover{background:#a5c31a!important} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js index 17206b29d..1ede19d30 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/static/ngg_attach_to_post_tinymce_plugin.min.js @@ -1 +1 @@ -!function(t,e){window.id="wordpress-post-page",tinyMCE.addI18n("en.ngg_attach_to_post",{title:"Attach NextGEN Gallery to Post"}),tinymce.create("tinymce.plugins.NextGEN_AttachToPost",{siteurl:t,getInfo:function(){return{longname:"NextGEN Gallery",author:"Imagely",authorurl:"https://www.imagely.com",infourl:"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",version:"0.1"}},init:function(t,n){var o=this;t.windowManager.nggOldOpen=t.windowManager.open,t.windowManager.open=function(e,n){var a=t.windowManager.nggOldOpen(e,n);return a.on("close",o.wm_close_event),a},t.addCommand("ngg_attach_to_post",this.render_attach_to_post_interface,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),t.addButton("NextGEN_AttachToPost",{title:"ngg_attach_to_post.title",cmd:"ngg_attach_to_post",image:n+"/igw_button.png"}),t.on("mouseup touchend",function(n){if(tinymce.extend(o,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),"IMG"==n.target.tagName){if(o.get_class_name(n.target).indexOf("ngg_displayed_gallery")>=0){t.dom.events.cancel(n);var a=n.target.src.match(/\d+$/);a&&(a=a.pop()),o.render_attach_to_post_interface({key:"id",val:a})}}else{var r=e(n.target);r.parents(".nggPlaceholderButton")&&(r=r.parents(".nggPlaceholderButton")),r.hasClass("nggPlaceholderButton")&&(r.hasClass("nggIgwRemove")?r.parents(".nggPlaceholder").remove():(window.igw_shortcode=e(n.target).parents(".nggPlaceholder").data("shortcode"),o.render_attach_to_post_interface({key:"shortcode",val:Base64.encode(window.igw_shortcode),ref:e(n.target).parents(".nggPlaceholder").attr("id")})))}}),t.on("BeforeSetContent",function(t){for(;t.content.indexOf("[ngg_images ")>=0;){for(var n=t.content.indexOf("[ngg_images "),o=n+"[ngg_images ".length,a=!1,r=null,i=!1,c=t.content.length;;){var l=t.content[o];if('"'==l||"'"==l&&"="==i)a&&r==l?(a=!1,r=null):(a=!0,r=l);else if("]"==l&&!a)break;if(i=l,o==c)break;o++}var g=t.content.substring(n,++o),s=g.substring(1,g.length-1);s=s.replace("[","["),s=s.replace("]","]");var d=_.template(e("#ngg-igw-placeholder").html());t.content=t.content.replace(g,d(e.extend(ngg_igw_i18n,{shortcode:s,ref:_.now()})))}}),t.on("PostProcess",function(t){var n=e("<div/>").append(t.content);n.find(".nggPlaceholder").toArray().forEach(function(t){var n=e(t),o=n.data("shortcode");o="<p>["+_.unescape(o)+"]</p>",n.replaceWith(o)}),t.content=n.html()})},get_class_name:function(t){var e=t.getAttribute("class")?t.getAttribute("class"):t.className;return e||""},wm_close_event:function(t){t&&t.target&&t.target._id&&"ngg_attach_to_post_dialog"==t.target._id&&(e("html,body").css("overflow","auto"),tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select("p")[0]),tinyMCE.activeEditor.selection.collapse(0))},render_attach_to_post_interface:function(t){var n=nextgen_gallery_attach_to_post_url;void 0!==t&&(n+="&"+t.key+"="+encodeURIComponent(t.val),void 0!==t.ref&&(n+="&ref="+encodeURIComponent(t.ref)));for(var o=window;null!=o.parent&&o.parent!=o;)o=o.parent;o=e(o);var a=o.width(),r=o.height(),i=1600,c=1200,l=a-.05*a,g=r-.1*r;l<800&&(l=a-20),g<600&&(g=r-40),i>l&&(i=l),c>g&&(c=g),document.activeElement.blur(),Array.prototype.forEach.call(document.querySelectorAll("input, textarea"),function(t){t.blur()}),this.editor.windowManager.open({url:n,id:"ngg_attach_to_post_dialog",width:i,height:c,title:"NextGEN Gallery - Attach To Post"}),e("html,body").css("overflow","hidden"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-y","auto"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-x","hidden")}}),tinymce.PluginManager.add("NextGEN_AttachToPost",tinymce.plugins.NextGEN_AttachToPost)}(photocrati_ajax.wp_site_url,jQuery); \ No newline at end of file +!function(t,e){window.id="wordpress-post-page",tinyMCE.addI18n("en.ngg_attach_to_post",{title:"Attach NextGEN Gallery to Post"}),tinymce.create("tinymce.plugins.NextGEN_AttachToPost",{siteurl:t,getInfo:function(){return{longname:"NextGEN Gallery",author:"Imagely",authorurl:"https://www.imagely.com",infourl:"https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/",version:"0.1"}},init:function(t,n){var o=this;t.windowManager.nggOldOpen=t.windowManager.open,t.windowManager.open=function(e,n){var a=t.windowManager.nggOldOpen(e,n);return a.on("close",o.wm_close_event),a},t.addCommand("ngg_attach_to_post",this.render_attach_to_post_interface,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),t.addButton("NextGEN_AttachToPost",{title:"ngg_attach_to_post.title",cmd:"ngg_attach_to_post",image:n+"/igw_button.png"}),t.on("mouseup touchend",function(n){if(tinymce.extend(o,{editor:t,plugin:t.plugins.NextGEN_AttachToPost}),"IMG"==n.target.tagName){if(o.get_class_name(n.target).indexOf("ngg_displayed_gallery")>=0){t.dom.events.cancel(n);var a=n.target.src.match(/\d+$/);a&&(a=a.pop()),o.render_attach_to_post_interface({key:"id",val:a})}}else{var r=e(n.target);if(r.hasClass("nggPlaceholderButton"))if(r.hasClass("nggIgwRemove")){var i=r.parents(".nggPlaceholder"),c=i[0].getAttribute("data-shortcode");t.fire("ngg-removed",{shortcode:c}),i.remove()}else window.igw_shortcode=e(n.target).parents(".nggPlaceholder")[0].getAttribute("data-shortcode"),o.render_attach_to_post_interface({key:"shortcode",val:Base64.encode(window.igw_shortcode),ref:e(n.target).parents(".nggPlaceholder").attr("id")})}}),t.on("BeforeSetContent",function(t){function n(n){for(;t.content.indexOf(n)>=0;){for(var o=t.content.indexOf(n),a=o+n.length,r=!1,i=null,c=!1,l=t.content.length;;){var g=t.content[a];if('"'==g||"'"==g&&"="==c)r&&i==g?(r=!1,i=null):(r=!0,i=g);else if("]"==g&&!r)break;if(c=g,a==l)break;a++}var s=t.content.substring(o,++a),d=s.substring(1,s.length-1);d=d.replace("[","["),d=d.replace("]","]");var h=_.template(e("#ngg-igw-placeholder").html());t.content=t.content.replace(s,h(e.extend(ngg_igw_i18n,{shortcode:d,ref:_.now()})))}}n("[ngg_images "),n("[ngg ")}),t.on("PostProcess",function(t){var n=e("<div/>").append(t.content);n.find(".nggPlaceholder").toArray().forEach(function(t){var n=e(t),o=n.data("shortcode");o="<p>["+_.unescape(o)+"]</p>",n.replaceWith(o)}),t.content=n.html()})},get_class_name:function(t){var e=t.getAttribute("class")?t.getAttribute("class"):t.className;return e||""},wm_close_event:function(t){t&&t.target&&t.target._id&&"ngg_attach_to_post_dialog"==t.target._id&&(e("html,body").css("overflow","auto"),tinyMCE.activeEditor.selection.select(tinyMCE.activeEditor.dom.select("p")[0]),tinyMCE.activeEditor.selection.collapse(0))},render_attach_to_post_interface:function(t){var n=nextgen_gallery_attach_to_post_url;void 0!==t&&(n+="&"+t.key+"="+encodeURIComponent(t.val),void 0!==t.ref&&(n+="&ref="+encodeURIComponent(t.ref))),n+="&editor="+this.editor.id;for(var o=window;null!=o.parent&&o.parent!=o;)o=o.parent;o=e(o);var a=o.width(),r=o.height(),i=1600,c=1200,l=a-.05*a,g=r-.1*r;l<800&&(l=a-20),g<600&&(g=r-40),i>l&&(i=l),c>g&&(c=g),document.activeElement.blur(),Array.prototype.forEach.call(document.querySelectorAll("input, textarea"),function(t){t.blur()}),this.editor.windowManager.open({url:n,id:"ngg_attach_to_post_dialog",width:i,height:c,title:"NextGEN Gallery - Attach To Post"}),e("html,body").css("overflow","hidden"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-y","auto"),e("#ngg_attach_to_post_dialog_ifr").css("overflow-x","hidden")}}),tinymce.PluginManager.add("NextGEN_AttachToPost",tinymce.plugins.NextGEN_AttachToPost)}(photocrati_ajax.wp_site_url,jQuery); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php index 9defe7b5e..a39259986 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/display_settings_form.php @@ -1,3 +1,7 @@ -<form rel="<?php echo esc_attr($display_type_name) ?>" class="<?php echo esc_attr($css_class) ?>" method='POST' action='<?php echo esc_attr($_SERVER['REQUEST_URI'])?>'> +<form rel="<?php echo esc_attr($display_type_name) ?>" + class="<?php echo esc_attr($css_class) ?>" + method='POST' + action='<?php echo esc_attr($_SERVER['REQUEST_URI'])?>' + data-defaults="<?php print esc_attr(json_encode($defaults)); ?>"> <?php echo $settings ?> </form> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php index 5a02a28f6..69e3e4b53 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/templates/tinymce_placeholder.php @@ -1,11 +1,16 @@ <script type="text/underscore-template" id="ngg-igw-placeholder"> - <div class="mceItem mceNonEditable nggPlaceholder" id="<%- ref %>" data-shortcode="<%- shortcode %>" data-mce-resize="false" data-mce-placeholder="1" contenteditable="false"> + <div class="mceItem mceNonEditable nggPlaceholder" + id="<%- ref %>" + data-shortcode="<%- shortcode %>" + data-mce-resize="false" + data-mce-placeholder="1" + contenteditable="false"> <h3><%- nextgen_gallery %></h3> - <span title="<%- edit %>" class="nggPlaceholderButton nggIgwEdit"> - <i class="fa fa-pencil-square-o" aria-hidden="true"></i> - </span> - <span title="<%- remove %>" class="nggPlaceholderButton nggIgwRemove"> - <i class="fa fa-times-circle" aria-hidden="true"></i> - </span> + <div class="nggPlaceholderButton nggIgwEdit"> + <%- edit %> + </div> + <div class="nggPlaceholderButton nggIgwRemove"> + <%- remove %> + </div> </div> </script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php index 1f0945ac8..2bb24b332 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/module.cache.php @@ -32,6 +32,9 @@ class M_Cache extends C_Base_Module $this->get_registry()->add_utility('I_Cache', 'C_Cache'); } + /** + * @return array + */ function get_type_list() { return array( diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php index d19bd8410..9260ab5b9 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/cache/package.module.cache.php @@ -13,6 +13,10 @@ class C_Cache extends C_Component $this->add_mixin('Mixin_Cache'); $this->implement('I_Cache'); } + /** + * @param bool|string $context + * @return C_Cache + */ public static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php index 37500d1d9..ffbc13071 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/module.datamapper.php @@ -177,8 +177,8 @@ class M_DataMapper extends C_Base_Module /** * Adds post_name to the where clause - * @param type $where - * @param type $wp_query + * @param string $where + * @param WP_Query $wp_query */ function add_post_name_where_clauses(&$where, &$wp_query) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php index ee9a1c77f..461dde2aa 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/datamapper/package.module.datamapper.php @@ -40,7 +40,7 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin /** * Used to select which fields should be returned. NOT currently used by * this implementation of the datamapper driver - * @param type $fields + * @param string $fields * @return C_DataMapper_Driver_Base */ function select($fields = '*') @@ -50,8 +50,8 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Specifies an order clause - * @param type $order_by - * @param type $direction + * @param string $order_by + * @param string $direction * @return C_DataMapper_Driver_Base */ function order_by($order_by, $direction = 'ASC') @@ -70,9 +70,9 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Specifies a limit and optional offset - * @param integer $max - * @param integer $offset - * @return C_DataMapper_Driver_Base + * @param int $max + * @param int|bool $offset (optional) + * @return object */ function limit($max, $offset = FALSE) { @@ -90,6 +90,7 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin /** * Specifies a list of columns to group by * @param array|string $columns + * @return object */ function group_by($columns = array()) { @@ -217,8 +218,9 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Destroys/deletes an entity from the database - * @param stdObject|C_DataMapper_Model $entity - * @return type + * @param object|C_DataMapper_Model $entity + * @param bool $skip_trash (optional) Default = true + * @return bool */ function destroy($entity, $skip_trash = TRUE) { @@ -276,8 +278,8 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Converts an entity to a post - * @param type $entity - * @return type + * @param object $entity + * @return object */ function _convert_entity_to_post($entity) { @@ -359,7 +361,8 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Saves an entity to the database - * @param stdObject $entity + * @param object $entity + * @return int Post ID */ function _save_entity($entity) { @@ -393,7 +396,7 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Determines whether the current statement is DELETE - * @return type + * @return bool */ function is_delete_statement() { @@ -411,7 +414,9 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Runs the query - * @param string $sql optionally run the specified query + * @param string|bool $sql (optional) Run the specified query + * @param object|bool $model (optional) + * @param bool $convert_to_entities (optional) Default = true * @return array */ function run_query($sql = FALSE, $model = FALSE, $convert_to_entities = TRUE) @@ -478,8 +483,9 @@ class Mixin_CustomPost_DataMapper_Driver extends Mixin } /** * Fetches the last row - * @param array $conditions - * @return C_DataMapper_Entity + * @param array $conditions (optional) + * @param object|bool $model (optional) + * @return object */ function find_last($conditions = array(), $model = FALSE) { @@ -613,7 +619,7 @@ class C_DataMapper_Driver_Base extends C_Component /** * Determines whether a column is present for the table * @param string $column_name - * @return string + * @return bool */ function has_column($column_name) { @@ -684,9 +690,9 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Selects which fields to collect from the table. - * NOTE: Not protected from SQL injection - DO NOT let your users - * specify DB columns + * NOTE: Not protected from SQL injection - DO NOT let your users specify DB columns * @param string $fields + * @return object */ function select($fields = NULL) { @@ -708,7 +714,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Determines if we're going to be executing a DELETE statement - * @return type + * @return bool */ function is_delete_statement() { @@ -729,6 +735,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin * This method may be used multiple of times to order by more than column * @param $order_by * @param $direction + * @return object */ function order_by($order_by, $direction = 'ASC') { @@ -751,6 +758,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin * Specifies a limit and optional offset * @param integer $max * @param integer $offset + * @return object */ function limit($max, $offset = 0) { @@ -767,6 +775,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin /** * Specifics a group by clause for one or more columns * @param array|string $columns + * @return object */ function group_by($columns = array()) { @@ -810,7 +819,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Returns the total number of entities known - * @return type + * @return int */ function count() { @@ -824,6 +833,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Returns the generated SQL query to be executed + * @param bool $no_entities Default = false * @return string */ function get_generated_query($no_entities = FALSE) @@ -857,8 +867,10 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Run the query - * @param $sql optionally run the specified SQL insteads - * return + * @param string|bool $sql (optional) run the specified SQL + * @param object|bool $model (optional) + * @param bool $no_entities (optional) + * @return array */ function run_query($sql = FALSE, $model = FALSE, $no_entities = FALSE) { @@ -915,7 +927,8 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Stores the entity - * @param stdClass $entity + * @param object $entity + * @return bool|object */ function _save_entity($entity) { @@ -943,9 +956,8 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin return $retval; } /** - * Converts an entity to something suitable for inserting into - * a database column - * @param stdObject $entity + * Converts an entity to something suitable for inserting into a database column + * @param object $entity * @return array */ function _convert_to_table_data($entity) @@ -960,7 +972,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Destroys/deletes an entity - * @param stdObject|C_DataMapper_Model|int $entity + * @param object|C_DataMapper_Model|int $entity * @return boolean */ function destroy($entity) @@ -982,7 +994,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Creates a new record in the database - * @param stdObject $entity + * @param object $entity * @return boolean */ function _create($entity) @@ -997,7 +1009,8 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin } /** * Updates a record in the database - * @param stdObject $entity + * @param object $entity + * @return int|bool */ function _update($entity) { @@ -1007,7 +1020,7 @@ class C_CustomTable_DataMapper_Driver_Mixin extends Mixin /** * Fetches the last row * @param array $conditions - * @return C_DataMapper_Entity + * @return object */ function find_last($conditions = array(), $model = FALSE) { @@ -1223,7 +1236,8 @@ class Mixin_DataMapper_Driver_Base extends Mixin /** * Finds a partiular entry by id * @param int|stdClass|C_DataMapper_Model $entity - * @return C_DataMapper_Entity + * @param object|bool $model (optional) + * @return null|object */ function find($entity, $model = FALSE) { @@ -1244,8 +1258,9 @@ class Mixin_DataMapper_Driver_Base extends Mixin } /** * Fetches the first row - * @param array $conditions - * @return C_DataMapper_Entity + * @param array $conditions (optional) + * @param object|bool $model (optional) + * @return null|object */ function find_first($conditions = array(), $model = FALSE) { @@ -1258,7 +1273,8 @@ class Mixin_DataMapper_Driver_Base extends Mixin } /** * Queries all rows - * @param array $conditions + * @param array $conditions (optional) + * @param object|bool $model (optional) * @return array */ function find_all($conditions = array(), $model = FALSE) @@ -1287,15 +1303,25 @@ class Mixin_DataMapper_Driver_Base extends Mixin * array("post_title = %s", "Foo"), * * ) + * @param array $conditions (optional) + * @return self */ function where_and($conditions = array()) { return $this->object->_where($conditions, 'AND'); } + /** + * @param array $conditions (optional) + * @return self + */ function where_or($conditions = array()) { return $this->object->where($conditions, 'OR'); } + /** + * @param array $conditions (optional) + * @return self + */ function where($conditions = array()) { return $this->object->_where($conditions, 'AND'); @@ -1432,8 +1458,8 @@ class Mixin_DataMapper_Driver_Base extends Mixin } /** * Converts a stdObject to an Entity - * @param stdObject $stdObject - * @return stdObject + * @param object $stdObject + * @return object */ function _convert_to_entity($stdObject) { @@ -1487,7 +1513,9 @@ class Mixin_DataMapper_Driver_Base extends Mixin } /** * Converts a stdObject entity to a model - * @param stdObject $stdObject + * @param object $stdObject + * @param string|bool $context (optional) + * @return object */ function convert_to_model($stdObject, $context = FALSE) { @@ -1503,7 +1531,8 @@ class Mixin_DataMapper_Driver_Base extends Mixin } /** * Creates a new model - * @param stdClass|array $properties + * @param object|array $properties (optional) + * @param string|bool $context (optional) * @return C_DataMapper_Model */ function create($properties = array(), $context = FALSE) @@ -1530,7 +1559,7 @@ class Mixin_DataMapper_Driver_Base extends Mixin /** * Saves an entity * @param stdClass|C_DataMapper_Model $entity - * @return bool + * @return bool|int Resulting ID or false upon failure */ function save($entity) { @@ -1577,6 +1606,7 @@ class Mixin_DataMapper_Driver_Base extends Mixin * Subclasses and adapters should extend this method to provide their * implementation. The implementation should make use of the * _set_default_value() method + * @param object $stdObject */ function set_defaults($stdObject) { @@ -1742,9 +1772,8 @@ class C_DataMapper_Model extends C_Component } /** * Creates a new entity for the specified mapper - * @param C_DataMapper_Driver_Base $mapper - * @param array|stdClass $properties - * @param string $context + * @param C_DataMapper_Driver_Base $mapper (optional) + * @param array|object|bool $properties (optional) */ function initialize($mapper = NULL, $properties = FALSE) { @@ -1769,7 +1798,9 @@ class C_DataMapper_Model extends C_Component return $this->_mapper; } /** - * Gets a property of the model + * Gets a property of the model + * @param string $property + * @return mixed */ function &__get($property) { @@ -1785,6 +1816,9 @@ class C_DataMapper_Model extends C_Component } /** * Sets a property for the model + * @param mixed $property + * @param mixed $value + * @return mixed $value */ function &__set($property, $value) { @@ -1797,7 +1831,8 @@ class C_DataMapper_Model extends C_Component } /** * Saves the entity - * @param type $updated_attributes + * @param array $updated_attributes + * @return int|bool Object ID or false upon failure */ function save($updated_attributes = array()) { @@ -1806,6 +1841,7 @@ class C_DataMapper_Model extends C_Component } /** * Updates the attributes for an object + * @param array $array (optional) */ function update_attributes($array = array()) { @@ -1832,7 +1868,7 @@ class C_DataMapper_Model extends C_Component } /** * Determines whether the object is new or existing - * @return type + * @return bool */ function is_new() { @@ -1840,6 +1876,8 @@ class C_DataMapper_Model extends C_Component } /** * Gets/sets the primary key + * @param null|int|string $value (optional) + * @return mixed */ function id($value = NULL) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php index 6379405fb..75ecad65f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_stylesheet/package.module.dynamic_stylesheet.php @@ -63,7 +63,7 @@ class Mixin_Dynamic_Stylesheet_Instance_Methods extends Mixin /** * Loads a template, along with the dynamic variables to be interpolated * @param string $name - * @param array $vars + * @param array $data (optional) */ function enqueue($name, $data = array()) { @@ -73,11 +73,11 @@ class Mixin_Dynamic_Stylesheet_Instance_Methods extends Mixin } if (defined('NGG_INLINE_DYNAMIC_CSS') && NGG_INLINE_DYNAMIC_CSS) { $css = $this->render_view($this->object->get_css_template($index), $data, TRUE); - wp_enqueue_style('ngg_dyncss', $this->get_static_url('photocrati-dynamic_stylesheet#blank.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('ngg_dyncss', $this->get_static_url('photocrati-dynamic_stylesheet#blank.css'), array(), NGG_SCRIPT_VERSION); wp_add_inline_style('ngg_dyncss', $css); } else { $data = $this->object->encode($data); - wp_enqueue_style('dyncss-' . $index . $data . '@dynamic', $this->object->get_router()->get_url("/{$this->object->_app}", FALSE) . "?index={$index}&data={$data}", FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('dyncss-' . $index . $data . '@dynamic', $this->object->get_router()->get_url("/{$this->object->_app}", array()) . "?index={$index}&data={$data}", FALSE, NGG_SCRIPT_VERSION); } } } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php index c5e30a036..bed66ba44 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/dynamic_thumbnails/package.module.dynamic_thumbnails.php @@ -103,7 +103,7 @@ class C_Dynamic_Thumbnails_Controller extends C_MVC_Controller /** * Returns an instance of this class * - * @param string $context + * @param string|bool $context * @return C_Dynamic_Thumbnails_Controller */ static function get_instance($context = FALSE) @@ -504,6 +504,10 @@ class C_Dynamic_Thumbnails_Manager extends C_Component $this->implement('I_Dynamic_Thumbnails_Manager'); $this->add_mixin('Mixin_Dynamic_Thumbnails_Manager'); } + /** + * @param bool|string $context + * @return C_Dynamic_Thumbnails_Manager + */ static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php index 8d1cb6ab7..751b7cd4b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/frame_communication/package.module.frame_communication.php @@ -21,7 +21,7 @@ class C_Frame_Event_Publisher extends C_Component } /** * Gets an instance of the publisher - * @param string $context + * @param string|bool $context * @return C_Frame_Event_Publisher */ static function get_instance($context = FALSE) @@ -55,8 +55,8 @@ class Mixin_Frame_Event_Publisher extends Mixin } /** * Adds a setting to the frame events - * @param type $data - * @return type + * @param array $data + * @return array */ function add_event($data) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php index 36c6c61db..dba1c05fd 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/fs/package.module.fs.php @@ -46,9 +46,9 @@ class Mixin_Fs_Instance_Methods extends Mixin /** * Returns a calculated path to a file * @param string $path - * @param string $module - * @param boolean $relpath - * @returns string + * @param string|false $module (optional) + * @param bool $relpath (optional) + * @return string */ function get_abspath($path, $module = FALSE, $relpath = FALSE) { @@ -76,7 +76,7 @@ class Mixin_Fs_Instance_Methods extends Mixin /** * Returns a calculated relpath to a particular file * @param string $path - * @param string $module + * @param string|false $module (optional) * @return string */ function get_relpath($path, $module = FALSE) @@ -99,8 +99,10 @@ class Mixin_Fs_Instance_Methods extends Mixin * * If the path doesn't exist, then NULL is returned * @param string $path - * @param string $module - * @returns string|NULL + * @param string|false $module (optional) + * @param bool $relpath (optional) + * @param array $search_paths (optional) + * @return string|NULL */ function find_abspath($path, $module = FALSE, $relpath = FALSE, $search_paths = array()) { @@ -141,7 +143,7 @@ class Mixin_Fs_Instance_Methods extends Mixin /** * Returns a list of directories to search for a particular filename * @param string $path - * @param string $module + * @param string|false $module (optional) * @return array */ function get_search_paths($path, $module = FALSE) @@ -180,7 +182,7 @@ class Mixin_Fs_Instance_Methods extends Mixin * * @param string $base_path * @param string $file - * @return string + * @return null|string */ function _rglob($base_path, $file) { @@ -208,16 +210,19 @@ class Mixin_Fs_Instance_Methods extends Mixin return $retval; } /** - * Gets the relative path to a file/directory for a specific Pope product. - * If the path doesn't exist, then NULL is returned - * @param type $path - * @param type $module - * @returns string|NULL + * Gets the relative path to a file/directory for a specific Pope product. If the path doesn't exist, then NULL is returned + * @param string $path + * @param string|false $module (optional) + * @return string|null */ function find_relpath($path, $module = FALSE) { return $this->object->find_abspath($path, $module, TRUE); } + /** + * @param string $abspath + * @return bool + */ function delete($abspath) { $retval = FALSE; @@ -263,7 +268,6 @@ class Mixin_Fs_Instance_Methods extends Mixin } } } - // $retval = join(DIRECTORY_SEPARATOR, $retval); if (strpos($retval, $this->get_document_root()) !== 0 && strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') { $retval = DIRECTORY_SEPARATOR . trim($retval, "/\\"); } @@ -286,6 +290,7 @@ class Mixin_Fs_Instance_Methods extends Mixin /** * Parses the path for a module and filename * @param string $str + * @return array [path => module] */ function parse_formatted_path($str) { @@ -300,6 +305,7 @@ class Mixin_Fs_Instance_Methods extends Mixin } /** * Gets the document root for this application + * @param string $type Must be one of plugins, plugins_mu, templates, styles, content, gallery, or root * @return string */ function get_document_root($type = 'root') @@ -365,8 +371,8 @@ class Mixin_Fs_Instance_Methods extends Mixin } /** * Sets the document root for this application - * @param type $value - * @return type + * @param string $value + * @return string */ function set_document_root($value) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po index 9fc381845..a8270206e 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-da_DK.po @@ -3499,10 +3499,10 @@ msgstr "Galleriet ID =%s findes ikke." #. Description of the plugin msgid "" "The most popular gallery plugin for WordPress and one of the most popular " -"plugins of all time with over 22 million downloads." +"plugins of all time with over 23 million downloads." msgstr "" "Den mest populære galleri plugin til WordPress og et af de mest populære " -"plugins igennem tiden med over 22 millioner downloads." +"plugins igennem tiden med over 23 millioner downloads." #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:290 msgid "The most powerful gallery system ever built for WordPress. " diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po index cf65c8549..f3ac6689c 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery-sv_SE.po @@ -2431,7 +2431,7 @@ msgid "Server Settings" msgstr "Serverinställningar" #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:97 -msgid "NextGEN Gallery is one of the most popular WordPress plugins of all time with over 22 million downloads." +msgid "NextGEN Gallery is one of the most popular WordPress plugins of all time with over 23 million downloads." msgstr "NextGEN Gallery är en av de mest populära WordPress-tilläggen genom tiderna med över 22 miljoner nedladdningar." # Missed by NextGEN, translated string is displayed. @@ -3222,8 +3222,8 @@ msgid "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/" msgstr "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/" #. Description of the plugin/theme -msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 22 million downloads." -msgstr "Det mest populära galleri-tillägget för WordPress och ett av de mest populära tillägg genom tiderna med över 22 miljoner nedladdningar." +msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 23 million downloads." +msgstr "Det mest populära galleri-tillägget för WordPress och ett av de mest populära tillägg genom tiderna med över 23 miljoner nedladdningar." #. Author of the plugin/theme msgid "Imagely" diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.po b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.po index 79fc1ff3d..a751d939b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.po +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/lang/nggallery.po @@ -2446,7 +2446,7 @@ msgid "Server Settings" msgstr "" #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:97 -msgid "NextGEN Gallery is one of the most popular WordPress plugins of all time with over 22 million downloads." +msgid "NextGEN Gallery is one of the most popular WordPress plugins of all time with over 23 million downloads." msgstr "" #: products/photocrati_nextgen/modules/ngglegacy/admin/overview.php:97 @@ -3231,7 +3231,7 @@ msgid "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/" msgstr "" #. Description of the plugin/theme -msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 22 million downloads." +msgid "The most popular gallery plugin for WordPress and one of the most popular plugins of all time with over 23 million downloads." msgstr "" #. Author of the plugin/theme diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/module.i18n.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/module.i18n.php index 7451b85bb..367c13fa5 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/module.i18n.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/i18n/module.i18n.php @@ -118,7 +118,7 @@ class M_I18N extends C_Base_Module /** * Registers gallery strings with WPML * - * @param object $gallery + * @param int|object $gallery_id Gallery object or ID */ function register_gallery_strings($gallery_id) { @@ -201,10 +201,10 @@ class M_I18N extends C_Base_Module { foreach($gallery_ids[1] as $index => $gallery_id) { $translated_gallery_id = apply_filters('wpml_object_id', (int)$gallery_id, "displayed_gallery", true, $lang); - $search[$index] = "preview/id--" . $gallery_id; - $replace[$index] = "preview/id--" . $translated_gallery_id; } + $search[$index] = "preview/id--" . $gallery_id; + $replace[$index] = "preview/id--" . $translated_gallery_id; $post_array['post_content'] = str_replace($search, $replace, $post_array['post_content']); $to_save = array( diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/module.imagify.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/module.imagify.php index 24d7670fe..f030de296 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/module.imagify.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/module.imagify.php @@ -27,7 +27,7 @@ class M_Imagify extends C_Base_Module 'photocrati-imagify', 'NextGEN Imagify Integration', 'NextGen Gallery / Imagify Integration', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -48,10 +48,10 @@ class M_Imagify extends C_Base_Module // TODO: check for PHP 5.2 if (is_admin()) { - $this->get_registry() - ->add_adapter('I_Page_Manager', 'A_Imagify_Admin_Page'); - $this->get_registry() - ->add_adapter('I_NextGen_Admin_Page', 'A_Imagify_Admin_Page_Controller', 'ngg_imagify'); +// $this->get_registry() +// ->add_adapter('I_Page_Manager', 'A_Imagify_Admin_Page'); +// $this->get_registry() +// ->add_adapter('I_NextGen_Admin_Page', 'A_Imagify_Admin_Page_Controller', 'ngg_imagify'); } } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/package.module.imagify.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/package.module.imagify.php index 687252ca1..42b458511 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/package.module.imagify.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/imagify/package.module.imagify.php @@ -25,7 +25,7 @@ class A_Imagify_Admin_Page_Controller extends Mixin function enqueue_backend_resources() { $this->call_parent('enqueue_backend_resources'); - wp_enqueue_style('imagify_upgrade_page', $this->get_static_url('photocrati-imagify#style.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('imagify_upgrade_page', $this->get_static_url('photocrati-imagify#style.css'), array(), NGG_SCRIPT_VERSION); } function get_page_title() { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php index 1b6d8c9ff..c557796bd 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/package.module.lightbox.php @@ -32,6 +32,9 @@ class C_Lightbox_Library_Manager * @var C_Lightbox_Library_Manager */ static $_instance = NULL; + /** + * @return C_Lightbox_Library_Manager + */ static function get_instance() { if (!isset(self::$_instance)) { @@ -49,6 +52,13 @@ class C_Lightbox_Library_Manager $none = new C_NGG_Lightbox('none'); $none->title = __('None', 'nggallery'); $this->register('none', $none); + // Add Simplelightbox + $simplelightbox = new C_NGG_Lightbox('simplelightbox'); + $simplelightbox->title = __('Simplelightbox', 'nggallery'); + $simplelightbox->code = 'class="ngg-simplelightbox" rel="%GALLERY_NAME%"'; + $simplelightbox->styles = array('photocrati-lightbox#simplelightbox/simplelightbox.css'); + $simplelightbox->scripts = array('photocrati-lightbox#simplelightbox/simple-lightbox.js', 'photocrati-lightbox#simplelightbox/nextgen_simple_lightbox_init.js'); + $this->register('simplelightbox', $simplelightbox); // Add Fancybox $fancybox = new C_NGG_Lightbox('fancybox'); $fancybox->title = __('Fancybox', 'nggallery'); @@ -216,7 +226,7 @@ class C_Lightbox_Library_Manager wp_enqueue_style(array_pop($parts)); } else { if (!empty($src)) { - wp_enqueue_style($lightbox->name . "-{$i}", $this->_handle_url($src), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style($lightbox->name . "-{$i}", $this->_handle_url($src), array(), NGG_SCRIPT_VERSION); } } } @@ -239,6 +249,7 @@ class C_Lightbox_Library_Manager * Parses certain paths through get_static_url * * @param string $url + * @param string $type Unused * @return string Resulting URL */ static function _handle_url($url, $type = 'script') @@ -257,6 +268,7 @@ class C_Lightbox_Library_Manager * @param string $object_name * @param mixed $object_value * @param bool $define + * @return bool */ function _add_script_data($handle, $object_name, $object_value, $define = TRUE, $override = FALSE) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.css index c7b4397fe..38812912d 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/fancybox/jquery.fancybox-1.3.4.min.css @@ -1 +1 @@ -#fancybox-loading{position:fixed;top:50%;left:50%;width:40px;height:40px;margin-top:-20px;margin-left:-20px;cursor:pointer;overflow:hidden;z-index:1104;display:none}#fancybox-loading div{position:absolute;top:0;left:0;width:40px;height:480px;background-image:url(fancybox.png)}#fancybox-overlay{position:absolute;top:0;left:0;width:100%;z-index:1100;display:none}#fancybox-tmp{padding:0;margin:0;border:0;overflow:auto;display:none}#fancybox-wrap{position:absolute;top:0;left:0;padding:20px;z-index:1101;outline:0;display:none}#fancybox-outer{position:relative;width:100%;height:100%;background:#fff}#fancybox-content{width:0;height:0;padding:0;outline:0;position:relative;overflow:hidden;z-index:1102;border:0 solid #fff}#fancybox-hide-sel-frame{position:absolute;top:0;left:0;width:100%;height:100%;background:0 0;z-index:1101}#fancybox-close{position:absolute;top:-15px;right:-15px;width:30px;height:30px;background:transparent url(fancybox.png) -40px 0;cursor:pointer;z-index:1103;display:none}#fancybox-error{color:#444;font:normal 12px/20px Arial;padding:14px;margin:0}#fancybox-img{width:100%;height:100%;padding:0;margin:0;border:none;outline:0;line-height:0;vertical-align:top}#fancybox-frame{width:100%;height:100%;border:none;display:block}#fancybox-left,#fancybox-right{position:absolute;bottom:0;height:100%;width:35%;cursor:pointer;outline:0;background:transparent url(blank.gif);z-index:1102;display:none}#fancybox-left{left:0}#fancybox-right{right:0}#fancybox-left-ico,#fancybox-right-ico{position:absolute;top:50%;left:-9999px;width:30px;height:30px;margin-top:-15px;cursor:pointer;z-index:1102;display:block}#fancybox-left-ico{background-image:url(fancybox.png);background-position:-40px -30px}#fancybox-right-ico{background-image:url(fancybox.png);background-position:-40px -60px}#fancybox-left:hover,#fancybox-right:hover{visibility:visible}#fancybox-left:hover span{left:20px}#fancybox-right:hover span{left:auto;right:20px}.fancybox-bg{position:absolute;padding:0;margin:0;border:0;width:20px;height:20px;z-index:1001}#fancybox-bg-n{top:-20px;left:0;width:100%;background-image:url(fancybox-x.png)}#fancybox-bg-ne{top:-20px;right:-20px;background-image:url(fancybox.png);background-position:-40px -162px}#fancybox-bg-e{top:0;right:-20px;height:100%;background-image:url(fancybox-y.png);background-position:-20px 0}#fancybox-bg-se{bottom:-20px;right:-20px;background-image:url(fancybox.png);background-position:-40px -182px}#fancybox-bg-s{bottom:-20px;left:0;width:100%;background-image:url(fancybox-x.png);background-position:0 -20px}#fancybox-bg-sw{bottom:-20px;left:-20px;background-image:url(fancybox.png);background-position:-40px -142px}#fancybox-bg-w{top:0;left:-20px;height:100%;background-image:url(fancybox-y.png)}#fancybox-bg-nw{top:-20px;left:-20px;background-image:url(fancybox.png);background-position:-40px -122px}#fancybox-title{font-family:Helvetica;font-size:12px;z-index:1102}.fancybox-title-inside{padding-bottom:10px;text-align:center;color:#333;background:#fff;position:relative}.fancybox-title-outside{padding-top:10px;color:#fff}.fancybox-title-over{position:absolute;bottom:0;left:0;color:#fff;text-align:left}#fancybox-title-over{padding:10px;background-image:url(fancy_title_over.png);display:block}.fancybox-title-float{position:absolute;left:0;bottom:-20px;height:32px}#fancybox-title-float-wrap{border:none;border-collapse:collapse;width:auto}#fancybox-title-float-wrap td{border:none;white-space:nowrap}#fancybox-title-float-left{padding:0 0 0 15px;background:url(fancybox.png) -40px -90px no-repeat}#fancybox-title-float-main{color:#fff;line-height:29px;font-weight:700;padding:0 0 3px 0;background:url(fancybox-x.png) 0 -40px}#fancybox-title-float-right{padding:0 0 0 15px;background:url(fancybox.png) -55px -90px no-repeat}.fancybox-ie6 #fancybox-close{background:0 0}.fancybox-ie6 #fancybox-left-ico{background:0 0}.fancybox-ie6 #fancybox-right-ico{background:0 0}.fancybox-ie6 #fancybox-title-over{background:0 0;zoom:1}.fancybox-ie6 #fancybox-title-float-left{background:0 0}.fancybox-ie6 #fancybox-title-float-main{background:0 0}.fancybox-ie6 #fancybox-title-float-right{background:0 0}#fancybox-hide-sel-frame,.fancybox-ie6 #fancybox-bg-e,.fancybox-ie6 #fancybox-bg-w,.fancybox-ie6 #fancybox-left,.fancybox-ie6 #fancybox-right{height:expression(this.parentNode.clientHeight + "px")}#fancybox-loading.fancybox-ie6{position:absolute;margin-top:0;top:expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px')}#fancybox-loading.fancybox-ie6 div{background:0 0}.fancybox-ie .fancybox-bg{background:0 0!important}#fancybox-content,#fancybox-outer,#fancybox-wrap{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box} \ No newline at end of file +#fancybox-loading div,#fancybox-overlay,#fancybox-wrap{position:absolute;top:0;left:0}#fancybox-bg-ne,#fancybox-bg-nw,#fancybox-bg-se,#fancybox-bg-sw,#fancybox-left-ico,#fancybox-loading div,#fancybox-right-ico{background-image:url(fancybox.png)}#fancybox-frame,#fancybox-img{width:100%;border:none;height:100%}#fancybox-loading{position:fixed;top:50%;left:50%;width:40px;height:40px;margin-top:-20px;margin-left:-20px;cursor:pointer;overflow:hidden;z-index:1104;display:none}#fancybox-loading div{width:40px;height:480px}#fancybox-overlay{width:100%;z-index:1100;display:none}#fancybox-tmp{padding:0;margin:0;border:0;overflow:auto;display:none}#fancybox-wrap{padding:20px;z-index:1101;outline:0;display:none}#fancybox-outer{position:relative;width:100%;height:100%;background:#fff}#fancybox-content{width:0;height:0;padding:0;outline:0;position:relative;overflow:hidden;z-index:1102;border:0 solid #fff}#fancybox-hide-sel-frame{position:absolute;top:0;left:0;width:100%;background:0 0;z-index:1101}#fancybox-close{position:absolute;top:-15px;right:-15px;width:30px;height:30px;background:url(fancybox.png) -40px 0;cursor:pointer;z-index:1103;display:none}#fancybox-error{color:#444;font:400 12px/20px Arial;padding:14px;margin:0}#fancybox-img{padding:0;margin:0;outline:0;line-height:0;vertical-align:top}#fancybox-frame{display:block}#fancybox-left,#fancybox-right{position:absolute;bottom:0;height:100%;width:35%;cursor:pointer;outline:0;background:url(blank.gif);z-index:1102;display:none}#fancybox-left{left:0}#fancybox-right{right:0}#fancybox-left-ico,#fancybox-right-ico{position:absolute;top:50%;left:-9999px;width:30px;height:30px;margin-top:-15px;cursor:pointer;z-index:1102;display:block}#fancybox-left-ico{background-position:-40px -30px}#fancybox-right-ico{background-position:-40px -60px}#fancybox-left:hover,#fancybox-right:hover{visibility:visible}#fancybox-left:hover span{left:20px}#fancybox-right:hover span{left:auto;right:20px}.fancybox-bg{position:absolute;padding:0;margin:0;border:0;width:20px;height:20px;z-index:1001}#fancybox-bg-n,#fancybox-bg-s{left:0;width:100%;background-image:url(fancybox-x.png)}#fancybox-bg-e,#fancybox-bg-w{top:0;height:100%;background-image:url(fancybox-y.png)}#fancybox-bg-n{top:-20px}#fancybox-bg-ne{top:-20px;right:-20px;background-position:-40px -162px}#fancybox-bg-e{right:-20px;background-position:-20px 0}#fancybox-bg-se{bottom:-20px;right:-20px;background-position:-40px -182px}#fancybox-bg-s{bottom:-20px;background-position:0 -20px}#fancybox-bg-sw{bottom:-20px;left:-20px;background-position:-40px -142px}#fancybox-bg-w{left:-20px}#fancybox-bg-nw{top:-20px;left:-20px;background-position:-40px -122px}#fancybox-title{font-family:Helvetica;font-size:12px;z-index:1102}.fancybox-title-inside{padding-bottom:10px;text-align:center;color:#333;background:#fff;position:relative}.fancybox-title-outside{padding-top:10px;color:#fff}.fancybox-title-over{position:absolute;bottom:0;left:0;color:#FFF;text-align:left}#fancybox-title-over{padding:10px;background-image:url(fancy_title_over.png);display:block}.fancybox-title-float{position:absolute;left:0;bottom:-20px;height:32px}#fancybox-title-float-wrap{border:none;border-collapse:collapse;width:auto}#fancybox-title-float-wrap td{border:none;white-space:nowrap}#fancybox-title-float-left{padding:0 0 0 15px;background:url(fancybox.png) -40px -90px no-repeat}#fancybox-title-float-main{color:#FFF;line-height:29px;font-weight:700;padding:0 0 3px;background:url(fancybox-x.png) 0 -40px}#fancybox-title-float-right{padding:0 0 0 15px;background:url(fancybox.png) -55px -90px no-repeat}.fancybox-ie6 #fancybox-close{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale')}.fancybox-ie6 #fancybox-left-ico{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale')}.fancybox-ie6 #fancybox-right-ico{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale')}.fancybox-ie6 #fancybox-title-over{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale');zoom:1}.fancybox-ie6 #fancybox-title-float-left{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale')}.fancybox-ie6 #fancybox-title-float-main{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale')}.fancybox-ie6 #fancybox-title-float-right{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale')}#fancybox-hide-sel-frame,.fancybox-ie6 #fancybox-bg-e,.fancybox-ie6 #fancybox-bg-w,.fancybox-ie6 #fancybox-left,.fancybox-ie6 #fancybox-right{height:expression(this.parentNode.clientHeight + "px")}#fancybox-loading.fancybox-ie6{position:absolute;margin-top:0;top:expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px')}#fancybox-loading.fancybox-ie6 div{background:0 0;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale')}.fancybox-ie .fancybox-bg{background:0 0!important}.fancybox-ie #fancybox-bg-n{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-ne{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-e{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-se{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-s{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-sw{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-w{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale')}.fancybox-ie #fancybox-bg-nw{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale')}#fancybox-content,#fancybox-outer,#fancybox-wrap{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter/shutter.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter/shutter.min.css index 54cb3eec0..d2f8a4c76 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter/shutter.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter/shutter.min.css @@ -1 +1 @@ -#shDisplay div#shTitle{font:normal 12px/17px 'Lucida Grande',Verdana,sans-serif;color:#fff;text-align:center;margin:0 auto}#shDisplay div#shCount{color:#999;font:normal 10px/12px 'Lucida Grande',Verdana,sans-serif}#shDisplay div#shTitle a{text-decoration:none;font:bold 16pt 'Courier New',Courier,fixed;letter-spacing:-2px;margin:0 10px;width:26px;color:#999}#shDisplay div#shTitle a:hover{color:#fff;border:none}#shDisplay div#shNext{float:right}#shDisplay div#shPrev{float:left}body{height:100%}#shDisplay *,#shShutter *{padding:0;margin:0}div#shDisplay,div#shShutter{top:0;left:0;width:100%;position:absolute}div#shShutter{height:100%;z-index:10000;background-color:#000;opacity:.8}div#shDisplay{display:block;background-color:transparent;z-index:10002}div#shDisplay img#shTopImg{margin:0 auto;border:1px solid #555;background:0 0;display:block;max-width:none;max-height:none;float:none;padding:2px;cursor:pointer}div#shDisplay div#shWrap{visibility:hidden}div#shWaitBar{font:bold 32px 'Lucida Grande','Lucida Sans Unicode',Verdana,sans-serif;height:36px;width:100%;left:0;cursor:default;opacity:.999;z-index:10001;margin-top:160px;color:#ae0a0a;text-align:center} \ No newline at end of file +#shDisplay div#shTitle{font:400 12px/17px 'Lucida Grande',Verdana,sans-serif;color:#fff;text-align:center;margin:0 auto}#shDisplay div#shCount{color:#999;font:400 10px/12px 'Lucida Grande',Verdana,sans-serif}#shDisplay div#shTitle a{text-decoration:none;font:700 16pt 'Courier New',Courier,fixed;letter-spacing:-2px;margin:0 10px;width:26px;color:#999}#shDisplay div#shTitle a:hover{color:#fff;border:none}#shDisplay div#shNext{float:right}#shDisplay div#shPrev{float:left}body{height:100%}#shDisplay *,#shShutter *{padding:0;margin:0}div#shDisplay,div#shShutter{top:0;left:0;width:100%;position:absolute}div#shShutter{height:100%;z-index:10000;background-color:#000;opacity:.8;filter:alpha(opacity=80)}div#shDisplay{display:block;background-color:transparent;z-index:10002}div#shDisplay img#shTopImg{margin:0 auto;border:1px solid #555;background:0 0;display:block;max-width:none;max-height:none;float:none;padding:2px;cursor:pointer}div#shDisplay div#shWrap{visibility:hidden}div#shWaitBar{font:700 32px 'Lucida Grande','Lucida Sans Unicode',Verdana,sans-serif;height:36px;width:100%;left:0;cursor:default;opacity:.999;filter:alpha(opacity=100);z-index:10001;margin-top:160px;color:#ae0a0a;text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/shutter.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/shutter.min.css index 189f31568..d7c50aa41 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/shutter.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/shutter_reloaded/shutter.min.css @@ -1 +1 @@ -#shNavBar a{color:#aaf;text-decoration:none}#shNavBar a:hover{color:#fff}#shDisplay div#shTitle{font:normal 12px/17px 'Lucida Grande',Verdana,sans-serif;color:#fff;text-align:center;margin:0 auto}div#shNavBar{font:normal 12px/12px 'Lucida Grande',Verdana,sans-serif;color:#999;position:fixed;left:0;bottom:0;background-color:#2e2e2e;width:100%;padding:4px 0 5px;text-align:center;cursor:pointer;z-index:10011}body{height:100%}#shDisplay *,#shShutter *{padding:0;margin:0}div#shDisplay,div#shShutter{top:0;left:0;width:100%;position:absolute}div#shShutter{height:100%;z-index:10000;background-color:#000;opacity:.8}div#shDisplay{display:block;background-color:transparent;z-index:10002}div#shDisplay img#shTopImg{margin:0 auto;border:1px solid #555;background:0 0;display:block;max-width:none;max-height:none}div#shDisplay div#shWrap{visibility:hidden}div#shWaitBar{position:absolute;width:100px;left:50%;margin-left:-50px;margin-top:120px}#shWaitBar img{border:0}#fullSize{display:none}#shNavBar img{border:0;vertical-align:middle;margin:0 2px;opacity:.6}#shNavBar img:hover{opacity:.999} \ No newline at end of file +#shNavBar a{color:#aaf;text-decoration:none}#shNavBar a:hover{color:#fff}#shDisplay div#shTitle{font:400 12px/17px 'Lucida Grande',Verdana,sans-serif;color:#fff;text-align:center;margin:0 auto}div#shNavBar{font:400 12px/12px 'Lucida Grande',Verdana,sans-serif;color:#999;position:fixed;left:0;bottom:0;background-color:#2e2e2e;width:100%;padding:4px 0 5px;text-align:center;cursor:pointer;z-index:10011}body{height:100%}#shDisplay *,#shShutter *{padding:0;margin:0}div#shDisplay,div#shShutter{top:0;left:0;width:100%;position:absolute}div#shShutter{height:100%;z-index:10000;background-color:#000;opacity:.8;filter:alpha(opacity=80)}div#shDisplay{display:block;background-color:transparent;z-index:10002}div#shDisplay img#shTopImg{margin:0 auto;border:1px solid #555;background:0 0;display:block;max-width:none;max-height:none}div#shDisplay div#shWrap{visibility:hidden}div#shWaitBar{position:absolute;width:100px;left:50%;margin-left:-50px;margin-top:120px}#shWaitBar img{border:0}#fullSize{display:none}#shNavBar img{border:0;vertical-align:middle;margin:0 2px;opacity:.6;filter:alpha(opacity=60)}#shNavBar img:hover{opacity:.999;filter:alpha(opacity=100)} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.js new file mode 100644 index 000000000..973840707 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.js @@ -0,0 +1,14 @@ +jQuery(function($) { + + var nextgen_simplelightbox_init = function() { + var selector = nextgen_lightbox_filter_selector($, $(".ngg-simplelightbox")); + selector.simpleLightbox({ + history: false, + animationSlide: false, + animationSpeed: 100 + }); + }; + + $(window).bind('refreshed', nextgen_simplelightbox_init); + nextgen_simplelightbox_init(); +}); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.min.js new file mode 100644 index 000000000..804718f10 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/nextgen_simple_lightbox_init.min.js @@ -0,0 +1 @@ +jQuery(function(i){var e=function(){nextgen_lightbox_filter_selector(i,i(".ngg-simplelightbox")).simpleLightbox({history:!1,animationSlide:!1,animationSpeed:100})};i(window).bind("refreshed",e),e()}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.js new file mode 100644 index 000000000..d7241132d --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.js @@ -0,0 +1,581 @@ +/* + By André Rinas, www.andrerinas.de + Available for use under the MIT License + 1.14.0 +*/ +;( function( $, window, document, undefined ) +{ + 'use strict'; + +$.fn.simpleLightbox = function( options ) +{ + + var options = $.extend({ + sourceAttr: 'href', + overlay: true, + spinner: true, + nav: true, + navText: ['‹', '›'], + captions: true, + captionDelay: 0, + captionSelector: 'img', + captionType: 'attr', + captionsData: 'title', + captionPosition: 'bottom', + captionClass: '', + close: true, + closeText: '×', + swipeClose: true, + showCounter: true, + fileExt: 'png|jpg|jpeg|gif', + animationSlide: true, + animationSpeed: 250, + preloading: true, + enableKeyboard: true, + loop: true, + rel: false, + docClose: true, + swipeTolerance: 50, + className: 'simple-lightbox', + widthRatio: 0.8, + heightRatio: 0.9, + scaleImageToRatio: false, + disableRightClick: false, + disableScroll: true, + alertError: true, + alertErrorMessage: 'Image not found, next image will be loaded', + additionalHtml: false, + history: true, + throttleInterval: 0 + }, options); + + // global variables + var touchDevice = ( 'ontouchstart' in window ), + pointerEnabled = window.navigator.pointerEnabled || window.navigator.msPointerEnabled, + touched = function( event ){ + if( touchDevice ) return true; + if( !pointerEnabled || typeof event === 'undefined' || typeof event.pointerType === 'undefined' ) return false; + if( typeof event.MSPOINTER_TYPE_MOUSE !== 'undefined' ) { + if( event.MSPOINTER_TYPE_MOUSE != event.pointerType ) return true; + } + else { + if( event.pointerType != 'mouse' ) return true; + } + return false; + }, + swipeDiff = 0, + swipeYDiff = 0, + curImg = $(), + transPrefix = function(){ + var s = document.body || document.documentElement; + s = s.style; + if( s.WebkitTransition === '' ) return '-webkit-'; + if( s.MozTransition === '' ) return '-moz-'; + if( s.OTransition === '' ) return '-o-'; + if( s.transition === '' ) return ''; + return false; + }, + opened = false, + loaded = [], + getRelated = function(rel, jqObj) { + var $related = jqObj.filter(function () { + return ($(this).attr('rel') === rel); + }); + return $related; + }, + objects = (options.rel && options.rel !== false) ? getRelated(options.rel, $(this)) : this, + transPrefix = transPrefix(), + globalScrollbarwidth = 0, + canTransisions = (transPrefix !== false) ? true : false, + supportsPushState = ('pushState' in history), + historyhasChanged = false, + historyUpdateTimeout, + winLoc = window.location, + getHash = function(){ + return winLoc.hash.substring(1); + }, + initialHash = getHash(), + updateHash = function(){ + var hash = getHash(), + newHash = 'pid='+(index+1); + var newURL = winLoc.href.split('#')[0] + '#' + newHash; + + if(supportsPushState){ + history[historyhasChanged ? 'replaceState' : 'pushState']('', document.title, newURL); + }else { + if(historyhasChanged) { + winLoc.replace( newURL ); + } else { + winLoc.hash = newHash; + } + } + historyhasChanged = true; + }, + resetHash = function() { + if (supportsPushState) { + history.pushState('', document.title, winLoc.pathname + winLoc.search ); + } else { + winLoc.hash = ''; + } + clearTimeout(historyUpdateTimeout); + + }, + updateURL = function(){ + if(!historyhasChanged) { + updateHash(); // first time + } else { + historyUpdateTimeout = setTimeout(updateHash, 800); + } + }, + throttle = function(func, limit) { + var inThrottle; + return function() { + var args = arguments; + var context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(function() { + return inThrottle = false; + }, limit); + } + }; + }, + prefix = 'simplelb', + overlay = $('<div>').addClass('sl-overlay'), + closeBtn = $('<button>').addClass('sl-close').html(options.closeText), + spinner = $('<div>').addClass('sl-spinner').html('<div></div>'), + nav = $('<div>').addClass('sl-navigation').html('<button class="sl-prev">'+options.navText[0]+'</button><button class="sl-next">'+options.navText[1]+'</button>'), + counter = $('<div>').addClass('sl-counter').html('<span class="sl-current"></span>/<span class="sl-total"></span>'), + animating = false, + index = 0, + caption = $('<div>').addClass('sl-caption '+options.captionClass+' pos-'+options.captionPosition), + image = $('<div>').addClass('sl-image'), + wrapper = $('<div>').addClass('sl-wrapper').addClass(options.className), + isValidLink = function( element ){ + if(!options.fileExt) return true; + var filEext = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gmi; + var testExt = $( element ).attr( options.sourceAttr ).match(filEext); + return testExt && $( element ).prop( 'tagName' ).toLowerCase() == 'a' && ( new RegExp( '\.(' + options.fileExt + ')$', 'i' ) ).test( testExt ); + }, + setup = function(){ + if(options.close) closeBtn.appendTo(wrapper); + if(options.showCounter){ + if(objects.length > 1){ + counter.appendTo(wrapper); + counter.find('.sl-total').text(objects.length); + } + } + if(options.nav) nav.appendTo(wrapper); + if(options.spinner) spinner.appendTo(wrapper); + }, + openImage = function(elem){ + elem.trigger($.Event('show.simplelightbox')); + if(options.disableScroll) globalScrollbarwidth = handleScrollbar('hide'); + wrapper.appendTo('body'); + image.appendTo(wrapper); + if(options.overlay) overlay.appendTo($('body')); + animating = true; + index = objects.index(elem); + curImg = $( '<img/>' ) + .hide() + .attr('src', elem.attr(options.sourceAttr)); + if(loaded.indexOf(elem.attr(options.sourceAttr)) == -1){ + loaded.push(elem.attr(options.sourceAttr)); + } + image.html('').attr('style',''); + curImg.appendTo(image); + addEvents(); + overlay.fadeIn('fast'); + $('.sl-close').fadeIn('fast'); + spinner.show(); + nav.fadeIn('fast'); + $('.sl-wrapper .sl-counter .sl-current').text(index +1); + counter.fadeIn('fast'); + adjustImage(); + if(options.preloading) preload(); + setTimeout( function(){ elem.trigger($.Event('shown.simplelightbox')); } ,options.animationSpeed); + }, + adjustImage = function(dir){ + if(!curImg.length) return; + var tmpImage = new Image(), + windowWidth = $( window ).width() * options.widthRatio, + windowHeight = $( window ).height() * options.heightRatio; + tmpImage.src = curImg.attr( 'src' ); + + $(tmpImage).on('error',function(ev){ + //no image was found + objects.eq(index).trigger($.Event('error.simplelightbox')); + animating = false; + opened = true; + spinner.hide(); + if(options.alertError){ + alert(options.alertErrorMessage); + } + if(dir == 1 || dir == -1){ + loadImage(dir); + } else { + loadImage(1); + } + return; + }); + + + tmpImage.onload = function() { + if (typeof dir !== 'undefined') { + objects.eq(index) + .trigger($.Event('changed.simplelightbox')) + .trigger($.Event( (dir===1?'nextDone':'prevDone')+'.simplelightbox')); + } + + // history + if(options.history){ + updateURL(); + } + + if(loaded.indexOf(curImg.attr( 'src' )) == -1){ + loaded.push(curImg.attr( 'src' )); + } + var imageWidth = tmpImage.width, + imageHeight = tmpImage.height; + + if( options.scaleImageToRatio || imageWidth > windowWidth || imageHeight > windowHeight ){ + var ratio = imageWidth / imageHeight > windowWidth / windowHeight ? imageWidth / windowWidth : imageHeight / windowHeight; + imageWidth /= ratio; + imageHeight /= ratio; + } + + $('.sl-image').css({ + 'top': ( $( window ).height() - imageHeight ) / 2 + 'px', + 'left': ( $( window ).width() - imageWidth - globalScrollbarwidth)/ 2 + 'px' + }); + spinner.hide(); + curImg + .css({ + 'width': imageWidth + 'px', + 'height': imageHeight + 'px' + }) + .fadeIn('fast'); + opened = true; + var cSel = (options.captionSelector == 'self') ? objects.eq(index) : objects.eq(index).find(options.captionSelector); + var captionText; + if(options.captionType == 'data'){ + captionText = cSel.data(options.captionsData); + } else if(options.captionType == 'text'){ + captionText = cSel.html(); + } else { + captionText = cSel.prop(options.captionsData); + } + + if(!options.loop) { + if(index === 0){ $('.sl-prev').hide();} + if(index >= objects.length -1) {$('.sl-next').hide();} + if(index > 0){ $('.sl-prev').show(); } + if(index < objects.length -1){ $('.sl-next').show(); } + } + + if(objects.length == 1) $('.sl-prev, .sl-next').hide(); + + if(dir == 1 || dir == -1){ + var css = { 'opacity': 1.0 }; + if( options.animationSlide ) { + if( canTransisions ) { + slide(0, 100 * dir + 'px'); + setTimeout( function(){ slide( options.animationSpeed / 1000, 0 + 'px'); }, 50 ); + } + else { + css.left = parseInt( $('.sl-image').css( 'left' ) ) + 100 * dir + 'px'; + } + } + + $('.sl-image').animate( css, options.animationSpeed, function(){ + animating = false; + setCaption(captionText, imageWidth); + }); + } else { + animating = false; + setCaption(captionText, imageWidth); + } + if(options.additionalHtml && $('.sl-additional-html').length === 0){ + $('<div>').html(options.additionalHtml).addClass('sl-additional-html').appendTo($('.sl-image')); + } + }; + }, + setCaption = function(captiontext, imageWidth){ + if(captiontext !== '' && typeof captiontext !== "undefined" && options.captions){ + caption.html(captiontext).css({'width': imageWidth + 'px'}).hide().appendTo($('.sl-image')).delay(options.captionDelay).fadeIn('fast'); + } + }, + slide = function(speed, pos){ + var styles = {}; + styles[transPrefix + 'transform'] = 'translateX(' + pos + ')'; + styles[transPrefix + 'transition'] = transPrefix + 'transform ' + speed + 's linear'; + $('.sl-image').css(styles); + }, + addEvents = function(){ + // resize/responsive + $( window ).on( 'resize.'+prefix, adjustImage ); + + // close lightbox on close btn + $( document ).on('click.'+prefix+ ' touchstart.'+prefix, '.sl-close', function(e){ + e.preventDefault(); + if(opened){ close();} + }); + + if(options.history){ + setTimeout(function() { + $(window).on('hashchange.'+prefix,function(){ + if(opened){ + if(getHash() === initialHash) { + close(); + return; + } + } + }); + }, 40); + } + + // nav-buttons + nav.on('click.'+prefix, 'button', throttle(function(e){ + e.preventDefault(); + swipeDiff = 0; + loadImage( $(this).hasClass('sl-next') ? 1 : -1 ); + }, options.throttleInterval)); + + // touchcontrols + var swipeStart = 0, + swipeEnd = 0, + swipeYStart = 0, + swipeYEnd = 0, + mousedown = false, + imageLeft = 0; + + image + .on( 'touchstart.'+prefix+' mousedown.'+prefix, function(e) + { + if(mousedown) return true; + if( canTransisions ) imageLeft = parseInt( image.css( 'left' ) ); + mousedown = true; + swipeDiff = 0; + swipeYDiff = 0; + swipeStart = e.originalEvent.pageX || e.originalEvent.touches[ 0 ].pageX; + swipeYStart = e.originalEvent.pageY || e.originalEvent.touches[ 0 ].pageY; + return false; + }) + .on( 'touchmove.'+prefix+' mousemove.'+prefix+' pointermove MSPointerMove', function(e) + { + if(!mousedown) return true; + e.preventDefault(); + swipeEnd = e.originalEvent.pageX || e.originalEvent.touches[ 0 ].pageX; + swipeYEnd = e.originalEvent.pageY || e.originalEvent.touches[ 0 ].pageY; + swipeDiff = swipeStart - swipeEnd; + swipeYDiff = swipeYStart - swipeYEnd; + if( options.animationSlide ) { + if( canTransisions ) slide( 0, -swipeDiff + 'px' ); + else image.css( 'left', imageLeft - swipeDiff + 'px' ); + } + }) + .on( 'touchend.'+prefix+' mouseup.'+prefix+' touchcancel.'+prefix+' mouseleave.'+prefix+' pointerup pointercancel MSPointerUp MSPointerCancel',function(e) + { + if(mousedown){ + mousedown = false; + var possibleDir = true; + if(!options.loop) { + if(index === 0 && swipeDiff < 0){ possibleDir = false; } + if(index >= objects.length -1 && swipeDiff > 0) { possibleDir = false; } + } + if( Math.abs( swipeDiff ) > options.swipeTolerance && possibleDir ) { + loadImage( swipeDiff > 0 ? 1 : -1 ); + } + else if( options.animationSlide ) + { + if( canTransisions ) slide( options.animationSpeed / 1000, 0 + 'px' ); + else image.animate({ 'left': imageLeft + 'px' }, options.animationSpeed / 2 ); + } + + if( options.swipeClose && Math.abs(swipeYDiff) > 50 && Math.abs( swipeDiff ) < options.swipeTolerance) { + close(); + } + } + }); + }, + removeEvents = function(){ + nav.off('click', 'button'); + $( document ).off('click.'+prefix, '.sl-close'); + $( window ).off( 'resize.'+prefix); + $( window ).off( 'hashchange.'+prefix); + }, + preload = function(){ + var next = (index+1 < 0) ? objects.length -1: (index+1 >= objects.length -1) ? 0 : index+1, + prev = (index-1 < 0) ? objects.length -1: (index-1 >= objects.length -1) ? 0 : index-1; + $( '<img />' ).attr( 'src', objects.eq(next).attr( options.sourceAttr ) ).on('load', function(){ + if(loaded.indexOf($(this).attr('src')) == -1){ + loaded.push($(this).attr('src')); + } + objects.eq(index).trigger($.Event('nextImageLoaded.simplelightbox')); + }); + $( '<img />' ).attr( 'src', objects.eq(prev).attr( options.sourceAttr ) ).on('load', function(){ + if(loaded.indexOf($(this).attr('src')) == -1){ + loaded.push($(this).attr('src')); + } + objects.eq(index).trigger($.Event('prevImageLoaded.simplelightbox')); + }); + + }, + loadImage = function(dir){ + objects.eq(index) + .trigger($.Event('change.simplelightbox')) + .trigger($.Event( (dir===1?'next':'prev')+'.simplelightbox')); + + var newIndex = index + dir; + if(animating || (newIndex < 0 || newIndex >= objects.length) && options.loop === false ) return; + index = (newIndex < 0) ? objects.length -1: (newIndex > objects.length -1) ? 0 : newIndex; + $('.sl-wrapper .sl-counter .sl-current').text(index +1); + var css = { 'opacity': 0 }; + if( options.animationSlide ) { + if( canTransisions ) slide(options.animationSpeed / 1000, ( -100 * dir ) - swipeDiff + 'px'); + else css.left = parseInt( $('.sl-image').css( 'left' ) ) + -100 * dir + 'px'; + } + + $('.sl-image').animate( css, options.animationSpeed, function(){ + setTimeout( function(){ + // fadeout old image + var elem = objects.eq(index); + curImg + .attr('src', elem.attr(options.sourceAttr)); + if(loaded.indexOf(elem.attr(options.sourceAttr)) == -1){ + spinner.show(); + } + $('.sl-caption').remove(); + adjustImage(dir); + if(options.preloading) preload(); + }, 100); + }); + }, + close = function(){ + if(animating) return; + var elem = objects.eq(index), + triggered = false; + + elem.trigger($.Event('close.simplelightbox')); + if(options.history){ + resetHash(); + } + $('.sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter').fadeOut('fast', function(){ + if(options.disableScroll) handleScrollbar('show'); + $('.sl-wrapper, .sl-overlay').remove(); + removeEvents(); + if(!triggered) elem.trigger($.Event('closed.simplelightbox')); + triggered = true; + }); + curImg = $(); + opened = false; + animating = false; + }, + handleScrollbar = function(type){ + var scrollbarWidth = 0; + if(type == 'hide'){ + var fullWindowWidth = window.innerWidth; + if (!fullWindowWidth) { + var documentElementRect = document.documentElement.getBoundingClientRect(); + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left); + } + if(document.body.clientWidth < fullWindowWidth){ + var scrollDiv = document.createElement('div'), + padding = parseInt($('body').css('padding-right'),10); + scrollDiv.className = 'sl-scrollbar-measure'; + $('body').append(scrollDiv); + scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; + $(document.body)[0].removeChild(scrollDiv); + $('body').data('padding',padding); + if(scrollbarWidth > 0){ + $('body').addClass('hidden-scroll').css({'padding-right':padding+scrollbarWidth}); + } + } + } else { + $('body').removeClass('hidden-scroll').css({'padding-right':$('body').data('padding')}); + } + return scrollbarWidth; + }; + + // events + setup(); + + // open lightbox + objects.on( 'click.'+prefix, function( e ){ + if(isValidLink(this)){ + e.preventDefault(); + if(animating) return false; + openImage($(this)); + } + }); + + // close on click on doc + $( document ).on('click.'+prefix+ ' touchstart.'+prefix, function(e){ + if(opened){ + if((options.docClose && $(e.target).closest('.sl-image').length === 0 && $(e.target).closest('.sl-navigation').length === 0)){ + close(); + } + } + }); + + // disable rightclick + if(options.disableRightClick){ + $( document ).on('contextmenu', '.sl-image img', function(e){ + return false; + }); + } + + + // keyboard-control + if( options.enableKeyboard ){ + $( document ).on( 'keyup.'+prefix, throttle(function( e ){ + swipeDiff = 0; + // keyboard control only if lightbox is open + if(opened){ + e.preventDefault(); + var key = e.keyCode; + if( key == 27 ) { + close(); + } + if( key == 37 || e.keyCode == 39 ) { + loadImage( e.keyCode == 39 ? 1 : -1 ); + } + } + }, options.throttleInterval)); + } + + // Public methods + this.open = function(elem){ + elem = elem || $(this[0]); + openImage(elem); + }; + + this.next = function(){ + loadImage( 1 ); + }; + + this.prev = function(){ + loadImage( -1 ); + }; + + this.close = function(){ + close(); + }; + + this.destroy = function(){ + $( document ).off('click.'+prefix).off('keyup.'+prefix); + close(); + $('.sl-overlay, .sl-wrapper').remove(); + this.off('click'); + }; + + this.refresh = function(){ + this.destroy(); + $(this).simpleLightbox(options); + }; + + return this; + +}; +})( jQuery, window, document ); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.min.js new file mode 100644 index 000000000..0d9f0efc7 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simple-lightbox.min.js @@ -0,0 +1 @@ +!function(t,e,i,n){"use strict";t.fn.simpleLightbox=function(n){var a,n=t.extend({sourceAttr:"href",overlay:!0,spinner:!0,nav:!0,navText:["‹","›"],captions:!0,captionDelay:0,captionSelector:"img",captionType:"attr",captionsData:"title",captionPosition:"bottom",captionClass:"",close:!0,closeText:"×",swipeClose:!0,showCounter:!0,fileExt:"png|jpg|jpeg|gif",animationSlide:!0,animationSpeed:250,preloading:!0,enableKeyboard:!0,loop:!0,rel:!1,docClose:!0,swipeTolerance:50,className:"simple-lightbox",widthRatio:.8,heightRatio:.9,scaleImageToRatio:!1,disableRightClick:!1,disableScroll:!0,alertError:!0,alertErrorMessage:"Image not found, next image will be loaded",additionalHtml:!1,history:!0,throttleInterval:0},n),o=(e.navigator.pointerEnabled||e.navigator.msPointerEnabled,0),s=0,l=t(),r=function(){var t=i.body||i.documentElement;return t=t.style,""===t.WebkitTransition?"-webkit-":""===t.MozTransition?"-moz-":""===t.OTransition?"-o-":""===t.transition&&""},c=!1,p=[],d=n.rel&&!1!==n.rel?function(e,i){return i.filter(function(){return t(this).attr("rel")===e})}(n.rel,t(this)):this,r=r(),h=0,u=!1!==r,g="pushState"in history,f=!1,m=e.location,v=function(){return m.hash.substring(1)},b=v(),x=function(){var t=(v(),"pid="+(M+1)),e=m.href.split("#")[0]+"#"+t;g?history[f?"replaceState":"pushState"]("",i.title,e):f?m.replace(e):m.hash=t,f=!0},y=function(){g?history.pushState("",i.title,m.pathname+m.search):m.hash="",clearTimeout(a)},w=function(){f?a=setTimeout(x,800):x()},T=function(t,e){var i;return function(){var n=arguments,a=this;i||(t.apply(a,n),i=!0,setTimeout(function(){return i=!1},e))}},E="simplelb",C=t("<div>").addClass("sl-overlay"),S=t("<button>").addClass("sl-close").html(n.closeText),I=t("<div>").addClass("sl-spinner").html("<div></div>"),k=t("<div>").addClass("sl-navigation").html('<button class="sl-prev">'+n.navText[0]+'</button><button class="sl-next">'+n.navText[1]+"</button>"),q=t("<div>").addClass("sl-counter").html('<span class="sl-current"></span>/<span class="sl-total"></span>'),D=!1,M=0,R=t("<div>").addClass("sl-caption "+n.captionClass+" pos-"+n.captionPosition),A=t("<div>").addClass("sl-image"),O=t("<div>").addClass("sl-wrapper").addClass(n.className),P=function(e){if(!n.fileExt)return!0;var i=/\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/gim,a=t(e).attr(n.sourceAttr).match(i);return a&&"a"==t(e).prop("tagName").toLowerCase()&&new RegExp(".("+n.fileExt+")$","i").test(a)},z=function(e){e.trigger(t.Event("show.simplelightbox")),n.disableScroll&&(h=$("hide")),O.appendTo("body"),A.appendTo(O),n.overlay&&C.appendTo(t("body")),D=!0,M=d.index(e),l=t("<img/>").hide().attr("src",e.attr(n.sourceAttr)),-1==p.indexOf(e.attr(n.sourceAttr))&&p.push(e.attr(n.sourceAttr)),A.html("").attr("style",""),l.appendTo(A),N(),C.fadeIn("fast"),t(".sl-close").fadeIn("fast"),I.show(),k.fadeIn("fast"),t(".sl-wrapper .sl-counter .sl-current").text(M+1),q.fadeIn("fast"),L(),n.preloading&&j(),setTimeout(function(){e.trigger(t.Event("shown.simplelightbox"))},n.animationSpeed)},L=function(i){if(l.length){var a=new Image,o=t(e).width()*n.widthRatio,s=t(e).height()*n.heightRatio;a.src=l.attr("src"),t(a).on("error",function(e){d.eq(M).trigger(t.Event("error.simplelightbox")),D=!1,c=!0,I.hide(),n.alertError&&alert(n.alertErrorMessage),H(1==i||-1==i?i:1)}),a.onload=function(){void 0!==i&&d.eq(M).trigger(t.Event("changed.simplelightbox")).trigger(t.Event((1===i?"nextDone":"prevDone")+".simplelightbox")),n.history&&w(),-1==p.indexOf(l.attr("src"))&&p.push(l.attr("src"));var r=a.width,g=a.height;if(n.scaleImageToRatio||r>o||g>s){var f=r/g>o/s?r/o:g/s;r/=f,g/=f}t(".sl-image").css({top:(t(e).height()-g)/2+"px",left:(t(e).width()-r-h)/2+"px"}),I.hide(),l.css({width:r+"px",height:g+"px"}).fadeIn("fast"),c=!0;var m,v="self"==n.captionSelector?d.eq(M):d.eq(M).find(n.captionSelector);if(m="data"==n.captionType?v.data(n.captionsData):"text"==n.captionType?v.html():v.prop(n.captionsData),n.loop||(0===M&&t(".sl-prev").hide(),M>=d.length-1&&t(".sl-next").hide(),M>0&&t(".sl-prev").show(),M<d.length-1&&t(".sl-next").show()),1==d.length&&t(".sl-prev, .sl-next").hide(),1==i||-1==i){var b={opacity:1};n.animationSlide&&(u?(X(0,100*i+"px"),setTimeout(function(){X(n.animationSpeed/1e3,"0px")},50)):b.left=parseInt(t(".sl-image").css("left"))+100*i+"px"),t(".sl-image").animate(b,n.animationSpeed,function(){D=!1,W(m,r)})}else D=!1,W(m,r);n.additionalHtml&&0===t(".sl-additional-html").length&&t("<div>").html(n.additionalHtml).addClass("sl-additional-html").appendTo(t(".sl-image"))}}},W=function(e,i){""!==e&&void 0!==e&&n.captions&&R.html(e).css({width:i+"px"}).hide().appendTo(t(".sl-image")).delay(n.captionDelay).fadeIn("fast")},X=function(e,i){var n={};n[r+"transform"]="translateX("+i+")",n[r+"transition"]=r+"transform "+e+"s linear",t(".sl-image").css(n)},N=function(){t(e).on("resize."+E,L),t(i).on("click.simplelb touchstart."+E,".sl-close",function(t){t.preventDefault(),c&&K()}),n.history&&setTimeout(function(){t(e).on("hashchange."+E,function(){if(c&&v()===b)return void K()})},40),k.on("click."+E,"button",T(function(e){e.preventDefault(),o=0,H(t(this).hasClass("sl-next")?1:-1)},n.throttleInterval));var a=0,l=0,r=0,p=0,h=!1,g=0;A.on("touchstart.simplelb mousedown."+E,function(t){return!!h||(u&&(g=parseInt(A.css("left"))),h=!0,o=0,s=0,a=t.originalEvent.pageX||t.originalEvent.touches[0].pageX,r=t.originalEvent.pageY||t.originalEvent.touches[0].pageY,!1)}).on("touchmove.simplelb mousemove.simplelb pointermove MSPointerMove",function(t){if(!h)return!0;t.preventDefault(),l=t.originalEvent.pageX||t.originalEvent.touches[0].pageX,p=t.originalEvent.pageY||t.originalEvent.touches[0].pageY,o=a-l,s=r-p,n.animationSlide&&(u?X(0,-o+"px"):A.css("left",g-o+"px"))}).on("touchend.simplelb mouseup.simplelb touchcancel.simplelb mouseleave.simplelb pointerup pointercancel MSPointerUp MSPointerCancel",function(t){if(h){h=!1;var e=!0;n.loop||(0===M&&o<0&&(e=!1),M>=d.length-1&&o>0&&(e=!1)),Math.abs(o)>n.swipeTolerance&&e?H(o>0?1:-1):n.animationSlide&&(u?X(n.animationSpeed/1e3,"0px"):A.animate({left:g+"px"},n.animationSpeed/2)),n.swipeClose&&Math.abs(s)>50&&Math.abs(o)<n.swipeTolerance&&K()}})},Y=function(){k.off("click","button"),t(i).off("click."+E,".sl-close"),t(e).off("resize."+E),t(e).off("hashchange."+E)},j=function(){var e=M+1<0?d.length-1:M+1>=d.length-1?0:M+1,i=M-1<0?d.length-1:M-1>=d.length-1?0:M-1;t("<img />").attr("src",d.eq(e).attr(n.sourceAttr)).on("load",function(){-1==p.indexOf(t(this).attr("src"))&&p.push(t(this).attr("src")),d.eq(M).trigger(t.Event("nextImageLoaded.simplelightbox"))}),t("<img />").attr("src",d.eq(i).attr(n.sourceAttr)).on("load",function(){-1==p.indexOf(t(this).attr("src"))&&p.push(t(this).attr("src")),d.eq(M).trigger(t.Event("prevImageLoaded.simplelightbox"))})},H=function(e){d.eq(M).trigger(t.Event("change.simplelightbox")).trigger(t.Event((1===e?"next":"prev")+".simplelightbox"));var i=M+e;if(!(D||(i<0||i>=d.length)&&!1===n.loop)){M=i<0?d.length-1:i>d.length-1?0:i,t(".sl-wrapper .sl-counter .sl-current").text(M+1);var a={opacity:0};n.animationSlide&&(u?X(n.animationSpeed/1e3,-100*e-o+"px"):a.left=parseInt(t(".sl-image").css("left"))+-100*e+"px"),t(".sl-image").animate(a,n.animationSpeed,function(){setTimeout(function(){var i=d.eq(M);l.attr("src",i.attr(n.sourceAttr)),-1==p.indexOf(i.attr(n.sourceAttr))&&I.show(),t(".sl-caption").remove(),L(e),n.preloading&&j()},100)})}},K=function(){if(!D){var e=d.eq(M),i=!1;e.trigger(t.Event("close.simplelightbox")),n.history&&y(),t(".sl-image img, .sl-overlay, .sl-close, .sl-navigation, .sl-image .sl-caption, .sl-counter").fadeOut("fast",function(){n.disableScroll&&$("show"),t(".sl-wrapper, .sl-overlay").remove(),Y(),i||e.trigger(t.Event("closed.simplelightbox")),i=!0}),l=t(),c=!1,D=!1}},$=function(n){var a=0;if("hide"==n){var o=e.innerWidth;if(!o){var s=i.documentElement.getBoundingClientRect();o=s.right-Math.abs(s.left)}if(i.body.clientWidth<o){var l=i.createElement("div"),r=parseInt(t("body").css("padding-right"),10);l.className="sl-scrollbar-measure",t("body").append(l),a=l.offsetWidth-l.clientWidth,t(i.body)[0].removeChild(l),t("body").data("padding",r),a>0&&t("body").addClass("hidden-scroll").css({"padding-right":r+a})}}else t("body").removeClass("hidden-scroll").css({"padding-right":t("body").data("padding")});return a};return function(){n.close&&S.appendTo(O),n.showCounter&&d.length>1&&(q.appendTo(O),q.find(".sl-total").text(d.length)),n.nav&&k.appendTo(O),n.spinner&&I.appendTo(O)}(),d.on("click."+E,function(e){if(P(this)){if(e.preventDefault(),D)return!1;z(t(this))}}),t(i).on("click.simplelb touchstart."+E,function(e){c&&n.docClose&&0===t(e.target).closest(".sl-image").length&&0===t(e.target).closest(".sl-navigation").length&&K()}),n.disableRightClick&&t(i).on("contextmenu",".sl-image img",function(t){return!1}),n.enableKeyboard&&t(i).on("keyup."+E,T(function(t){if(o=0,c){t.preventDefault();var e=t.keyCode;27==e&&K(),37!=e&&39!=t.keyCode||H(39==t.keyCode?1:-1)}},n.throttleInterval)),this.open=function(e){e=e||t(this[0]),z(e)},this.next=function(){H(1)},this.prev=function(){H(-1)},this.close=function(){K()},this.destroy=function(){t(i).off("click."+E).off("keyup."+E),K(),t(".sl-overlay, .sl-wrapper").remove(),this.off("click")},this.refresh=function(){this.destroy(),t(this).simpleLightbox(n)},this}}(jQuery,window,document); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.css new file mode 100644 index 000000000..172fc5fb2 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.css @@ -0,0 +1,298 @@ +/* line 27, ../sass/simplelightbox.scss */ +body.hidden-scroll { + overflow: hidden; +} + +/* line 30, ../sass/simplelightbox.scss */ +.sl-overlay { + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: #fff; + opacity: 0.95; + display: none; + z-index: 100050; +} + +/* line 41, ../sass/simplelightbox.scss */ +.sl-wrapper { + z-index: 100040; +} +/* line 43, ../sass/simplelightbox.scss */ +.sl-wrapper button { + border: 0 none; + background: transparent; + font-size: 28px; + padding: 0; + cursor: pointer; +} +/* line 49, ../sass/simplelightbox.scss */ +.sl-wrapper button:hover { + opacity: 0.7; +} +/* line 54, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-close { + display: none; + position: fixed; + right: 30px; + top: 30px; + z-index: 100060; + margin-top: -14px; + margin-right: -14px; + height: 44px; + width: 44px; + line-height: 44px; + font-family: Arial, Baskerville, monospace; + color: #000; + font-size: 3rem; +} +/* line 69, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-close:focus { + outline: none; +} +/* line 74, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-counter { + display: none; + position: fixed; + top: 30px; + left: 30px; + z-index: 100060; + color: #000; + font-size: 1rem; +} +/* line 84, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-navigation { + width: 100%; + display: none; +} +/* line 87, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-navigation button { + position: fixed; + top: 50%; + margin-top: -22px; + height: 44px; + width: 22px; + line-height: 44px; + text-align: center; + display: block; + z-index: 100060; + font-family: Arial, Baskerville, monospace; + color: #000; +} +/* line 99, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-navigation button.sl-next { + right: 5px; + font-size: 2rem; +} +/* line 104, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-navigation button.sl-prev { + left: 5px; + font-size: 2rem; +} +/* line 109, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-navigation button:focus { + outline: none; +} +@media (min-width: 35.5em) { + /* line 87, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button { + width: 44px; + } + /* line 116, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button.sl-next { + right: 10px; + font-size: 3rem; + } + /* line 121, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button.sl-prev { + left: 10px; + font-size: 3rem; + } +} +@media (min-width: 50em) { + /* line 87, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button { + width: 44px; + } + /* line 129, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button.sl-next { + right: 20px; + font-size: 3rem; + } + /* line 134, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-navigation button.sl-prev { + left: 20px; + font-size: 3rem; + } +} +/* line 142, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image { + position: fixed; + -ms-touch-action: none; + touch-action: none; + z-index: 100060; +} +/* line 147, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image img { + margin: 0; + padding: 0; + display: block; + border: 0 none; +} +@media (min-width: 35.5em) { + /* line 147, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-image img { + border: 0 none; + } +} +@media (min-width: 50em) { + /* line 147, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-image img { + border: 0 none; + } +} +/* line 160, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image iframe { + background: #000; + border: 0 none; +} +@media (min-width: 35.5em) { + /* line 160, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-image iframe { + border: 0 none; + } +} +@media (min-width: 50em) { + /* line 160, ../sass/simplelightbox.scss */ + .sl-wrapper .sl-image iframe { + border: 0 none; + } +} +/* line 170, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image .sl-caption { + display: none; + padding: 10px; + color: #fff; + background: rgba(0, 0, 0, 0.8); + font-size: 1rem; + position: absolute; + bottom: 0; + left: 0; + right: 0; + box-sizing: border-box; /* Added by Imagely @ 2018-09-24 for compatibility with Photocrati theme */ +} +/* line 181, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image .sl-caption.pos-top { + bottom: auto; + top: 0; +} +/* line 186, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image .sl-caption.pos-outside { + bottom: auto; +} +/* line 191, ../sass/simplelightbox.scss */ +.sl-wrapper .sl-image .sl-download { + display: none; + position: absolute; + bottom: 5px; + right: 5px; + color: #000; + z-index: 100060; +} + +/* line 202, ../sass/simplelightbox.scss */ +.sl-spinner { + display: none; + border: 5px solid #333; + border-radius: 40px; + height: 40px; + left: 50%; + margin: -20px 0 0 -20px; + opacity: 0; + position: fixed; + top: 50%; + width: 40px; + z-index: 100007; + -webkit-animation: pulsate 1s ease-out infinite; + -moz-animation: pulsate 1s ease-out infinite; + -ms-animation: pulsate 1s ease-out infinite; + -o-animation: pulsate 1s ease-out infinite; + animation: pulsate 1s ease-out infinite; +} + +/* line 221, ../sass/simplelightbox.scss */ +.sl-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@-webkit-keyframes pulsate { + 0% { + transform: scale(0.1); + opacity: 0.0; + } + 50% { + opacity: 1; + } + 100% { + transform: scale(1.2); + opacity: 0; + } +} +@keyframes pulsate { + 0% { + transform: scale(0.1); + opacity: 0.0; + } + 50% { + opacity: 1; + } + 100% { + transform: scale(1.2); + opacity: 0; + } +} +@-moz-keyframes pulsate { + 0% { + transform: scale(0.1); + opacity: 0.0; + } + 50% { + opacity: 1; + } + 100% { + transform: scale(1.2); + opacity: 0; + } +} +@-o-keyframes pulsate { + 0% { + transform: scale(0.1); + opacity: 0.0; + } + 50% { + opacity: 1; + } + 100% { + transform: scale(1.2); + opacity: 0; + } +} +@-ms-keyframes pulsate { + 0% { + transform: scale(0.1); + opacity: 0.0; + } + 50% { + opacity: 1; + } + 100% { + transform: scale(1.2); + opacity: 0; + } +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.min.css new file mode 100644 index 000000000..8df2b0d78 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/lightbox/static/simplelightbox/simplelightbox.min.css @@ -0,0 +1 @@ +.sl-wrapper .sl-close,.sl-wrapper .sl-navigation button{height:44px;line-height:44px;font-family:Arial,Baskerville,monospace}.sl-wrapper .sl-close:focus,.sl-wrapper .sl-navigation button:focus{outline:0}body.hidden-scroll{overflow:hidden}.sl-overlay{position:fixed;left:0;right:0;top:0;bottom:0;background:#fff;opacity:.95;display:none;z-index:100050}.sl-wrapper .sl-close,.sl-wrapper .sl-counter{top:30px;display:none;color:#000;position:fixed}.sl-wrapper{z-index:100040}.sl-wrapper button{border:0;background:0 0;font-size:28px;padding:0;cursor:pointer}.sl-wrapper button:hover{opacity:.7}.sl-wrapper .sl-close{right:30px;z-index:100060;margin-top:-14px;margin-right:-14px;width:44px;font-size:3rem}.sl-wrapper .sl-counter{left:30px;z-index:100060;font-size:1rem}.sl-wrapper .sl-navigation{width:100%;display:none}.sl-wrapper .sl-navigation button{position:fixed;top:50%;margin-top:-22px;width:22px;text-align:center;display:block;z-index:100060;color:#000}.sl-wrapper .sl-navigation button.sl-next{right:5px;font-size:2rem}.sl-wrapper .sl-navigation button.sl-prev{left:5px;font-size:2rem}.sl-wrapper .sl-image{position:fixed;-ms-touch-action:none;touch-action:none;z-index:100060}.sl-wrapper .sl-image img{margin:0;padding:0;display:block;border:0}.sl-wrapper .sl-image iframe{background:#000;border:0}@media (min-width:35.5em){.sl-wrapper .sl-navigation button{width:44px}.sl-wrapper .sl-navigation button.sl-next{right:10px;font-size:3rem}.sl-wrapper .sl-navigation button.sl-prev{left:10px;font-size:3rem}.sl-wrapper .sl-image iframe,.sl-wrapper .sl-image img{border:0}}@media (min-width:50em){.sl-wrapper .sl-navigation button{width:44px}.sl-wrapper .sl-navigation button.sl-next{right:20px;font-size:3rem}.sl-wrapper .sl-navigation button.sl-prev{left:20px;font-size:3rem}.sl-wrapper .sl-image iframe,.sl-wrapper .sl-image img{border:0}}.sl-wrapper .sl-image .sl-caption{display:none;padding:10px;color:#fff;background:rgba(0,0,0,.8);font-size:1rem;position:absolute;bottom:0;left:0;right:0;box-sizing:border-box}.sl-wrapper .sl-image .sl-caption.pos-top{bottom:auto;top:0}.sl-wrapper .sl-image .sl-caption.pos-outside{bottom:auto}.sl-wrapper .sl-image .sl-download{display:none;position:absolute;bottom:5px;right:5px;color:#000;z-index:100060}.sl-spinner{display:none;border:5px solid #333;border-radius:40px;height:40px;left:50%;margin:-20px 0 0 -20px;opacity:0;position:fixed;top:50%;width:40px;z-index:100007;-webkit-animation:pulsate 1s ease-out infinite;-moz-animation:pulsate 1s ease-out infinite;-ms-animation:pulsate 1s ease-out infinite;-o-animation:pulsate 1s ease-out infinite;animation:pulsate 1s ease-out infinite}.sl-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@-webkit-keyframes pulsate{0%{transform:scale(.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@keyframes pulsate{0%{transform:scale(.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-moz-keyframes pulsate{0%{transform:scale(.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-o-keyframes pulsate{0%{transform:scale(.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2);opacity:0}}@-ms-keyframes pulsate{0%,100%{opacity:0}0%{transform:scale(.1)}50%{opacity:1}100%{transform:scale(1.2)}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/module.mvc.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/module.mvc.php index 3d26ce090..cbf21b50f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/module.mvc.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/module.mvc.php @@ -27,7 +27,7 @@ class M_MVC extends C_Base_Module 'photocrati-mvc', 'MVC Framework', 'Provides an MVC architecture for the plugin to use', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery', 'Imagely', 'https://www.imagely.com' diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php index 9981140b9..e05e90710 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/mvc/package.module.mvc.php @@ -38,8 +38,9 @@ class A_MVC_Fs extends Mixin * Gets the absolute path to a static resource. If it doesn't exist, then NULL is returned * * @param string $path - * @param string $module - * @param string $relative + * @param string|false $module (optional) + * @param bool $relative (optional) + * @param bool $found_root (optional) * @return string|NULL */ function find_static_abspath($path, $module = FALSE, $relative = FALSE, &$found_root = FALSE) @@ -107,7 +108,7 @@ class A_MVC_Fs extends Mixin * Gets the relative path to a static resource. If it doesn't exist, then NULL is returned * * @param string $path - * @param string $module + * @param string|false $module (optional) * @return string|NULL */ function find_static_relpath($path, $module = FALSE) @@ -358,7 +359,8 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin /** * Returns the value of a parameters * @param string $key - * @return mixed + * @param string|null $prefix (optional) + * @return string */ function param($key, $prefix = NULL, $default = NULL) { @@ -384,6 +386,7 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin } /** * Gets the routed url, generated by the Routing App + * @param bool $with_qs (optional) With QueryString * @return string */ function get_routed_url($with_qs = FALSE) @@ -393,7 +396,7 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin /** * Gets the absolute path of a static resource * @param string $path - * @param string $module + * @param string|false $module (optional) * @param boolean $relative * @return string */ @@ -404,13 +407,18 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin /** * Gets the relative path of a static resource * @param string $path - * @param string $module + * @param string|false $module (optional) * @return string */ function get_static_relpath($path, $module = FALSE) { return C_Fs::get_instance()->find_static_abspath($path, $module, TRUE); } + /** + * @param string $path + * @param string|false $module (optional) + * @return string + */ function get_static_url($path, $module = FALSE) { return C_Router::get_instance()->get_static_url($path, $module); @@ -418,7 +426,9 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin /** * Renders a template and outputs the response headers * @param string $name - * @param array $vars + * @param array $vars (optional) + * @param bool $return (optional) + * @return string */ function render_view($name, $vars = array(), $return = FALSE) { @@ -430,7 +440,7 @@ class Mixin_MVC_Controller_Instance_Methods extends Mixin */ function render() { - if (!headers_sent() || defined('DOING_AJAX')) { + if (!headers_sent() && !defined('DOING_AJAX') && !defined('REST_REQUEST')) { header('Content-Type: ' . $this->object->_content_type . '; charset=' . get_option('blog_charset'), true); } } @@ -488,7 +498,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin { $retval = array(); foreach ($this->object->_params as $key => $value) { - if (strpos($key, '_template') !== FALSE) { + if (strpos($key, '_template') === 0) { $value = $this->object->get_template_abspath($value); } $retval[$key] = $value; @@ -496,8 +506,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin return $retval; } /** - * Returns the abspath of the template to be rendered - * @param string $key + * @param string $value (optional) * @return string */ function get_template_abspath($value = NULL) @@ -505,7 +514,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin if (!$value) { $value = $this->object->_template; } - if ($value[0] == '/' && @file_exists($value)) { + if (strpos($value, DIRECTORY_SEPARATOR) !== FALSE && @file_exists($value)) { // key is already abspath } else { $value = $this->object->find_template_abspath($value); @@ -514,7 +523,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin } /** * Renders the view (template) - * @param string $__return + * @param bool $return (optional) * @return string|NULL */ function render($return = FALSE) @@ -531,7 +540,8 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin // We use underscores to prefix local variables to avoid conflicts wth // template vars $__element = $this->start_element($this->object->_template, 'template', $this->object); - extract($this->object->get_template_vars()); + $template_vars = $this->object->get_template_vars(); + extract($template_vars); include $this->object->get_template_abspath(); $this->end_element(); return $__element; @@ -579,7 +589,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin * Renders a sub-template for the view * @param string $__template * @param array $__params - * @param string $__return + * @param bool $__return Unused * @return NULL */ function include_template($__template, $__params = null, $__return = FALSE) @@ -618,7 +628,7 @@ class Mixin_Mvc_View_Instance_Methods extends Mixin * Gets the absolute path of an MVC template file * * @param string $path - * @param string $module + * @param string|false $module (optional) * @return string */ function find_template_abspath($path, $module = FALSE) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php index e093a5554..4753124a1 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/module.nextgen_addgallery_page.php @@ -40,6 +40,16 @@ class M_NextGen_AddGallery_Page extends C_Base_Module $forms->add_form(NGG_ADD_GALLERY_SLUG, 'import_folder'); } } + + public function check_upload_dir_permissions_requirement() + { + return wp_is_writable(C_Gallery_Storage::get_instance()->get_upload_abspath()); + } + + public function check_domdocument_requirement() + { + return class_exists('DOMDocument'); + } function get_type_list() { @@ -72,17 +82,28 @@ class M_NextGen_AddGallery_Page extends C_Base_Module function _register_hooks() { - add_action('admin_init', array(&$this, 'register_scripts')); + add_action('admin_init', array($this, 'register_requirements')); + add_action('admin_init', array($this, 'register_scripts')); + add_filter('ngg_non_minified_files', array($this, 'do_not_minify'), 10, 2); } - // plupload i18n JS should not be minified - function do_not_minify($path, $module) + public function register_requirements() { - $retval = FALSE; - if ($module == 'photocrati-nextgen_addgallery_page' && strpos($path, '/i18n/') !== FALSE) - $retval = TRUE; - return $retval; + C_Admin_Requirements_Manager::get_instance()->add( + 'nextgen_addgallery_xmlcheck', + 'phpext', + array($this, 'check_domdocument_requirement'), + array('message' => __('XML is strongly encouraged for safely uploading images', 'nggallery')) + ); + + $directory = C_Gallery_Storage::get_instance()->get_upload_abspath(); + C_Admin_Requirements_Manager::get_instance()->add( + 'add_gallery_upload_dir_permission', + 'dirperms', + array($this, 'check_upload_dir_permissions_requirement'), + array('message' => sprintf(__('Cannot write to %s: new galleries cannot be created', 'nggallery'), $directory)) + ); } function register_scripts() @@ -93,13 +114,13 @@ class M_NextGen_AddGallery_Page extends C_Base_Module wp_register_script( 'browserplus', $router->get_static_url('photocrati-nextgen_addgallery_page#browserplus-2.4.21.min.js'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_script( 'ngg.plupload.moxie', $router->get_static_url('photocrati-nextgen_addgallery_page#plupload-2.1.1/moxie.min.js'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_script( @@ -117,13 +138,13 @@ class M_NextGen_AddGallery_Page extends C_Base_Module wp_register_style( 'ngg.plupload.queue', $router->get_static_url('photocrati-nextgen_addgallery_page#plupload-2.1.1/jquery.plupload.queue/css/jquery.plupload.queue.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_style( 'nextgen_addgallery_page', $router->get_static_url('photocrati-nextgen_addgallery_page#styles.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_script( @@ -135,7 +156,7 @@ class M_NextGen_AddGallery_Page extends C_Base_Module wp_register_style( 'jquery.filetree', $router->get_static_url('photocrati-nextgen_addgallery_page#jquery.filetree/jquery.filetree.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_script( @@ -147,10 +168,19 @@ class M_NextGen_AddGallery_Page extends C_Base_Module wp_register_style( 'nextgen_media_library_import-css', $router->get_static_url('photocrati-nextgen_addgallery_page#media-library-import.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); } } + + // plupload i18n JS should not be minified + function do_not_minify($path, $module) + { + $retval = FALSE; + if ($module == 'photocrati-nextgen_addgallery_page' && strpos($path, '/i18n/') !== FALSE) + $retval = TRUE; + return $retval; + } } new M_NextGen_AddGallery_Page(); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php index 118c48388..97923c89b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/package.module.nextgen_addgallery_page.php @@ -96,7 +96,7 @@ class A_NextGen_AddGallery_Ajax extends Mixin $error = FALSE; if ($this->validate_ajax_request('nextgen_upload_image', TRUE)) { if (!class_exists('DOMDocument')) { - $retval['error'] = __("Please ask your hosting provider or system administrator to enable the PHP XML module, which is required for NextGEN Gallery", 'nggallery'); + $retval['error'] = __("Please ask your hosting provider or system administrator to enable the PHP XML module which is required for image uploads", 'nggallery'); } else { // We need to create a gallery if ($gallery_id == 0) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/jquery.filetree.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/jquery.filetree.min.css index 95c5814e9..fbc540862 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/jquery.filetree.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/jquery.filetree/jquery.filetree.min.css @@ -1 +1 @@ -UL.jqueryFileTree{font-family:Verdana,sans-serif;font-size:11px;line-height:18px;padding:0;margin:0}UL.jqueryFileTree LI{list-style:none;padding:0;padding-left:20px;margin:0;white-space:nowrap}UL.jqueryFileTree A{color:#333;text-decoration:none;display:block;padding:0 2px}UL.jqueryFileTree A:hover{background:#bdf}UL.jqueryFileTree A.selected_folder{background-color:#eee}.jqueryFileTree LI.directory{background:url(images/directory.png) left top no-repeat}.jqueryFileTree LI.expanded{background:url(images/folder_open.png) left top no-repeat}.jqueryFileTree LI.file{background:url(images/file.png) left top no-repeat}.jqueryFileTree LI.wait{background:url(images/spinner.gif) left top no-repeat}.jqueryFileTree LI.ext_3gp{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_afp{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_afpa{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_asp{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_aspx{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_avi{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_bat{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_bmp{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_c{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_cfm{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_cgi{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_com{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_cpp{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_css{background:url(images/css.png) left top no-repeat}.jqueryFileTree LI.ext_doc{background:url(images/doc.png) left top no-repeat}.jqueryFileTree LI.ext_exe{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_gif{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_fla{background:url(images/flash.png) left top no-repeat}.jqueryFileTree LI.ext_h{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_htm{background:url(images/html.png) left top no-repeat}.jqueryFileTree LI.ext_html{background:url(images/html.png) left top no-repeat}.jqueryFileTree LI.ext_jar{background:url(images/java.png) left top no-repeat}.jqueryFileTree LI.ext_jpg{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_jpeg{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_js{background:url(images/script.png) left top no-repeat}.jqueryFileTree LI.ext_lasso{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_log{background:url(images/txt.png) left top no-repeat}.jqueryFileTree LI.ext_m4p{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_mov{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_mp3{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_mp4{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_mpg{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_mpeg{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_ogg{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_pcx{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_pdf{background:url(images/pdf.png) left top no-repeat}.jqueryFileTree LI.ext_php{background:url(images/php.png) left top no-repeat}.jqueryFileTree LI.ext_png{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_ppt{background:url(images/ppt.png) left top no-repeat}.jqueryFileTree LI.ext_psd{background:url(images/psd.png) left top no-repeat}.jqueryFileTree LI.ext_pl{background:url(images/script.png) left top no-repeat}.jqueryFileTree LI.ext_py{background:url(images/script.png) left top no-repeat}.jqueryFileTree LI.ext_rb{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_rbx{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_rhtml{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_rpm{background:url(images/linux.png) left top no-repeat}.jqueryFileTree LI.ext_ruby{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_sql{background:url(images/db.png) left top no-repeat}.jqueryFileTree LI.ext_swf{background:url(images/flash.png) left top no-repeat}.jqueryFileTree LI.ext_tif{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_tiff{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_txt{background:url(images/txt.png) left top no-repeat}.jqueryFileTree LI.ext_vb{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_wav{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_wmv{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_xls{background:url(images/xls.png) left top no-repeat}.jqueryFileTree LI.ext_xml{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_zip{background:url(images/zip.png) left top no-repeat} \ No newline at end of file +UL.jqueryFileTree{font-family:Verdana,sans-serif;font-size:11px;line-height:18px;padding:0;margin:0}UL.jqueryFileTree LI{list-style:none;padding:0 0 0 20px;margin:0;white-space:nowrap}UL.jqueryFileTree A{color:#333;text-decoration:none;display:block;padding:0 2px}UL.jqueryFileTree A:hover{background:#BDF}UL.jqueryFileTree A.selected_folder{background-color:#EEE}.jqueryFileTree LI.directory{background:url(images/directory.png) left top no-repeat}.jqueryFileTree LI.expanded{background:url(images/folder_open.png) left top no-repeat}.jqueryFileTree LI.file{background:url(images/file.png) left top no-repeat}.jqueryFileTree LI.wait{background:url(images/spinner.gif) left top no-repeat}.jqueryFileTree LI.ext_3gp{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_afp,.jqueryFileTree LI.ext_afpa,.jqueryFileTree LI.ext_asp,.jqueryFileTree LI.ext_aspx{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_avi{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_bat{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_bmp{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_c,.jqueryFileTree LI.ext_cfm,.jqueryFileTree LI.ext_cgi{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_com{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_cpp{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_css{background:url(images/css.png) left top no-repeat}.jqueryFileTree LI.ext_doc{background:url(images/doc.png) left top no-repeat}.jqueryFileTree LI.ext_exe{background:url(images/application.png) left top no-repeat}.jqueryFileTree LI.ext_gif{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_fla{background:url(images/flash.png) left top no-repeat}.jqueryFileTree LI.ext_h{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_htm,.jqueryFileTree LI.ext_html{background:url(images/html.png) left top no-repeat}.jqueryFileTree LI.ext_jar{background:url(images/java.png) left top no-repeat}.jqueryFileTree LI.ext_jpeg,.jqueryFileTree LI.ext_jpg{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_js{background:url(images/script.png) left top no-repeat}.jqueryFileTree LI.ext_lasso{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_log{background:url(images/txt.png) left top no-repeat}.jqueryFileTree LI.ext_m4p{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_mov{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_mp3{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_mp4,.jqueryFileTree LI.ext_mpeg,.jqueryFileTree LI.ext_mpg{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_ogg{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_pcx{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_pdf{background:url(images/pdf.png) left top no-repeat}.jqueryFileTree LI.ext_php{background:url(images/php.png) left top no-repeat}.jqueryFileTree LI.ext_png{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_ppt{background:url(images/ppt.png) left top no-repeat}.jqueryFileTree LI.ext_psd{background:url(images/psd.png) left top no-repeat}.jqueryFileTree LI.ext_pl,.jqueryFileTree LI.ext_py{background:url(images/script.png) left top no-repeat}.jqueryFileTree LI.ext_rb,.jqueryFileTree LI.ext_rbx,.jqueryFileTree LI.ext_rhtml{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_rpm{background:url(images/linux.png) left top no-repeat}.jqueryFileTree LI.ext_ruby{background:url(images/ruby.png) left top no-repeat}.jqueryFileTree LI.ext_sql{background:url(images/db.png) left top no-repeat}.jqueryFileTree LI.ext_swf{background:url(images/flash.png) left top no-repeat}.jqueryFileTree LI.ext_tif,.jqueryFileTree LI.ext_tiff{background:url(images/picture.png) left top no-repeat}.jqueryFileTree LI.ext_txt{background:url(images/txt.png) left top no-repeat}.jqueryFileTree LI.ext_vb{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_wav{background:url(images/music.png) left top no-repeat}.jqueryFileTree LI.ext_wmv{background:url(images/film.png) left top no-repeat}.jqueryFileTree LI.ext_xls{background:url(images/xls.png) left top no-repeat}.jqueryFileTree LI.ext_xml{background:url(images/code.png) left top no-repeat}.jqueryFileTree LI.ext_zip{background:url(images/zip.png) left top no-repeat} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/media-library-import.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/media-library-import.min.css index e6b8168c8..3139a5c8b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/media-library-import.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/media-library-import.min.css @@ -1 +1 @@ -#ngg-importML-selected-image-import.hidden{display:none}#ngg-importML-select-opener.hidden{display:none}#ngg-importML-gallery-selection{display:inline-block}#ngg-importML-selected-image-import{vertical-align:middle}#ngg-importML-select-opener{vertical-align:middle}#ngg-importML-gallery-name{vertical-align:middle}#ngg-importML-gallery-select{vertical-align:middle}.ngg_settings_page .jqueryFileTree LI.directory{background-size:contain}.ngg_settings_page .jqueryFileTree LI.expanded{background-size:21px} \ No newline at end of file +#ngg-importML-select-opener.hidden,#ngg-importML-selected-image-import.hidden{display:none}#ngg-importML-gallery-selection{display:inline-block}#ngg-importML-gallery-name,#ngg-importML-gallery-select,#ngg-importML-select-opener,#ngg-importML-selected-image-import{vertical-align:middle}.ngg_settings_page .jqueryFileTree LI.directory{background-size:contain}.ngg_settings_page .jqueryFileTree LI.expanded{background-size:21px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/plupload-2.1.1/jquery.plupload.queue/css/jquery.plupload.queue.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/plupload-2.1.1/jquery.plupload.queue/css/jquery.plupload.queue.min.css index 72425dddf..4c164a742 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/plupload-2.1.1/jquery.plupload.queue/css/jquery.plupload.queue.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/plupload-2.1.1/jquery.plupload.queue/css/jquery.plupload.queue.min.css @@ -1 +1 @@ -.plupload_button{display:-moz-inline-box;display:inline-block;font:normal 12px sans-serif;text-decoration:none;color:#42454a;border:1px solid #bababa;padding:2px 8px 3px 20px;margin-right:4px;background:#f3f3f3 url(../img/buttons.png) no-repeat 0 center;outline:0;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.plupload_button:hover{color:#000;text-decoration:none}.plupload_disabled,a.plupload_disabled:hover{color:#737373;border-color:#c5c5c5;background:#ededed url(../img/buttons-disabled.png) no-repeat 0 center;cursor:default}.plupload_add{background-position:-181px center}.plupload_wrapper{font:normal 11px Verdana,sans-serif;width:100%}.plupload_container{padding:8px;background:url(../img/transp50.png)}.plupload_container input{border:1px solid #ddd;font:normal 11px Verdana,sans-serif;width:98%}.plupload_header{background:#2a2c2e url(../img/backgrounds.gif) repeat-x}.plupload_header_content{background:url(../img/backgrounds.gif) no-repeat 0 -317px;min-height:56px;padding-left:60px;color:#fff}.plupload_header_title{font:normal 18px sans-serif;padding:6px 0 3px}.plupload_header_text{font:normal 12px sans-serif}.plupload_filelist{margin:0;padding:0;list-style:none}.plupload_scroll .plupload_filelist{height:185px;background:#f5f5f5;overflow-y:scroll}.plupload_filelist li{padding:10px 8px;background:#f5f5f5 url(../img/backgrounds.gif) repeat-x 0 -156px;border-bottom:1px solid #ddd}.plupload_filelist_footer,.plupload_filelist_header{background:#dfdfdf;padding:8px 8px;color:#42454a}.plupload_filelist_header{border-top:1px solid #eee;border-bottom:1px solid #cdcdcd}.plupload_filelist_footer{border-top:1px solid #fff;height:22px;line-height:20px;vertical-align:middle}.plupload_file_name{float:left;overflow:hidden}.plupload_file_status{color:#777}.plupload_file_status span{color:#42454a}.plupload_file_size,.plupload_file_status,.plupload_progress{float:right;width:80px}.plupload_file_action,.plupload_file_size,.plupload_file_status{text-align:right}.plupload_filelist .plupload_file_name{width:205px;white-space:nowrap;text-overflow:ellipsis}.plupload_file_action{float:right;width:16px;height:16px;margin-left:15px}.plupload_file_action *{display:none;width:16px;height:16px}li.plupload_uploading{background:#ecf3dc url(../img/backgrounds.gif) repeat-x 0 -238px}li.plupload_done{color:#aaa}li.plupload_delete a{background:url(../img/delete.gif)}li.plupload_failed a{background:url(../img/error.gif);cursor:default}li.plupload_done a{background:url(../img/done.gif);cursor:default}.plupload_progress,.plupload_upload_status{display:none}.plupload_progress_container{margin-top:3px;border:1px solid #ccc;background:#fff;padding:1px}.plupload_progress_bar{width:0;height:7px;background:#cdeb8b}.plupload_scroll .plupload_filelist_footer .plupload_file_action,.plupload_scroll .plupload_filelist_header .plupload_file_action{margin-right:17px}.plupload_clear,.plupload_clearer{clear:both}.plupload_clearer,.plupload_progress_bar{display:block;font-size:0;line-height:0}li.plupload_droptext{background:0 0;text-align:center;vertical-align:middle;border:0;line-height:165px} \ No newline at end of file +.plupload_button{display:-moz-inline-box;display:inline-block;font:400 12px sans-serif;text-decoration:none;color:#42454a;border:1px solid #bababa;padding:2px 8px 3px 20px;margin-right:4px;background:url(../img/buttons.png) 0 center no-repeat #f3f3f3;outline:0;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.plupload_button:hover{color:#000;text-decoration:none}.plupload_disabled,a.plupload_disabled:hover{color:#737373;border-color:#c5c5c5;background:url(../img/buttons-disabled.png) 0 center no-repeat #ededed;cursor:default}.plupload_add{background-position:-181px center}.plupload_wrapper{font:400 11px Verdana,sans-serif;width:100%}.plupload_container{padding:8px;background:url(../img/transp50.png)}.plupload_container input{border:1px solid #DDD;font:400 11px Verdana,sans-serif;width:98%}.plupload_header{background:url(../img/backgrounds.gif) repeat-x #2A2C2E}.plupload_header_content{background:url(../img/backgrounds.gif) 0 -317px no-repeat;min-height:56px;padding-left:60px;color:#FFF}.plupload_header_title{font:400 18px sans-serif;padding:6px 0 3px}.plupload_header_text{font:400 12px sans-serif}.plupload_filelist{margin:0;padding:0;list-style:none}.plupload_scroll .plupload_filelist{height:185px;background:#F5F5F5;overflow-y:scroll}.plupload_filelist li{padding:10px 8px;background:url(../img/backgrounds.gif) 0 -156px repeat-x #F5F5F5;border-bottom:1px solid #DDD}.plupload_filelist_footer,.plupload_filelist_header{background:#DFDFDF;padding:8px;color:#42454A}.plupload_filelist_header{border-top:1px solid #EEE;border-bottom:1px solid #CDCDCD}.plupload_filelist_footer{border-top:1px solid #FFF;height:22px;line-height:20px;vertical-align:middle}.plupload_file_name{float:left;overflow:hidden}.plupload_file_status{color:#777}.plupload_file_status span{color:#42454A}.plupload_file_size,.plupload_file_status,.plupload_progress{float:right;width:80px}.plupload_file_action,.plupload_file_size,.plupload_file_status{text-align:right}.plupload_filelist .plupload_file_name{width:205px;white-space:nowrap;text-overflow:ellipsis}.plupload_file_action{float:right;width:16px;height:16px;margin-left:15px}.plupload_file_action *{display:none;width:16px;height:16px}li.plupload_uploading{background:url(../img/backgrounds.gif) 0 -238px repeat-x #ECF3DC}li.plupload_done{color:#AAA}li.plupload_delete a{background:url(../img/delete.gif)}li.plupload_failed a{background:url(../img/error.gif);cursor:default}li.plupload_done a{background:url(../img/done.gif);cursor:default}.plupload_progress,.plupload_upload_status{display:none}.plupload_progress_container{margin-top:3px;border:1px solid #CCC;background:#FFF;padding:1px}.plupload_progress_bar{width:0;height:7px;background:#CDEB8B}.plupload_scroll .plupload_filelist_footer .plupload_file_action,.plupload_scroll .plupload_filelist_header .plupload_file_action{margin-right:17px}.plupload_clear,.plupload_clearer{clear:both}.plupload_clearer,.plupload_progress_bar{display:block;font-size:0;line-height:0}li.plupload_droptext{background:0 0;text-align:center;vertical-align:middle;border:0;line-height:165px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/styles.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/styles.min.css index 4bd05a7d9..f3ca41d00 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/styles.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/static/styles.min.css @@ -1 +1 @@ -#gallery_selection{background-color:#fff;padding:7px}#gallery_selection label{font-weight:600;position:relative;top:-1px}#gallery_selection .plupload_buttons a{margin-right:6px;text-align:center;font-size:11px}#gallery_name{width:auto;min-width:200px}#gallery_name.error{border:solid 1px red}#upload_images_content{padding:0}#upload_images_content .plupload_container{padding:0}.plupload_header{display:none}.plupload_buttons{display:inline;margin-left:20px}.plupload_droptext{font-size:16px;color:silver}#gritter-notice-wrapper{background:rgba(56,70,82,.9);border:1px solid #2a343d;margin:10px 5px 0 0;border-radius:3px;bottom:20px;top:auto}.gritter-bottom,.gritter-item,.gritter-top{background:0 0}.gritter-item{padding:2px 11px 0 11px}.gritter-title{text-shadow:none}#gritter-notice-wrapper a{color:#b8d433;text-decoration:none;padding-top:5px;display:block}.gritter-close{width:auto;height:auto;background:0 0;display:block!important;top:10px;right:10px}.gritter-close:after{content:'X';font-weight:700;font-size:13px}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:25%}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main{width:75%}#ngg_page_content .plupload_container{padding:0!important;border:1px solid rgba(159,187,26,.13)!important}#ngg_page_content .plupload_file_status span,#ngg_page_content .plupload_filelist_footer,#ngg_page_content .plupload_filelist_header{background:rgba(247,248,243,.46)!important;color:#999!important}#ngg_page_content .plupload_filelist_header{border-bottom:1px solid #f7f7f7!important;display:none}#ngg_page_content .plupload_filelist_footer{border-top:1px solid #f7f7f7!important}#ngg_page_content .plupload_scroll .plupload_filelist{background:#fff!important;height:auto;overflow-y:hidden}#ngg_page_content #gallery_selection{padding:20px 20px 25px!important;background:#f7f8f3}#ngg_page_content #gallery_id,#ngg_page_content #gallery_name{height:30px!important;min-width:200px!important;font-size:12px!important;color:#888!important}#ngg_page_content input#import_gallery_title{width:250px;font-size:13px;color:#aaa}@media (max-width:1380px){.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:100%}}@media (max-width:1140px){.plupload_buttons{display:block;margin:10px 0 0 75px}.gallery_page_ngg_addgallery #ngg_page_content .button-primary,.gallery_page_ngg_addgallery #ngg_page_content .button-secondary,.gallery_page_ngg_addgallery #ngg_page_content button{width:201px!important}}@media (max-width:800px){.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:100%}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main input,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main select{width:100%!important;max-width:100%;margin:5px 0;box-sizing:border-box}.gallery_page_ngg_addgallery #ngg_page_content input[type=checkbox]{width:16px!important}.plupload_buttons{margin-left:0}.gallery_page_ngg_addgallery #ngg_page_content .button-primary,.gallery_page_ngg_addgallery #ngg_page_content .button-secondary,.gallery_page_ngg_addgallery #ngg_page_content button{width:100%!important;margin:4px 0;display:block;text-align:center}#ngg-importML-gallery-selection{display:block!important}} \ No newline at end of file +#gallery_selection{background-color:#fff;padding:7px}#gallery_selection label{font-weight:600;position:relative;top:-1px}#gallery_selection .plupload_buttons a{margin-right:6px;text-align:center;font-size:11px}#gallery_name{width:auto;min-width:200px}#gallery_name.error{border:1px solid red}#upload_images_content,#upload_images_content .plupload_container{padding:0}.plupload_header{display:none}.plupload_buttons{display:inline;margin-left:20px}.plupload_droptext{font-size:16px;color:silver}#gritter-notice-wrapper{background:rgba(56,70,82,.9);border:1px solid #2a343d;margin:10px 5px 0 0;border-radius:3px;bottom:20px;top:auto}.gritter-bottom,.gritter-close,.gritter-item,.gritter-top{background:0 0}.gritter-item{padding:2px 11px 0}.gritter-title{text-shadow:none}#gritter-notice-wrapper a{color:#b8d433;text-decoration:none;padding-top:5px;display:block}.gritter-close{width:auto;height:auto;display:block!important;top:10px;right:10px}.gritter-close:after{content:'X';font-weight:700;font-size:13px}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:25%}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main{width:75%}#ngg_page_content .plupload_container{padding:0!important;border:1px solid rgba(159,187,26,.13)!important}#ngg_page_content .plupload_file_status span,#ngg_page_content .plupload_filelist_footer,#ngg_page_content .plupload_filelist_header{background:rgba(247,248,243,.46)!important;color:#999!important}#ngg_page_content .plupload_filelist_header{border-bottom:1px solid #f7f7f7!important;display:none}#ngg_page_content .plupload_filelist_footer{border-top:1px solid #f7f7f7!important}#ngg_page_content .plupload_scroll .plupload_filelist{background:#fff!important;height:auto;overflow-y:hidden}#ngg_page_content #gallery_selection{padding:20px 20px 25px!important;background:#f7f8f3}#ngg_page_content #gallery_id,#ngg_page_content #gallery_name{height:30px!important;min-width:200px!important;font-size:12px!important;color:#888!important}#ngg_page_content input#import_gallery_title{width:250px;font-size:13px;color:#aaa}@media (max-width:1380px){.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:100%}}@media (max-width:1140px){.plupload_buttons{display:block;margin:10px 0 0 75px}.gallery_page_ngg_addgallery #ngg_page_content .button-primary,.gallery_page_ngg_addgallery #ngg_page_content .button-secondary,.gallery_page_ngg_addgallery #ngg_page_content button{width:201px!important}}@media (max-width:800px){.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_menu{width:100%}.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main input,.gallery_page_ngg_addgallery #ngg_page_content .ngg_page_content_main select{width:100%!important;max-width:100%;margin:5px 0;box-sizing:border-box}.gallery_page_ngg_addgallery #ngg_page_content input[type=checkbox]{width:16px!important}.plupload_buttons{margin-left:0}.gallery_page_ngg_addgallery #ngg_page_content .button-primary,.gallery_page_ngg_addgallery #ngg_page_content .button-secondary,.gallery_page_ngg_addgallery #ngg_page_content button{width:100%!important;margin:4px 0;display:block;text-align:center}#ngg-importML-gallery-selection{display:block!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php index 4f4bc92ba..67283dfb5 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_addgallery_page/templates/upload_images.php @@ -230,6 +230,7 @@ if (typeof(response) != 'object') { try { response = JSON.parse(info.response); + if (!response) throw new Error(); } catch (ex) { up.trigger('Error', { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php index e1f0b756e..90ed54e18 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/module.nextgen_admin.php @@ -26,7 +26,7 @@ class M_NextGen_Admin extends C_Base_Module 'photocrati-nextgen_admin', 'NextGEN Administration', 'Provides a framework for adding Administration pages', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -116,7 +116,7 @@ class M_NextGen_Admin extends C_Base_Module if (has_action($hook)) do_action($hook, $handle, $version); else - wp_enqueue_script($handle, NULL, NULL, $version); + wp_enqueue_script($handle, '', array(), $version); } @@ -126,7 +126,7 @@ class M_NextGen_Admin extends C_Base_Module if (has_action($hook)) do_action($hook, $handle, $version); else - wp_enqueue_style($handle, NULL, NULL, $version); + wp_enqueue_style($handle, '', array(), $version); } } @@ -150,7 +150,8 @@ class M_NextGen_Admin extends C_Base_Module // Register scripts add_action('init', array($this, 'register_scripts'), 9); add_action('admin_enqueue_scripts', array($this, 'enqueue_wizard_components')); - add_action('init', array($this, 'init_wizards'), 5); + add_action('current_screen', array($this, 'init_wizards'), 20); + add_action('current_screen', array($this, 'handle_wizards'), 100); // Enqueue common static resources for NGG admin pages add_filter('ngg_admin_style_handles', array($this, 'get_common_admin_css_handlers')); @@ -174,8 +175,11 @@ class M_NextGen_Admin extends C_Base_Module add_action( 'all_admin_notices', array($this, 'custom_post_type_markup_top')); add_action( 'admin_footer', array($this, 'custom_post_type_markup_bottom')); - // Provides admin notices - $notices = C_Admin_Notification_Manager::get_instance(); + // Requirements need to be registered with the notification manager *before* it's serve_ajax_request() + add_action('init', array(C_Admin_Requirements_Manager::get_instance(), 'create_notification'), -10); + + // Provides admin notices + $notices = C_Admin_Notification_Manager::get_instance(); add_action('init', array($notices, 'serve_ajax_request')); add_action('admin_footer', array($notices, 'enqueue_scripts')); add_action('do_ngg_notices', array($notices, 'render')); @@ -186,21 +190,19 @@ class M_NextGen_Admin extends C_Base_Module add_action('all_admin_notices', get_class().'::emit_do_notices_action'); } - $notices = C_Admin_Notification_Manager::get_instance(); - - $php_id = 0; - if (defined('PHP_VERSION_ID')) { $php_id = PHP_VERSION_ID; } else { $version = explode('.', PHP_VERSION); - $php_id = ($version[0] * 10000 + $version[1] * 100 + $version[2]); } if ($php_id < 50300) { - $notices->add("ngg_php52_deprecation", array("message" => __('PHP 5.2 will be deprecated in a future version of NextGEN. Please upgrade your PHP installation to 5.3 or above.', 'nggallery'))); + $notices->add( + "ngg_php52_deprecation", + array("message" => __('PHP 5.2 will be deprecated in a future version of NextGEN. Please upgrade your PHP installation to 5.3 or above.', 'nggallery')) + ); } // Add review notices @@ -296,48 +298,48 @@ class M_NextGen_Admin extends C_Base_Module 'gritter', $router->get_static_url('photocrati-nextgen_admin#gritter/gritter.min.js'), array('jquery'), - $this->module_version + NGG_SCRIPT_VERSION ); wp_register_style( 'gritter', $router->get_static_url('photocrati-nextgen_admin#gritter/css/gritter.css'), - FALSE, - $this->module_version + array(), + NGG_SCRIPT_VERSION ); wp_register_script( 'ngg_progressbar', $router->get_static_url('photocrati-nextgen_admin#ngg_progressbar.js'), array('gritter'), - $this->module_version + NGG_SCRIPT_VERSION ); wp_register_style( 'ngg_progressbar', $router->get_static_url('photocrati-nextgen_admin#ngg_progressbar.css'), array('gritter'), - $this->module_version + NGG_SCRIPT_VERSION ); wp_register_style( 'ngg_select2', $router->get_static_url('photocrati-nextgen_admin#select2/select2.css'), - FALSE, - $this->module_version + array(), + NGG_SCRIPT_VERSION ); wp_register_script( 'ngg_select2', $router->get_static_url('photocrati-nextgen_admin#select2/select2.js'), - FALSE, - $this->module_version + array(), + NGG_SCRIPT_VERSION ); wp_register_script( 'jquery.nextgen_radio_toggle', $router->get_static_url('photocrati-nextgen_admin#jquery.nextgen_radio_toggle.js'), array('jquery'), - $this->module_version + NGG_SCRIPT_VERSION ); wp_register_style( 'ngg-jquery-ui', $router->get_static_url('photocrati-nextgen_admin#jquery-ui/jquery-ui-1.10.4.custom.css'), - FALSE, + array(), '1.10.4' ); wp_register_script( @@ -355,13 +357,13 @@ class M_NextGen_Admin extends C_Base_Module 'nextgen_admin_css', $router->get_static_url('photocrati-nextgen_admin#nextgen_admin_page.css'), array('wp-color-picker'), - $this->module_version + NGG_SCRIPT_VERSION ); wp_register_script( 'nextgen_admin_js', $router->get_static_url('photocrati-nextgen_admin#nextgen_admin_page.js'), array('wp-color-picker'), - $this->module_version + NGG_SCRIPT_VERSION ); // Style the parent menu icons for NextGEN-related pages @@ -430,46 +432,36 @@ class M_NextGen_Admin extends C_Base_Module function init_wizards() { + $is_block_editor = false; + if (function_exists('get_current_screen')) { + $current_screen = get_current_screen(); + if (is_object($current_screen)) { + if (method_exists($current_screen, 'is_block_editor')) + $is_block_editor = $current_screen->is_block_editor(); + + if (!$is_block_editor) { + if ($current_screen->action == 'add') + $is_block_editor = function_exists('use_block_editor_for_post_type') && use_block_editor_for_post_type($current_screen->post_type); + else + $is_block_editor = function_exists('use_block_editor_for_post') && use_block_editor_for_post(null); + } + + if (!$is_block_editor) { + if ($current_screen->action == 'add') + $is_block_editor = !isset($_GET['classic-editor']) && function_exists('gutenberg_can_edit_post_type') && gutenberg_can_edit_post_type($current_screen->post_type); + else + $is_block_editor = !isset($_GET['classic-editor']) && function_exists('gutenberg_can_edit_post') && gutenberg_can_edit_post(null); + } + } + } + + if (!$is_block_editor) + $is_block_editor = function_exists('is_gutenberg_page') && is_gutenberg_page(); + $wizards = C_NextGEN_Wizard_Manager::get_instance(); $wizards->set_starter(__('Do you need help with NextGEN?', 'nggallery')); $wizards->set_active(false); - /* - * This first sequence was established to just add a gallery via the - * central gallery area. We decided instead on an alternative sequence - * below that also inserts the gallery into a page. Just keeping this - * code for reference - */ - // $wizard = $wizards->add_wizard('nextgen.beginner.gallery_creation'); - // $wizard->add_step('start'); - // $wizard->set_step_text('start', __('Hello, it looks like you don\'t have any galleries, this wizard will guide you through creating your first gallery.', 'nggallery')); - // $wizard->set_step_view('start', 'a.toplevel_page_nextgen-gallery'); - // $wizard->add_step('gallery_menu'); - // $wizard->set_step_text('gallery_menu', __('Click on the Gallery menu to access NextGEN\'s functionality.', 'nggallery')); - // $wizard->set_step_target('gallery_menu', 'a.toplevel_page_nextgen-gallery', 'right center', 'left center'); - // $wizard->set_step_view('gallery_menu', 'a.toplevel_page_nextgen-gallery'); - // $wizard->add_step('add_gallery_menu'); - // $wizard->set_step_text('add_gallery_menu', __('Click on the "Add Gallery / Images" menu to create new galleries with images.', 'nggallery')); - // $wizard->set_step_target('add_gallery_menu', 'a[href*="admin.php?page=ngg_addgallery"]', 'right center', 'left center'); - // $wizard->set_step_view('add_gallery_menu', 'a[href*="admin.php?page=ngg_addgallery"]'); - // $wizard->add_step('input_gallery_name'); - // $wizard->set_step_text('input_gallery_name', __('Select a name for your gallery.', 'nggallery')); - // $wizard->set_step_target('input_gallery_name', 'input#gallery_name', 'bottom center', 'top center'); - // $wizard->set_step_target_wait('input_gallery_name', '5'); - // $wizard->set_step_view('input_gallery_name', 'input#gallery_name'); - // $wizard->add_step('select_images'); - // $wizard->set_step_text('select_images', __('Now click the "Add Files" button and select some images to add to the gallery.', 'nggallery')); - // $wizard->set_step_target('select_images', 'a#uploader_browse', 'right center', 'left center'); - // $wizard->set_step_target_wait('select_images', '5'); - // $wizard->set_step_view('select_images', 'a#uploader_browse'); - // $wizard->add_step('upload_images'); - // $wizard->set_step_text('upload_images', __('Now click the "Start Upload" button to begin the upload process.', 'nggallery')); - // $wizard->set_step_target('upload_images', 'a#uploader_upload', 'right center', 'left center'); - // $wizard->set_step_target_wait('upload_images', '5'); - // $wizard->set_step_view('upload_images', 'a#uploader_upload'); - // $wizard->add_step('finish'); - // $wizard->set_step_text('finish', __('Congratulations! You just created your first gallery.', 'nggallery')); - /* * This is the new wizard sequence that helps users both crerate a gallery * and add it to a page. @@ -477,7 +469,6 @@ class M_NextGen_Admin extends C_Base_Module $wizard = $wizards->add_wizard('nextgen.beginner.gallery_creation_igw'); $wizard->add_step('start'); $wizard->set_step_text('start', __('Hello, this wizard will guide you through creating a NextGEN gallery and inserting it into a page. Click "Next step" to proceed.', 'nggallery')); - // $wizard->set_step_target('start', 'a.ngg-wizard-invoker', 'bottom center', 'top center'); $wizard->add_step('pages_menu'); $wizard->set_step_text('pages_menu', __('Click on "Pages" to access your WordPress pages.', 'nggallery')); $wizard->set_step_target('pages_menu', '#menu-pages a.menu-top', 'right center', 'left center'); @@ -486,14 +477,50 @@ class M_NextGen_Admin extends C_Base_Module $wizard->set_step_text('add_page_menu', __('Click "Add New" to create a new page.', 'nggallery')); $wizard->set_step_target('add_page_menu', '#menu-pages a[href*="post-new.php?post_type=page"]', 'right center', 'left center'); $wizard->set_step_view('add_page_menu', '#menu-pages a[href*="post-new.php?post_type=page"]'); - $wizard->add_step('input_page_title'); - $wizard->set_step_text('input_page_title', __('Type in a title for your page.', 'nggallery')); - $wizard->set_step_target('input_page_title', 'input#title', 'bottom center', 'top center'); - $wizard->set_step_view('input_page_title', 'input#title'); - $wizard->add_step('add_gallery_button'); - $wizard->set_step_text('add_gallery_button', __('Now click the "Add Gallery" button to open NextGEN\'s Insert Gallery Window (IGW).', 'nggallery')); - $wizard->set_step_target('add_gallery_button', 'a#ngg-media-button', 'right center', 'left center'); - $wizard->set_step_view('add_gallery_button', 'a#ngg-media-button'); + + if ($is_block_editor) { + $wizard->add_step('input_page_title'); + $wizard->set_step_text('input_page_title', __('Type in a title for your page.', 'nggallery')); + $wizard->set_step_target('input_page_title', '.editor-post-title__input', 'bottom center', 'top center'); + $wizard->set_step_view('input_page_title', '.editor-post-title__input'); + + $wizard->add_step('add_block'); + $wizard->set_step_text('add_block', __('Now click the button to insert a block.', 'nggallery')); + $wizard->set_step_target('add_block', 'button.editor-inserter__toggle', 'right center', 'left center'); + $wizard->set_step_view('add_block', 'button.editor-inserter__toggle'); + $wizard->set_step_lazy('add_block', true); + + $wizard->add_step('search_nextgen'); + $wizard->set_step_text('search_nextgen', __('Type "nextgen" to search for the NextGEN block.', 'nggallery')); + $wizard->set_step_target('search_nextgen', 'input.editor-inserter__search', 'right center', 'left center'); + $wizard->set_step_view('search_nextgen', 'input.editor-inserter__search'); + $wizard->set_step_lazy('search_nextgen', true); + + $wizard->add_step('add_ngg_block'); + $wizard->set_step_text('add_ngg_block', __('Click on the NextGEN block to add it.', 'nggallery')); + $wizard->set_step_target('add_ngg_block', 'button.editor-block-list-item-imagely-nextgen-gallery', 'right center', 'left center'); + $wizard->set_step_view('add_ngg_block', 'button.editor-block-list-item-imagely-nextgen-gallery'); + $wizard->set_step_lazy('add_ngg_block', true); + $wizard->set_step_condition('add_ngg_block', 'wait', '1500'); + + $wizard->add_step('add-ngg-gallery'); + $wizard->set_step_text('add-ngg-gallery', __('Now click the "Add Gallery" button to open NextGEN\'s Insert Gallery Window.', 'nggallery')); + $wizard->set_step_target('add-ngg-gallery', '.add-ngg-gallery', 'bottom center', 'top center'); + $wizard->set_step_view('add-ngg-gallery', '.add-ngg-gallery'); + $wizard->set_step_lazy('add-ngg-gallery', true); + } + else { + $wizard->add_step('input_page_title'); + $wizard->set_step_text('input_page_title', __('Type in a title for your page.', 'nggallery')); + $wizard->set_step_target('input_page_title', 'input#title', 'bottom center', 'top center'); + $wizard->set_step_view('input_page_title', 'input#title'); + + $wizard->add_step('add_gallery_button'); + $wizard->set_step_text('add_gallery_button', __('Now click the "Add Gallery" button to open NextGEN\'s Insert Gallery Window (IGW).', 'nggallery')); + $wizard->set_step_target('add_gallery_button', 'a#ngg-media-button', 'right center', 'left center'); + $wizard->set_step_view('add_gallery_button', 'a#ngg-media-button'); + } + $wizard->add_step('add_gallery_tab'); $wizard->set_step_text('add_gallery_tab', __('Now click the "Upload Images" tab to add a new gallery.', 'nggallery')); $wizard->set_step_target('add_gallery_tab', '#attach_to_post_tabs a#ui-id-2', 'right center', 'left center'); @@ -549,24 +576,33 @@ class M_NextGen_Admin extends C_Base_Module $wizard->set_step_condition('insert_gallery', 'wait', '1000'); $wizard->add_step('finish'); $wizard->set_step_text('finish', __('Congratulations! You just created your first gallery. You can now click the "Publish" button on the right to publish your page.', 'nggallery')); + } + + function handle_wizards() + { + $wizards = C_NextGEN_Wizard_Manager::get_instance(); // adjust wizards state based on query/parameters $wizards->handle_wizard_query(); global $ngg_fs; // make sure we don't trigger the wizards if NGG Fremius is running or this is an AJAX request - if (isset($_REQUEST['ngg_dismiss_notice']) || (is_admin() && !M_Attach_To_Post::is_atp_url() && !isset($_REQUEST['attach_to_post']) && (!isset($ngg_fs) || !$ngg_fs->is_activation_mode()) && (!defined('DOING_AJAX') || !DOING_AJAX))) { + if (isset($_REQUEST['ngg_dismiss_notice']) || (is_admin() && !M_Attach_To_Post::is_atp_url() && !isset($_REQUEST['attach_to_post']) && (!isset($ngg_fs) || !$ngg_fs->is_activation_mode()) && (!defined('DOING_AJAX') || !DOING_AJAX))) + { $wizards->set_active(true); } // before adding notices or activating individual wizards, ensure wizards are globally enabled and no wizard is currently running already - if ($wizards->is_active() && $wizards->get_running_wizard() == null) { + if ($wizards->is_active() && $wizards->get_running_wizard() == null) + { // add notice for gallery creation wizard $wizard = $wizards->get_wizard('nextgen.beginner.gallery_creation_igw'); - if (!$wizard->is_completed() && !$wizard->is_cancelled()) { + if (!$wizard->is_completed() && !$wizard->is_cancelled()) + { $mapper = C_Gallery_Mapper::get_instance(); - if ($mapper->count() == 0) { + if ($mapper->count() == 0) + { $wizard->set_active(true); $notices = C_Admin_Notification_Manager::get_instance(); $notices->add('ngg_wizard_' . $wizard->get_id(), array("message" => __('Thanks for installing NextGEN Gallery! Want help creating your first gallery?', 'nggallery') . ' <a data-ngg-wizard="' . $wizard->get_id() . '" class="ngg-wizard-invoker" href="' . esc_url(add_query_arg('ngg_wizard', $wizard->get_id())) . '">' . __('Launch the Gallery Wizard', 'nggallery') . '</a>. ' . __('If you close this message, you can also launch the Gallery Wizard at any time from the', 'nggallery') . ' <a href="' . esc_url(admin_url('admin.php?page=nextgen-gallery')) . '">' . __('NextGEN Overview page', 'nggallery') . '</a>.')); @@ -580,15 +616,15 @@ class M_NextGen_Admin extends C_Base_Module function enqueue_wizard_components() { - $router = C_Router::get_instance(); + $router = C_Router::get_instance(); - // Wizards related scripts/styles - wp_register_style( - 'bootstrap-tooltip', - $router->get_static_url('photocrati-nextgen_admin#bootstrap/css/bootstrap-tooltip.css'), - FALSE, - NGG_SCRIPT_VERSION - ); + // Wizards related scripts/styles + wp_register_style( + 'bootstrap-tooltip', + $router->get_static_url('photocrati-nextgen_admin#bootstrap/css/bootstrap-tooltip.css'), + array(), + NGG_SCRIPT_VERSION + ); wp_register_script( 'tourist', @@ -634,10 +670,6 @@ class M_NextGen_Admin extends C_Base_Module }; } - function initialize() - { - } - /** * Adds menu pages to manage NextGen Settings * @uses action: admin_menu @@ -650,17 +682,18 @@ class M_NextGen_Admin extends C_Base_Module function get_type_list() { return array( - 'A_Fs_Access_Page' => 'adapter.fs_access_page.php', - 'A_MVC_Validation' => 'adapter.mvc_validation.php', - 'C_Nextgen_Admin_Installer' => 'class.nextgen_admin_installer.php', - 'A_Nextgen_Admin_Default_Pages' => 'adapter.nextgen_admin_default_pages.php', - 'A_Nextgen_Settings_Routes' => 'adapter.nextgen_settings_routes.php', - 'C_Form' => 'class.form.php', - 'C_Form_Manager' => 'class.form_manager.php', - 'C_Nextgen_Admin_Page_Controller' => 'class.nextgen_admin_page_controller.php', - 'C_NextGen_Admin_Page_Manager' => 'class.nextgen_admin_page_manager.php', - 'C_Admin_Notification_Manager' => 'class.admin_notification_manager.php', - 'C_NextGEN_Wizard_Manager' => 'class.nextgen_wizard_manager.php', + 'A_Fs_Access_Page' => 'adapter.fs_access_page.php', + 'A_MVC_Validation' => 'adapter.mvc_validation.php', + 'A_Nextgen_Admin_Default_Pages' => 'adapter.nextgen_admin_default_pages.php', + 'A_Nextgen_Settings_Routes' => 'adapter.nextgen_settings_routes.php', + 'C_Admin_Notification_Manager' => 'class.admin_notification_manager.php', + 'C_Admin_Requirements_Manager' => 'class.admin_requirements_manager.php', + 'C_Form' => 'class.form.php', + 'C_Form_Manager' => 'class.form_manager.php', + 'C_NextGEN_Wizard_Manager' => 'class.nextgen_wizard_manager.php', + 'C_NextGen_Admin_Page_Manager' => 'class.nextgen_admin_page_manager.php', + 'C_Nextgen_Admin_Installer' => 'class.nextgen_admin_installer.php', + 'C_Nextgen_Admin_Page_Controller' => 'class.nextgen_admin_page_controller.php' ); } } @@ -731,5 +764,4 @@ class C_NextGen_Admin_Option_Handler } } -new M_NextGen_Admin(); - +new M_NextGen_Admin(); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php index 9b5427d38..507adf89a 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/package.module.nextgen_admin.php @@ -204,6 +204,9 @@ class C_Admin_Notification_Manager * @var C_Admin_Notification_Manager */ static $_instance = NULL; + /** + * @return C_Admin_Notification_Manager + */ static function get_instance() { if (!isset(self::$_instance)) { @@ -325,7 +328,7 @@ class C_Admin_Notification_Manager { if ($this->has_displayed_notice()) { $router = C_Router::get_instance(); - wp_enqueue_script('ngg_admin_notices', $router->get_static_url('photocrati-nextgen_admin#admin_notices.js'), FALSE, NGG_SCRIPT_VERSION, TRUE); + wp_enqueue_script('ngg_admin_notices', $router->get_static_url('photocrati-nextgen_admin#admin_notices.js'), array(), NGG_SCRIPT_VERSION, TRUE); wp_localize_script('ngg_admin_notices', 'ngg_dismiss_url', $this->_dismiss_url); } } @@ -358,7 +361,8 @@ class C_Admin_Notification_Manager $has_method = method_exists($handler, 'is_renderable'); if ($has_method && $handler->is_renderable() || !$has_method) { $show_dismiss_button = method_exists($handler, 'show_dismiss_button') ? $handler->show_dismiss_button() : method_exists($handler, 'is_dismissable') ? $handler->is_dismissable() : FALSE; - $view = new C_MVC_View('photocrati-nextgen_admin#admin_notice', array('css_class' => method_exists($handler, 'get_css_class') ? $handler->get_css_class() : 'updated', 'is_dismissable' => method_exists($handler, 'is_dismissable') ? $handler->is_dismissable() : FALSE, 'html' => method_exists($handler, 'render') ? $handler->render() : '', 'show_dismiss_button' => $show_dismiss_button, 'notice_name' => $name)); + $template = method_exists($handler, 'get_mvc_template') ? $handler->get_mvc_template() : 'photocrati-nextgen_admin#admin_notice'; + $view = new C_MVC_View($template, array('css_class' => method_exists($handler, 'get_css_class') ? $handler->get_css_class() : 'updated', 'is_dismissable' => method_exists($handler, 'is_dismissable') ? $handler->is_dismissable() : FALSE, 'html' => method_exists($handler, 'render') ? $handler->render() : '', 'show_dismiss_button' => $show_dismiss_button, 'notice_name' => $name)); $retval = $view->render(TRUE); $this->_displayed_notice = TRUE; } @@ -366,6 +370,168 @@ class C_Admin_Notification_Manager return $retval; } } +class C_Admin_Requirements_Manager +{ + protected $_requirements = array(); + protected $_groups = array(); + public function __construct() + { + $this->set_initial_groups(); + } + protected function set_initial_groups() + { + // Requirements can be added with any group key desired but only registered groups will be displayed + $this->_groups = apply_filters('ngg_admin_requirements_manager_groups', array('phpext' => __('NextGen Gallery requires the following PHP extensions to function correctly. Please contact your hosting provider or systems admin and ask them for assistance:', 'nggallery'), 'phpver' => __('NextGen Gallery has degraded functionality because of your PHP version. Please contact your hosting provider or systems admin and ask them for assistance:', 'nggallery'), 'dirperms' => __('NextGen Gallery has found an issue trying to access the following files or directories. Please ensure the following locations have the correct permissions:', 'nggallery'))); + } + /** + * @return C_Admin_Requirements_Manager + */ + private static $_instance = NULL; + public static function get_instance() + { + if (!isset(self::$_instance)) { + self::$_instance = new C_Admin_Requirements_Manager(); + } + return self::$_instance; + } + /** + * @param string $name Unique notification ID + * @param string $group Choose one of phpext | phpver | dirperms + * @param callable $callback Method that determines whether the notification should display + * @param array $data Possible keys: className, message, dismissable + */ + public function add($name, $group, $callback, $data) + { + $this->_requirements[$group][$name] = new C_Admin_Requirements_Notice($name, $callback, $data); + } + /** + * @param string $name + */ + public function remove($name) + { + unset($this->_notifications[$name]); + } + public function create_notification() + { + foreach ($this->_groups as $groupID => $groupLabel) { + if (empty($this->_requirements[$groupID])) { + continue; + } + $dismissable = TRUE; + $notices = array(); + foreach ($this->_requirements[$groupID] as $key => $requirement) { + $passOrFail = $requirement->run_callback(); + if (!$passOrFail) { + // If any of the notices can't be dismissed then all notices in that group can't be dismissed + if (!$requirement->is_dismissable()) { + // Add important notices to the beginning of the list + $dismissable = FALSE; + array_unshift($notices, $requirement); + } else { + // Less important notices go to the end of the list + $notices[] = $requirement; + } + } + } + // Don't display empty group notices + if (empty($notices)) { + continue; + } + // Generate the combined message for this group + $message = '<p>' . $this->_groups[$groupID] . '</p><ul>'; + foreach ($notices as $requirement) { + // Make non-dismissable notifications bold + $string = $requirement->is_dismissable() ? $requirement->get_message() : '<strong>' . $requirement->get_message() . '</strong>'; + $message .= '<li>' . $string . '</li>'; + } + $message .= '</ul>'; + // Generate the notice object + $name = 'ngg_requirement_notice_' . $groupID . '_' . md5($message); + $notice = new C_Admin_Requirements_Notice($name, '__return_true', array('dismissable' => $dismissable, 'message' => $message)); + C_Admin_Notification_Manager::get_instance()->add($name, $notice); + } + } +} +class C_Admin_Requirements_Notice +{ + protected $_name; + protected $_data; + protected $_callback; + /** + * C_Admin_Requirements_Notice constructor + * @param string $name + * @param callable $callback + * @param array $data + */ + public function __construct($name, $callback, $data) + { + $this->_name = $name; + $this->_data = $data; + $this->_callback = $callback; + } + /** + * @return bool + */ + public function is_renderable() + { + return true; + } + /** + * @return bool + */ + public function is_dismissable() + { + return isset($this->_data['dismissable']) ? $this->_data['dismissable'] : TRUE; + } + /** + * @return string + */ + public function render() + { + return $this->_data["message"]; + } + /** + * @return string + */ + public function get_mvc_template() + { + return 'photocrati-nextgen_admin#requirement_notice'; + } + /** + * @return string + */ + public function get_name() + { + return $this->_name; + } + /** + * @return bool + */ + public function run_callback() + { + if (is_callable($this->_callback)) { + return call_user_func($this->_callback); + } else { + return false; + } + } + /** + * @return string + */ + public function get_css_class() + { + $prefix = 'notice notice-'; + if ($this->is_dismissable()) { + return $prefix . 'warning'; + } else { + return $prefix . 'error'; + } + } + public function get_message() + { + return empty($this->_data['message']) ? "" : $this->_data['message']; + } +} /** * Class C_Form * @mixin Mixin_Form_Instance_Methods @@ -391,7 +557,7 @@ class C_Form extends C_MVC_Controller } /** * Defines the form - * @param string $context + * @param string|bool $context (optional) */ function define($context = FALSE) { @@ -428,7 +594,7 @@ class Mixin_Form_Instance_Methods extends Mixin /** * Saves the form/model * @param array $attributes - * @return type + * @return bool */ function save_action($attributes = array()) { @@ -443,6 +609,8 @@ class Mixin_Form_Instance_Methods extends Mixin } /** * Returns the rendered form + * @param bool $wrap (optional) Default = true + * @return string */ function render($wrap = TRUE) { @@ -515,7 +683,8 @@ class C_Form_Manager extends C_Component var $_forms = array(); /** * Returns an instance of the form manager - * @returns C_Form_Manager + * @param string|bool $context (optional) + * @return C_Form_Manager */ static function &get_instance($context = FALSE) { @@ -540,9 +709,9 @@ class Mixin_Form_Manager extends Mixin { /** * Adds one or more - * @param type $type - * @param type $form_names - * @return type + * @param string $type + * @param array|string $form_names + * @return int Results of get_form_count($type) */ function add_form($type, $form_names) { @@ -598,7 +767,7 @@ class Mixin_Form_Manager extends Mixin } /** * Gets known form types - * @return type + * @return array */ function get_known_types() { @@ -607,6 +776,7 @@ class Mixin_Form_Manager extends Mixin /** * Gets forms of a particular type * @param string $type + * @param string|bool $instantiate (optional) * @return array */ function get_forms($type, $instantiate = FALSE) @@ -703,6 +873,10 @@ if (!class_exists('C_NextGen_Admin_Installer')) { class C_NextGen_Admin_Page_Controller extends C_MVC_Controller { static $_instances = array(); + /** + * @param bool|string $context + * @return C_NextGen_Admin_Page_Controller + */ static function get_instance($context = FALSE) { if (!isset(self::$_instances[$context])) { @@ -782,7 +956,7 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin wp_enqueue_script('photocrati_ajax'); wp_enqueue_script('jquery-ui-accordion'); wp_enqueue_script('nextgen_display_settings_page_placeholder_stub', $this->get_static_url('photocrati-nextgen_admin#jquery.placeholder.min.js'), array('jquery'), NGG_SCRIPT_VERSION, TRUE); - wp_enqueue_style('imagely-admin-font', 'https://fonts.googleapis.com/css?family=Lato:300,400,700,900', false, NGG_SCRIPT_VERSION); + wp_enqueue_style('imagely-admin-font', 'https://fonts.googleapis.com/css?family=Lato:300,400,700,900', array(), NGG_SCRIPT_VERSION); if (method_exists('M_Gallery_Display', 'enqueue_fontawesome')) { M_Gallery_Display::enqueue_fontawesome(); } @@ -793,7 +967,7 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin function enqueue_jquery_ui_theme() { $settings = C_NextGen_Settings::get_instance(); - wp_enqueue_style($settings->jquery_ui_theme, is_ssl() ? str_replace('http:', 'https:', $settings->jquery_ui_theme_url) : $settings->jquery_ui_theme_url, FALSE, $settings->jquery_ui_theme_version); + wp_enqueue_style($settings->jquery_ui_theme, is_ssl() ? str_replace('http:', 'https:', $settings->jquery_ui_theme_url) : $settings->jquery_ui_theme_url, array(), $settings->jquery_ui_theme_version); } /** * Returns the page title @@ -838,15 +1012,16 @@ class Mixin_NextGen_Admin_Page_Instance_Methods extends Mixin } /** * Returns an accordion tab, encapsulating the form - * @param I_Form $form + * @param C_Form $form + * @return string */ function to_accordion_tab($form) { return $this->object->render_partial('photocrati-nextgen_admin#accordion_tab', array('id' => $form->get_id(), 'title' => $form->get_title(), 'content' => $form->render(TRUE)), TRUE); } /** - * Returns the - * @return type + * Returns the forms registered for the current get_form_type() + * @return array */ function get_forms() { @@ -948,7 +1123,7 @@ class C_NextGen_Admin_Page_Manager extends C_Component var $_pages = array(); /** * Gets an instance of the Page Manager - * @param string $context + * @param string|false $context (optional) * @return C_NextGen_Admin_Page_Manager */ static function &get_instance($context = FALSE) @@ -961,7 +1136,7 @@ class C_NextGen_Admin_Page_Manager extends C_Component } /** * Defines the instance of the Page Manager - * @param type $context + * @param string $context */ function define($context = FALSE) { @@ -1122,6 +1297,9 @@ class Mixin_Page_Manager extends Mixin // TODO: Remove some time in 2018 class C_Page_Manager { + /** + * @return C_NextGen_Admin_Page_Manager + */ static function get_instance() { return C_NextGen_Admin_Page_Manager::get_instance(); @@ -1249,6 +1427,14 @@ class C_NextGEN_Wizard { $this->set_step_property($step_id, 'target_wait', $wait); } + function get_step_optional($step_id) + { + return $this->get_step_property($step_id, 'optional'); + } + function set_step_optional($step_id, $optional) + { + $this->set_step_property($step_id, 'optional', $optional); + } function get_step_lazy($step_id) { return $this->get_step_property($step_id, 'lazy'); @@ -1364,7 +1550,8 @@ class C_NextGEN_Wizard_Manager extends C_Component var $_handled_query = false; /** * Returns an instance of the wizard manager - * @returns C_NextGEN_Wizard_Manager + * @param bool|string $context + * @return C_NextGEN_Wizard_Manager */ static function get_instance($context = FALSE) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-theme.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-theme.min.css index 8baaea9fa..a7046af59 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-theme.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-theme.min.css @@ -2,4 +2,4 @@ * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file + */.navbar-default,.navbar-inverse{border-radius:4px;background-repeat:repeat-x}.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.css index 110fc821b..7e12a74bb 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.css @@ -36,6 +36,7 @@ box-shadow: 0 5px 10px rgba(0, 0, 0, .2); line-break: auto; + z-index: 999999 !important; } .tourist-popover.top { margin-top: -10px; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.min.css index 1cf6972c7..a3dec76bd 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap-tooltip.min.css @@ -2,4 +2,4 @@ * Bootstrap v3.3.7 (Tooltips) (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.tourist-popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.tourist-popover.top{margin-top:-10px}.tourist-popover.right{margin-left:10px}.tourist-popover.bottom{margin-top:10px}.tourist-popover.left{margin-left:-10px}.tourist-popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.tourist-popover-content{padding:9px 14px}.tourist-popover>.arrow,.tourist-popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.tourist-popover>.arrow{border-width:11px}.tourist-popover>.arrow:after{content:"";border-width:10px}.tourist-popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.tourist-popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.tourist-popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.tourist-popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.tourist-popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.tourist-popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.tourist-popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.tourist-popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.tourist-popover .btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.428;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.tourist-popover .btn.active.focus,.tourist-popover .btn.active:focus,.tourist-popover .btn.focus,.tourist-popover .btn:active.focus,.tourist-popover .btn:active:focus,.tourist-popover .btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.tourist-popover .btn.focus,.tourist-popover .btn:focus,.tourist-popover .btn:hover{color:#333;text-decoration:none}.tourist-popover .btn.active,.tourist-popover .btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} \ No newline at end of file + */.tourist-popover{position:absolute;top:0;left:0;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto;z-index:999999!important}.tourist-popover.top{margin-top:-10px}.tourist-popover.right{margin-left:10px}.tourist-popover.bottom{margin-top:10px}.tourist-popover.left{margin-left:-10px}.tourist-popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.tourist-popover-content{padding:9px 14px}.tourist-popover>.arrow,.tourist-popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.tourist-popover>.arrow{border-width:11px}.tourist-popover>.arrow:after{content:"";border-width:10px}.tourist-popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.tourist-popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.tourist-popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.tourist-popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.tourist-popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.tourist-popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.tourist-popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.tourist-popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.tourist-popover .btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.428;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.tourist-popover .btn.active.focus,.tourist-popover .btn.active:focus,.tourist-popover .btn.focus,.tourist-popover .btn:active.focus,.tourist-popover .btn:active:focus,.tourist-popover .btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.tourist-popover .btn.focus,.tourist-popover .btn:focus,.tourist-popover .btn:hover{color:#333;text-decoration:none}.tourist-popover .btn.active,.tourist-popover .btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap.min.css index ea3c03b30..0670345ab 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/bootstrap/css/bootstrap.min.css @@ -2,4 +2,4 @@ * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;opacity:0;line-break:auto}.tooltip.in{opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.label,sub,sup{vertical-align:baseline}hr,img{border:0}body,figure{margin:0}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.dropdown-menu,.modal-content{-webkit-background-clip:padding-box}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}a.badge:focus,a.badge:hover,a.label:focus,a.label:hover{color:#fff;cursor:pointer;text-decoration:none}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control{color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.css index 7b1d130cd..1174d5e80 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.css @@ -71,7 +71,7 @@ .gritter-title { font-size:14px; font-weight:bold; - padding:0 0 7px 0; + padding:0 12px 7px 0; display:block; text-shadow:1px 1px 0 #000; /* Not supported by IE :( */ } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.min.css index 2e3949522..2d9321457 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/gritter/css/gritter.min.css @@ -1 +1 @@ -#gritter-notice-wrapper{position:fixed;top:30px;right:20px;width:301px;z-index:999999}#gritter-notice-wrapper.top-left{left:20px;right:auto}#gritter-notice-wrapper.bottom-right{top:auto;left:auto;bottom:20px;right:20px}#gritter-notice-wrapper.bottom-left{top:auto;right:auto;bottom:20px;left:20px}.gritter-item-wrapper{position:relative;margin:0 0 10px 0;background:url(../images/ie-spacer.gif)}.gritter-top{background:url(../images/gritter.png) no-repeat left -30px;height:10px}.hover .gritter-top{background-position:right -30px}.gritter-bottom{background:url(../images/gritter.png) no-repeat left bottom;height:8px;margin:0}.hover .gritter-bottom{background-position:bottom right}.gritter-item{display:block;background:url(../images/gritter.png) no-repeat left -40px;color:#eee;padding:2px 11px 8px 11px;font-size:11px;font-family:verdana}.hover .gritter-item{background-position:right -40px}.gritter-item p{padding:0;margin:0;word-wrap:break-word}.gritter-close{display:none;position:absolute;top:5px;right:3px;background:url(../images/gritter.png) no-repeat left top;cursor:pointer;width:30px;height:30px}.gritter-title{font-size:14px;font-weight:700;padding:0 0 7px 0;display:block;text-shadow:1px 1px 0 #000}.gritter-image{width:48px;height:48px;float:left}.gritter-with-image,.gritter-without-image{padding:0}.gritter-with-image{width:220px;float:right}.gritter-light .gritter-bottom,.gritter-light .gritter-close,.gritter-light .gritter-item,.gritter-light .gritter-top{background-image:url(../images/gritter-light.png);color:#222}.gritter-light .gritter-title{text-shadow:none} \ No newline at end of file +#gritter-notice-wrapper{position:fixed;top:30px;right:20px;width:301px;z-index:999999}#gritter-notice-wrapper.top-left{left:20px;right:auto}#gritter-notice-wrapper.bottom-right{top:auto;left:auto;bottom:20px;right:20px}#gritter-notice-wrapper.bottom-left{top:auto;right:auto;bottom:20px;left:20px}.gritter-item-wrapper{position:relative;margin:0 0 10px;background:url(../images/ie-spacer.gif)}.gritter-top{background:url(../images/gritter.png) left -30px no-repeat;height:10px}.hover .gritter-top{background-position:right -30px}.gritter-bottom{background:url(../images/gritter.png) left bottom no-repeat;height:8px;margin:0}.hover .gritter-bottom{background-position:bottom right}.gritter-item{display:block;background:url(../images/gritter.png) left -40px no-repeat;color:#eee;padding:2px 11px 8px;font-size:11px;font-family:verdana}.hover .gritter-item{background-position:right -40px}.gritter-item p{padding:0;margin:0;word-wrap:break-word}.gritter-close{display:none;position:absolute;top:5px;right:3px;background:url(../images/gritter.png) left top no-repeat;cursor:pointer;width:30px;height:30px}.gritter-title{font-size:14px;font-weight:700;padding:0 12px 7px 0;display:block;text-shadow:1px 1px 0 #000}.gritter-image{width:48px;height:48px;float:left}.gritter-with-image,.gritter-without-image{padding:0}.gritter-with-image{width:220px;float:right}.gritter-light .gritter-bottom,.gritter-light .gritter-close,.gritter-light .gritter-item,.gritter-light .gritter-top{background-image:url(../images/gritter-light.png);color:#222}.gritter-light .gritter-title{text-shadow:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.10.4.custom.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.10.4.custom.min.css index 5a693ea6c..996585531 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.10.4.custom.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.10.4.custom.min.css @@ -2,4 +2,4 @@ * * http://jqueryui.com * * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css * * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=%22Open%20Sans%22%2C%20sans-serif&fwDefault=normal&fsDefault=13px&cornerRadius=0&bgColorHeader=%23333&bgTextureHeader=flat&bgImgOpacityHeader=0&borderColorHeader=%23333&fcHeader=%23eee&iconColorHeader=%23eee&bgColorContent=%23fff&bgTextureContent=flat&bgImgOpacityContent=0&borderColorContent=%23eee&fcContent=%23333333&iconColorContent=%23cccccc&bgColorDefault=%23f5f5f5&bgTextureDefault=flat&bgImgOpacityDefault=0&borderColorDefault=%23dfdfdf&fcDefault=%23222&iconColorDefault=%23222&bgColorHover=%23e1e1e1&bgTextureHover=flat&bgImgOpacityHover=0&borderColorHover=%23dfdfdf&fcHover=%23222&iconColorHover=%23222&bgColorActive=%23e1e1e1&bgTextureActive=flat&bgImgOpacityActive=65&borderColorActive=%23dfdfdf&fcActive=%23222&iconColorActive=%23222&bgColorHighlight=%23e1e1e1&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=%23dfdfdf&fcHighlight=%23222&iconColorHighlight=%23222&bgColorError=%23D54E21&bgTextureError=flat&bgImgOpacityError=0&borderColorError=%23D54E21&fcError=%23eee&iconColorError=%23eee&bgColorOverlay=%23333&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=%23aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=2px&offsetTopShadow=-2px&offsetLeftShadow=-2px&cornerRadiusShadow=2px - * * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:10px;padding:.5em .5em .5em .7em;border:1px solid #e5e5e5;min-height:0}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;right:.5em;left:initial;top:50%;margin-top:-8px;color:#a0a5aa}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border:1px solid #e5e5e5;border-top:0;overflow:auto;margin:0 0 10px 0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04) box-shadow: 0 1px 1px rgba(0,0,0,.04)}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-icons-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-icons-only .ui-button-icon-primary,.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary{left:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:"Open Sans",sans-serif;font-size:13px}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:"Open Sans",sans-serif;font-size:1em}.ui-widget-content{border:1px solid #eee;background:#fff url(images/ui-bg_flat_0_fff_40x100.png) 50% 50% repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #333;background:#333 url(images/ui-bg_flat_0_333_40x100.png) 50% 50% repeat-x;color:#eee;font-weight:700}.ui-widget-header a{color:#eee}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#fff;font-weight:400;color:#222}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#222;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{font-weight:400;color:#222}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#222;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff;font-weight:400;color:#222}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#222;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dfdfdf;background:#e1e1e1 url(images/ui-bg_flat_55_e1e1e1_40x100.png) 50% 50% repeat-x;color:#222}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#222}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #d54e21;background:#d54e21 url(images/ui-bg_flat_0_D54E21_40x100.png) 50% 50% repeat-x;color:#eee}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#eee}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#eee}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_cccccc_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_eee_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_999999_256x240.png)}.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(images/ui-icons_222_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_222_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_222_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_eee_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:0}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:0}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:0}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:0}.ui-widget-overlay{background:#333 url(images/ui-bg_flat_0_333_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-2px 0 0 -2px;padding:2px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:2px}.ui-tabs-nav .ui-corner-top{-khtml-border-top-left-radius:4px;-khtml-border-top-right-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px;border:1px solid #dfdfdf}.ngg_settings_template_wrapper .ui-combobox-input{padding:0!important}.ui-tabs .ui-tabs-nav li{background:#fff;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;margin-bottom:-1px;margin-right:.5em}.ui-tabs .ui-tabs-nav li a{color:#aaa;outline:0;font-size:120%}.ui-tabs .ui-tabs-nav li a:hover{color:#d54e21}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#464646}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{border-top:1px solid #8a8a8a;border-right:1px solid #8a8a8a;border-left:1px solid #8a8a8a;border-bottom:1px solid #fff}.ui-tabs-icon+ul.ui-tabs-nav{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0}.ui-tabs-icon{float:left;font-size:18px;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;width:200px;height:40px}.ui-tabs-icon .nextgen_logo{display:none}.ui-tabs-icon .nextgen_logo_sub{display:none;font-size:14px}.ui-widget-overlay{background:#000 50% 50% repeat-x;opacity:.4;filter:Alpha(Opacity = 40)}.ui-widget select{height:2em}.ui-autocomplete{z-index:250}h3.ui-accordion-header,h3.ui-accordion-header.ui-state-default{margin:3px 0 0 0;font-size:14px;font-weight:600;line-height:20px}h3.ui-accordion-header a:focus,h3.ui-accordion-header:focus{outline:0;box-shadow:none}h3.ui-accordion-header.ui-state-active{border-bottom:1px solid #eee}div.accordion{margin-top:10px} \ No newline at end of file + * * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */.ui-button,.ui-spinner,.ui-spinner-input{vertical-align:middle}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:10px;padding:.5em .5em .5em .7em;border:1px solid #e5e5e5;min-height:0}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;right:.5em;left:initial;top:50%;margin-top:-8px;color:#a0a5aa}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border:1px solid #e5e5e5;border-top:0;overflow:auto;margin:0 0 10px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04) box-shadow: 0 1px 1px rgba(0,0,0,.04)}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;text-align:center;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-icons-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-icons-only .ui-button-icon-primary,.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary{left:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner,input.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group,.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-slider-vertical .ui-slider-range-min,.ui-spinner-down{bottom:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0}.ui-spinner-input{border:none;background:0 0;color:inherit;padding:0;margin:.2em 22px .2em .4em}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:"Open Sans",sans-serif;font-size:13px}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:"Open Sans",sans-serif;font-size:1em}.ui-widget-content{border:1px solid #eee;background:url(images/ui-bg_flat_0_fff_40x100.png) 50% 50% repeat-x #fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #333;background:url(images/ui-bg_flat_0_333_40x100.png) 50% 50% repeat-x #333;color:#eee;font-weight:700}.ui-widget-header a{color:#eee}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{background:#fff;font-weight:400;color:#222}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#222;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{font-weight:400;color:#222}.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#222;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff;font-weight:400;color:#222}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#222;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dfdfdf;background:url(images/ui-bg_flat_55_e1e1e1_40x100.png) 50% 50% repeat-x #e1e1e1;color:#222}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#222}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #D54E21;background:url(images/ui-bg_flat_0_D54E21_40x100.png) 50% 50% repeat-x #D54E21;color:#eee}.ui-state-error a,.ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error a,.ui-widget-header .ui-state-error-text{color:#eee}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_cccccc_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_eee_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_999999_256x240.png)}.ui-state-active .ui-icon,.ui-state-focus .ui-icon,.ui-state-highlight .ui-icon,.ui-state-hover .ui-icon{background-image:url(images/ui-icons_222_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_eee_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{border-top-left-radius:0}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{border-top-right-radius:0}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{border-bottom-left-radius:0}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{border-bottom-right-radius:0}.ui-widget-shadow{margin:-2px 0 0 -2px;padding:2px;background:url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x #aaa;opacity:.3;filter:Alpha(Opacity=30);border-radius:2px}.ui-tabs-nav .ui-corner-top{-khtml-border-top-left-radius:4px;-khtml-border-top-right-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;-webkit-border-top-left-radius:4px;-webkit-border-top-right-radius:4px;border-top-left-radius:4px;border-top-right-radius:4px;border:1px solid #dfdfdf}.ngg_settings_template_wrapper .ui-combobox-input{padding:0!important}.ui-tabs .ui-tabs-nav li{background:#fff;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;margin-bottom:-1px;margin-right:.5em}.ui-tabs .ui-tabs-nav li a{color:#aaa;outline:0;font-size:120%}.ui-tabs .ui-tabs-nav li a:hover{color:#d54e21}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#464646}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{border-top:1px solid #8a8a8a;border-right:1px solid #8a8a8a;border-left:1px solid #8a8a8a;border-bottom:1px solid #fff}.ui-tabs-icon+ul.ui-tabs-nav{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0}.ui-tabs-icon{float:left;font-size:18px;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;width:200px;height:40px}.ui-tabs-icon .nextgen_logo{display:none}.ui-tabs-icon .nextgen_logo_sub{display:none;font-size:14px}.ui-widget-overlay{background:50% 50% repeat-x #000;opacity:.4;filter:Alpha(Opacity=40);filter:-\9}.ui-widget select{height:2em}.ui-autocomplete{z-index:250}h3.ui-accordion-header,h3.ui-accordion-header.ui-state-default{margin:3px 0 0;font-size:14px;font-weight:600;line-height:20px}h3.ui-accordion-header a:focus,h3.ui-accordion-header:focus{outline:0;box-shadow:none}h3.ui-accordion-header.ui-state-active{border-bottom:1px solid #eee}div.accordion{margin-top:10px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.9.1.custom.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.9.1.custom.min.css index df61f2c7a..171675e18 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.9.1.custom.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/jquery-ui/jquery-ui-1.9.1.custom.min.css @@ -2,4 +2,4 @@ * http://jqueryui.com * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=sans-serif&fwDefault=normal&fsDefault=12px&cornerRadius=4px&bgColorHeader=ececec&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=dfdfdf&fcHeader=333333&iconColorHeader=999999&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=dfdfdf&fcContent=333333&iconColorContent=333333&bgColorDefault=ececec&bgTextureDefault=04_highlight_hard.png&bgImgOpacityDefault=75&borderColorDefault=dfdfdf&fcDefault=333333&iconColorDefault=333333&bgColorHover=ececec&bgTextureHover=06_inset_hard.png&bgImgOpacityHover=75&borderColorHover=cccccc&fcHover=000000&iconColorHover=333333&bgColorActive=ececec&bgTextureActive=01_flat.png&bgImgOpacityActive=65&borderColorActive=dfdfdf&fcActive=333333&iconColorActive=333333&bgColorHighlight=ffffe0&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=e6db55&fcHighlight=333333&iconColorHighlight=21759b&bgColorError=ffebe8&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cc0000&fcError=cc0000&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=3px -* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity = 0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;zoom:1}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto;zoom:1}.ui-autocomplete{position:absolute;top:0;cursor:default}* html .ui-autocomplete{width:1px}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-icons-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-icons-only .ui-button-icon-primary,.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary{left:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current{float:right}.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block}.ui-dialog .ui-dialog-titlebar-close:focus,.ui-dialog .ui-dialog-titlebar-close:hover{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin:.5em 0 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:0 0;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}* html .ui-tooltip{background-image:none}body .ui-tooltip{border-width:2px}.ui-widget{font-family:sans-serif;font-size:12px}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dfdfdf;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #dfdfdf;background:#ececec url(images/ui-bg_highlight-soft_75_ececec_1x100.png) 50% 50% repeat-x;color:#333;font-weight:700}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #dfdfdf;background:#ececec url(images/ui-bg_highlight-hard_75_ececec_1x100.png) 50% 50% repeat-x;font-weight:400;color:#333}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#333;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:#ececec url(images/ui-bg_inset-hard_75_ececec_1x100.png) 50% 50% repeat-x;font-weight:400;color:#000}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#000;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #dfdfdf;background:#ececec url(images/ui-bg_flat_65_ececec_40x100.png) 50% 50% repeat-x;font-weight:400;color:#333}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#333;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #e6db55;background:#ffffe0 url(images/ui-bg_glass_55_ffffe0_1x400.png) 50% 50% repeat-x;color:#333}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#333}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #c00;background:#ffebe8 url(images/ui-bg_glass_95_ffebe8_1x400.png) 50% 50% repeat-x;color:#c00}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#c00}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#c00}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity = 70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity = 35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity = 35)}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_333333_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_999999_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_21759b_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cc0000_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity = 30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity = 30);-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-icon{float:left}.ui-accordion .ui-accordion-header{font-size:1.17em;text-shadow:#fff 0 1px 0;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;line-height:1}.ui-tabs .ui-tabs-nav li{background:#fff;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;margin-bottom:-1px;margin-right:.5em}.ui-tabs .ui-tabs-nav li a{color:#aaa;outline:0;font-size:120%}.ui-tabs .ui-tabs-nav li a:hover{color:#d54e21}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#464646}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{border-top:1px solid #8a8a8a;border-right:1px solid #8a8a8a;border-left:1px solid #8a8a8a;border-bottom:1px solid #fff}.ui-tabs-icon+ul.ui-tabs-nav{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0}.ui-tabs-icon{float:left;font-size:18px;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;width:200px;height:40px}.ui-tabs-icon .nextgen_logo{display:none}.ui-tabs-icon .nextgen_logo_sub{display:none;font-size:14px}.ui-widget-overlay{background:#000 50% 50% repeat-x;opacity:.4;filter:Alpha(Opacity = 40)}.ui-widget select{height:2em} \ No newline at end of file +* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */.ui-spinner,.ui-spinner-input{vertical-align:middle;padding:0}.ui-helper-reset,.ui-menu{list-style:none;outline:0}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute!important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px)}.ui-helper-zfix,.ui-widget-overlay{position:absolute;top:0;height:100%;width:100%;left:0}.ui-helper-reset{margin:0;padding:0;border:0;line-height:1.3;text-decoration:none;font-size:100%}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;zoom:1}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto;zoom:1}.ui-autocomplete{position:absolute;top:0;cursor:default}* html .ui-autocomplete{width:1px}.ui-button{display:inline-block;position:relative;padding:0;margin-right:.1em;cursor:pointer;text-align:center;zoom:1;overflow:visible}.ui-button,.ui-button:active,.ui-button:hover,.ui-button:link,.ui-button:visited{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:1.4}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-icons-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-icons-only .ui-button-icon-primary,.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary{left:.5em}.ui-button-icons-only .ui-button-icon-secondary,.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-next-hover,.ui-datepicker .ui-datepicker-prev-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-next span,.ui-datepicker .ui-datepicker-prev span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td a,.ui-datepicker td span{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-multi .ui-datepicker-group,.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker-cover{position:absolute;z-index:-1;filter:mask();top:-4px;left:-4px;width:200px;height:200px}.ui-dialog{position:absolute;padding:.2em;width:300px;overflow:hidden}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 16px .1em 0}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:19px;margin:-10px 0 0;padding:1px;height:18px}.ui-dialog .ui-dialog-titlebar-close span{display:block}.ui-dialog .ui-dialog-titlebar-close:focus,.ui-dialog .ui-dialog-titlebar-close:hover{padding:0}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0 0;overflow:auto;zoom:1}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin:.5em 0 0;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:14px;height:14px;right:3px;bottom:3px}.ui-slider-vertical .ui-slider-range-min,.ui-spinner-down{bottom:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{padding:2px;margin:0;display:block}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;zoom:1;width:100%}.ui-menu .ui-menu-divider{margin:5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;zoom:1;font-weight:400}.ui-menu .ui-menu-item a.ui-state-active,.ui-menu .ui-menu-item a.ui-state-focus{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden}.ui-spinner-input{border:none;background:0 0;margin:.2em 22px .2em .4em}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em;zoom:1}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0 0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}* html .ui-tooltip{background-image:none}body .ui-tooltip{border-width:2px}.ui-widget{font-family:sans-serif;font-size:12px}.ui-widget .ui-widget{font-size:1em}.ui-widget button,.ui-widget input,.ui-widget select,.ui-widget textarea{font-family:sans-serif;font-size:1em}.ui-widget-content{border:1px solid #dfdfdf;background:url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x #fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #dfdfdf;background:url(images/ui-bg_highlight-soft_75_ececec_1x100.png) 50% 50% repeat-x #ececec;color:#333;font-weight:700}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #dfdfdf;background:url(images/ui-bg_highlight-hard_75_ececec_1x100.png) 50% 50% repeat-x #ececec;font-weight:400;color:#333}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#333;text-decoration:none}.ui-state-focus,.ui-state-hover,.ui-widget-content .ui-state-focus,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-focus,.ui-widget-header .ui-state-hover{border:1px solid #ccc;background:url(images/ui-bg_inset-hard_75_ececec_1x100.png) 50% 50% repeat-x #ececec;font-weight:400;color:#000}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#000;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #dfdfdf;background:url(images/ui-bg_flat_65_ececec_40x100.png) 50% 50% repeat-x #ececec;font-weight:400;color:#333}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#333;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #e6db55;background:url(images/ui-bg_glass_55_ffffe0_1x400.png) 50% 50% repeat-x #ffffe0;color:#333}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#333}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #c00;background:url(images/ui-bg_glass_95_ffebe8_1x400.png) 50% 50% repeat-x #ffebe8;color:#c00}.ui-state-error a,.ui-state-error-text,.ui-widget-content .ui-state-error a,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error a,.ui-widget-header .ui-state-error-text{color:#c00}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:700}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:400}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px;float:left}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_999999_256x240.png)}.ui-state-active .ui-icon,.ui-state-default .ui-icon,.ui-state-focus .ui-icon,.ui-state-hover .ui-icon{background-image:url(images/ui-icons_333333_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_21759b_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cc0000_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-first,.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-left,.ui-corner-tl,.ui-corner-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-right,.ui-corner-top,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bl,.ui-corner-bottom,.ui-corner-left{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-br,.ui-corner-right{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x #aaa;opacity:.3;filter:Alpha(Opacity=30);-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-accordion .ui-accordion-header{font-size:1.17em;text-shadow:#fff 0 1px 0;font-family:Georgia,"Times New Roman","Bitstream Charter",Times,serif;line-height:1}.ui-tabs .ui-tabs-nav li{background:#fff;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;margin-bottom:-1px;margin-right:.5em}.ui-tabs .ui-tabs-nav li a{color:#aaa;outline:0;font-size:120%}.ui-tabs .ui-tabs-nav li a:hover{color:#d54e21}.ui-tabs .ui-tabs-nav li.ui-tabs-active a{color:#464646}.ui-tabs .ui-tabs-nav li.ui-tabs-selected{border-top:1px solid #8a8a8a;border-right:1px solid #8a8a8a;border-left:1px solid #8a8a8a;border-bottom:1px solid #fff}.ui-tabs-icon+ul.ui-tabs-nav{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;-khtml-border-bottom-left-radius:0;border-bottom-left-radius:0}.ui-tabs-icon{float:left;font-size:18px;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;width:200px;height:40px}.ui-tabs-icon .nextgen_logo{display:none}.ui-tabs-icon .nextgen_logo_sub{display:none;font-size:14px}.ui-widget-overlay{background:50% 50% repeat-x #000;opacity:.4;filter:Alpha(Opacity=40);filter:-\9}.ui-widget select{height:2em} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.css index 17f84c77d..b7b037dbe 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.css @@ -54,12 +54,23 @@ max-width: 100%; } -.nextgen_settings_colorpicker { +.nextgen_settings_field_colorpicker { width: 85px !important; text-align: center; margin-left: 50px; } +/* These three rules are to prevent 'WP Social Widget' from breaking our use of the WP Color Picker */ +#ngg_page_content .wp-picker-container { + position: initial !important; +} +#ngg_page_content .wp-picker-holder { + position: initial !important; +} +#ngg_page_content .wp-picker-input-wrap { + position: initial !important; +} + #nextgen_settings_wmXpos, #nextgen_settings_wmYpos { width: 65px !important; @@ -345,9 +356,10 @@ table.nextgen_settings_position { color: #fff; content: '\f0c9'; display: block; - font: normal 20px/1 'FontAwesome'; + font: normal 20px/1 'Font Awesome 5 Free'; margin: 0 auto; text-align: center; + font-weight: 900; } #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active, @@ -365,9 +377,8 @@ table.nextgen_settings_position { } #ngg_page_content .ngg_page_content_menu a:before { - content: "\f107"; float: left; - font: normal 16px/1 'FontAwesome'; + font: normal 16px/1 'Font Awesome 5 Free'; height: 16px; right: 0; margin-top: 3px; @@ -375,6 +386,7 @@ table.nextgen_settings_position { z-index: 9999; padding-right: 10px; content: "\f1de"; + font-weight: 900; } #ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after, @@ -449,6 +461,10 @@ table.nextgen_settings_position { box-shadow: inset 0 0 2px 1px rgba(100,100,100,.05); } +#ngg_page_content .ngg_page_content_main select { + font-size: 13px; +} + #ngg_page_content .ngg_page_content_main .select2-container { width: 200px !important; line-height: 0; @@ -660,6 +676,11 @@ table.nextgen_settings_position { width: 100% !important; } +#tr_photocrati-nextgen_basic_imagebrowser_ngg_triggers_display, +#tr_photocrati-nextgen_basic_slideshow_ngg_triggers_display { + display:none; +} + /***** 6) NGG Admin CSS: NextGEN Pro Custom Post Types *****/ /* First, CSS for post type lists */ diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js index f88285117..79f905b91 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.js @@ -94,4 +94,15 @@ jQuery(function($){ $('input.nextgen_settings_field_colorpicker').wpColorPicker(); $('#ngg_page_content').css('visibility', 'visible'); + + // Handle the "recover" and "delete" links in Manage Gallery > each image row + $('#ngg-listimages .row-actions .confirmrecover, #ngg-listimages .row-actions.submitdelete.delete').on( + 'click', + function(event) { + var target = event.target; + if (!confirm(target.getAttribute('data-question') + ' "' + target.getAttribute('data-text') + '"')) { + event.preventDefault(); + } + } + ); }); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.css index 9a1e9028e..cedc164cc 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.css @@ -1 +1 @@ -.ngg-admin .notice,.ngg-admin div.error,.ngg-admin div.updated{margin:20px 15px 0 0}.ngg-admin #ngg_page_content .notice,.ngg-admin #ngg_page_content div.error,.ngg-admin #ngg_page_content div.updated{margin:20px 0 20px 0}.hidden{display:none}.nextgen_advanced_toggle_link{font-size:11px;position:relative;bottom:5px;color:#444}.url_field{width:400px;max-width:100%}.nextgen_settings_colorpicker{width:85px!important;text-align:center;margin-left:50px}#nextgen_settings_wmXpos,#nextgen_settings_wmYpos{width:65px!important}table.nextgen_settings_position{width:auto!important}#ngg_page_content label.tooltip,#ngg_page_content span.tooltip{outline:0;background-image:url(information.png);background-repeat:no-repeat;padding-left:22px;padding-bottom:4px;background-size:18px}#poststuff .ui-accordion h3{padding-left:25px}#lightbox_effects_content table tr td:first-child{vertical-align:top;text-align:right;padding-right:7px;padding-top:5px}#lightbox_effects_content tr{height:28px}.ngg-admin #screen-meta-links{padding-bottom:20px}.ngg-admin #wpbody{position:static}#ngg_page_content{padding-bottom:0;width:98%;font-family:lato,sans-serif;height:auto;margin-top:25px;float:left;box-shadow:0 0 100px 10px rgba(0,0,0,.05)}#adminmenu .wp-submenu a[href*=ngg_pro_upgrade]{color:#9fbb1a;font-weight:600}.toplevel_page_nextgen-gallery #ngg_page_content{margin-top:20px}#ngg_page_content.ngg_settings_page{background:#fff}.ngg_gallery_sort,.ngg_manage_albums,.ngg_manage_galleries,.ngg_manage_images{background:#fcfcfc}#ngg_page_content .wrap{margin:0}#ngg_page_content .about-wrap{max-width:100%;background:#fff;float:left;background:#fcfcfc}#ngg_page_content a{color:#9fbb1a}#ngg_page_content .button-primary,#ngg_page_content .button-secondary,#ngg_page_content button{background-color:#9fbb1a;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px;text-transform:uppercase;letter-spacing:1px;font-size:11px;font-weight:700;font-family:Lato,sans-serif}#ngg_page_content .button-primary:hover,#ngg_page_content .button-secondary:hover,#ngg_page_content button:hover{background-color:#a9c524}#ngg_page_content .button-primary:active,#ngg_page_content .button-secondary:active,#ngg_page_content button:active{vertical-align:middle}#ngg_page_content .button-secondary{background-color:#888!important}.ngg-admin #ngg_page_content .notice button,.ngg-admin #ngg_page_content div.error button,.ngg-admin #ngg_page_content div.updated button{background-color:transparent!important;padding:0}#ngg_page_content button,.ngg-admin .notice button,.ngg-admin div.error button,.ngg-admin div.updated button{background:0 0}#ngg_page_content button.wp-color-result{height:24px!important;padding:0 0 0 30px!important;border:1px solid #ddd!important}#ngg_page_content button.wp-color-result:hover{background-color:transparent}#ngg_page_content input[type=checkbox]{height:16px!important;width:16px!important}#ngg_page_content.ngg_settings_page form>p{width:81%;background:#fff;margin:0;float:right}#ngg_page_content .ngg_save_settings_button{margin:30px;font-weight:700;height:40px!important;padding:0 40px!important}#ngg_page_content ::-webkit-input-placeholder{color:#aaa}#ngg_page_content :-ms-input-placeholder{color:#aaa}#ngg_page_content ::-moz-placeholder{color:#aaa;opacity:1}#ngg_page_content :-moz-placeholder{color:#aaa;opacity:1}.ngg-admin .select2-drop.select2-drop-above .select2-search input{width:100%}#ngg_page_content .ngg_page_content_header{border-bottom:10px solid #9fbb1a;height:80px;padding:0 0 0 20px;background:#143650;margin-top:-23px}#ngg_page_content .ngg_page_content_header img{height:40px;padding-top:20px;padding-right:20px;float:left;width:auto}#ngg_page_content .ngg_page_content_header h2,#ngg_page_content .ngg_page_content_header h3{line-height:80px;color:#fff;font-size:18px;font-family:Lato,sans-serif;text-transform:uppercase;letter-spacing:2px;text-align:left;font-weight:900}#ngg_page_content .ngg_page_content_header p{float:right;margin:-98px 0 0 0;font-size:15px;font-style:italic;font-weight:400;color:#cdd3d8;background:rgba(93,134,167,.18);padding:0 40px;border-left:1px solid #566b7c;color:#a7b8c6;line-height:80px}#ngg_page_content .ngg_page_content_header p a{text-decoration:none;font-weight:500;background:#aac43b;color:#fff;padding:5px 10px;font-style:normal;margin:-1px 0 0 20px;border-radius:1px;text-transform:uppercase}#ngg_page_content .ngg_page_content_header .ngg_save_settings_button{margin:0!important}#ngg_page_content .ngg_page_content_menu{padding:20px;width:20%;float:left;padding:0;height:100%;background:0 0}#ngg_page_content .ngg_page_content_menu a{box-shadow:none!important;cursor:pointer;display:block;padding:20px 10px 20px 15px;line-height:22px;margin:0;text-decoration:none;color:#2b5d89;text-transform:uppercase;font-size:11px;border-bottom:1px solid #eee;font-weight:600;letter-spacing:1.2px}.responsive-menu-icon{cursor:pointer;display:none;margin-bottom:5px;text-align:left}.responsive-menu-icon::before{color:#fff;content:'\f0c9';display:block;font:normal 20px/1 FontAwesome;margin:0 auto;text-align:center}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#ngg_page_content .ngg_page_content_menu a:active{outline:0;outline-width:0;outline-color:transparent;border-right:1px solid #fff;background:#9ebc1b;position:relative;color:#fff;margin-right:-1px;font-weight:800;border-bottom:1px solid #9dbd1b}#ngg_page_content .ngg_page_content_menu a:before{content:"\f107";float:left;font:normal 16px/1 FontAwesome;height:16px;right:0;margin-top:3px;text-align:right;z-index:9999;padding-right:10px;content:"\f1de"}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#ngg_page_content .ngg_page_content_menu a:active:after{right:0;border:8px solid transparent;content:"";width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}#ngg_page_content .ngg_page_content_main{padding:10px 20px 20px 30px;min-height:600px;float:left;background:#fff;box-sizing:border-box;width:100%;box-shadow:0 -5px 4px 2px rgba(0,0,0,.05)}#ngg_page_content .ngg_overview .ngg_page_content_main,#ngg_page_content.ngg_settings_page .ngg_page_content_main{width:80%}.gallery_page_ngg_display_settings #ngg_page_content.ngg_settings_page .ngg_page_content_main{min-height:1000px}.gallery_page_ngg_other_options #ngg_page_content.ngg_settings_page .ngg_page_content_main{min-height:400px}#ngg_page_content .ngg_manage_tags .ngg_page_content_main{padding:0}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div,#ngg_page_content .ngg_overview .ngg_page_content_main>div,#ngg_page_content.ngg_settings_page .ngg_page_content_main>div{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div:first-of-type,#ngg_page_content .ngg_overview .ngg_page_content_main>div:first-of-type,#ngg_page_content.ngg_settings_page .ngg_page_content_main>div:first-of-type{display:block}#ngg_page_content.ngg_settings_page .ngg_page_content_main h3{color:rgba(29,36,42,.85);font-size:18px;margin:20px 0 30px;text-transform:uppercase}#ngg_page_content .ngg_page_content_main input,#ngg_page_content .ngg_page_content_main select{color:#888;height:35px;border:1px solid #ddd;padding-left:10px;box-shadow:none;width:200px;box-shadow:inset 0 0 2px 1px rgba(100,100,100,.05)}#ngg_page_content .ngg_page_content_main .select2-container{width:200px!important;line-height:0}#ngg_page_content .ngg_page_content_main .select2-selection--multiple,#ngg_page_content .ngg_page_content_main .select2-selection--single{border:1px solid #ddd}#ngg_page_content .ngg_page_content_main .select2-search{width:100%}#ngg_page_content .ngg_page_content_main .select2-search__field{border-radius:3px}#ngg_page_content .ngg_page_content_main .select2-selection__choice{background:#9fbb1a;background-image:none;border:none;box-shadow:none;color:#fff;line-height:20px;padding:7px 10px 7px 8px;width:92%}#ngg_page_content .ngg_page_content_main .select2-selection__choice__remove{color:#fff;margin-right:6px}#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] .select2-container,#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] input,#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] select{width:250px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main input[type=radio],#ngg_page_content.ngg_settings_page .ngg_page_content_main input[type=radio]{border-radius:50%!important;height:16px!important;width:16px!important;padding:0!important;vertical-align:middle}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main input[type=radio]:checked:before,#ngg_page_content.ngg_settings_page .ngg_page_content_main input[type=radio]:checked:before{background-color:#9fbb1a;border-radius:50%;color:transparent;content:"\2022";display:block;height:16px;margin:0 0 0 -1px;vertical-align:middle;width:16px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table,#ngg_page_content.ngg_settings_page .ngg_page_content_main table{color:rgba(29,36,42,.85);border-collapse:collapse;width:100%}#ngg_page_content table .sorting-indicator:before{color:#fff!important}#attach_to_post_tabs #displayed_tab #display_settings_tab_content table tr,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr{border:1px solid #f7f8f3;padding:5px 0!important;height:auto}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{line-height:30px;vertical-align:middle;padding:10px 20px;box-sizing:border-box}.ngg-admin #ngg_page_content .widefat td,.ngg-admin #ngg_page_content .widefat th{padding:10px;color:rgba(118,169,52,.75);color:#aaa;vertical-align:middle}.ngg-admin #ngg_page_content .widefat tfoot th,.ngg-admin #ngg_page_content .widefat thead th{padding:0 10px;color:#fff;text-transform:uppercase}#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{font-weight:400!important;font-size:13px!important;line-height:1.5!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td:first-of-type{width:300px;text-align:left;font-weight:400;padding-top:8px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table table tr td:first-of-type,#ngg_page_content.ngg_settings_page .ngg_page_content_main table table tr td:first-of-type{width:auto;font-weight:400;padding:10px 20px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr:nth-of-type(2n),#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr:nth-of-type(2n){background-color:#f7f8f3}#ngg_page_content.ngg_settings_page .ngg_page_content_main tr.watermark_field{padding:10px 0!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table{border:1px solid #d3e1c8}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table td{padding:5px 15px!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table td:first-of-type{width:auto!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table tr{border:none;padding:0!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field img{max-width:100%}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main label,#ngg_page_content.ngg_settings_page .ngg_page_content_main label,#ngg_page_content.ngg_settings_page .ngg_page_content_main p.description{font-size:14px;color:#666}#ngg_page_content.ngg_settings_page .ngg_page_content_main label{margin-right:5px}#ngg_page_content.ngg_settings_page .ngg_page_content_main label:last-of-type{margin-right:15px}#ngg_page_content.ngg_settings_page .nextgen_settings_position td,#ngg_page_content.ngg_settings_page .nextgen_settings_position tr:nth-of-type(2n){border:none!important}#ngg_page_content.ngg_settings_page .nextgen_pro_lightbox_admin_header{background:#38576f!important;margin-top:20px}.nextgen_pro_lightbox_admin_header td{padding-left:0!important}.nextgen_pro_lightbox_admin_header td h3{text-transform:none!important;color:#fff!important;margin:0 0 0 20px!important}.ngg_options_promo{background:#224460;color:#fff;font-family:Lato,sans-serif;font-size:14px;font-weight:600}.ngg_options_promo a{text-decoration:none;font-weight:600;margin-left:6px}.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main tbody tr td.ngg_options_promo{width:100%!important}.ngg-post-type .ngg_page_content_main .button,.ngg-post-type .ngg_page_content_main .page-title-action{background-color:#9fbb1a!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 15px!important;line-height:35px;width:auto!important}.ngg-post-type .ngg_page_content_main .button:hover,.ngg-post-type .ngg_page_content_main .page-title-action:hover{background-color:#a9c524!important}.ngg-post-type .ngg_page_content_main .page-title-action{padding:8px 16px!important}.ngg-post-type .ngg_admin_notice{display:none}.ngg-post-type .ngg_page_content_main .tablenav{margin:0 0 20px}.ngg-post-type .ngg_page_content_main .tablenav .actions,.ngg-post-type .ngg_page_content_main .tablenav .tablenav-pages{margin:10px 0}.ngg-post-type .ngg_page_content_main .tablenav .tablenav-pages a,.ngg-post-type .ngg_page_content_main .tablenav-pages-navspan{background:#556472;border:none;color:#fff!important;margin:0 2px}.ngg-post-type #ngg_page_content .ngg_page_content_main .tablenav input.current-page{width:50px!important}.ngg-post-type .ngg_page_content_main table{box-shadow:none;table-layout:auto;border:1px solid rgba(159,187,26,.08)}.ngg-post-type .ngg_page_content_main table tfoot,.ngg-post-type .ngg_page_content_main table thead{background-color:#38576f;text-transform:uppercase}.ngg-post-type .ngg_page_content_main table tfoot{background-color:#38576f}.ngg-post-type .ngg_page_content_main table tfoot a,.ngg-post-type .ngg_page_content_main table thead a{padding:0}.ngg-post-type .ngg_page_content_main table tfoot span,.ngg-post-type .ngg_page_content_main table thead span{color:#fff;font-size:15px}.ngg-post-type .ngg_page_content_main table thead td,.ngg-post-type .ngg_page_content_main table thead th{background-color:transparent;border:none;color:#fff}.ngg-post-type .ngg_page_content_main table thead td{padding:12px 5px!important}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]{height:13px!important;width:13px!important;min-width:auto;margin-top:2px}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]:checked:before{color:#9fbb1a;margin:-5px 0 0 -5px}.ngg-post-type #ngg_page_content .sorting-indicator:before{color:#fff!important}.ngg-post-type .ngg_page_content_main .striped>tbody>:nth-child(odd){background-color:#f7f8f3}.ngg-post-type .ngg_page_content_main a.row-title{font-weight:400}.ngg-post-type .ngg_page_content_main .row-actions{left:0;padding-top:0}.ngg-post-type .ngg_page_content_main .row-actions a{color:rgba(118,169,52,.75)!important;color:#aaa!important}.ngg-post-type .ngg_page_content_main td.column-title strong{margin-bottom:0}.ngg-post-type #wpbody-content .quick-edit-row-page .inline-edit-col-left{width:100%}.ngg-post-type #ngg_page_content .widefat td,.ngg-post-type #ngg_page_content .widefat th{padding:10px;color:rgba(118,169,52,.75);color:#aaa;vertical-align:middle}.ngg-post-type #ngg_page_content .widefat tfoot th,.ngg-post-type #ngg_page_content .widefat thead th{padding:0 10px;color:#fff;text-transform:uppercase}.ngg-post-type .ngg_page_content_main .tablenav.bottom{margin:10px 0 0}.ngg-admin #postbox-container-2 h2.ui-sortable-handle,.ngg-post-type #ngg_page_content h3.accordion_tab{padding:10px;background:#38576f;margin-bottom:0}.ngg-admin #postbox-container-2 h2.ui-sortable-handle,.ngg-post-type #ngg_page_content h3.accordion_tab a{color:#fff;text-decoration:none}.ngg-admin #postbox-container-2 .postbox,.ngg-post-type .accordion>div{border-left:1px solid rgba(159,187,26,.05);border-bottom:1px solid rgba(159,187,26,.05);border-right:1px solid rgba(159,187,26,.05);margin-bottom:30px;background-color:#f7f8f3}.ngg-post-type .accordion>div{padding:20px;margin-bottom:30px}.ngg-post-type .accordion>div table{border:none}.ngg-admin #postbox-container-2 .postbox .inside{margin:0}.ngg-admin #postbox-container-2 .postbox .inside a{color:#9fbb1a}.ngg-admin #postbox-container-2 .postbox .inside td,.ngg-admin #postbox-container-2 .postbox .inside th{padding:5px 10px}.ngg-admin #postbox-container-2 .postbox .inside .button-primary,.ngg-post-type .accordion>div .button-primary{margin:15px 0 0}.ngg-post-type table input[type=text]{margin:0}@media (max-width:1030px){#ngg_page_content .ngg_page_content_header p{padding:0 20px}}@media (max-width:900px){#ngg_page_content .ngg_page_content_header p{display:none}}@media (max-width:782px){.ngg-post-type #ngg_page_content button.toggle-row{width:40px!important;height:40px!important;background:0 0!important}.ngg-post-type tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 8px 3px 35%}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]:checked:before{font:400 20px/1 dashicons!important}#ngg_page_content .ngg_page_content_header img{padding-right:10px}#ngg_page_content .ngg_overview .ngg_page_content_header h3,#ngg_page_content .ngg_page_content_header h3{font-size:14px}#ngg_page_content .ngg_overview .ngg_page_content_main,#ngg_page_content .ngg_page_content_menu,#ngg_page_content.ngg_settings_page .ngg_page_content_main{width:100%}#ngg_page_content .ngg_page_content_main,#ngg_page_content.ngg_settings_page .ngg_page_content_main{padding:20px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table,#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main tbody,#ngg_page_content.ngg_settings_page .ngg_page_content_main table,#ngg_page_content.ngg_settings_page .ngg_page_content_main tbody{display:block!important;max-width:100%}#ngg_page_content.ngg_settings_page .ngg_page_content_main tbody.hidden{display:none!important}#attach_to_post_tabs #displayed_tab #ngg_page_content #slug_configuration{display:none!important}#attach_to_post_tabs #displayed_tab #display_settings_tab_content table tr,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr{display:block!important;padding:10px 0 20px!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{display:block;padding:2px 10px}#ngg_page_content.ngg_settings_page .ngg_page_content_main table.nextgen_settings_position tr td{display:table-cell}#ngg_page_content.ngg_settings_page .ngg_page_content_main h2,#ngg_page_content.ngg_settings_page .ngg_page_content_main h3{text-align:center}#ngg_page_content.ngg_settings_page form>p{width:100%;padding:15px;box-sizing:border-box}#ngg_page_content .ngg_page_content_main input,#ngg_page_content .ngg_page_content_main select{max-width:100%;margin:5px 0;box-sizing:border-box}#ngg_page_content .ngg_page_content_main .select2-container,#ngg_page_content .ngg_page_content_main input[type=number],#ngg_page_content .ngg_page_content_main input[type=text],#ngg_page_content .ngg_page_content_main select{width:100%!important}#ngg_page_content button.wp-color-result{width:auto!important}#ngg_page_content button.wp-color-result .wp-color-result-text{line-height:22px}.ngg-post-type .ngg_page_content_main .subsubsub{width:100%}.ngg-post-type .ngg_page_content_main .tablenav .actions{width:100%}.ngg-post-type #ngg_page_content .ngg_page_content_main input,.ngg-post-type #ngg_page_content .ngg_page_content_main select{width:100%!important;max-width:100%;margin:5px 0;box-sizing:border-box}#ngg_page_content input[type=checkbox]{width:16px!important}#ngg_page_content .button-primary,#ngg_page_content .button-secondary,#ngg_page_content button{width:100%!important;margin:4px 0;display:block;text-align:center}.ngg-post-type .ngg_page_content_main .button,.ngg-post-type .ngg_page_content_main .page-title-action{width:80%!important;margin:4px 0;display:block;text-align:center;margin:10px auto 20px;padding:0!important}.ngg-post-type .ngg_page_content_main .displaying-num{display:none}#gallery_selection label{display:block;padding-bottom:8px}.post-type-ngg_pricelist .accordion table{width:100%!important}.post-type-ngg_pricelist .accordion #manual_shipping_options td{display:block;width:100%!important}.post-type-ngg_pricelist #ngg_page_content .accordion table input.shipping_rate{width:100%;max-width:100%}.post-type-ngg_pricelist .accordion input[type=checkbox]:checked:before{font:400 21px/1 dashicons}.ngg-post-type #ngg_page_content h1{text-align:center;display:block}#ngg_page_content .responsive-menu-icon{display:block;background:#9fbb1a;padding:10px 0 15px}#ngg_page_content .responsive-menu{display:none;float:none;margin:0}#ngg_page_content .responsive-menu a{display:block}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#ngg_page_content .ngg_page_content_menu a:active:after{display:none}} \ No newline at end of file +#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field img,.url_field{max-width:100%}.ngg-admin .notice,.ngg-admin div.error,.ngg-admin div.updated{margin:20px 15px 0 0}.ngg-admin #ngg_page_content .notice,.ngg-admin #ngg_page_content div.error,.ngg-admin #ngg_page_content div.updated{margin:20px 0}.hidden{display:none}.nextgen_advanced_toggle_link{font-size:11px;position:relative;bottom:5px;color:#444}.url_field{width:400px}.nextgen_settings_field_colorpicker{width:85px!important;text-align:center;margin-left:50px}#ngg_page_content .wp-picker-container,#ngg_page_content .wp-picker-holder,#ngg_page_content .wp-picker-input-wrap{position:initial!important}#nextgen_settings_wmXpos,#nextgen_settings_wmYpos{width:65px!important}table.nextgen_settings_position{width:auto!important}#ngg_page_content label.tooltip,#ngg_page_content span.tooltip{outline:0;background-image:url(information.png);background-repeat:no-repeat;padding-left:22px;padding-bottom:4px;background-size:18px}#poststuff .ui-accordion h3{padding-left:25px}#lightbox_effects_content table tr td:first-child{vertical-align:top;text-align:right;padding-right:7px;padding-top:5px}#lightbox_effects_content tr{height:28px}.ngg-admin #screen-meta-links{padding-bottom:20px}.ngg-admin #wpbody{position:static}#ngg_page_content{padding-bottom:0;width:98%;font-family:lato,sans-serif;height:auto;margin-top:25px;float:left;box-shadow:0 0 100px 10px rgba(0,0,0,.05)}#adminmenu .wp-submenu a[href*=ngg_pro_upgrade]{color:#9fbb1a;font-weight:600}.toplevel_page_nextgen-gallery #ngg_page_content{margin-top:20px}#ngg_page_content.ngg_settings_page{background:#fff}.ngg_gallery_sort,.ngg_manage_albums,.ngg_manage_galleries,.ngg_manage_images{background:#fcfcfc}#ngg_page_content .wrap{margin:0}#ngg_page_content .about-wrap{max-width:100%;float:left;background:#fcfcfc}#ngg_page_content a{color:#9fbb1a}#ngg_page_content .button-primary,#ngg_page_content .button-secondary,#ngg_page_content button{background-color:#9FBB1A;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 24px!important;line-height:35px;width:auto!important;border-radius:3px;text-transform:uppercase;letter-spacing:1px;font-size:11px;font-weight:700;font-family:Lato,sans-serif}#ngg_page_content .button-primary:hover,#ngg_page_content .button-secondary:hover,#ngg_page_content button:hover{background-color:#A9C524}#ngg_page_content .button-primary:active,#ngg_page_content .button-secondary:active,#ngg_page_content button:active{vertical-align:middle}#ngg_page_content .button-secondary{background-color:#888!important}.ngg-admin #ngg_page_content .notice button,.ngg-admin #ngg_page_content div.error button,.ngg-admin #ngg_page_content div.updated button{background-color:transparent!important;padding:0}#ngg_page_content button,.ngg-admin .notice button,.ngg-admin div.error button,.ngg-admin div.updated button{background:0 0}#ngg_page_content button.wp-color-result{height:24px!important;padding:0 0 0 30px!important;border:1px solid #ddd!important}#ngg_page_content button.wp-color-result:hover{background-color:transparent}#ngg_page_content input[type=checkbox]{height:16px!important;width:16px!important}#ngg_page_content.ngg_settings_page form>p{width:81%;background:#fff;margin:0;float:right}#ngg_page_content .ngg_save_settings_button{margin:30px;font-weight:700;height:40px!important;padding:0 40px!important}#ngg_page_content ::-webkit-input-placeholder{color:#aaa}#ngg_page_content :-ms-input-placeholder{color:#aaa}#ngg_page_content ::-moz-placeholder{color:#aaa;opacity:1}#ngg_page_content :-moz-placeholder{color:#aaa;opacity:1}.ngg-admin .select2-drop.select2-drop-above .select2-search input{width:100%}#ngg_page_content .ngg_page_content_header{border-bottom:10px solid #9FBB1A;height:80px;padding:0 0 0 20px;background:#143650;margin-top:-23px}#ngg_page_content .ngg_page_content_header img{height:40px;padding-top:20px;padding-right:20px;float:left;width:auto}#ngg_page_content .ngg_page_content_header h2,#ngg_page_content .ngg_page_content_header h3{line-height:80px;color:#fff;font-size:18px;font-family:Lato,sans-serif;text-transform:uppercase;letter-spacing:2px;text-align:left;font-weight:900}#ngg_page_content .ngg_page_content_header p{float:right;margin:-98px 0 0;font-size:15px;font-style:italic;font-weight:400;background:rgba(93,134,167,.18);padding:0 40px;border-left:1px solid #566b7c;color:#a7b8c6;line-height:80px}#ngg_page_content .ngg_page_content_header p a{text-decoration:none;font-weight:500;background:#aac43b;color:#fff;padding:5px 10px;font-style:normal;margin:-1px 0 0 20px;border-radius:1px;text-transform:uppercase}#ngg_page_content .ngg_page_content_header .ngg_save_settings_button{margin:0!important}#ngg_page_content .ngg_page_content_menu{width:20%;float:left;padding:0;height:100%;background:0 0}#ngg_page_content .ngg_page_content_menu a{box-shadow:none!important;cursor:pointer;display:block;padding:20px 10px 20px 15px;line-height:22px;margin:0;text-decoration:none;color:#2b5d89;text-transform:uppercase;font-size:11px;border-bottom:1px solid #eee;font-weight:600;letter-spacing:1.2px}.responsive-menu-icon{cursor:pointer;display:none;margin-bottom:5px;text-align:left}.responsive-menu-icon::before{color:#fff;content:'\f0c9';display:block;font:400 20px/1 'Font Awesome 5 Free';margin:0 auto;text-align:center;font-weight:900}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active,#ngg_page_content .ngg_page_content_menu a:active{outline:transparent 0;border-right:1px solid #fff;background:#9ebc1b;position:relative;color:#fff;margin-right:-1px;font-weight:800;border-bottom:1px solid #9dbd1b}#ngg_page_content .ngg_page_content_menu a:before{float:left;font:400 16px/1 'Font Awesome 5 Free';height:16px;right:0;margin-top:3px;text-align:right;z-index:9999;padding-right:10px;content:"\f1de";font-weight:900}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#ngg_page_content .ngg_page_content_menu a:active:after{right:0;border:8px solid transparent;content:"";width:0;position:absolute;pointer-events:none;border-right-color:#fff;top:50%;margin-top:-8px}#ngg_page_content .ngg_page_content_main{padding:10px 20px 20px 30px;min-height:600px;float:left;background:#fff;box-sizing:border-box;width:100%;box-shadow:0 -5px 4px 2px rgba(0,0,0,.05)}#ngg_page_content .ngg_overview .ngg_page_content_main,#ngg_page_content.ngg_settings_page .ngg_page_content_main{width:80%}.gallery_page_ngg_display_settings #ngg_page_content.ngg_settings_page .ngg_page_content_main{min-height:1000px}.gallery_page_ngg_other_options #ngg_page_content.ngg_settings_page .ngg_page_content_main{min-height:400px}#ngg_page_content .ngg_manage_tags .ngg_page_content_main{padding:0}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div,#ngg_page_content .ngg_overview .ngg_page_content_main>div,#ngg_page_content.ngg_settings_page .ngg_page_content_main>div{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main>div:first-of-type,#ngg_page_content .ngg_overview .ngg_page_content_main>div:first-of-type,#ngg_page_content.ngg_settings_page .ngg_page_content_main>div:first-of-type{display:block}#ngg_page_content.ngg_settings_page .ngg_page_content_main h3{color:rgba(29,36,42,.85);font-size:18px;margin:20px 0 30px;text-transform:uppercase}#ngg_page_content .ngg_page_content_main input,#ngg_page_content .ngg_page_content_main select{color:#888;height:35px;border:1px solid #ddd;padding-left:10px;width:200px;box-shadow:inset 0 0 2px 1px rgba(100,100,100,.05)}#ngg_page_content .ngg_page_content_main select{font-size:13px}#ngg_page_content .ngg_page_content_main .select2-container{width:200px!important;line-height:0}#ngg_page_content .ngg_page_content_main .select2-selection--multiple,#ngg_page_content .ngg_page_content_main .select2-selection--single{border:1px solid #ddd}#ngg_page_content .ngg_page_content_main .select2-search{width:100%}#ngg_page_content .ngg_page_content_main .select2-search__field{border-radius:3px}#ngg_page_content .ngg_page_content_main .select2-selection__choice{background:#9fbb1a;border:none;box-shadow:none;color:#fff;line-height:20px;padding:7px 10px 7px 8px;width:92%}#ngg_page_content .ngg_page_content_main .select2-selection__choice__remove{color:#fff;margin-right:6px}#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] .select2-container,#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] input,#ngg_page_content .ngg_page_content_main div[data-id=lightbox_effects] select{width:250px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main input[type=radio],#ngg_page_content.ngg_settings_page .ngg_page_content_main input[type=radio]{border-radius:50%!important;height:16px!important;width:16px!important;padding:0!important;vertical-align:middle}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main input[type=radio]:checked:before,#ngg_page_content.ngg_settings_page .ngg_page_content_main input[type=radio]:checked:before{background-color:#9FBB1A;border-radius:50%;color:transparent;content:"\2022";display:block;height:16px;margin:0 0 0 -1px;vertical-align:middle;width:16px}#tr_photocrati-nextgen_basic_imagebrowser_ngg_triggers_display,#tr_photocrati-nextgen_basic_slideshow_ngg_triggers_display,.ngg-post-type .ngg_admin_notice{display:none}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table,#ngg_page_content.ngg_settings_page .ngg_page_content_main table{color:rgba(29,36,42,.85);border-collapse:collapse;width:100%}#ngg_page_content table .sorting-indicator:before{color:#fff!important}#attach_to_post_tabs #displayed_tab #display_settings_tab_content table tr,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr{border:1px solid #f7f8f3;padding:5px 0!important;height:auto}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{line-height:30px;vertical-align:middle;padding:10px 20px;box-sizing:border-box}.ngg-admin #ngg_page_content .widefat td,.ngg-admin #ngg_page_content .widefat th{padding:10px;color:#aaa;vertical-align:middle}.ngg-admin #ngg_page_content .widefat tfoot th,.ngg-admin #ngg_page_content .widefat thead th{padding:0 10px;color:#fff;text-transform:uppercase}#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{font-weight:400!important;font-size:13px!important;line-height:1.5!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td:first-of-type{width:300px;text-align:left;font-weight:400;padding-top:8px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table table tr td:first-of-type,#ngg_page_content.ngg_settings_page .ngg_page_content_main table table tr td:first-of-type{width:auto;font-weight:400;padding:10px 20px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr:nth-of-type(2n),#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr:nth-of-type(2n){background-color:#f7f8f3}#ngg_page_content.ngg_settings_page .ngg_page_content_main tr.watermark_field{padding:10px 0!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table{border:1px solid #d3e1c8}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table td{padding:5px 15px!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table td:first-of-type{width:auto!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main .watermark_field table tr{border:none;padding:0!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main label,#ngg_page_content.ngg_settings_page .ngg_page_content_main label,#ngg_page_content.ngg_settings_page .ngg_page_content_main p.description{font-size:14px;color:#666}#ngg_page_content.ngg_settings_page .ngg_page_content_main label{margin-right:5px}#ngg_page_content.ngg_settings_page .ngg_page_content_main label:last-of-type{margin-right:15px}#ngg_page_content.ngg_settings_page .nextgen_settings_position td,#ngg_page_content.ngg_settings_page .nextgen_settings_position tr:nth-of-type(2n){border:none!important}#ngg_page_content.ngg_settings_page .nextgen_pro_lightbox_admin_header{background:#38576f!important;margin-top:20px}.nextgen_pro_lightbox_admin_header td{padding-left:0!important}.nextgen_pro_lightbox_admin_header td h3{text-transform:none!important;color:#fff!important;margin:0 0 0 20px!important}.ngg_options_promo{background:#224460;color:#fff;font-family:Lato,sans-serif;font-size:14px;font-weight:600}.ngg_options_promo a{text-decoration:none;font-weight:600;margin-left:6px}.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main tbody tr td.ngg_options_promo{width:100%!important}.ngg-post-type .ngg_page_content_main .button,.ngg-post-type .ngg_page_content_main .page-title-action{background-color:#9FBB1A!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 15px!important;line-height:35px;width:auto!important}.ngg-post-type .ngg_page_content_main .button:hover,.ngg-post-type .ngg_page_content_main .page-title-action:hover{background-color:#A9C524!important}.ngg-post-type .ngg_page_content_main .page-title-action{padding:8px 16px!important}.ngg-post-type .ngg_page_content_main .tablenav{margin:0 0 20px}.ngg-post-type .ngg_page_content_main .tablenav .actions,.ngg-post-type .ngg_page_content_main .tablenav .tablenav-pages{margin:10px 0}.ngg-post-type .ngg_page_content_main .tablenav .tablenav-pages a,.ngg-post-type .ngg_page_content_main .tablenav-pages-navspan{background:#556472;border:none;color:#fff!important;margin:0 2px}.ngg-post-type #ngg_page_content .ngg_page_content_main .tablenav input.current-page{width:50px!important}.ngg-post-type .ngg_page_content_main table{box-shadow:none;table-layout:auto;border:1px solid rgba(159,187,26,.08)}.ngg-post-type .ngg_page_content_main table tfoot,.ngg-post-type .ngg_page_content_main table thead{background-color:#38576f;text-transform:uppercase}.ngg-post-type .ngg_page_content_main table tfoot{background-color:#38576f}.ngg-post-type .ngg_page_content_main table tfoot a,.ngg-post-type .ngg_page_content_main table thead a{padding:0}.ngg-post-type .ngg_page_content_main table tfoot span,.ngg-post-type .ngg_page_content_main table thead span{color:#fff;font-size:15px}.ngg-post-type .ngg_page_content_main table thead td,.ngg-post-type .ngg_page_content_main table thead th{background-color:transparent;border:none;color:#fff}.ngg-post-type .ngg_page_content_main table thead td{padding:12px 5px!important}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]{height:13px!important;width:13px!important;min-width:auto;margin-top:2px}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]:checked:before{color:#9FBB1A;margin:-5px 0 0 -5px}.ngg-post-type #ngg_page_content .sorting-indicator:before{color:#fff!important}.ngg-post-type .ngg_page_content_main .striped>tbody>:nth-child(odd){background-color:#f7f8f3}.ngg-post-type .ngg_page_content_main a.row-title{font-weight:400}.ngg-post-type .ngg_page_content_main .row-actions{left:0;padding-top:0}.ngg-post-type .ngg_page_content_main .row-actions a{color:#aaa!important}.ngg-post-type .ngg_page_content_main td.column-title strong{margin-bottom:0}.ngg-post-type #wpbody-content .quick-edit-row-page .inline-edit-col-left{width:100%}.ngg-post-type #ngg_page_content .widefat td,.ngg-post-type #ngg_page_content .widefat th{padding:10px;color:#aaa;vertical-align:middle}.ngg-post-type #ngg_page_content .widefat tfoot th,.ngg-post-type #ngg_page_content .widefat thead th{padding:0 10px;color:#fff;text-transform:uppercase}.ngg-post-type .ngg_page_content_main .tablenav.bottom{margin:10px 0 0}.ngg-admin #postbox-container-2 h2.ui-sortable-handle,.ngg-post-type #ngg_page_content h3.accordion_tab{padding:10px;background:#38576f;margin-bottom:0}.ngg-admin #postbox-container-2 h2.ui-sortable-handle,.ngg-post-type #ngg_page_content h3.accordion_tab a{color:#fff;text-decoration:none}.ngg-admin #postbox-container-2 .postbox,.ngg-post-type .accordion>div{border-left:1px solid rgba(159,187,26,.05);border-bottom:1px solid rgba(159,187,26,.05);border-right:1px solid rgba(159,187,26,.05);margin-bottom:30px;background-color:#f7f8f3}.ngg-post-type .accordion>div{padding:20px;margin-bottom:30px}.ngg-post-type .accordion>div table{border:none}.ngg-admin #postbox-container-2 .postbox .inside{margin:0}.ngg-admin #postbox-container-2 .postbox .inside a{color:#9fbb1a}.ngg-admin #postbox-container-2 .postbox .inside td,.ngg-admin #postbox-container-2 .postbox .inside th{padding:5px 10px}.ngg-admin #postbox-container-2 .postbox .inside .button-primary,.ngg-post-type .accordion>div .button-primary{margin:15px 0 0}.ngg-post-type table input[type=text]{margin:0}@media (max-width:1030px){#ngg_page_content .ngg_page_content_header p{padding:0 20px}}@media (max-width:900px){#ngg_page_content .ngg_page_content_header p{display:none}}@media (max-width:782px){.ngg-post-type #ngg_page_content button.toggle-row{width:40px!important;height:40px!important;background:0 0!important}.ngg-post-type tr:not(.inline-edit-row):not(.no-items) td.column-primary~td:not(.check-column){padding:3px 8px 3px 35%}.ngg-post-type #ngg_page_content .ngg_page_content_main input[type=checkbox]:checked:before{font:400 20px/1 dashicons!important}#ngg_page_content .ngg_page_content_header img{padding-right:10px}#ngg_page_content .ngg_overview .ngg_page_content_header h3,#ngg_page_content .ngg_page_content_header h3{font-size:14px}#ngg_page_content .ngg_overview .ngg_page_content_main,#ngg_page_content .ngg_page_content_menu,#ngg_page_content.ngg_settings_page .ngg_page_content_main{width:100%}#ngg_page_content .ngg_page_content_main,#ngg_page_content.ngg_settings_page .ngg_page_content_main{padding:20px}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table,#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main tbody,#ngg_page_content.ngg_settings_page .ngg_page_content_main table,#ngg_page_content.ngg_settings_page .ngg_page_content_main tbody{display:block!important;max-width:100%}#attach_to_post_tabs #displayed_tab #ngg_page_content #slug_configuration,#ngg_page_content.ngg_settings_page .ngg_page_content_main tbody.hidden{display:none!important}#attach_to_post_tabs #displayed_tab #display_settings_tab_content table tr,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr{display:block!important;padding:10px 0 20px!important}#attach_to_post_tabs #displayed_tab #ngg_page_content .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td,#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr th{display:block;padding:2px 10px}#ngg_page_content.ngg_settings_page .ngg_page_content_main table.nextgen_settings_position tr td{display:table-cell}#ngg_page_content.ngg_settings_page .ngg_page_content_main h2,#ngg_page_content.ngg_settings_page .ngg_page_content_main h3{text-align:center}#ngg_page_content.ngg_settings_page form>p{width:100%;padding:15px;box-sizing:border-box}#ngg_page_content .ngg_page_content_main input,#ngg_page_content .ngg_page_content_main select{max-width:100%;margin:5px 0;box-sizing:border-box}#ngg_page_content .ngg_page_content_main .select2-container,#ngg_page_content .ngg_page_content_main input[type=number],#ngg_page_content .ngg_page_content_main input[type=text],#ngg_page_content .ngg_page_content_main select{width:100%!important}#ngg_page_content button.wp-color-result{width:auto!important}#ngg_page_content button.wp-color-result .wp-color-result-text{line-height:22px}.ngg-post-type .ngg_page_content_main .subsubsub,.ngg-post-type .ngg_page_content_main .tablenav .actions{width:100%}.ngg-post-type #ngg_page_content .ngg_page_content_main input,.ngg-post-type #ngg_page_content .ngg_page_content_main select{width:100%!important;max-width:100%;margin:5px 0;box-sizing:border-box}#ngg_page_content input[type=checkbox]{width:16px!important}#ngg_page_content .button-primary,#ngg_page_content .button-secondary,#ngg_page_content button{width:100%!important;margin:4px 0;display:block;text-align:center}.ngg-post-type .ngg_page_content_main .button,.ngg-post-type .ngg_page_content_main .page-title-action{width:80%!important;display:block;text-align:center;margin:10px auto 20px;padding:0!important}.ngg-post-type .ngg_page_content_main .displaying-num{display:none}#gallery_selection label{display:block;padding-bottom:8px}.post-type-ngg_pricelist .accordion table{width:100%!important}.post-type-ngg_pricelist .accordion #manual_shipping_options td{display:block;width:100%!important}.post-type-ngg_pricelist #ngg_page_content .accordion table input.shipping_rate{width:100%;max-width:100%}.post-type-ngg_pricelist .accordion input[type=checkbox]:checked:before{font:400 21px/1 dashicons}.ngg-post-type #ngg_page_content h1{text-align:center;display:block}#ngg_page_content .responsive-menu-icon{display:block;background:#9fbb1a;padding:10px 0 15px}#ngg_page_content .responsive-menu{display:none;float:none;margin:0}#ngg_page_content .responsive-menu a{display:block}#ngg_page_content .ngg_page_content_menu .ngg_page_content_menu_active:after,#ngg_page_content .ngg_page_content_menu a:active:after{display:none}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.js index 41b801d25..5283d21b7 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_admin_page.min.js @@ -1 +1 @@ -jQuery(function(e){e(".ngg_page_content_menu a:first-of-type").addClass("ngg_page_content_menu_active"),e(".ngg_page_content_menu a").click(function(n){e(".ngg_page_content_menu a").removeClass("ngg_page_content_menu_active"),e(this).addClass("ngg_page_content_menu_active");e(this).attr("data-id");e(".ngg_page_content_main > div").css("display","none"),e('div[data-id="'+e(this).attr("data-id")+'"]').css("display","block")}),e(".responsive-menu-icon").remove(),e(".ngg_page_content_menu").addClass("responsive-menu").before('<div class="responsive-menu-icon"></div>'),e(".responsive-menu-icon").click(function(){e(this).next(".ngg_page_content_menu").slideToggle("fast")}),e(window).resize(function(){window.innerWidth>640&&(e(".ngg_page_content_menu").removeAttr("style"),e(".responsive-menu > a").removeClass("menu-open"))}),e(".responsive-menu > a").click(function(n){window.innerWidth<782&&e(this).parent(".ngg_page_content_menu").slideToggle("fast")}),e('input[type="submit"], button[type="submit"]').click(function(n){var t=e(this),i=!1;if((i=t.attr("data-confirm"))&&!confirm(i))return void n.preventDefault();if(-1!=t.attr("name").indexOf("_proxy")){var a=t.attr("data-proxy-value");a||(a=t.attr("value"));var s=t.attr("name").replace("_proxy",""),o=e('input[name="'+s+'"]');o.length>0?o.val(a):(o=e("<input/>").attr({type:"hidden",name:s,value:a}),t.parents("form").append(o))}}),e(".nextgen_advanced_toggle_link").on("click",function(n){n.preventDefault();var t="#"+e(this).attr("rel"),i=e(this);e(t).toggle(500,"swing",function(){e(this).hasClass("hidden")?(e(this).removeClass("hidden"),i.text(i.attr("active_label"))):(e(this).addClass("hidden"),i.text(i.attr("hidden_label")))})}),e("input.nextgen_settings_field_colorpicker").wpColorPicker(),e("#ngg_page_content").css("visibility","visible")}); \ No newline at end of file +jQuery(function(e){e(".ngg_page_content_menu a:first-of-type").addClass("ngg_page_content_menu_active"),e(".ngg_page_content_menu a").click(function(t){e(".ngg_page_content_menu a").removeClass("ngg_page_content_menu_active"),e(this).addClass("ngg_page_content_menu_active");e(this).attr("data-id");e(".ngg_page_content_main > div").css("display","none"),e('div[data-id="'+e(this).attr("data-id")+'"]').css("display","block")}),e(".responsive-menu-icon").remove(),e(".ngg_page_content_menu").addClass("responsive-menu").before('<div class="responsive-menu-icon"></div>'),e(".responsive-menu-icon").click(function(){e(this).next(".ngg_page_content_menu").slideToggle("fast")}),e(window).resize(function(){window.innerWidth>640&&(e(".ngg_page_content_menu").removeAttr("style"),e(".responsive-menu > a").removeClass("menu-open"))}),e(".responsive-menu > a").click(function(t){window.innerWidth<782&&e(this).parent(".ngg_page_content_menu").slideToggle("fast")}),e('input[type="submit"], button[type="submit"]').click(function(t){var n=e(this),i=!1;if((i=n.attr("data-confirm"))&&!confirm(i))return void t.preventDefault();if(-1!=n.attr("name").indexOf("_proxy")){var a=n.attr("data-proxy-value");a||(a=n.attr("value"));var s=n.attr("name").replace("_proxy",""),o=e('input[name="'+s+'"]');o.length>0?o.val(a):(o=e("<input/>").attr({type:"hidden",name:s,value:a}),n.parents("form").append(o))}}),e(".nextgen_advanced_toggle_link").on("click",function(t){t.preventDefault();var n="#"+e(this).attr("rel"),i=e(this);e(n).toggle(500,"swing",function(){e(this).hasClass("hidden")?(e(this).removeClass("hidden"),i.text(i.attr("active_label"))):(e(this).addClass("hidden"),i.text(i.attr("hidden_label")))})}),e("input.nextgen_settings_field_colorpicker").wpColorPicker(),e("#ngg_page_content").css("visibility","visible"),e("#ngg-listimages .row-actions .confirmrecover, #ngg-listimages .row-actions.submitdelete.delete").on("click",function(e){var t=e.target;confirm(t.getAttribute("data-question")+' "'+t.getAttribute("data-text")+'"')||e.preventDefault()})}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.css index cb7734e76..c7971e254 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.css @@ -51,7 +51,8 @@ margin-top: -25px; } .tourist-popover { -z-index: 100100 !important; +z-index: 1000100 !important; +min-width: 230px; } .tourist-popover .arrow { margin-left: 0; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.js index 7ce77d95b..d753935d8 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.js @@ -72,6 +72,8 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { this.enable = function() { el.removeClass('ngg-wizard-disabled'); }; + this.setup = function() { + }; this.reset = function() { el.removeClass('ngg-wizard-has-selection'); el.find(this.itemSelector).removeClass('ngg-wizard-selected'); @@ -103,16 +105,17 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { el.click(function (e) { // here we only trigger done() if anchor is page-local (i.e. JS button) because for normal anchors this step is only "done" when reaching the new page - if (!el.is('a') || (el.attr("href").startsWith("#") || el.hasClass("thickbox"))) { + if (!el.is('a') || (el.attr("href").startsWith("#") || el.attr("href").startsWith("javascript:") || el.hasClass("thickbox"))) { self.done(el); } }); - this.reset = function() { + this.setup = function() { if (!el.is('a')) return; var href = el.attr("href"); + this.originalHref = href; if (!href.startsWith("#")) { if (href.indexOf("?") == -1) @@ -125,6 +128,14 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { el.attr("href", href); } }; + + this.reset = function() { + if (this.originalHref) { + if (el.is('a')) { + el.attr('href', this.originalHref); + } + } + }; } _.extend(ButtonView.prototype, BaseView.prototype); @@ -138,7 +149,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { self.done(el); }); - this.reset = function() { + this.setup = function() { // in here we can support wizards steps after a post is submitted by editing the form's URL }; } @@ -154,7 +165,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { self.done(el); }); - this.reset = function() { + this.setup = function() { // in here we can support wizards steps after a post is submitted by editing the form's URL }; } @@ -190,7 +201,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { view = { handler : TextView, name : "TextView", - selector : "input[type='text']" + selector : "input[type='text'], input[type='search'], input[type='email'], input[type='tel'], input[type='number'], input[type='username'], input[type='password'], textarea" }; this.views.push(view); @@ -212,7 +223,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { Tourist.Tip.Base.prototype.nextButtonTemplate = '<a class="button-primary pull-right tour-next">Next step →</a>'; Tourist.Tip.Base.prototype.finalButtonTemplate = '<button class="button-primary pull-right tour-next">Finish up</button>'; // override close button template - Tourist.Tip.Base.prototype.closeButtonTemplate = '<a class="btn btn-close tour-close" href="#"><i class="icon icon-remove fa fa-close"></i></a>'; + Tourist.Tip.Base.prototype.closeButtonTemplate = '<a class="btn btn-close tour-close" href="#"><i class="icon icon-remove far fa-window-close"></i></a>'; // override Tourist's BootstrapTip logic to retrieve target bounds Tourist.Tip.BootstrapTip.prototype._getTargetBounds = function(target) { @@ -501,7 +512,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { } stepOb.highlightTarget = isTargeted; - stepOb.nextButton = !isTargeted; + stepOb.nextButton = !isTargeted || step['optional']; stepOb.target = jTarget; stepOb.ngg_view = viewOb; @@ -748,7 +759,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { if (view != null) { view.currentWizard = tour.ngg_wizard_id; view.currentStep = this.ngg_step_id; - view.reset(); + view.setup(); view.bind('done', this.onDone); view.enable(); } @@ -763,6 +774,7 @@ if (typeof(NextGEN_Wizard_Manager) === 'undefined') { if (view != null) { view.disable(); view.unbind('done', this.onDone); + view.reset(); } }; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.css index cd2c1096e..b9af908d2 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.css @@ -1 +1 @@ -.ngg-wizard-starter{width:250px}.ngg-wizard-starter .starter-wrap-top{width:180px;margin:0 auto}.ngg-wizard-starter .starter-wrap-icon{background:#fff;border-radius:50%;border:2px solid #ccc;border-top-width:4px;padding:1.2em;cursor:pointer}.ngg-wizard-starter img.starter-icon{max-width:100%;z-index:10000}.ngg-wizard-starter .starter-wrap-bottom{background:#fff;border-radius:1em;border:2px solid #ccc;border-top-width:1px;padding:.8em;text-align:center;line-height:1.5em;position:relative;margin-top:-2.2em;cursor:pointer}#ngg-wizard-starter{position:fixed;bottom:0;left:10%}.ngg-wizard-anchor{background:0 0;width:50px;height:50px}#ngg-wizard-anchor{position:fixed;top:50%;left:50%;margin-left:-25px;margin-top:-25px}.tourist-popover{z-index:100100!important}.tourist-popover .arrow{margin-left:0;bottom:auto;overflow:visible}.tourist-popover .arrow:after{background-color:transparent;box-shadow:none;margin-left:0;bottom:auto;left:auto;top:auto;overflow:visible;transform:none}.tourist-popover .ngg-wizard-text{margin:30px 20px}.tourist-popover .ngg-wizard-loading{text-align:center;margin:5px 0 0 0;clear:both;font-style:italic} \ No newline at end of file +.ngg-wizard-starter{width:250px}.ngg-wizard-starter .starter-wrap-top{width:180px;margin:0 auto}.ngg-wizard-starter .starter-wrap-icon{background:#fff;border-radius:50%;border:2px solid #ccc;border-top-width:4px;padding:1.2em;cursor:pointer}.ngg-wizard-starter img.starter-icon{max-width:100%;z-index:10000}.ngg-wizard-starter .starter-wrap-bottom{background:#fff;border-radius:1em;border:2px solid #ccc;border-top-width:1px;padding:.8em;text-align:center;line-height:1.5em;position:relative;margin-top:-2.2em;cursor:pointer}#ngg-wizard-starter{position:fixed;bottom:0;left:10%}.ngg-wizard-anchor{background:0 0;width:50px;height:50px}#ngg-wizard-anchor{position:fixed;top:50%;left:50%;margin-left:-25px;margin-top:-25px}.tourist-popover .arrow,.tourist-popover .arrow:after{margin-left:0;bottom:auto;overflow:visible}.tourist-popover{z-index:1000100!important;min-width:230px}.tourist-popover .arrow:after{background-color:transparent;box-shadow:none;left:auto;top:auto;transform:none}.tourist-popover .ngg-wizard-text{margin:30px 20px}.tourist-popover .ngg-wizard-loading{text-align:center;margin:5px 0 0;clear:both;font-style:italic} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.js index aa2981346..b36392c6b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/nextgen_wizards.min.js @@ -1 +1 @@ -function NextGEN_Wizard(t,e){this.id=t,this.manager=e,this.data={},this.steps=[],this.status=null,this.tour=null,this.created=Math.floor(Date.now()/1e3)}if("undefined"==typeof NextGEN_Wizard_Manager){NextGEN_Wizard.prototype.start=function(){null!=this.tour&&this.tour.start()},NextGEN_Wizard.prototype.getNextStep=function(t){for(var e=0;e<this.steps.length;e++){if(this.steps[e].id==t)break}return e++,e<this.steps.length?this.steps[e]:null},NextGEN_Wizard.prototype.setState=function(t){};var manager={state:[],wizards:[],runningWizard:null,views:[],starter:null,anchor:null,events:{},targetWatchers:{},refreshTimer:null,nggEvents:[],init:function(){function t(t){this.itemSelector=".view-item",this.currentWizard=null,this.currentStep=null,this.doneFlag=!1,this.init=function(){},this.disable=function(){t.addClass("ngg-wizard-disabled")},this.enable=function(){t.removeClass("ngg-wizard-disabled")},this.reset=function(){t.removeClass("ngg-wizard-has-selection"),t.find(this.itemSelector).removeClass("ngg-wizard-selected")},this.done=function(t){this.doneFlag||(this.doneFlag=!0,this.trigger("done",this,t))}}function e(e){t.call(this,e);var i=this;jQuery(e.get(0).ownerDocument).on("click",e.selector,function(t){i.done(e)})}function i(e){t.call(this,e);var i=this;e.click(function(t){(!e.is("a")||e.attr("href").startsWith("#")||e.hasClass("thickbox"))&&i.done(e)}),this.reset=function(){if(e.is("a")){var t=e.attr("href");t.startsWith("#")||(-1==t.indexOf("?")?t+="?":t+="&",t=t+"ngg_wizard="+this.currentWizard+"&ngg_wizard_step="+this.currentStep,e.attr("href",t))}}}function n(e){t.call(this,e);var i=this;e.on("input",function(t){jQuery(this).val().length>=3&&i.done(e)}),this.reset=function(){}}function r(e){t.call(this,e);var i=this;jQuery(e.get(0).ownerDocument).on("change",e.selector,function(t){jQuery(this).is(":checked")&&i.done(e)}),this.reset=function(){}}function o(e){t.call(this,e);var i=this;e.on("change",function(t){i.done(e)})}"undefined"!=typeof NextGEN_Wizard_Manager_State&&(this.state=NextGEN_Wizard_Manager_State);var a=this;jQuery(window.top.document).find("body").on("nextgen_event",function(t,e){a.nggEvents.push({type:e})}),_.extend(t.prototype,Backbone.Events),_.extend(e.prototype,t.prototype),_.extend(i.prototype,t.prototype),_.extend(n.prototype,t.prototype),_.extend(r.prototype,t.prototype),_.extend(o.prototype,t.prototype);var s=null;s={handler:o,name:"SelectView",selector:"select"},this.views.push(s),s={handler:r,name:"RadioView",selector:"input[type='radio']"},this.views.push(s),s={handler:n,name:"TextView",selector:"input[type='text']"},this.views.push(s),s={handler:i,name:"ButtonView",selector:"a, input[type='button'], input[type='submit']"},this.views.push(s),s={handler:e,name:"GenericView",selector:"*"},this.views.push(s),Tourist.Tip.Base.prototype.nextButtonTemplate='<a class="button-primary pull-right tour-next">Next step →</a>',Tourist.Tip.Base.prototype.finalButtonTemplate='<button class="button-primary pull-right tour-next">Finish up</button>',Tourist.Tip.Base.prototype.closeButtonTemplate='<a class="btn btn-close tour-close" href="#"><i class="icon icon-remove fa fa-close"></i></a>',Tourist.Tip.BootstrapTip.prototype._getTargetBounds=function(t){var e,i;e=t[0],i="function"==typeof e.getBoundingClientRect?e.getBoundingClientRect():{width:e.offsetWidth,height:e.offsetHeight};var n=t.offset();if(t.ownerDocument!=document)for(var r=function(t,e){for(var i=t.find("iframe"),n=[],o=0;o<i.size();o++){var a=jQuery(i.get(o));try{if(a.prop("contentWindow").document==e)return[a]}catch(t){continue}var s=r(a.contents(),e);if(s.length>0){n.push(a);for(var u=0;u<s.length;u++)n.push(s[u]);break}}return n},o=r(jQuery(document),t.get(0).ownerDocument),a=0;a<o.length;a++){var s=o[a],u=s.offset();n.left+=u.left,n.top+=u.top}return jQuery.extend({},i,n)},jQuery(".ngg-wizard-invoker").on("click",function(t){t.preventDefault();for(var e=NextGEN_Wizard_Manager,i=jQuery(this).data("ngg-wizard"),n=null,r=0;r<e.wizards.length;r++){var o=e.wizards[r];if(o.id==i){n=o;break}}return null!=n&&null==this.runningWizard&&n.start(),!1})},bind:function(t,e){t in this.events||(this.events[t]=[]);var i={handler:e};this.events[t].push(i)},trigger:function(t,e){if(void 0===e&&(e={}),t in this.events)for(var i=this.events[t],n=0;n<i.length;n++){var r=i[n];r.handler&&r.handler(this,e)}},didNextgenEventFire:function(t){for(var e=0;e<this.nggEvents.length;e++){if(this.nggEvents[e].type==t)return!0}return!1},getViewForSelector:function(t,e){var i=null;void 0===e&&(e=!0);for(var n=0;n<this.views.length;n++){var r=this.views[n];if(t.is(r.selector)){i=r.handler;break}}if(null!=i){var r=new i(t);return e&&r.init(),r}return null},getViewFor:function(t,e,i){var n=this.getViewForSelector(t,!1);return null!=n&&(n.currentWizard=e,n.currentStep=i,n.init()),n},generateQueue:function(t){var e=this,i=this.state,n=i.wizard_list.length,r=i.starter,o=i.running_wizard;if(n>0){var a=t('<div id="ngg-wizard-starter" class="ngg-wizard-starter"></div>');a.append('<div class="starter-wrap-top"><div class="starter-wrap-icon"><img class="starter-icon" src="'+r.image+'" /></div></div>'),a.append('<div class="starter-wrap-bottom"><div class="starter-wrap-text">'+r.text+"</div></div>"),a.on("click",".starter-wrap-icon, starter-wrap-bottom",function(){e.startQueue()}),a.hide(),a.appendTo("body"),this.starter=a;var s=t('<div id="ngg-wizard-anchor" class="ngg-wizard-anchor"></div>');s.appendTo("body"),this.anchor=s;for(var u=0,l=0;l<n;l++){var d=i.wizard_list[l],h=new NextGEN_Wizard(d.id,this);h.data=d,h.steps=d.steps;var c=this.generateTour(h);"ok"==c.result?(h.status="ready",h.tour=c.tour):"wait_element"==c.result&&(h.status="wait",u++),h.id==o?(this.wizards.unshift(h),this.runningWizard=h):this.wizards.push(h)}u>0?this.enqueueRefreshOperation():this.trigger("ready")}},getContextObject:function(t){var e=null;if(null!=t){"object"!=typeof t&&(t=[t]);for(var i=0;i<t.length;i++){var n=t[i];if(e=null==e?jQuery(n):e.find(n),e.is("iframe")){var r=e.prop("contentWindow");if("interactive"!=r.document.readyState&&"complete"!=r.document.readyState){e=jQuery([]);break}e=r.jQuery?r.jQuery("body"):e.contents().find("body")}}0==e.size()&&(e=jQuery([]))}else e=jQuery(document);return e},computeStepTarget:function(t,e,i){var n=e.target_wait,r=e.target,o=e.view,a=null,s=null,u=null,l=this.getContextObject(e.context),d=!1;if(null!=r){if(a=l.find(r),a.size()>0?d=!0:a=this.anchor,!d&&null!=n&&Math.floor(Date.now()/1e3)-t.created<=n)return!1}else a=this.anchor;return null!=o&&(s=l.find(o),s.size()>0&&(u=this.getViewFor(s,t.id,e.id))),i.highlightTarget=d,i.nextButton=!d,i.target=a,i.ngg_view=u,!0},scrollIntoView:function(t){},generateTour:function(t){if(null==t.tour){var e=t.data,i=e.steps,n=e.current_step,r=0,o=[],a=null;if(null!=e.view&&null==(a=this.getViewFor(jQuery(e.view),t.id)))return{result:"wait_element",element:e.view};for(var s=0;s<i.length;s++){var u=i[s];null!=n&&n==u.id&&(r=s);var l={ngg_step_id:u.id,ngg_step_data:u,viewport:jQuery(window),closeButton:!0,content:'<div class="ngg-wizard-text">'+u.text+"</div>",my:u.popup_anchor,at:u.target_anchor,bind:["onDone"],onDone:function(t,e,i,n){var r=t.ngg_wizard,o=this.ngg_step_data,a=!0;if(null!=o.condition&&(this.condition_met||(a=!1,this.condition_setup||this.setupCondition(t,e))),a&&null!=r){var s=r.getNextStep(this.ngg_step_id);if(null!=s&&s.lazy){a=!1;for(var u=null,l=0;l<t.options.steps.length;l++){var d=t.options.steps[l];if(d.ngg_step_id==s.id){u=d;break}}null!=u&&(null==u.target||0==u.target.size()||"ngg-wizard-anchor"==u.target.attr("id")?!(a=r.manager.computeStepTarget(r,s,u))||null!=u.target&&0!=u.target.size()&&"ngg-wizard-anchor"!=u.target.attr("id")||(a=!1):a=!0)}}if(a)t.next();else{null!=this.lazyTimeout&&(clearTimeout(this.lazyTimeout),this.lazyTimeout=null);var h=this;this.lazyTimeout=setTimeout(function(){h.lazyTimeout=null,h.onDone(t,e,i,n)},500)}}};if(!this.computeStepTarget(t,u,l))return{result:"wait_element",element:u.target};l.setupCondition=function(t,e){var i=t.ngg_wizard,n=this.ngg_step_data;if(!this.condition_setup&&null!=n.condition){var r=n.condition,o=r.type,a=r.value,s=r.context,u=r.timeout;this.condition_met=!1,this.condition_setup=!1,s&&"object"!=typeof s&&(s=[s]);var l=jQuery([]);if(s){s=s.slice(0);var d=s.pop();l=i.manager.getContextObject(s).find(d)}if(l.size()>0){var h=l.get(0).ownerDocument;h.defaultView||h.parentWindow}switch(o){case"frame_event":if(window.Frame_Event_Publisher){this.condition_setup=!0;var c=this;Frame_Event_Publisher.listen_for(a,function(){c.condition_met=!0})}break;case"event_bind":case"plupload_bind":var g=l.size()>0;if("plupload_bind"==o&&(void 0!==l.pluploadQueue?l=l.pluploadQueue():g=!1),g){this.condition_setup=!0;var c=this;l.bind(a,function(){c.condition_met=!0})}break;case"nextgen_event":if(this.condition_setup=!0,i.manager.didNextgenEventFire(a))this.condition_met=!0;else{var c=this;jQuery(window.top.document).find("body").bind("nextgen_event",function(t,e){e==a&&(c.condition_met=!0)})}break;case"wait":this.condition_setup=!0;var c=this;setTimeout(function(){c.condition_met=!0},a)}}var p=jQuery(".tourist-popover .ngg-wizard-text"),f=p.find(".ngg-wizard-loading");if(f.hide(),this.condition_setup&&!this.condition_met&&u>0){this.condition_timeout=0,0==f.length&&(f=jQuery('<div class="ngg-wizard-loading"></div>'),p.append(f)),f.html("Loading... ("+Math.ceil(u/1e3).toString()+")"),f.show();var c=this;c.condition_timer=setInterval(function(){c.condition_timeout+=1e3,c.condition_timeout>=u&&(c.condition_met=!0);var t=(Math.floor(c.condition_timeout/1e3),Math.ceil(u/1e3),Math.floor((u-c.condition_timeout)/1e3));f.html("Loading... ("+t.toString()+")"),c.condition_met&&(f.hide(),clearInterval(c.condition_timer),c.condition_timer=null)},1e3)}return this.condition_setup},l.setup=function(t,e){var i=e.view;null!=this.ngg_view&&(i=this.ngg_view),null!=i&&(i.currentWizard=t.ngg_wizard_id,i.currentStep=this.ngg_step_id,i.reset(),i.bind("done",this.onDone),i.enable())},l.teardown=function(t,e){var i=e.view;null!=this.ngg_view&&(i=this.ngg_view),null!=i&&(i.disable(),i.unbind("done",this.onDone))},o.push(l)}var d={steps:o,tipClass:"Bootstrap",tipOptions:{showEffect:"slidein"},stepOptions:{}};null!=a&&(d.stepOptions.view=a);var h=new Tourist.Tour(d);for(h.ngg_wizard_id=t.id,h.ngg_wizard=t;r>0;)h.next(),r--;return{result:"ok",tour:h}}},enqueueRefreshOperation:function(){null!=this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.refreshTimer=setTimeout(function(t){NextGEN_Wizard_Manager.refreshQueue()},500)},refreshQueue:function(){this.refreshTimer=null;for(var t=0,e=0;e<this.wizards.length;e++){var i=this.wizards[e];if("wait"==i.status){var n=this.generateTour(i);"ok"==n.result?(i.status="ready",i.tour=n.tour):"wait_element"==n.result&&(i.status="wait",t++)}}t>0?this.enqueueRefreshOperation():this.trigger("ready")},start:function(){null!=this.runningWizard?this.runningWizard.start():this.showStarter()},showStarter:function(){},startQueue:function(){if(null!=this.starter){var t=this;this.starter.fadeOut(function(){t.nextTour()})}else this.nextTour()},nextTour:function(){for(var t=0,e=0;e<this.wizards.length;e++){var i=this.wizards[e];if("ready"==i.status&&null!=i.tour){t=e;break}}if(t<this.wizards.length){var i=this.wizards[t];i.tour.start()}},updateWizardState:function(t){}};manager.init(),window.NextGEN_Wizard_Manager=manager}jQuery(function(t){"undefined"!=typeof NextGEN_Wizard_Manager&&(NextGEN_Wizard_Manager.bind("ready",function(){NextGEN_Wizard_Manager.start()}),NextGEN_Wizard_Manager.generateQueue(t))}); \ No newline at end of file +function NextGEN_Wizard(t,e){this.id=t,this.manager=e,this.data={},this.steps=[],this.status=null,this.tour=null,this.created=Math.floor(Date.now()/1e3)}if("undefined"==typeof NextGEN_Wizard_Manager){NextGEN_Wizard.prototype.start=function(){null!=this.tour&&this.tour.start()},NextGEN_Wizard.prototype.getNextStep=function(t){for(var e=0;e<this.steps.length;e++){if(this.steps[e].id==t)break}return e++,e<this.steps.length?this.steps[e]:null},NextGEN_Wizard.prototype.setState=function(t){};var manager={state:[],wizards:[],runningWizard:null,views:[],starter:null,anchor:null,events:{},targetWatchers:{},refreshTimer:null,nggEvents:[],init:function(){function t(t){this.itemSelector=".view-item",this.currentWizard=null,this.currentStep=null,this.doneFlag=!1,this.init=function(){},this.disable=function(){t.addClass("ngg-wizard-disabled")},this.enable=function(){t.removeClass("ngg-wizard-disabled")},this.setup=function(){},this.reset=function(){t.removeClass("ngg-wizard-has-selection"),t.find(this.itemSelector).removeClass("ngg-wizard-selected")},this.done=function(t){this.doneFlag||(this.doneFlag=!0,this.trigger("done",this,t))}}function e(e){t.call(this,e);var i=this;jQuery(e.get(0).ownerDocument).on("click",e.selector,function(t){i.done(e)})}function i(e){t.call(this,e);var i=this;e.click(function(t){(!e.is("a")||e.attr("href").startsWith("#")||e.attr("href").startsWith("javascript:")||e.hasClass("thickbox"))&&i.done(e)}),this.setup=function(){if(e.is("a")){var t=e.attr("href");this.originalHref=t,t.startsWith("#")||(-1==t.indexOf("?")?t+="?":t+="&",t=t+"ngg_wizard="+this.currentWizard+"&ngg_wizard_step="+this.currentStep,e.attr("href",t))}},this.reset=function(){this.originalHref&&e.is("a")&&e.attr("href",this.originalHref)}}function n(e){t.call(this,e);var i=this;e.on("input",function(t){jQuery(this).val().length>=3&&i.done(e)}),this.setup=function(){}}function r(e){t.call(this,e);var i=this;jQuery(e.get(0).ownerDocument).on("change",e.selector,function(t){jQuery(this).is(":checked")&&i.done(e)}),this.setup=function(){}}function a(e){t.call(this,e);var i=this;e.on("change",function(t){i.done(e)})}"undefined"!=typeof NextGEN_Wizard_Manager_State&&(this.state=NextGEN_Wizard_Manager_State);var o=this;jQuery(window.top.document).find("body").on("nextgen_event",function(t,e){o.nggEvents.push({type:e})}),_.extend(t.prototype,Backbone.Events),_.extend(e.prototype,t.prototype),_.extend(i.prototype,t.prototype),_.extend(n.prototype,t.prototype),_.extend(r.prototype,t.prototype),_.extend(a.prototype,t.prototype);var s=null;s={handler:a,name:"SelectView",selector:"select"},this.views.push(s),s={handler:r,name:"RadioView",selector:"input[type='radio']"},this.views.push(s),s={handler:n,name:"TextView",selector:"input[type='text'], input[type='search'], input[type='email'], input[type='tel'], input[type='number'], input[type='username'], input[type='password'], textarea"},this.views.push(s),s={handler:i,name:"ButtonView",selector:"a, input[type='button'], input[type='submit']"},this.views.push(s),s={handler:e,name:"GenericView",selector:"*"},this.views.push(s),Tourist.Tip.Base.prototype.nextButtonTemplate='<a class="button-primary pull-right tour-next">Next step →</a>',Tourist.Tip.Base.prototype.finalButtonTemplate='<button class="button-primary pull-right tour-next">Finish up</button>',Tourist.Tip.Base.prototype.closeButtonTemplate='<a class="btn btn-close tour-close" href="#"><i class="icon icon-remove far fa-window-close"></i></a>',Tourist.Tip.BootstrapTip.prototype._getTargetBounds=function(t){var e,i;e=t[0],i="function"==typeof e.getBoundingClientRect?e.getBoundingClientRect():{width:e.offsetWidth,height:e.offsetHeight};var n=t.offset();if(t.ownerDocument!=document)for(var r=function(t,e){for(var i=t.find("iframe"),n=[],a=0;a<i.size();a++){var o=jQuery(i.get(a));try{if(o.prop("contentWindow").document==e)return[o]}catch(t){continue}var s=r(o.contents(),e);if(s.length>0){n.push(o);for(var u=0;u<s.length;u++)n.push(s[u]);break}}return n},a=r(jQuery(document),t.get(0).ownerDocument),o=0;o<a.length;o++){var s=a[o],u=s.offset();n.left+=u.left,n.top+=u.top}return jQuery.extend({},i,n)},jQuery(".ngg-wizard-invoker").on("click",function(t){t.preventDefault();for(var e=NextGEN_Wizard_Manager,i=jQuery(this).data("ngg-wizard"),n=null,r=0;r<e.wizards.length;r++){var a=e.wizards[r];if(a.id==i){n=a;break}}return null!=n&&null==this.runningWizard&&n.start(),!1})},bind:function(t,e){t in this.events||(this.events[t]=[]);var i={handler:e};this.events[t].push(i)},trigger:function(t,e){if(void 0===e&&(e={}),t in this.events)for(var i=this.events[t],n=0;n<i.length;n++){var r=i[n];r.handler&&r.handler(this,e)}},didNextgenEventFire:function(t){for(var e=0;e<this.nggEvents.length;e++){if(this.nggEvents[e].type==t)return!0}return!1},getViewForSelector:function(t,e){var i=null;void 0===e&&(e=!0);for(var n=0;n<this.views.length;n++){var r=this.views[n];if(t.is(r.selector)){i=r.handler;break}}if(null!=i){var r=new i(t);return e&&r.init(),r}return null},getViewFor:function(t,e,i){var n=this.getViewForSelector(t,!1);return null!=n&&(n.currentWizard=e,n.currentStep=i,n.init()),n},generateQueue:function(t){var e=this,i=this.state,n=i.wizard_list.length,r=i.starter,a=i.running_wizard;if(n>0){var o=t('<div id="ngg-wizard-starter" class="ngg-wizard-starter"></div>');o.append('<div class="starter-wrap-top"><div class="starter-wrap-icon"><img class="starter-icon" src="'+r.image+'" /></div></div>'),o.append('<div class="starter-wrap-bottom"><div class="starter-wrap-text">'+r.text+"</div></div>"),o.on("click",".starter-wrap-icon, starter-wrap-bottom",function(){e.startQueue()}),o.hide(),o.appendTo("body"),this.starter=o;var s=t('<div id="ngg-wizard-anchor" class="ngg-wizard-anchor"></div>');s.appendTo("body"),this.anchor=s;for(var u=0,l=0;l<n;l++){var d=i.wizard_list[l],h=new NextGEN_Wizard(d.id,this);h.data=d,h.steps=d.steps;var c=this.generateTour(h);"ok"==c.result?(h.status="ready",h.tour=c.tour):"wait_element"==c.result&&(h.status="wait",u++),h.id==a?(this.wizards.unshift(h),this.runningWizard=h):this.wizards.push(h)}u>0?this.enqueueRefreshOperation():this.trigger("ready")}},getContextObject:function(t){var e=null;if(null!=t){"object"!=typeof t&&(t=[t]);for(var i=0;i<t.length;i++){var n=t[i];if(e=null==e?jQuery(n):e.find(n),e.is("iframe")){var r=e.prop("contentWindow");if("interactive"!=r.document.readyState&&"complete"!=r.document.readyState){e=jQuery([]);break}e=r.jQuery?r.jQuery("body"):e.contents().find("body")}}0==e.size()&&(e=jQuery([]))}else e=jQuery(document);return e},computeStepTarget:function(t,e,i){var n=e.target_wait,r=e.target,a=e.view,o=null,s=null,u=null,l=this.getContextObject(e.context),d=!1;if(null!=r){if(o=l.find(r),o.size()>0?d=!0:o=this.anchor,!d&&null!=n&&Math.floor(Date.now()/1e3)-t.created<=n)return!1}else o=this.anchor;return null!=a&&(s=l.find(a),s.size()>0&&(u=this.getViewFor(s,t.id,e.id))),i.highlightTarget=d,i.nextButton=!d||e.optional,i.target=o,i.ngg_view=u,!0},scrollIntoView:function(t){},generateTour:function(t){if(null==t.tour){var e=t.data,i=e.steps,n=e.current_step,r=0,a=[],o=null;if(null!=e.view&&null==(o=this.getViewFor(jQuery(e.view),t.id)))return{result:"wait_element",element:e.view};for(var s=0;s<i.length;s++){var u=i[s];null!=n&&n==u.id&&(r=s);var l={ngg_step_id:u.id,ngg_step_data:u,viewport:jQuery(window),closeButton:!0,content:'<div class="ngg-wizard-text">'+u.text+"</div>",my:u.popup_anchor,at:u.target_anchor,bind:["onDone"],onDone:function(t,e,i,n){var r=t.ngg_wizard,a=this.ngg_step_data,o=!0;if(null!=a.condition&&(this.condition_met||(o=!1,this.condition_setup||this.setupCondition(t,e))),o&&null!=r){var s=r.getNextStep(this.ngg_step_id);if(null!=s&&s.lazy){o=!1;for(var u=null,l=0;l<t.options.steps.length;l++){var d=t.options.steps[l];if(d.ngg_step_id==s.id){u=d;break}}null!=u&&(null==u.target||0==u.target.size()||"ngg-wizard-anchor"==u.target.attr("id")?!(o=r.manager.computeStepTarget(r,s,u))||null!=u.target&&0!=u.target.size()&&"ngg-wizard-anchor"!=u.target.attr("id")||(o=!1):o=!0)}}if(o)t.next();else{null!=this.lazyTimeout&&(clearTimeout(this.lazyTimeout),this.lazyTimeout=null);var h=this;this.lazyTimeout=setTimeout(function(){h.lazyTimeout=null,h.onDone(t,e,i,n)},500)}}};if(!this.computeStepTarget(t,u,l))return{result:"wait_element",element:u.target};l.setupCondition=function(t,e){var i=t.ngg_wizard,n=this.ngg_step_data;if(!this.condition_setup&&null!=n.condition){var r=n.condition,a=r.type,o=r.value,s=r.context,u=r.timeout;this.condition_met=!1,this.condition_setup=!1,s&&"object"!=typeof s&&(s=[s]);var l=jQuery([]);if(s){s=s.slice(0);var d=s.pop();l=i.manager.getContextObject(s).find(d)}if(l.size()>0){var h=l.get(0).ownerDocument;h.defaultView||h.parentWindow}switch(a){case"frame_event":if(window.Frame_Event_Publisher){this.condition_setup=!0;var c=this;Frame_Event_Publisher.listen_for(o,function(){c.condition_met=!0})}break;case"event_bind":case"plupload_bind":var p=l.size()>0;if("plupload_bind"==a&&(void 0!==l.pluploadQueue?l=l.pluploadQueue():p=!1),p){this.condition_setup=!0;var c=this;l.bind(o,function(){c.condition_met=!0})}break;case"nextgen_event":if(this.condition_setup=!0,i.manager.didNextgenEventFire(o))this.condition_met=!0;else{var c=this;jQuery(window.top.document).find("body").bind("nextgen_event",function(t,e){e==o&&(c.condition_met=!0)})}break;case"wait":this.condition_setup=!0;var c=this;setTimeout(function(){c.condition_met=!0},o)}}var g=jQuery(".tourist-popover .ngg-wizard-text"),f=g.find(".ngg-wizard-loading");if(f.hide(),this.condition_setup&&!this.condition_met&&u>0){this.condition_timeout=0,0==f.length&&(f=jQuery('<div class="ngg-wizard-loading"></div>'),g.append(f)),f.html("Loading... ("+Math.ceil(u/1e3).toString()+")"),f.show();var c=this;c.condition_timer=setInterval(function(){c.condition_timeout+=1e3,c.condition_timeout>=u&&(c.condition_met=!0);var t=(Math.floor(c.condition_timeout/1e3),Math.ceil(u/1e3),Math.floor((u-c.condition_timeout)/1e3));f.html("Loading... ("+t.toString()+")"),c.condition_met&&(f.hide(),clearInterval(c.condition_timer),c.condition_timer=null)},1e3)}return this.condition_setup},l.setup=function(t,e){var i=e.view;null!=this.ngg_view&&(i=this.ngg_view),null!=i&&(i.currentWizard=t.ngg_wizard_id,i.currentStep=this.ngg_step_id,i.setup(),i.bind("done",this.onDone),i.enable())},l.teardown=function(t,e){var i=e.view;null!=this.ngg_view&&(i=this.ngg_view),null!=i&&(i.disable(),i.unbind("done",this.onDone),i.reset())},a.push(l)}var d={steps:a,tipClass:"Bootstrap",tipOptions:{showEffect:"slidein"},stepOptions:{}};null!=o&&(d.stepOptions.view=o);var h=new Tourist.Tour(d);for(h.ngg_wizard_id=t.id,h.ngg_wizard=t;r>0;)h.next(),r--;return{result:"ok",tour:h}}},enqueueRefreshOperation:function(){null!=this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null),this.refreshTimer=setTimeout(function(t){NextGEN_Wizard_Manager.refreshQueue()},500)},refreshQueue:function(){this.refreshTimer=null;for(var t=0,e=0;e<this.wizards.length;e++){var i=this.wizards[e];if("wait"==i.status){var n=this.generateTour(i);"ok"==n.result?(i.status="ready",i.tour=n.tour):"wait_element"==n.result&&(i.status="wait",t++)}}t>0?this.enqueueRefreshOperation():this.trigger("ready")},start:function(){null!=this.runningWizard?this.runningWizard.start():this.showStarter()},showStarter:function(){},startQueue:function(){if(null!=this.starter){var t=this;this.starter.fadeOut(function(){t.nextTour()})}else this.nextTour()},nextTour:function(){for(var t=0,e=0;e<this.wizards.length;e++){var i=this.wizards[e];if("ready"==i.status&&null!=i.tour){t=e;break}}if(t<this.wizards.length){var i=this.wizards[t];i.tour.start()}},updateWizardState:function(t){}};manager.init(),window.NextGEN_Wizard_Manager=manager}jQuery(function(t){"undefined"!=typeof NextGEN_Wizard_Manager&&(NextGEN_Wizard_Manager.bind("ready",function(){NextGEN_Wizard_Manager.start()}),NextGEN_Wizard_Manager.generateQueue(t))}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/ngg_progressbar.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/ngg_progressbar.min.css index b34cb659e..5f0e13338 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/ngg_progressbar.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/ngg_progressbar.min.css @@ -1 +1 @@ -.ngg_progressbar{width:100%;background:#292929;border:1px solid #111;border-radius:5px;overflow:hidden;box-shadow:0 0 5px #333;height:25px}.ngg_progressbar div{width:0%;text-align:right;color:#fff;background-image:url(animation.gif);border:solid 1px #556b2f;overflow:hidden;border-radius:5px;height:100%;font-size:12px;padding-top:3px;font-family:Helvetica,Arial}.ngg_progressbar.infinite div{width:100%;text-align:center} \ No newline at end of file +.ngg_progressbar{width:100%;background:#292929;border:1px solid #111;border-radius:5px;overflow:hidden;box-shadow:0 0 5px #333;height:25px}.ngg_progressbar div{width:0%;text-align:right;color:#fff;background-image:url(animation.gif);border:1px solid #556b2f;overflow:hidden;border-radius:5px;height:100%;font-size:12px;padding-top:3px;font-family:Helvetica,Arial}.ngg_progressbar.infinite div{width:100%;text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/select2/select2.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/select2/select2.min.css index 120d36c9d..e627ad29f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/select2/select2.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/select2/select2.min.css @@ -1 +1 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--classic .select2-results>.select2-results__options,.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #000;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:4px 0 0 4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.css index 4b65b6fa8..b1dcd2f93 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.css @@ -10,6 +10,7 @@ /* bootstrap styles */ .tourist-popover { padding: 0; + z-index: 999999 !important; } .tourist-popover .popover-content { padding: 10px 0 0 0; @@ -37,7 +38,7 @@ background: #f5f5f5; border-radius: 0px 0px 6px 6px; box-sizing: content-box; - background: #2a343d; + background: #103149; padding: 15px 20px 17px; border-top: 3px solid #9fbb1a; } @@ -47,6 +48,7 @@ text-shadow: none; border: none; padding: 1px 20px; + float:right; } .tourist-popover .button-primary:hover { background-color: #A9C524; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.min.css index f8dfd8ded..fa136a7a6 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/static/tourist/tourist.min.css @@ -1 +1 @@ -.tour-highlight{background:0 0;-moz-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);-webkit-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);-o-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);box-shadow:0 0 7px 0 rgba(0,241,255,.701961);border-radius:2px}.tourist-popover{padding:0}.tourist-popover .popover-content{padding:10px 0 0 0;min-width:200px}.tourist-popover .popover-content p{margin:0 8px 10px 8px}.tourist-popover .popover-content .action-label{background:rgba(0,111,255,.168627);font-size:14px;padding:3px 10px}.tourist-popover .popover-content .tour-counter{margin:0;padding:0;position:absolute;left:20px;bottom:23px;font-size:11px;color:#acacac;color:#fff}.tourist-popover .tour-buttons{min-height:28px;background:#f5f5f5;border-radius:0 0 6px 6px;box-sizing:content-box;background:#2a343d;padding:15px 20px 17px;border-top:3px solid #9fbb1a}.tourist-popover .button-primary{background-color:#9fbb1a;box-shadow:none;text-shadow:none;border:none;padding:1px 20px}.tourist-popover .button-primary:hover{background-color:#a9c524}.tourist-popover .btn-close{background:0 0;border:none;position:absolute;top:4px;right:7px;padding:0;opacity:.3}.tourist-popover .btn-close:hover{opacity:.5}.tourist-popover.top>.arrow{border-top-color:#2a343d;overflow:hidden}.qtip-tour,.qtip-tour .qtip-content{padding:0}.qtip-tour .qtip-content{padding-top:10px}.qtip-tour .qtip-content p{margin:0 8px 10px 8px}.qtip-tour .qtip-content .action-label{background:rgba(0,111,255,.168627);font-size:14px;padding:3px 10px}.qtip-tour .qtip-content .tour-counter{font-size:11px;color:#acacac}.qtip-tour .tour-buttons{padding:8px 10px;min-height:28px;background:#f5f5f5;border-radius:0 0 6px 6px;box-sizing:content-box} \ No newline at end of file +.tour-highlight{background:0 0;-moz-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);-webkit-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);-o-box-shadow:0 0 7px 0 rgba(0,241,255,.701961);box-shadow:0 0 7px 0 rgba(0,241,255,.701961);border-radius:2px}.tourist-popover{padding:0;z-index:999999!important}.tourist-popover .popover-content{padding:10px 0 0;min-width:200px}.tourist-popover .popover-content p{margin:0 8px 10px}.tourist-popover .popover-content .action-label{background:rgba(0,111,255,.168627);font-size:14px;padding:3px 10px}.tourist-popover .popover-content .tour-counter{margin:0;padding:0;position:absolute;left:20px;bottom:23px;font-size:11px;color:#fff}.tourist-popover .tour-buttons{min-height:28px;border-radius:0 0 6px 6px;box-sizing:content-box;background:#103149;padding:15px 20px 17px;border-top:3px solid #9fbb1a}.tourist-popover .button-primary{background-color:#9fbb1a;box-shadow:none;text-shadow:none;border:none;padding:1px 20px;float:right}.tourist-popover .button-primary:hover{background-color:#A9C524}.tourist-popover .btn-close{background:0 0;border:none;position:absolute;top:4px;right:7px;padding:0;opacity:.3}.tourist-popover .btn-close:hover{opacity:.5}.tourist-popover.top>.arrow{border-top-color:#2a343d;overflow:hidden}.qtip-tour,.qtip-tour .qtip-content{padding:0}.qtip-tour .qtip-content{padding-top:10px}.qtip-tour .qtip-content p{margin:0 8px 10px}.qtip-tour .qtip-content .action-label{background:rgba(0,111,255,.168627);font-size:14px;padding:3px 10px}.qtip-tour .qtip-content .tour-counter{font-size:11px;color:#acacac}.qtip-tour .tour-buttons{padding:8px 10px;min-height:28px;background:#f5f5f5;border-radius:0 0 6px 6px;box-sizing:content-box} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/templates/requirement_notice.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/templates/requirement_notice.php new file mode 100644 index 000000000..13e32a0c5 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_admin/templates/requirement_notice.php @@ -0,0 +1,6 @@ +<div data-notification-name="<?php echo esc_attr($notice_name); ?>" class="ngg_admin_notice <?php echo esc_attr($css_class); ?>"> + <?php echo $html; ?> + <?php if ($show_dismiss_button) { ?> + <p><a class='dismiss' href="#"><?php esc_html_e(__('Dismiss', 'nggallery')) ?></a></p> + <?php } ?> +</div> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php index c5cb0ff01..ffac67592 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/module.nextgen_basic_album.php @@ -9,6 +9,7 @@ define('NGG_BASIC_COMPACT_ALBUM', 'photocrati-nextgen_basic_compact_album'); define('NGG_BASIC_EXTENDED_ALBUM', 'photocrati-nextgen_basic_extended_album'); +define('NGG_BASIC_ALBUM', 'photocrati-nextgen_basic_album'); class M_NextGen_Basic_Album extends C_Base_Module { @@ -22,10 +23,10 @@ class M_NextGen_Basic_Album extends C_Base_Module $context = FALSE) { parent::define( - 'photocrati-nextgen_basic_album', + NGG_BASIC_ALBUM, 'NextGEN Basic Album', "Provides support for NextGEN's Basic Album", - '3.0.0', + '3.0.0.5', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -123,6 +124,10 @@ class M_NextGen_Basic_Album extends C_Base_Module } add_filter('ngg_atp_show_display_type', array($this, 'atp_show_basic_albums'), 10, 2); + + add_filter('ngg_' . NGG_BASIC_COMPACT_ALBUM . '_template_dirs', array($this, 'filter_compact_view_dir')); + + add_filter('ngg_' . NGG_BASIC_EXTENDED_ALBUM . '_template_dirs', array($this, 'filter_extended_view_dir')); } /** @@ -187,6 +192,19 @@ class M_NextGen_Basic_Album extends C_Base_Module 'Mixin_Nextgen_Basic_Album_Form' => 'mixin.nextgen_basic_album_form.php' ); } + + function filter_compact_view_dir($dirs) + { + $dirs['default'] = C_Component_Registry::get_instance()->get_module_dir(NGG_BASIC_ALBUM) . DIRECTORY_SEPARATOR . 'templates/compact'; + return $dirs; + } + + function filter_extended_view_dir($dirs) + { + $dirs['default'] = C_Component_Registry::get_instance()->get_module_dir(NGG_BASIC_ALBUM) . DIRECTORY_SEPARATOR . 'templates/extended'; + return $dirs; + } + } class C_NextGen_Basic_Album_Installer extends C_Gallery_Display_Installer @@ -196,6 +214,7 @@ class C_NextGen_Basic_Album_Installer extends C_Gallery_Display_Installer $this->install_display_type( NGG_BASIC_COMPACT_ALBUM, array( 'title' => __('NextGEN Basic Compact Album', 'nggallery'), + 'module_id' => NGG_BASIC_ALBUM, 'entity_types' => array('album', 'gallery'), 'preview_image_relpath' => 'photocrati-nextgen_basic_album#compact_preview.jpg', 'default_source' => 'albums', @@ -211,6 +230,7 @@ class C_NextGen_Basic_Album_Installer extends C_Gallery_Display_Installer $this->install_display_type( NGG_BASIC_EXTENDED_ALBUM, array( 'title' => __('NextGEN Basic Extended Album', 'nggallery'), + 'module_id' => NGG_BASIC_ALBUM, 'entity_types' => array('album', 'gallery'), 'preview_image_relpath' => 'photocrati-nextgen_basic_album#extended_preview.jpg', 'default_source' => 'albums', diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php index 994adf28f..aa0832139 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/package.module.nextgen_basic_album.php @@ -221,7 +221,7 @@ class A_NextGen_Album_Child_Entities extends Mixin * Register each gallery belonging to the album that has just been rendered, so that when the MVC controller * system 'catches up' and runs $this->render_object() that method knows what galleries to inline as JS. * - * @param array $gallery + * @param array $galleries * @param $displayed_gallery * @return array mixed */ @@ -415,8 +415,9 @@ class A_NextGen_Basic_Album_Controller extends Mixin_NextGen_Basic_Pagination /** * Renders the front-end for the NextGen Basic Album display type * - * @param $displayed_gallery + * @param C_Displayed_Gallery $displayed_gallery * @param bool $return + * @return string */ function index_action($displayed_gallery, $return = FALSE) { @@ -537,7 +538,7 @@ class A_NextGen_Basic_Album_Controller extends Mixin_NextGen_Basic_Pagination * * @param $gallery * @param $display_settings - * @return $gallery + * @return C_Displayed_Gallery */ function make_child_displayed_gallery($gallery, $display_settings) { @@ -578,7 +579,7 @@ class A_NextGen_Basic_Album_Controller extends Mixin_NextGen_Basic_Pagination /** * Gets the parent album for the entity being displayed * @param int $entity_id - * @return stdClass (album) + * @return null|object Album object */ function get_parent_album_for($entity_id) { @@ -690,12 +691,12 @@ class A_NextGen_Basic_Album_Controller extends Mixin_NextGen_Basic_Pagination function enqueue_frontend_resources($displayed_gallery) { $this->call_parent('enqueue_frontend_resources', $displayed_gallery); - wp_enqueue_style('nextgen_basic_album_style', $this->object->get_static_url('photocrati-nextgen_basic_album#nextgen_basic_album.css'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_album_style', $this->object->get_static_url('photocrati-nextgen_basic_album#nextgen_basic_album.css'), array(), NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'), array(), NGG_SCRIPT_VERSION); wp_enqueue_script('jquery.dotdotdot', $this->object->get_static_url('photocrati-nextgen_basic_album#jquery.dotdotdot-1.5.7-packed.js'), array('jquery'), NGG_SCRIPT_VERSION); $ds = $displayed_gallery->display_settings; if (!empty($ds['enable_breadcrumbs']) && $ds['enable_breadcrumbs'] || !empty($ds['original_settings']['enable_breadcrumbs']) && $ds['original_settings']['enable_breadcrumbs']) { - wp_enqueue_style('nextgen_basic_album_breadcrumbs_style', $this->object->get_static_url('photocrati-nextgen_basic_album#breadcrumbs.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_album_breadcrumbs_style', $this->object->get_static_url('photocrati-nextgen_basic_album#breadcrumbs.css'), array(), NGG_SCRIPT_VERSION); } $this->enqueue_ngg_styles(); } @@ -713,20 +714,27 @@ class A_NextGen_Basic_Album_Mapper extends Mixin if (isset($entity->name) && in_array($entity->name, array(NGG_BASIC_COMPACT_ALBUM, NGG_BASIC_EXTENDED_ALBUM))) { // Set defaults for both display (album) types $settings = C_NextGen_Settings::get_instance(); + $default_template = isset($entity->settings["template"]) ? 'default' : 'default-view.php'; + $this->object->_set_default_value($entity, 'settings', 'display_view', $default_template); $this->object->_set_default_value($entity, 'settings', 'galleries_per_page', $settings->galPagedGalleries); $this->object->_set_default_value($entity, 'settings', 'enable_breadcrumbs', 1); $this->object->_set_default_value($entity, 'settings', 'disable_pagination', 0); $this->object->_set_default_value($entity, 'settings', 'enable_descriptions', 0); $this->object->_set_default_value($entity, 'settings', 'template', ''); $this->object->_set_default_value($entity, 'settings', 'open_gallery_in_lightbox', 0); + $this->_set_default_value($entity, 'settings', 'override_thumbnail_settings', 1); + $this->_set_default_value($entity, 'settings', 'thumbnail_quality', $settings->thumbquality); + $this->_set_default_value($entity, 'settings', 'thumbnail_crop', 1); + $this->_set_default_value($entity, 'settings', 'thumbnail_watermark', 0); + // Thumbnail dimensions -- only used by extended albums + if ($entity->name == NGG_BASIC_COMPACT_ALBUM) { + $this->_set_default_value($entity, 'settings', 'thumbnail_width', 240); + $this->_set_default_value($entity, 'settings', 'thumbnail_height', 160); + } // Thumbnail dimensions -- only used by extended albums if ($entity->name == NGG_BASIC_EXTENDED_ALBUM) { - $this->_set_default_value($entity, 'settings', 'override_thumbnail_settings', 0); - $this->_set_default_value($entity, 'settings', 'thumbnail_width', $settings->thumbwidth); - $this->_set_default_value($entity, 'settings', 'thumbnail_height', $settings->thumbheight); - $this->_set_default_value($entity, 'settings', 'thumbnail_quality', $settings->thumbquality); - $this->_set_default_value($entity, 'settings', 'thumbnail_crop', $settings->thumbfix); - $this->_set_default_value($entity, 'settings', 'thumbnail_watermark', 0); + $this->_set_default_value($entity, 'settings', 'thumbnail_width', 300); + $this->_set_default_value($entity, 'settings', 'thumbnail_height', 200); } if (defined('NGG_BASIC_THUMBNAILS')) { $this->object->_set_default_value($entity, 'settings', 'gallery_display_type', NGG_BASIC_THUMBNAILS); @@ -824,11 +832,12 @@ class Mixin_NextGen_Basic_Album_Form extends Mixin_Display_Type_Form { function _get_field_names() { - return array('nextgen_basic_album_gallery_display_type', 'nextgen_basic_album_galleries_per_page', 'nextgen_basic_album_enable_breadcrumbs', 'nextgen_basic_templates_template', 'nextgen_basic_album_enable_descriptions'); + return array('nextgen_basic_album_gallery_display_type', 'nextgen_basic_album_galleries_per_page', 'nextgen_basic_album_enable_breadcrumbs', 'display_view', 'nextgen_basic_templates_template', 'nextgen_basic_album_enable_descriptions'); } /** * Renders the Gallery Display Type field * @param C_Display_Type $display_type + * @return string */ function _render_nextgen_basic_album_gallery_display_type_field($display_type) { @@ -845,6 +854,7 @@ class Mixin_NextGen_Basic_Album_Form extends Mixin_Display_Type_Form /** * Renders the Galleries Per Page field * @param C_Display_Type $display_type + * @return string */ function _render_nextgen_basic_album_galleries_per_page_field($display_type) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.css index 9d7d5049d..ae0a61efa 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.css @@ -3,6 +3,10 @@ overflow: hidden; margin: 0; padding: .5em 0 .5em 0; + margin-left: 0 !important; + text-transform: uppercase; + font-size: 14px; + margin: 30px 0 30px !important; } ul.ngg-breadcrumbs > li { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.min.css index a09fc2067..e7ccd43f3 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/breadcrumbs.min.css @@ -1 +1 @@ -.ngg-breadcrumbs{list-style:none;overflow:hidden;margin:0;padding:.5em 0 .5em 0}ul.ngg-breadcrumbs>li{float:left;padding:0 .3em 0 .15em;margin:0;vertical-align:middle;border:none;list-style-type:none}.ngg-breadcrumbs .ngg-breadcrumb-divisor{margin:0;padding:0 0 0 .15em} \ No newline at end of file +.ngg-breadcrumbs{list-style:none;overflow:hidden;padding:.5em 0;text-transform:uppercase;font-size:14px;margin:30px 0!important}ul.ngg-breadcrumbs>li{float:left;padding:0 .3em 0 .15em;margin:0;vertical-align:middle;border:none;list-style-type:none}.ngg-breadcrumbs .ngg-breadcrumb-divisor{margin:0;padding:0 0 0 .15em} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css index a9ee2c884..f18b92389 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.css @@ -5,6 +5,8 @@ width: 100%; clear: both; display: block !important; + margin-top: 40px; + margin-bottom: 50px; } .ngg-album { @@ -45,6 +47,7 @@ text-align: left; } + /* ----------- Album Styles Compact -------------*/ .ngg-album-compact { @@ -120,4 +123,126 @@ .ngg-clear { clear: both; float: none; +} + +/* ----------- Extended Album - Updated Default Template -------------*/ + +.ngg-albumoverview.default-view .ngg-album { + border: 1px solid rgba(150,150,150,.4); + margin-bottom: 15px; + padding: 40px 36px 30px; +} + +.ngg-albumoverview.default-view .ngg-albumtitle { + font-size: 17px; + text-transform: uppercase; +} + +.ngg-albumoverview.default-view .ngg-thumbnail { + margin-right: 20px; +} + +.ngg-albumoverview.default-view .ngg-thumbnail img { + background: transparent; + border: 1px solid rgba(150,150,150,.1); + padding: 0px; + margin: 0; +} + +.ngg-albumoverview.default-view .ngg-thumbnail img:hover { + background-color: transparent; +} + +.ngg-albumoverview.default-view .ngg-description, +.ngg-albumoverview.default-view .ngg-description p { + font-size: 15px; + margin: 0 0 10px; +} + +.ngg-albumoverview.default-view p.ngg-album-gallery-image-counter { + display: none; +} + +@media (max-width: 960px) { + .ngg-albumoverview.default-view .ngg-albumtitle { + font-size: 16px; + } + .ngg-albumoverview.default-view .ngg-description, + .ngg-albumoverview.default-view .ngg-description p { + font-size: 14px; + } +} + +@media (max-width: 800px) { + .ngg-albumoverview.default-view .ngg-album { + padding: 22px 20px 14px; + } + .ngg-albumoverview.default-view .ngg-thumbnail img { + max-width: 240px; + } + .ngg-albumoverview.default-view .ngg-albumtitle { + font-size: 15px; + } + .ngg-albumoverview.default-view .ngg-description, + .ngg-albumoverview.default-view .ngg-description p { + font-size: 13px; + } + +} + +@media (max-width: 600px) { + .ngg-albumoverview.default-view .ngg-album { + padding: 40px 36px 30px; + } + .ngg-albumoverview.default-view .ngg-album, + .ngg-albumoverview.default-view .ngg-albumtitle, + .ngg-albumoverview.default-view .ngg-description { + text-align: center; + } + .ngg-albumoverview.default-view .ngg-thumbnail { + float:none; + margin-right: 0; + margin-bottom: 20px; + } + .ngg-albumoverview.default-view .ngg-thumbnail img { + max-width: 100%; + } +} + +/* ----------- Compact Album - Updated Default Template -------------*/ + +.ngg-albumoverview.default-view { + text-align: center; +} + +.ngg-albumoverview.default-view .ngg-album-compact { + text-align: center; + margin: 0 10px 10px 0 !important; + padding: 10px !important; + border: 1px solid rgba(150,150,150,.3); + box-shadow: 0 0 4px 2px rgba(150,150,150,.1); + float: none; + display: inline-block; +} + +.ngg-albumoverview.default-view .ngg-album-compactbox, +.ngg-albumoverview.default-view .ngg-album-compactbox .Thumb { + border: none !important; +} + +.ngg-albumoverview.default-view .ngg-album-compactbox:before, +.ngg-albumoverview.default-view .ngg-album-compactbox:after, +.ngg-albumoverview.default-view p.ngg-album-gallery-image-counter { + display: none; +} + +.ngg-albumoverview.default-view .ngg-album-compact h4 { + padding: 0; +} + + +.ngg-albumoverview.default-view .ngg-album-compact h4 .ngg-album-desc { + font-size: 14px; + letter-spacing: 1.4px; + box-shadow: none; } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.min.css index 592e59dce..06595ad44 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/static/nextgen_basic_album.min.css @@ -1 +1 @@ -.ngg-albumoverview{margin-top:10px;width:100%;clear:both;display:block!important}.ngg-album{height:100%;overflow:hidden;padding:5px;margin-bottom:5px;border:1px solid #ccc}.ngg-albumtitle{text-align:left;font-weight:700;margin:0;padding:0;font-size:1.4em;margin-bottom:10px}.ngg-thumbnail{float:left;margin-right:12px}.ngg-thumbnail img{background-color:#fff;border:1px solid #a9a9a9;margin:4px 0 4px 5px;padding:4px;position:relative}.ngg-thumbnail img:hover{background-color:#a9a9a9}.ngg-description{text-align:left}.ngg-album-compact{float:left;padding:0 12px 4px 0!important;margin:0!important;text-align:left}.ngg-album-compact a{border:none}.ngg-album-compactbox{margin:0!important;padding:8px!important;box-sizing:border-box;-moz-box-sizing:border-box;position:relative;border:1px solid gray;border-radius:6px;z-index:1}.ngg-album-compactbox:before{content:' ';position:absolute;top:0;left:0;right:0;bottom:-7px;border-bottom:1px solid gray;border-radius:6px;z-index:-1}.ngg-album-compactbox:after{content:' ';position:absolute;top:0;left:0;right:0;bottom:-4px;border-bottom:1px solid gray;border-radius:6px;z-index:-1}.ngg-album-compactbox .Thumb{margin:0!important;padding:0!important;border:1px solid #000!important}.ngg-album-compact h4{font-size:15px;font-weight:700;margin:0;margin-top:10px}.ngg-album-compact h4 .ngg-album-desc{overflow:hidden;display:block;height:54px}.ngg-album-compact p{font-size:11px;margin:0}.ngg-clear{clear:both;float:none} \ No newline at end of file +.ngg-albumtitle,.ngg-description{text-align:left}.ngg-albumoverview{width:100%;clear:both;display:block!important;margin-top:40px;margin-bottom:50px}.ngg-album{height:100%;overflow:hidden;padding:5px;margin-bottom:5px;border:1px solid #ccc}.ngg-albumtitle{font-weight:700;margin:0 0 10px;padding:0;font-size:1.4em}.ngg-thumbnail{float:left;margin-right:12px}.ngg-thumbnail img{background-color:#FFF;border:1px solid #A9A9A9;margin:4px 0 4px 5px;padding:4px;position:relative}.ngg-thumbnail img:hover{background-color:#A9A9A9}.ngg-album-compact{float:left;padding:0 12px 4px 0!important;margin:0!important;text-align:left}.ngg-album-compact a{border:none}.ngg-album-compactbox{margin:0!important;padding:8px!important;box-sizing:border-box;-moz-box-sizing:border-box;position:relative;border:1px solid gray;border-radius:6px;z-index:1}.ngg-album-compactbox:after,.ngg-album-compactbox:before{content:' ';position:absolute;top:0;left:0;right:0;border-bottom:1px solid gray;border-radius:6px;z-index:-1}.ngg-album-compactbox:before{bottom:-7px}.ngg-album-compactbox:after{bottom:-4px}.ngg-album-compactbox .Thumb{margin:0!important;padding:0!important;border:1px solid #000!important}.ngg-album-compact h4{font-size:15px;font-weight:700;margin:10px 0 0}.ngg-album-compact h4 .ngg-album-desc{overflow:hidden;display:block;height:54px}.ngg-album-compact p{font-size:11px;margin:0}.ngg-clear{clear:both;float:none}.ngg-albumoverview.default-view .ngg-album{border:1px solid rgba(150,150,150,.4);margin-bottom:15px;padding:40px 36px 30px}.ngg-albumoverview.default-view .ngg-albumtitle{font-size:17px;text-transform:uppercase}.ngg-albumoverview.default-view .ngg-thumbnail{margin-right:20px}.ngg-albumoverview.default-view .ngg-thumbnail img{background:0 0;border:1px solid rgba(150,150,150,.1);padding:0;margin:0}.ngg-albumoverview.default-view .ngg-thumbnail img:hover{background-color:transparent}.ngg-albumoverview.default-view .ngg-description,.ngg-albumoverview.default-view .ngg-description p{font-size:15px;margin:0 0 10px}.ngg-albumoverview.default-view p.ngg-album-gallery-image-counter{display:none}@media (max-width:960px){.ngg-albumoverview.default-view .ngg-albumtitle{font-size:16px}.ngg-albumoverview.default-view .ngg-description,.ngg-albumoverview.default-view .ngg-description p{font-size:14px}}@media (max-width:800px){.ngg-albumoverview.default-view .ngg-album{padding:22px 20px 14px}.ngg-albumoverview.default-view .ngg-thumbnail img{max-width:240px}.ngg-albumoverview.default-view .ngg-albumtitle{font-size:15px}.ngg-albumoverview.default-view .ngg-description,.ngg-albumoverview.default-view .ngg-description p{font-size:13px}}@media (max-width:600px){.ngg-albumoverview.default-view .ngg-album{padding:40px 36px 30px}.ngg-albumoverview.default-view .ngg-album,.ngg-albumoverview.default-view .ngg-albumtitle,.ngg-albumoverview.default-view .ngg-description{text-align:center}.ngg-albumoverview.default-view .ngg-thumbnail{float:none;margin-right:0;margin-bottom:20px}.ngg-albumoverview.default-view .ngg-thumbnail img{max-width:100%}}.ngg-albumoverview.default-view{text-align:center}.ngg-albumoverview.default-view .ngg-album-compact{text-align:center;margin:0 10px 10px 0!important;padding:10px!important;border:1px solid rgba(150,150,150,.3);box-shadow:0 0 4px 2px rgba(150,150,150,.1);float:none;display:inline-block}.ngg-albumoverview.default-view .ngg-album-compactbox,.ngg-albumoverview.default-view .ngg-album-compactbox .Thumb{border:none!important}.ngg-albumoverview.default-view .ngg-album-compactbox:after,.ngg-albumoverview.default-view .ngg-album-compactbox:before,.ngg-albumoverview.default-view p.ngg-album-gallery-image-counter{display:none}.ngg-albumoverview.default-view .ngg-album-compact h4{padding:0}.ngg-albumoverview.default-view .ngg-album-compact h4 .ngg-album-desc{font-size:14px;letter-spacing:1.4px;box-shadow:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact/default-view.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact/default-view.php new file mode 100644 index 000000000..72cf4ab86 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/compact/default-view.php @@ -0,0 +1,51 @@ +<?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?> +<div class="ngg-albumoverview default-view"> + <?php + foreach ($galleries as $gallery) { + if ($open_gallery_in_lightbox && $gallery->entity_type == 'gallery') { + $anchor = $gallery->displayed_gallery->effect_code . " + href='" . nextgen_esc_url($gallery->pagelink) . "' + data-src='" . esc_attr($gallery->previewpic_fullsized_url) . "' + data-fullsize='" . esc_attr($gallery->previewpic_fullsized_url) . "' + data-thumbnail='" . esc_attr($gallery->previewurl) . "' + data-title='" . esc_attr($gallery->previewpic_image->alttext) . "' + data-description='" . esc_attr(stripslashes($gallery->previewpic_image->description)) . "' + data-image-id='" . esc_attr($gallery->previewpic) . "'"; + } else { + $anchor = "title='" . esc_attr($gallery->title) . "' + href='" . nextgen_esc_url($gallery->pagelink) . "'"; + } + ?> + <div class="ngg-album-compact"> + <div class="ngg-album-compactbox"> + <div class="ngg-album-link"> + <?php $this->start_element('nextgen_gallery.album_gallery', 'item', $gallery); ?> + <a <?php echo $anchor; ?>> + <img class="Thumb" + alt="<?php echo esc_attr($gallery->title); ?>" + src="<?php echo nextgen_esc_url($gallery->previewurl); ?>"/> + </a> + <?php $this->end_element(); ?> + </div> + </div> + <?php if (!empty($image_gen_params)) { + $max_width = 'style="max-width: ' . ($image_gen_params['width'] + 20) . 'px"'; + } else { + $max_width = ''; + } ?> + <h4> + <a class='ngg-album-desc' <?php echo $anchor; echo $max_width; ?>><?php print wp_kses($gallery->title, M_I18N::get_kses_allowed_html()); ?></a> + </h4> + <p class="ngg-album-gallery-image-counter"> + <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?> + <strong><?php echo $gallery->counter; ?></strong> <?php _e('Photos', 'nggallery'); ?> + <?php } else { ?> + + <?php } ?> + </p> + </div> + <?php } ?> + <br class="ngg-clear"/> + <?php echo $pagination ?> +</div> +<?php $this->end_element(); ?> diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended/default-view.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended/default-view.php new file mode 100644 index 000000000..8613253cd --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_album/templates/extended/default-view.php @@ -0,0 +1,39 @@ +<?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?> +<div class="ngg-albumoverview default-view"> + <?php foreach ($galleries as $gallery) { + if ($open_gallery_in_lightbox && $gallery->entity_type == 'gallery') { + $anchor = $gallery->displayed_gallery->effect_code . " + href='" . nextgen_esc_url($gallery->pagelink) . "' + data-src='" . esc_attr($gallery->previewpic_fullsized_url) . "' + data-fullsize='" . esc_attr($gallery->previewpic_fullsized_url) . "' + data-thumbnail='" . esc_attr($gallery->previewurl) . "' + data-title='" . esc_attr($gallery->previewpic_image->alttext) . "' + data-description='" . esc_attr(stripslashes($gallery->previewpic_image->description)) . "' + data-image-id='" . esc_attr($gallery->previewpic) . "'"; + } else { + $anchor = "class='gallery_link' href='" . nextgen_esc_url($gallery->pagelink) . "'"; + } ?> + <div class="ngg-album"> + <div class="ngg-albumcontent"> + <div class="ngg-thumbnail"> + <a <?php echo $anchor; ?>> + <img class="Thumb" + alt="<?php echo esc_attr($gallery->title); ?>" + src="<?php echo nextgen_esc_url($gallery->previewurl); ?>"/> + </a> + </div> + <div class="ngg-albumtitle"> + <a <?php echo $anchor; ?>><?php print wp_kses($gallery->title, M_I18N::get_kses_allowed_html()); ?></a> + </div> + <div class="ngg-description"> + <p><?php print wp_kses($gallery->galdesc, M_I18N::get_kses_allowed_html()); ?></p> + <?php if (isset($gallery->counter) && $gallery->counter > 0) { ?> + <p class="ngg-album-gallery-image-counter"><strong><?php echo $gallery->counter; ?></strong> <?php _e('Photos', 'nggallery'); ?></p> + <?php } ?> + </div> + </div> + </div> + <?php } ?> + <?php echo $pagination; ?> +</div> +<?php $this->end_element(); ?> diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php index 36b9528e0..3a07f55e0 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/module.nextgen_basic_gallery.php @@ -16,6 +16,11 @@ define( 'photocrati-nextgen_basic_slideshow' ); +define( + 'NGG_BASIC_GALLERY', + 'photocrati-nextgen_basic_gallery' +); + class M_NextGen_Basic_Gallery extends C_Base_Module { @@ -29,10 +34,10 @@ class M_NextGen_Basic_Gallery extends C_Base_Module $context = FALSE) { parent::define( - 'photocrati-nextgen_basic_gallery', + NGG_BASIC_GALLERY, 'NextGEN Basic Gallery', "Provides NextGEN Gallery's basic thumbnail/slideshow integrated gallery", - '3.0.0', + '3.0.13', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -152,6 +157,10 @@ class M_NextGen_Basic_Gallery extends C_Base_Module add_action('ngg_routes', array(&$this, 'define_routes')); add_filter('ngg_atp_show_display_type', array($this, 'atp_show_basic_galleries'), 10, 2); + + add_filter('ngg_' . NGG_BASIC_THUMBNAILS . '_template_dirs', array($this, 'filter_thumbnail_view_dir')); + + add_filter('ngg_' . NGG_BASIC_SLIDESHOW . '_template_dirs', array($this, 'filter_slideshow_view_dir')); } function define_routes($router) @@ -287,6 +296,19 @@ class M_NextGen_Basic_Gallery extends C_Base_Module $renderer = C_Displayed_Gallery_Renderer::get_instance(); return $renderer->display_images($params, $inner_content); } + + function filter_thumbnail_view_dir($dirs) + { + $dirs['default'] = C_Component_Registry::get_instance()->get_module_dir(NGG_BASIC_GALLERY) . DIRECTORY_SEPARATOR . 'templates/thumbnails'; + return $dirs; + } + + function filter_slideshow_view_dir($dirs) + { + $dirs['default'] = C_Component_Registry::get_instance()->get_module_dir(NGG_BASIC_GALLERY) . DIRECTORY_SEPARATOR . 'templates/slideshow'; + return $dirs; + } + } /** @@ -346,6 +368,7 @@ class C_NextGen_Basic_Gallery_Installer extends C_Gallery_Display_Installer $this->install_display_type(NGG_BASIC_THUMBNAILS, array( 'title' => __('NextGEN Basic Thumbnails', 'nggallery'), + 'module_id' => NGG_BASIC_GALLERY, 'entity_types' => array('image'), 'preview_image_relpath' => 'photocrati-nextgen_basic_gallery#thumb_preview.jpg', 'default_source' => 'galleries', @@ -361,6 +384,7 @@ class C_NextGen_Basic_Gallery_Installer extends C_Gallery_Display_Installer $this->install_display_type(NGG_BASIC_SLIDESHOW, array( 'title' => __('NextGEN Basic Slideshow', 'nggallery'), + 'module_id' => NGG_BASIC_GALLERY, 'entity_types' => array('image'), 'preview_image_relpath' => 'photocrati-nextgen_basic_gallery#slideshow_preview.jpg', 'default_source' => 'galleries', diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php index dead8e09a..6e4cfdfce 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/package.module.nextgen_basic_gallery.php @@ -76,20 +76,24 @@ class A_NextGen_Basic_Gallery_Mapper extends Mixin $settings = C_NextGen_Settings::get_instance(); $this->object->_set_default_value($entity, 'settings', 'gallery_width', $settings->irWidth); $this->object->_set_default_value($entity, 'settings', 'gallery_height', $settings->irHeight); - $this->object->_set_default_value($entity, 'settings', 'thumbnail_width', $settings->thumbwidth); - $this->object->_set_default_value($entity, 'settings', 'thumbnail_height', $settings->thumbheight); - $this->object->_set_default_value($entity, 'settings', 'cycle_interval', $settings->irRotatetime); - $this->object->_set_default_value($entity, 'settings', 'cycle_effect', $settings->slideFX); - $this->object->_set_default_value($entity, 'settings', 'effect_code', $settings->thumbCode); $this->object->_set_default_value($entity, 'settings', 'show_thumbnail_link', $settings->galShowSlide ? 1 : 0); $this->object->_set_default_value($entity, 'settings', 'thumbnail_link_text', $settings->galTextGallery); $this->object->_set_default_value($entity, 'settings', 'template', ''); + $this->object->_set_default_value($entity, 'settings', 'display_view', 'default'); + $this->object->_set_default_value($entity, 'settings', 'autoplay', 1); + $this->object->_set_default_value($entity, 'settings', 'pauseonhover', 1); + $this->object->_set_default_value($entity, 'settings', 'arrows', 0); + $this->object->_set_default_value($entity, 'settings', 'interval', 3000); + $this->object->_set_default_value($entity, 'settings', 'transition_speed', 300); + $this->object->_set_default_value($entity, 'settings', 'transition_style', 'fade'); // Part of the pro-modules $this->object->_set_default_value($entity, 'settings', 'ngg_triggers_display', 'never'); } function set_thumbnail_defaults($entity) { $settings = C_NextGen_Settings::get_instance(); + $default_template = isset($entity->settings["template"]) ? 'default' : 'default-view.php'; + $this->object->_set_default_value($entity, 'settings', 'display_view', $default_template); $this->object->_set_default_value($entity, 'settings', 'images_per_page', $settings->galImages); $this->object->_set_default_value($entity, 'settings', 'number_of_columns', $settings->galColumns); $this->object->_set_default_value($entity, 'settings', 'thumbnail_width', $settings->thumbwidth); @@ -221,12 +225,15 @@ class A_NextGen_Basic_Gallery_Validation extends Mixin class A_NextGen_Basic_Slideshow_Controller extends Mixin { /** - * Displays the ngglegacy thumbnail gallery. - * This method deprecates the use of the nggShowGallery() function. - * @param stdClass|C_Displayed_Gallery|C_DataMapper_Model $displayed_gallery + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return (optional) + * @return string */ function index_action($displayed_gallery, $return = FALSE) { + // We now hide option for triggers on this display type. + // This ensures they do not show based on past settings. + $displayed_gallery->display_settings['ngg_triggers_display'] = 'never'; // Get the images to be displayed $current_page = (int) $this->param('nggpage', 1); if ($images = $displayed_gallery->get_included_entities()) { @@ -265,10 +272,11 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin */ function enqueue_frontend_resources($displayed_gallery) { - wp_register_script('jquery-cycle', $this->get_static_url("photocrati-nextgen_basic_gallery#slideshow/jquery.cycle.all.js"), array('jquery'), NGG_SCRIPT_VERSION); - wp_enqueue_script('jquery-cycle'); - wp_enqueue_style('nextgen_basic_slideshow_style', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_script('waitforimages', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/jquery.waitforimages.js'), array('jquery'), NGG_SCRIPT_VERSION); + wp_enqueue_style('ngg_basic_slideshow_style', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/ngg_basic_slideshow.css'), array(), NGG_SCRIPT_VERSION); + // Add new scripts for slick based slideshow + wp_enqueue_script('ngg_slick', $this->get_static_url("photocrati-nextgen_basic_gallery#slideshow/slick/slick.min.js"), array('jquery'), NGG_SCRIPT_VERSION); + wp_enqueue_style('ngg_slick_slideshow_style', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/slick/slick.css'), array(), NGG_SCRIPT_VERSION); + wp_enqueue_style('ngg_slick_slideshow_theme', $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/slick/slick-theme.css'), array(), NGG_SCRIPT_VERSION); $this->call_parent('enqueue_frontend_resources', $displayed_gallery); $this->enqueue_ngg_styles(); } @@ -279,7 +287,7 @@ class A_NextGen_Basic_Slideshow_Controller extends Mixin */ function _get_js_lib_url() { - return $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.js'); + return $this->get_static_url('photocrati-nextgen_basic_gallery#slideshow/ngg_basic_slideshow.js'); } } /** @@ -302,15 +310,67 @@ class A_NextGen_Basic_Slideshow_Form extends Mixin_Display_Type_Form */ function _get_field_names() { - return array('nextgen_basic_slideshow_gallery_dimensions', 'nextgen_basic_slideshow_cycle_effect', 'nextgen_basic_slideshow_cycle_interval', 'nextgen_basic_slideshow_show_thumbnail_link', 'nextgen_basic_slideshow_thumbnail_link_text'); + return array('nextgen_basic_slideshow_gallery_dimensions', 'nextgen_basic_slideshow_autoplay', 'nextgen_basic_slideshow_pauseonhover', 'nextgen_basic_slideshow_arrows', 'nextgen_basic_slideshow_transition_style', 'nextgen_basic_slideshow_interval', 'nextgen_basic_slideshow_transition_speed', 'nextgen_basic_slideshow_show_thumbnail_link', 'nextgen_basic_slideshow_thumbnail_link_text', 'display_view'); } - function _render_nextgen_basic_slideshow_cycle_interval_field($display_type) + /** + * Renders the autoplay field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_autoplay_field($display_type) { - return $this->_render_number_field($display_type, 'cycle_interval', __('Interval', 'nggallery'), $display_type->settings['cycle_interval'], '', FALSE, __('# of seconds', 'nggallery'), 1); + return $this->_render_radio_field($display_type, 'autoplay', __('Autoplay?', 'nggallery'), $display_type->settings['autoplay']); } - function _render_nextgen_basic_slideshow_cycle_effect_field($display_type) + /** + * Renders the Pause on Hover field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_pauseonhover_field($display_type) { - return $this->_render_select_field($display_type, 'cycle_effect', 'Effect', array('fade' => 'fade', 'blindX' => 'blindX', 'cover' => 'cover', 'scrollUp' => 'scrollUp', 'scrollDown' => 'scrollDown', 'shuffle' => 'shuffle', 'toss' => 'toss', 'wipe' => 'wipe'), $display_type->settings['cycle_effect'], '', FALSE); + return $this->_render_radio_field($display_type, 'pauseonhover', __('Pause on Hover?', 'nggallery'), $display_type->settings['pauseonhover']); + } + /** + * Renders the arrows field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_arrows_field($display_type) + { + return $this->_render_radio_field($display_type, 'arrows', __('Show Arrows?', 'nggallery'), $display_type->settings['arrows']); + } + /** + * Renders the effect field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_transition_style_field($display_type) + { + return $this->_render_select_field($display_type, 'transition_style', __('Transition Style', 'nggallery'), array('slide' => 'Slide', 'fade' => 'Fade'), $display_type->settings['transition_style'], '', FALSE); + } + /** + * Renders the interval field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_interval_field($display_type) + { + return $this->_render_number_field($display_type, 'interval', __('Interval', 'nggallery'), $display_type->settings['interval'], '', FALSE, __('Milliseconds', 'nggallery'), 1); + } + /** + * Renders the interval field for new Slick.js slideshow + * + * @param C_Display_Type $display_type + * @return string + */ + function _render_nextgen_basic_slideshow_transition_speed_field($display_type) + { + return $this->_render_number_field($display_type, 'transition_speed', __('Transition Speed', 'nggallery'), $display_type->settings['transition_speed'], '', FALSE, __('Milliseconds', 'nggallery'), 1); } function _render_nextgen_basic_slideshow_gallery_dimensions_field($display_type) { @@ -361,7 +421,7 @@ class A_NextGen_Basic_Thumbnail_Form extends Mixin_Display_Type_Form */ function _get_field_names() { - return array('thumbnail_override_settings', 'nextgen_basic_thumbnails_images_per_page', 'nextgen_basic_thumbnails_number_of_columns', 'ajax_pagination', 'nextgen_basic_thumbnails_hidden', 'nextgen_basic_thumbnails_imagebrowser_effect', 'nextgen_basic_thumbnails_show_slideshow_link', 'nextgen_basic_thumbnails_slideshow_link_text', 'nextgen_basic_templates_template'); + return array('thumbnail_override_settings', 'nextgen_basic_thumbnails_images_per_page', 'nextgen_basic_thumbnails_number_of_columns', 'ajax_pagination', 'nextgen_basic_thumbnails_hidden', 'nextgen_basic_thumbnails_imagebrowser_effect', 'nextgen_basic_thumbnails_show_slideshow_link', 'nextgen_basic_thumbnails_slideshow_link_text', 'display_view', 'nextgen_basic_templates_template'); } /** * Renders the images_per_page settings field @@ -432,9 +492,9 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin $this->add_mixin('Mixin_NextGen_Basic_Pagination'); } /** - * Displays the ngglegacy thumbnail gallery. - * This method deprecates the use of the nggShowGallery() function. - * @param stdClass|C_Displayed_Gallery|C_DataMapper_Model $displayed_gallery + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return (optional) + * @return string */ function index_action($displayed_gallery, $return = FALSE) { @@ -466,9 +526,6 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin // just display the images for this page, as normal $images = $displayed_gallery->get_included_entities($display_settings['images_per_page'], $offset); } - if (in_array($displayed_gallery->source, array('random_images', 'recent_images'))) { - $display_settings['disable_pagination'] = TRUE; - } // Are there images to display? if ($images) { // Create pagination @@ -551,11 +608,11 @@ class A_NextGen_Basic_Thumbnails_Controller extends Mixin function enqueue_frontend_resources($displayed_gallery) { $this->call_parent('enqueue_frontend_resources', $displayed_gallery); - wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_thumbnails_style', $this->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'), array(), NGG_SCRIPT_VERSION); if ($displayed_gallery->display_settings['ajax_pagination']) { - wp_enqueue_script('nextgen-basic-thumbnails-ajax-pagination', $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/ajax_pagination.js'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_script('nextgen-basic-thumbnails-ajax-pagination', $this->object->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/ajax_pagination.js'), array(), NGG_SCRIPT_VERSION); } - wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_pagination_style', $this->get_static_url('photocrati-nextgen_pagination#style.css'), array(), NGG_SCRIPT_VERSION); $this->enqueue_ngg_styles(); } /** diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/jquery.waitforimages.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/jquery.waitforimages.js index 36f3259ec..622610c84 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/jquery.waitforimages.js +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/jquery.waitforimages.js @@ -1,3 +1,5 @@ +/* Please enqueue ngg_waitforimages instead of enqueuing this file directly */ + /*! waitForImages jQuery Plugin - v1.4.1 - 2012-10-12 * https://github.com/alexanderdickson/waitForImages * Copyright (c) 2012 Alex Dickson; Licensed MIT */ @@ -6,7 +8,7 @@ // Namespace all events. var eventNamespace = 'waitForImages'; - // CSS properties which contain references to images. + // CSS properties which contain references to images. $.waitForImages = { hasImageProperties: ['backgroundImage', 'listStyleImage', 'borderImage', 'borderCornerImage'] }; @@ -95,11 +97,11 @@ // For images only, the task is simpler. obj.find('img:uncached') .each(function () { - allImgs.push({ - src: this.src, - element: this + allImgs.push({ + src: this.src, + element: this + }); }); - }); } allImgsLength = allImgs.length; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.css new file mode 100644 index 000000000..5ca4b6c03 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.css @@ -0,0 +1,115 @@ +.ngg-slideshow.slick-slider { + margin: 40px auto 50px !important; + overflow: visible; +} + +.ngg-slideshow .ngg-gallery-slideshow-image { + display: inline-block; + text-align: center; + font: 0/0 a; +} + +.ngg-slideshow .ngg-gallery-slideshow-image:before { + content: ' '; + display: inline-block; + vertical-align: middle; + height: 100%; +} + +.ngg-slideshow .ngg-gallery-slideshow-image a { + display: inline !important; +} + +.ngg-slideshow .ngg-gallery-slideshow-image img { + margin: 0 auto; + display: inline-block !important; + vertical-align: middle; + max-width: 99%!important; + max-height: 98% !important; +} + +.ngg-slideshow .slick-prev { + left: 20px !important; + z-index: 10 !important; + top: 49%; + cursor: before; +} + +.ngg-slideshow .slick-next { + right: 30px !important; + z-index: 10 !important; + top: 49%; + cursor: pointer; +} + +.ngg-slideshow .slick-next:before, +.ngg-slideshow .slick-prev:before { + color: #CCC !important; + font-size: 32px !important; +} + +.ngg-slideshow .slick-next:hover:before, +.ngg-slideshow .slick-prev:hover:before { + color: #AAA !important; + font-size: 32px !important; +} + +.ngg-slideshow .slick-dots { + margin: 0; + padding: 0; + bottom: -30px; +} + +.ngg-slideshow .slick-dots li { + margin: 0; +} + +.ngg-slideshow .slick-dots li button { + margin: 0; +} + +.ngg-slideshow .slick-dots li button:before { + font-size: 8px; + color: #888; + opacity: .5; + cursor: pointer; +} + +.ngg-slideshow .slick-dots li.slick-active button:before { + opacity: 1; + color: #555; +} + +.slideshowlink { + margin: -34px auto 50px; + text-align: center; + text-transform: uppercase; +} + +.slideshowlink a { + font-size: 13px; + letter-spacing: .75px; + cursor: pointer; + text-decoration: none; + box-shadow: none; + border: none; +} + +.slideshowlink a:hover { + text-decoration: none !important; + box-shadow: none !important; + border: none !important; +} + +@media (max-width: 600px) { + .ngg-slideshow .ngg-gallery-slideshow-image { + height: 400px !important; + } +} + +@media (max-width: 450px) { + .ngg-slideshow .ngg-gallery-slideshow-image { + height: 300px !important; + } + +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.js new file mode 100644 index 000000000..b4adf37e8 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.js @@ -0,0 +1,29 @@ +(function($){ + + $(document).ready(function(){ + + $.each(window.galleries, function(index, gallery) { + + if (gallery.display_type === 'photocrati-nextgen_basic_slideshow') { + + var settings = gallery.display_settings; + var fadeValue = (settings.transition_style == "fade") ? true : false; + + $('.ngg-galleryoverview.ngg-slideshow').slick({ + autoplay: Number(settings.autoplay) ? true : false, + arrows: Number(settings.arrows) ? true : false, + draggable: false, + dots: false, + fade: fadeValue, + autoplaySpeed: settings.interval, + speed: settings.transition_speed, + pauseOnHover: Number(settings.pauseonhover) ? true : false + }); + + } + + }); + + }); + +})(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.css new file mode 100644 index 000000000..851e2406b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.css @@ -0,0 +1 @@ +.ngg-slideshow.slick-slider{margin:40px auto 50px!important;overflow:visible}.ngg-slideshow .ngg-gallery-slideshow-image{display:inline-block;text-align:center;font:0/0 a}.ngg-slideshow .ngg-gallery-slideshow-image:before{content:' ';display:inline-block;vertical-align:middle;height:100%}.ngg-slideshow .ngg-gallery-slideshow-image a{display:inline!important}.ngg-slideshow .ngg-gallery-slideshow-image img{margin:0 auto;display:inline-block!important;vertical-align:middle;max-width:99%!important;max-height:98%!important}.ngg-slideshow .slick-prev{left:20px!important;z-index:10!important;top:49%;cursor:before}.ngg-slideshow .slick-next{right:30px!important;z-index:10!important;top:49%;cursor:pointer}.ngg-slideshow .slick-next:before,.ngg-slideshow .slick-prev:before{color:#CCC!important;font-size:32px!important}.ngg-slideshow .slick-next:hover:before,.ngg-slideshow .slick-prev:hover:before{color:#AAA!important;font-size:32px!important}.ngg-slideshow .slick-dots{margin:0;padding:0;bottom:-30px}.ngg-slideshow .slick-dots li,.ngg-slideshow .slick-dots li button{margin:0}.ngg-slideshow .slick-dots li button:before{font-size:8px;color:#888;opacity:.5;cursor:pointer}.ngg-slideshow .slick-dots li.slick-active button:before{opacity:1;color:#555}.slideshowlink{margin:-34px auto 50px;text-align:center;text-transform:uppercase}.slideshowlink a{font-size:13px;letter-spacing:.75px;cursor:pointer;text-decoration:none;box-shadow:none;border:none}.slideshowlink a:hover{text-decoration:none!important;box-shadow:none!important;border:none!important}@media (max-width:600px){.ngg-slideshow .ngg-gallery-slideshow-image{height:400px!important}}@media (max-width:450px){.ngg-slideshow .ngg-gallery-slideshow-image{height:300px!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.js new file mode 100644 index 000000000..2a658dc4e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/ngg_basic_slideshow.min.js @@ -0,0 +1 @@ +!function(e){e(document).ready(function(){e.each(window.galleries,function(a,o){if("photocrati-nextgen_basic_slideshow"===o.display_type){var s=o.display_settings,i="fade"==s.transition_style;e(".ngg-galleryoverview.ngg-slideshow").slick({autoplay:!!Number(s.autoplay),arrows:!!Number(s.arrows),draggable:!1,dots:!1,fade:i,autoplaySpeed:s.interval,speed:s.transition_speed,pauseOnHover:!!Number(s.pauseonhover)})}})})}(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/ajax-loader.gif b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..e0e6e9760bc04861cc4771e327f22ed7962e0858 GIT binary patch literal 4178 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 B1&#m! literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/config.rb b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/config.rb new file mode 100644 index 000000000..81f5ae324 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/config.rb @@ -0,0 +1,10 @@ +css_dir = "." +sass_dir = "." +images_dir = "." +fonts_dir = "fonts" +relative_assets = true + +output_style = :compact +line_comments = false + +preferred_syntax = :scss \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.eot b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.eot new file mode 100644 index 0000000000000000000000000000000000000000..2cbab9ca97723bc24c50315a0a9bd155db4e0aa5 GIT binary patch literal 2048 zcmZSJU|>jLXJBAtU}69PCI(hc5DgNUzzAab1TZo%G$??WPz)AkU|{eUIPw81ghX*M z6f@*7WHKZ(WHT@@@G%52q%x#4lrrQnBr+5+FffQQgfXNt6fqPtWHRJ4<S{5P7&7QF z7%(s}pz34*Ie~$Jm!W}ynIXW<EyOqX;)(SP4D22Z3=A^vF0O72CJby04D1>V3=9hX z!TLu2-~Mi5U|@`3U|<MK&P^;(;&<K4z`%Hdfq^k8J+Zjp|9=K%1_pMJS2)shD%0#| zZ%bfcV76gkVA9D*O-x~6H2lrLz;K6wfx#>zBQ=rvDHAIL1EUB71A|INZb=237lRiA z1LFpeCvx(W6B)iSE@EI{)?r{^5XeoeC}8kraA#m(v;es$FEKZjRlV^L0|RRY0|R4T zL4I+G{$?X)1_rhp3=9me44^<{WMKGkM8H3u-{va=HzfSe7gp4R0uxNDGN>}%X1vY7 zz`y~G9&ng|Mf4!*8E=D40%?I^7O)6Ag9}s-NFgIw%mJ!|k%@tE0s|`p2cr*T8Uq7^ zJCy#)Aj#0ez<@{t4Pg5iKp_U!8j$9i!r;J=s5pu7!T$#gdW^UKgIovl3j;_WSP|G- zCI$voC<F;IGcbU{o<Roe4hDu824*lzhJl3v<SHJp4_O!(7!nnf6elQ7`u`uK4Vm|U z>HWv|O70bc^?@ZJ1S1>7ksux;$gdy_;=nM}bucbjG#gpEP&Kila%seKW9VVnz$nJR z1PXm{>XBg3VPLRlG&9j>R8v;sXJiu<k!NHFlVZk3W+Lot>}*QvYU*kx=4R$*M&e@P zADh_NnpoL6SY_GR!o%6vWLY`b-^<Dw8PpgU$;rYPg-vXHY)!1Ja;)r}ED;ebob0S} ztd~%ffYgE$1}r6m-J)u4W@@6(2q7U(5|L-b;TA>>BuB799kv7J29O0{R~4eTf)(O4 zY>r`shl?-+0|OS%Gv3B9oY4-`R|s>Q85kHvMcA|%mDJVjK|u@(P<A#EaWN1yHUfpJ zv5`EZm?+pbWpG$SL)+ZU7!=^<X5wOux4AePxY<}aHMFc`Wn_dzc(}QFM1*8yWR>I; zgxMHbnAMq?6ty)?^wo5vq(uY;MWm&4)bzE~HDy&fc(@t2H*j!qb91VzLv&d|jNs>! zVP;lmW@chh7ZHJIiG%3p7nD)uV1XuV9)@Yqe8tGX%D@9<Gcm9;C_&lG42leSP&Nw# zE5jTpo0Wl^VHcFm#=y#O36!&0I2jljxWIXyk%g0iiGhzn2rACZ;KZN>WwS7FF-(B6 zSsBC_7D3r;3|tJykgJj6oXq5G2K1^VC^fw_C$Wfu!3|uIlz{0XhIEEh1_cHqaHXQa zV8x(-WD<mL$Y8>t3&uta1`Hq`gIj)HiCcbAda8nvo`Hgu0@y|cD+NOnT@zg+149!A zBvTl`vJAK?var;m;>`R!1w%apY`PEyC8P+zET7oHbsrNW6C*Q2JA(^XVo_0kc~NG1 zMhPdFnUk7U0@eHfKLZmu^!XSV7$m@gAU-n#8v`Q)s62&~hG09+y}J&oyBNTA3j+g~ F1^_W!{XGBx literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.svg b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.svg new file mode 100644 index 000000000..b36a66a6c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata>Generated by Fontastic.me</metadata> +<defs> +<font id="slick" horiz-adv-x="512"> +<font-face font-family="slick" units-per-em="512" ascent="480" descent="-32"/> +<missing-glyph horiz-adv-x="512" /> + +<glyph unicode="→" d="M241 113l130 130c4 4 6 8 6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12 0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0 9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/> +<glyph unicode="←" d="M296 113l29 30c4 3 6 7 6 12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13 5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0 10 2 13 5z m179 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/> +<glyph unicode="•" d="M475 256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/> +<glyph unicode="a" d="M475 439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40 39c-28 26-62 39-100 39-20 0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39 11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15 20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6 0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51 27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47 70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37 37c6 6 12 7 20 4 8-4 11-9 11-17z"/> +</font></defs></svg> diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.ttf b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d03461b653373f7cda3b4af104c6bca07f9892b GIT binary patch literal 1892 zcmZQzWME+6WoTevW(aU|3-Qgpcw#*R1G@(U1A~mai>n)h2?HAg1G@$T1A~Hpu)dN1 zx4)Yh7#JfM7#PBma}x`c_+9rhFfg8AU|>v2Pb@C@|DS=Gfq`9tfq{V|J*P6we)hHm z1_ovu1_mabjMT&w21di*3=9l+7#JALGBQ#VnV&MTGB7ZTFfcHvWaO4quz4|fF)%Q0 zU|?Vn%gIkpWcbFoh=GAwhk=1XAUCn1fWe!=oq>VT0_2{&#N1R?^~OUC46GRp42*dN z`Nbvrn~j(m7}#zwFfh1+{l>_^@ZpGne>}g<R|ak-1`s%3SWyqBRT)$nZ!_Koxt9SV z%>dE|7SV$UFy01<fONny3s{7m!3C-Zq>vFT<^Wa0$i%=nfq|8QgVBdEje&u|9ZG*? zkYs3KU|?ck<%Fng0Ncj^3Nf%iK$>d`g9AgN;v~ig{~s{uG2Z?Uavdn17(n{Kion(~ zF)*k?AxMy!fdLfu3^HJMFfhb0FoRh#3@i*FSMe}#FfcK&FfcGADkv#VP@MGtKS&!g z@Bh;KkMEV-D+KEUOF{@nHi#oZJVuaTK^Vk=VW{h1T(W33vUH(pVnyZBi08)8!?1x- zjDZOh`ry<f!JxyyV9#h~qR*(Nti;dACMqJ&$POmOjE&4h*xA_Gl+@MK)lAII%*~9% z#l$~0v9UF=vU9M?vayASv$4sta<IRbl`}G^F))&og)s`7*!b9*SXt#***RGvB3L-t zS>;$Sp(p{V1t$zxN(Q?{)!fX~M4u5tLYyQb&xpe<j2cLeV1+tt2h0s13&5@_L~#Wx z#A(<Z!w3%-VFm^UES_h)jbS*W9j31k<~TDjFp7$>X)`LRtJ#Bs7!;uFY$D=fAZTm^ z3RPnxc}6i&ux-lVu!e@VxtTF2z|GCX#TajMaWrtVv2to?S;@-C2#N4;bMuG@$;ikm z$tei4F|shLGcze_Ynte*=}1Y72nvcwOX;ZTYpH9>s&epfGj4C-;Ns@yR9A=SvVs`F z&nLsotj^5L#G)=D0?`r&(a$d^qsqYoP1rmP)1di^k%5(g2g+t*U}sQ*vY8na8S<cP z76w*^IZ!q$12@AiD4UIemEjU7XR~lJFfwp~^E@L9Cj%1$AA=B7oSDIiK?}-eVc=qz z0A;f>h%qdJve_887>+R%GvqL2G9)u(GcXkAWF}`bFa$BAGNdz<GUPBMG88c|1f`~z z<|Gy|Ft{<~GvqOpfaxNJbcR$01qLGqJq7~?1qLey1tgOod_x8k23;^VVlZF;@fh6l z^Ge+Ei_%jSjPwi?tQ5dDDp)BPn&_J78W|XxFd&%%b59sUDnk)NF+(QUegy_Yu$>HH zsYS(^`FRS4dIs2ZAqq-J5rA1fu`_^*G$uwSMrMX~1{bcxqN4orqRjM+5>7BPCpE1E rs`vkY1}1Rm^D!_mNPq=Fd}anV21ams3Mmc2cAR^69aMKQAlESfE_dz; literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.woff b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/fonts/slick.woff new file mode 100644 index 0000000000000000000000000000000000000000..8ee99721bb81b59a5e1ceee1d3256b15f907d96b GIT binary patch literal 1380 zcmXT-cXRU(3GruOU`=7*W?*1oV2@#71ksq-+09LXfq{{Ofq_Ynfq`kZ{I4)RH@6U9 z1_ove1_lNx1_lP1+>0mHySuo$F)%QPfcOjy3<?ZJ3@rY^`bG>4%moY#3_%PG3<&`e z|JNnwCKfO-Fdt!HU<hDfU`$ftcG-}TnwY}Cz#_uHz@W##z+lF}X!tuLBQ=qMfyD)C zo(l6*CgzOXk_rX}mIMX{20jpG@nZ1GO{^$jU|<2+!N$PAz{bEDz>t@io65kzQo+E$ zaEF0`F^^Tf@lZj2aR~zhE69BUVD~XIFjma5ope55$Wi2Yx@NTclm%f5W{!_;W>=e6 zU7cMnyt!0VN00kRYm3v5t@ahWt)nA!CLEX*!6o4lu<qF6dXL}g6*qjVE<}2rQOV!; zb6@5B>3ht1xYz^_8|?l$S>!vTA>)w+>Gu{lOuzF{j_s=f^Fvt<_Q{GRAF}@IAE+1H zw>he^Nqqxn$nMz=FXEWCzE=;h5UkkM-(;7@?|PBZYv0MIESl4+zVF)*sGk4x(6Z~f z&MgwHfq{&+?rY*j9M)gd|1x`~+ns5rkA;L@Oj&R|!1qt#Ijv=G2bfN8=;&O(u76$a z@mm%xR+}xeXPJ2NE}E%T_Sn2|nnv3rWfRxH5A*BZ6ly&BcW1*>-sq1v%?r)XX{C6p zw_J#NHAC&@1)ce3r#HCV-IU^b)V)2teV=mv%PseXPc5zSFL-<VcC}#hx-3(V!#P`{ zb<ccWV{(rF==mi5Y|aUcj_1NQU#;1x;d!)Z-l;V{xjd5I7U$=sw^uH=n6_`4{_5#h zSK73*)>zNxeb&tV{50z|-n$IUXSS`A{PBZ*wdAaIO<c2<ZPh+{X=TXttocuvJOWgf z`mKz97s~cyOT4t1+u4amZ0s^d?|ODEzE^PJJ%5|6mUZ$YhJSpgPlX)0V|Y7j>+H12 zCOTWWZ}h&qbn;b+jY&hR@;uqr8<7?+;{Ol)chgUdjrZiv)btDTyY(=a&*H)BOik5J zCEk}-{4#9ko@JVu3Qqs>cGbQ%(=~5eH<zdhONo8sx>oUCeoDLS9tMVrImrnL2`LOs z#qZbUGhBSmt^F#|gdwVueKSNZB_ZJfa}p<;KtfUii<6iE+eZlomNEu&kiN8}ggFNe zoH}su#o-yp4jg#Ew{*XehtU=T0|UbiMMe#d%*@Qn6M_;Nni@>5i?Fe`xg7QE;s0l! za3Oim-~VRJF1*Z-b2oUgvbiyspXTF+*q4xy){r2{=Ef$_!T3qyV2v0XyTaMS2M!)! zNijB1(bCZL3z+lezkP(P(EI<7e)GQ<y?eTS76W@v4$ljxE9^QU2F)|M(jG7{SnBeN zgWQ;skid{+z24w`McwT6Ja>F}6bkljSS07S+GvH*y|g{NPl^m0mNNcb#u)^$KP4ey z&)EY9792mqz~o@2%&e8b#9)xb_?C%*fq{vEK@|!iS)CQ6C%4Zw>#&1BtNqPM&UGFW zmA>9u>gXi2DrVUQ#-JVMX@W{lO;c<8LskYom9TW+n;`u3ZIz<yrVVGlx0!!t+wr)U z<-d^8N^bofNy3#UXBif0ov(h<6K$uwe#yS4K9{mf^A1gU&idWPCGOJ^vm&kY*-v`h z?UdGE`Ja@w;Q0yeGtTuPmB%g>hW&4tyyb4C1xJ+H-7>DLCld{?h)h{!{rA4Fc<jXq z?eV7{i@r6Pck5*7wJWZfWojy`!hG*NDUCe&>HECBlji)YJ@LJ|R;~K=vpOl?&?*0Y Z{xbBgGI9llUz!734^IXI14ADJD*y_Q8;<}0 literal 0 HcmV?d00001 diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.css new file mode 100644 index 000000000..1232fcab0 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.css @@ -0,0 +1,204 @@ +@charset 'UTF-8'; +/* Slider */ +.slick-loading .slick-list +{ + background: #fff url('./ajax-loader.gif') center center no-repeat; +} + +/* Icons */ +@font-face +{ + font-family: 'slick'; + font-weight: normal; + font-style: normal; + + src: url('./fonts/slick.eot'); + src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg'); +} +/* Arrows */ +.slick-prev, +.slick-next +{ + font-size: 0; + line-height: 0; + + position: absolute; + top: 50%; + + display: block; + + width: 20px; + height: 20px; + padding: 0; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + + cursor: pointer; + + color: transparent; + border: none; + outline: none; + background: transparent; +} +.slick-prev:hover, +.slick-prev:focus, +.slick-next:hover, +.slick-next:focus +{ + color: transparent; + outline: none; + background: transparent; +} +.slick-prev:hover:before, +.slick-prev:focus:before, +.slick-next:hover:before, +.slick-next:focus:before +{ + opacity: 1; +} +.slick-prev.slick-disabled:before, +.slick-next.slick-disabled:before +{ + opacity: .25; +} + +.slick-prev:before, +.slick-next:before +{ + font-family: 'slick'; + font-size: 20px; + line-height: 1; + + opacity: .75; + color: white; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.slick-prev +{ + left: -25px; +} +[dir='rtl'] .slick-prev +{ + right: -25px; + left: auto; +} +.slick-prev:before +{ + content: '←'; +} +[dir='rtl'] .slick-prev:before +{ + content: '→'; +} + +.slick-next +{ + right: -25px; +} +[dir='rtl'] .slick-next +{ + right: auto; + left: -25px; +} +.slick-next:before +{ + content: '→'; +} +[dir='rtl'] .slick-next:before +{ + content: '←'; +} + +/* Dots */ +.slick-dotted.slick-slider +{ + margin-bottom: 30px; +} + +.slick-dots +{ + position: absolute; + bottom: -25px; + + display: block; + + width: 100%; + padding: 0; + margin: 0; + + list-style: none; + + text-align: center; +} +.slick-dots li +{ + position: relative; + + display: inline-block; + + width: 20px; + height: 20px; + margin: 0 5px; + padding: 0; + + cursor: pointer; +} +.slick-dots li button +{ + font-size: 0; + line-height: 0; + + display: block; + + width: 20px; + height: 20px; + padding: 5px; + + cursor: pointer; + + color: transparent; + border: 0; + outline: none; + background: transparent; +} +.slick-dots li button:hover, +.slick-dots li button:focus +{ + outline: none; +} +.slick-dots li button:hover:before, +.slick-dots li button:focus:before +{ + opacity: 1; +} +.slick-dots li button:before +{ + font-family: 'slick'; + font-size: 6px; + line-height: 20px; + + position: absolute; + top: 0; + left: 0; + + width: 20px; + height: 20px; + + content: '•'; + text-align: center; + + opacity: .25; + color: black; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.slick-dots li.slick-active button:before +{ + opacity: .75; + color: black; +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.less b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.less new file mode 100644 index 000000000..e06fc183d --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.less @@ -0,0 +1,168 @@ +@charset "UTF-8"; + +// Default Variables + +@slick-font-path: "./fonts/"; +@slick-font-family: "slick"; +@slick-loader-path: "./"; +@slick-arrow-color: white; +@slick-dot-color: black; +@slick-dot-color-active: @slick-dot-color; +@slick-prev-character: "←"; +@slick-next-character: "→"; +@slick-dot-character: "•"; +@slick-dot-size: 6px; +@slick-opacity-default: 0.75; +@slick-opacity-on-hover: 1; +@slick-opacity-not-active: 0.25; + +/* Slider */ +.slick-loading .slick-list{ + background: #fff url('@{slick-loader-path}ajax-loader.gif') center center no-repeat; +} + +/* Arrows */ +.slick-prev, +.slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0px; + font-size: 0px; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; + &:hover, &:focus { + outline: none; + background: transparent; + color: transparent; + &:before { + opacity: @slick-opacity-on-hover; + } + } + &.slick-disabled:before { + opacity: @slick-opacity-not-active; + } +} + +.slick-prev:before, .slick-next:before { + font-family: @slick-font-family; + font-size: 20px; + line-height: 1; + color: @slick-arrow-color; + opacity: @slick-opacity-default; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + & when ( @slick-font-family = 'slick' ) { + /* Icons */ + @font-face { + font-family: 'slick'; + font-weight: normal; + font-style: normal; + src: url('@{slick-font-path}slick.eot'); + src: url('@{slick-font-path}slick.eot?#iefix') format('embedded-opentype'), url('@{slick-font-path}slick.woff') format('woff'), url('@{slick-font-path}slick.ttf') format('truetype'), url('@{slick-font-path}slick.svg#slick') format('svg'); + } + } +} + +.slick-prev { + left: -25px; + [dir="rtl"] & { + left: auto; + right: -25px; + } + &:before { + content: @slick-prev-character; + [dir="rtl"] & { + content: @slick-next-character; + } + } +} + +.slick-next { + right: -25px; + [dir="rtl"] & { + left: -25px; + right: auto; + } + &:before { + content: @slick-next-character; + [dir="rtl"] & { + content: @slick-prev-character; + } + } +} + +/* Dots */ + +.slick-dotted .slick-slider { + margin-bottom: 30px; +} + +.slick-dots { + position: absolute; + bottom: -25px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; + li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; + padding: 0; + cursor: pointer; + button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0px; + font-size: 0px; + color: transparent; + padding: 5px; + cursor: pointer; + &:hover, &:focus { + outline: none; + &:before { + opacity: @slick-opacity-on-hover; + } + } + &:before { + position: absolute; + top: 0; + left: 0; + content: @slick-dot-character; + width: 20px; + height: 20px; + font-family: @slick-font-family; + font-size: @slick-dot-size; + line-height: 20px; + text-align: center; + color: @slick-dot-color; + opacity: @slick-opacity-not-active; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + } + &.slick-active button:before { + color: @slick-dot-color-active; + opacity: @slick-opacity-default; + } + } +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.min.css new file mode 100644 index 000000000..999e75623 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.min.css @@ -0,0 +1 @@ +@charset 'UTF-8';.slick-dots,.slick-next,.slick-prev{position:absolute;display:block;padding:0}.slick-dots li button:before,.slick-next:before,.slick-prev:before{font-family:slick;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-loading .slick-list{background:url(ajax-loader.gif) center center no-repeat #fff}@font-face{font-family:slick;font-weight:400;font-style:normal;src:url(fonts/slick.eot);src:url(fonts/slick.eot?#iefix) format('embedded-opentype'),url(fonts/slick.woff) format('woff'),url(fonts/slick.ttf) format('truetype'),url(fonts/slick.svg#slick) format('svg')}.slick-next,.slick-prev{font-size:0;line-height:0;top:50%;width:20px;height:20px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);cursor:pointer;color:transparent;border:none;outline:0;background:0 0}.slick-next:focus,.slick-next:hover,.slick-prev:focus,.slick-prev:hover{color:transparent;outline:0;background:0 0}.slick-next:focus:before,.slick-next:hover:before,.slick-prev:focus:before,.slick-prev:hover:before{opacity:1}.slick-next.slick-disabled:before,.slick-prev.slick-disabled:before{opacity:.25}.slick-next:before,.slick-prev:before{font-size:20px;line-height:1;opacity:.75;color:#fff}.slick-prev{left:-25px}[dir=rtl] .slick-prev{right:-25px;left:auto}.slick-prev:before{content:'←'}.slick-next:before,[dir=rtl] .slick-prev:before{content:'→'}.slick-next{right:-25px}[dir=rtl] .slick-next{right:auto;left:-25px}[dir=rtl] .slick-next:before{content:'←'}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{bottom:-25px;width:100%;margin:0;list-style:none;text-align:center}.slick-dots li{position:relative;display:inline-block;width:20px;height:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{font-size:0;line-height:0;display:block;width:20px;height:20px;padding:5px;cursor:pointer;color:transparent;border:0;outline:0;background:0 0}.slick-dots li button:focus,.slick-dots li button:hover{outline:0}.slick-dots li button:focus:before,.slick-dots li button:hover:before{opacity:1}.slick-dots li button:before{font-size:6px;line-height:20px;position:absolute;top:0;left:0;width:20px;height:20px;content:'•';text-align:center;opacity:.25;color:#000}.slick-dots li.slick-active button:before{opacity:.75;color:#000} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.scss b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.scss new file mode 100644 index 000000000..7fe63e107 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick-theme.scss @@ -0,0 +1,194 @@ +@charset "UTF-8"; + +// Default Variables + +// Slick icon entity codes outputs the following +// "\2190" outputs ascii character "←" +// "\2192" outputs ascii character "→" +// "\2022" outputs ascii character "•" + +$slick-font-path: "./fonts/" !default; +$slick-font-family: "slick" !default; +$slick-loader-path: "./" !default; +$slick-arrow-color: white !default; +$slick-dot-color: black !default; +$slick-dot-color-active: $slick-dot-color !default; +$slick-prev-character: "\2190" !default; +$slick-next-character: "\2192" !default; +$slick-dot-character: "\2022" !default; +$slick-dot-size: 6px !default; +$slick-opacity-default: 0.75 !default; +$slick-opacity-on-hover: 1 !default; +$slick-opacity-not-active: 0.25 !default; + +@function slick-image-url($url) { + @if function-exists(image-url) { + @return image-url($url); + } + @else { + @return url($slick-loader-path + $url); + } +} + +@function slick-font-url($url) { + @if function-exists(font-url) { + @return font-url($url); + } + @else { + @return url($slick-font-path + $url); + } +} + +/* Slider */ + +.slick-list { + .slick-loading & { + background: #fff slick-image-url("ajax-loader.gif") center center no-repeat; + } +} + +/* Icons */ +@if $slick-font-family == "slick" { + @font-face { + font-family: "slick"; + src: slick-font-url("slick.eot"); + src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg"); + font-weight: normal; + font-style: normal; + } +} + +/* Arrows */ + +.slick-prev, +.slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0px; + font-size: 0px; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; + &:hover, &:focus { + outline: none; + background: transparent; + color: transparent; + &:before { + opacity: $slick-opacity-on-hover; + } + } + &.slick-disabled:before { + opacity: $slick-opacity-not-active; + } + &:before { + font-family: $slick-font-family; + font-size: 20px; + line-height: 1; + color: $slick-arrow-color; + opacity: $slick-opacity-default; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +.slick-prev { + left: -25px; + [dir="rtl"] & { + left: auto; + right: -25px; + } + &:before { + content: $slick-prev-character; + [dir="rtl"] & { + content: $slick-next-character; + } + } +} + +.slick-next { + right: -25px; + [dir="rtl"] & { + left: -25px; + right: auto; + } + &:before { + content: $slick-next-character; + [dir="rtl"] & { + content: $slick-prev-character; + } + } +} + +/* Dots */ + +.slick-dotted.slick-slider { + margin-bottom: 30px; +} + +.slick-dots { + position: absolute; + bottom: -25px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; + li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; + padding: 0; + cursor: pointer; + button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0px; + font-size: 0px; + color: transparent; + padding: 5px; + cursor: pointer; + &:hover, &:focus { + outline: none; + &:before { + opacity: $slick-opacity-on-hover; + } + } + &:before { + position: absolute; + top: 0; + left: 0; + content: $slick-dot-character; + width: 20px; + height: 20px; + font-family: $slick-font-family; + font-size: $slick-dot-size; + line-height: 20px; + text-align: center; + color: $slick-dot-color; + opacity: $slick-opacity-not-active; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + } + &.slick-active button:before { + color: $slick-dot-color-active; + opacity: $slick-opacity-default; + } + } +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.css new file mode 100644 index 000000000..57477e848 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.css @@ -0,0 +1,119 @@ +/* Slider */ +.slick-slider +{ + position: relative; + + display: block; + box-sizing: border-box; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + -webkit-touch-callout: none; + -khtml-user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} + +.slick-list +{ + position: relative; + + display: block; + overflow: hidden; + + margin: 0; + padding: 0; +} +.slick-list:focus +{ + outline: none; +} +.slick-list.dragging +{ + cursor: pointer; + cursor: hand; +} + +.slick-slider .slick-track, +.slick-slider .slick-list +{ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track +{ + position: relative; + top: 0; + left: 0; + + display: block; + margin-left: auto; + margin-right: auto; +} +.slick-track:before, +.slick-track:after +{ + display: table; + + content: ''; +} +.slick-track:after +{ + clear: both; +} +.slick-loading .slick-track +{ + visibility: hidden; +} + +.slick-slide +{ + display: none; + float: left; + + height: 100%; + min-height: 1px; +} +[dir='rtl'] .slick-slide +{ + float: right; +} +.slick-slide img +{ + display: block; +} +.slick-slide.slick-loading img +{ + display: none; +} +.slick-slide.dragging img +{ + pointer-events: none; +} +.slick-initialized .slick-slide +{ + display: block; +} +.slick-loading .slick-slide +{ + visibility: hidden; +} +.slick-vertical .slick-slide +{ + display: block; + + height: auto; + + border: 1px solid transparent; +} +.slick-arrow.slick-hidden { + display: none; +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.js new file mode 100644 index 000000000..6a2a09953 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.js @@ -0,0 +1,3011 @@ +/* + _ _ _ _ + ___| (_) ___| | __ (_)___ +/ __| | |/ __| |/ / | / __| +\__ \ | | (__| < _ | \__ \ +|___/_|_|\___|_|\_(_)/ |___/ + |__/ + + Version: 1.8.0 + Author: Ken Wheeler + Website: http://kenwheeler.github.io + Docs: http://kenwheeler.github.io/slick + Repo: http://github.com/kenwheeler/slick + Issues: http://github.com/kenwheeler/slick/issues + + */ +/* global window, document, define, jQuery, setInterval, clearInterval */ +;(function(factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof exports !== 'undefined') { + module.exports = factory(require('jquery')); + } else { + factory(jQuery); + } + +}(function($) { + 'use strict'; + var Slick = window.Slick || {}; + + Slick = (function() { + + var instanceUid = 0; + + function Slick(element, settings) { + + var _ = this, dataSettings; + + _.defaults = { + accessibility: true, + adaptiveHeight: false, + appendArrows: $(element), + appendDots: $(element), + arrows: true, + asNavFor: null, + prevArrow: '<button class="slick-prev" aria-label="Previous" type="button">Previous</button>', + nextArrow: '<button class="slick-next" aria-label="Next" type="button">Next</button>', + autoplay: false, + autoplaySpeed: 3000, + centerMode: false, + centerPadding: '50px', + cssEase: 'ease', + customPaging: function(slider, i) { + return $('<button type="button" />').text(i + 1); + }, + dots: false, + dotsClass: 'slick-dots', + draggable: true, + easing: 'linear', + edgeFriction: 0.35, + fade: false, + focusOnSelect: false, + focusOnChange: false, + infinite: true, + initialSlide: 0, + lazyLoad: 'ondemand', + mobileFirst: false, + pauseOnHover: true, + pauseOnFocus: true, + pauseOnDotsHover: false, + respondTo: 'window', + responsive: null, + rows: 1, + rtl: false, + slide: '', + slidesPerRow: 1, + slidesToShow: 1, + slidesToScroll: 1, + speed: 500, + swipe: true, + swipeToSlide: false, + touchMove: true, + touchThreshold: 5, + useCSS: true, + useTransform: true, + variableWidth: false, + vertical: false, + verticalSwiping: false, + waitForAnimate: true, + zIndex: 1000 + }; + + _.initials = { + animating: false, + dragging: false, + autoPlayTimer: null, + currentDirection: 0, + currentLeft: null, + currentSlide: 0, + direction: 1, + $dots: null, + listWidth: null, + listHeight: null, + loadIndex: 0, + $nextArrow: null, + $prevArrow: null, + scrolling: false, + slideCount: null, + slideWidth: null, + $slideTrack: null, + $slides: null, + sliding: false, + slideOffset: 0, + swipeLeft: null, + swiping: false, + $list: null, + touchObject: {}, + transformsEnabled: false, + unslicked: false + }; + + $.extend(_, _.initials); + + _.activeBreakpoint = null; + _.animType = null; + _.animProp = null; + _.breakpoints = []; + _.breakpointSettings = []; + _.cssTransitions = false; + _.focussed = false; + _.interrupted = false; + _.hidden = 'hidden'; + _.paused = true; + _.positionProp = null; + _.respondTo = null; + _.rowCount = 1; + _.shouldClick = true; + _.$slider = $(element); + _.$slidesCache = null; + _.transformType = null; + _.transitionType = null; + _.visibilityChange = 'visibilitychange'; + _.windowWidth = 0; + _.windowTimer = null; + + dataSettings = $(element).data('slick') || {}; + + _.options = $.extend({}, _.defaults, settings, dataSettings); + + _.currentSlide = _.options.initialSlide; + + _.originalSettings = _.options; + + if (typeof document.mozHidden !== 'undefined') { + _.hidden = 'mozHidden'; + _.visibilityChange = 'mozvisibilitychange'; + } else if (typeof document.webkitHidden !== 'undefined') { + _.hidden = 'webkitHidden'; + _.visibilityChange = 'webkitvisibilitychange'; + } + + _.autoPlay = $.proxy(_.autoPlay, _); + _.autoPlayClear = $.proxy(_.autoPlayClear, _); + _.autoPlayIterator = $.proxy(_.autoPlayIterator, _); + _.changeSlide = $.proxy(_.changeSlide, _); + _.clickHandler = $.proxy(_.clickHandler, _); + _.selectHandler = $.proxy(_.selectHandler, _); + _.setPosition = $.proxy(_.setPosition, _); + _.swipeHandler = $.proxy(_.swipeHandler, _); + _.dragHandler = $.proxy(_.dragHandler, _); + _.keyHandler = $.proxy(_.keyHandler, _); + + _.instanceUid = instanceUid++; + + // A simple way to check for HTML strings + // Strict HTML recognition (must start with <) + // Extracted from jQuery v1.11 source + _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/; + + + _.registerBreakpoints(); + _.init(true); + + } + + return Slick; + + }()); + + Slick.prototype.activateADA = function() { + var _ = this; + + _.$slideTrack.find('.slick-active').attr({ + 'aria-hidden': 'false' + }).find('a, input, button, select').attr({ + 'tabindex': '0' + }); + + }; + + Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) { + + var _ = this; + + if (typeof(index) === 'boolean') { + addBefore = index; + index = null; + } else if (index < 0 || (index >= _.slideCount)) { + return false; + } + + _.unload(); + + if (typeof(index) === 'number') { + if (index === 0 && _.$slides.length === 0) { + $(markup).appendTo(_.$slideTrack); + } else if (addBefore) { + $(markup).insertBefore(_.$slides.eq(index)); + } else { + $(markup).insertAfter(_.$slides.eq(index)); + } + } else { + if (addBefore === true) { + $(markup).prependTo(_.$slideTrack); + } else { + $(markup).appendTo(_.$slideTrack); + } + } + + _.$slides = _.$slideTrack.children(this.options.slide); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slideTrack.append(_.$slides); + + _.$slides.each(function(index, element) { + $(element).attr('data-slick-index', index); + }); + + _.$slidesCache = _.$slides; + + _.reinit(); + + }; + + Slick.prototype.animateHeight = function() { + var _ = this; + if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { + var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); + _.$list.animate({ + height: targetHeight + }, _.options.speed); + } + }; + + Slick.prototype.animateSlide = function(targetLeft, callback) { + + var animProps = {}, + _ = this; + + _.animateHeight(); + + if (_.options.rtl === true && _.options.vertical === false) { + targetLeft = -targetLeft; + } + if (_.transformsEnabled === false) { + if (_.options.vertical === false) { + _.$slideTrack.animate({ + left: targetLeft + }, _.options.speed, _.options.easing, callback); + } else { + _.$slideTrack.animate({ + top: targetLeft + }, _.options.speed, _.options.easing, callback); + } + + } else { + + if (_.cssTransitions === false) { + if (_.options.rtl === true) { + _.currentLeft = -(_.currentLeft); + } + $({ + animStart: _.currentLeft + }).animate({ + animStart: targetLeft + }, { + duration: _.options.speed, + easing: _.options.easing, + step: function(now) { + now = Math.ceil(now); + if (_.options.vertical === false) { + animProps[_.animType] = 'translate(' + + now + 'px, 0px)'; + _.$slideTrack.css(animProps); + } else { + animProps[_.animType] = 'translate(0px,' + + now + 'px)'; + _.$slideTrack.css(animProps); + } + }, + complete: function() { + if (callback) { + callback.call(); + } + } + }); + + } else { + + _.applyTransition(); + targetLeft = Math.ceil(targetLeft); + + if (_.options.vertical === false) { + animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)'; + } else { + animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)'; + } + _.$slideTrack.css(animProps); + + if (callback) { + setTimeout(function() { + + _.disableTransition(); + + callback.call(); + }, _.options.speed); + } + + } + + } + + }; + + Slick.prototype.getNavTarget = function() { + + var _ = this, + asNavFor = _.options.asNavFor; + + if ( asNavFor && asNavFor !== null ) { + asNavFor = $(asNavFor).not(_.$slider); + } + + return asNavFor; + + }; + + Slick.prototype.asNavFor = function(index) { + + var _ = this, + asNavFor = _.getNavTarget(); + + if ( asNavFor !== null && typeof asNavFor === 'object' ) { + asNavFor.each(function() { + var target = $(this).slick('getSlick'); + if(!target.unslicked) { + target.slideHandler(index, true); + } + }); + } + + }; + + Slick.prototype.applyTransition = function(slide) { + + var _ = this, + transition = {}; + + if (_.options.fade === false) { + transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase; + } else { + transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase; + } + + if (_.options.fade === false) { + _.$slideTrack.css(transition); + } else { + _.$slides.eq(slide).css(transition); + } + + }; + + Slick.prototype.autoPlay = function() { + + var _ = this; + + _.autoPlayClear(); + + if ( _.slideCount > _.options.slidesToShow ) { + _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed ); + } + + }; + + Slick.prototype.autoPlayClear = function() { + + var _ = this; + + if (_.autoPlayTimer) { + clearInterval(_.autoPlayTimer); + } + + }; + + Slick.prototype.autoPlayIterator = function() { + + var _ = this, + slideTo = _.currentSlide + _.options.slidesToScroll; + + if ( !_.paused && !_.interrupted && !_.focussed ) { + + if ( _.options.infinite === false ) { + + if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) { + _.direction = 0; + } + + else if ( _.direction === 0 ) { + + slideTo = _.currentSlide - _.options.slidesToScroll; + + if ( _.currentSlide - 1 === 0 ) { + _.direction = 1; + } + + } + + } + + _.slideHandler( slideTo ); + + } + + }; + + Slick.prototype.buildArrows = function() { + + var _ = this; + + if (_.options.arrows === true ) { + + _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow'); + _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow'); + + if( _.slideCount > _.options.slidesToShow ) { + + _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex'); + _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex'); + + if (_.htmlExpr.test(_.options.prevArrow)) { + _.$prevArrow.prependTo(_.options.appendArrows); + } + + if (_.htmlExpr.test(_.options.nextArrow)) { + _.$nextArrow.appendTo(_.options.appendArrows); + } + + if (_.options.infinite !== true) { + _.$prevArrow + .addClass('slick-disabled') + .attr('aria-disabled', 'true'); + } + + } else { + + _.$prevArrow.add( _.$nextArrow ) + + .addClass('slick-hidden') + .attr({ + 'aria-disabled': 'true', + 'tabindex': '-1' + }); + + } + + } + + }; + + Slick.prototype.buildDots = function() { + + var _ = this, + i, dot; + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + _.$slider.addClass('slick-dotted'); + + dot = $('<ul />').addClass(_.options.dotsClass); + + for (i = 0; i <= _.getDotCount(); i += 1) { + dot.append($('<li />').append(_.options.customPaging.call(this, _, i))); + } + + _.$dots = dot.appendTo(_.options.appendDots); + + _.$dots.find('li').first().addClass('slick-active'); + + } + + }; + + Slick.prototype.buildOut = function() { + + var _ = this; + + _.$slides = + _.$slider + .children( _.options.slide + ':not(.slick-cloned)') + .addClass('slick-slide'); + + _.slideCount = _.$slides.length; + + _.$slides.each(function(index, element) { + $(element) + .attr('data-slick-index', index) + .data('originalStyling', $(element).attr('style') || ''); + }); + + _.$slider.addClass('slick-slider'); + + _.$slideTrack = (_.slideCount === 0) ? + $('<div class="slick-track"/>').appendTo(_.$slider) : + _.$slides.wrapAll('<div class="slick-track"/>').parent(); + + _.$list = _.$slideTrack.wrap( + '<div class="slick-list"/>').parent(); + _.$slideTrack.css('opacity', 0); + + if (_.options.centerMode === true || _.options.swipeToSlide === true) { + _.options.slidesToScroll = 1; + } + + $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading'); + + _.setupInfinite(); + + _.buildArrows(); + + _.buildDots(); + + _.updateDots(); + + + _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); + + if (_.options.draggable === true) { + _.$list.addClass('draggable'); + } + + }; + + Slick.prototype.buildRows = function() { + + var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection; + + newSlides = document.createDocumentFragment(); + originalSlides = _.$slider.children(); + + if(_.options.rows > 0) { + + slidesPerSection = _.options.slidesPerRow * _.options.rows; + numOfSlides = Math.ceil( + originalSlides.length / slidesPerSection + ); + + for(a = 0; a < numOfSlides; a++){ + var slide = document.createElement('div'); + for(b = 0; b < _.options.rows; b++) { + var row = document.createElement('div'); + for(c = 0; c < _.options.slidesPerRow; c++) { + var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c)); + if (originalSlides.get(target)) { + row.appendChild(originalSlides.get(target)); + } + } + slide.appendChild(row); + } + newSlides.appendChild(slide); + } + + _.$slider.empty().append(newSlides); + _.$slider.children().children().children() + .css({ + 'width':(100 / _.options.slidesPerRow) + '%', + 'display': 'inline-block' + }); + + } + + }; + + Slick.prototype.checkResponsive = function(initial, forceUpdate) { + + var _ = this, + breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false; + var sliderWidth = _.$slider.width(); + var windowWidth = window.innerWidth || $(window).width(); + + if (_.respondTo === 'window') { + respondToWidth = windowWidth; + } else if (_.respondTo === 'slider') { + respondToWidth = sliderWidth; + } else if (_.respondTo === 'min') { + respondToWidth = Math.min(windowWidth, sliderWidth); + } + + if ( _.options.responsive && + _.options.responsive.length && + _.options.responsive !== null) { + + targetBreakpoint = null; + + for (breakpoint in _.breakpoints) { + if (_.breakpoints.hasOwnProperty(breakpoint)) { + if (_.originalSettings.mobileFirst === false) { + if (respondToWidth < _.breakpoints[breakpoint]) { + targetBreakpoint = _.breakpoints[breakpoint]; + } + } else { + if (respondToWidth > _.breakpoints[breakpoint]) { + targetBreakpoint = _.breakpoints[breakpoint]; + } + } + } + } + + if (targetBreakpoint !== null) { + if (_.activeBreakpoint !== null) { + if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) { + _.activeBreakpoint = + targetBreakpoint; + if (_.breakpointSettings[targetBreakpoint] === 'unslick') { + _.unslick(targetBreakpoint); + } else { + _.options = $.extend({}, _.originalSettings, + _.breakpointSettings[ + targetBreakpoint]); + if (initial === true) { + _.currentSlide = _.options.initialSlide; + } + _.refresh(initial); + } + triggerBreakpoint = targetBreakpoint; + } + } else { + _.activeBreakpoint = targetBreakpoint; + if (_.breakpointSettings[targetBreakpoint] === 'unslick') { + _.unslick(targetBreakpoint); + } else { + _.options = $.extend({}, _.originalSettings, + _.breakpointSettings[ + targetBreakpoint]); + if (initial === true) { + _.currentSlide = _.options.initialSlide; + } + _.refresh(initial); + } + triggerBreakpoint = targetBreakpoint; + } + } else { + if (_.activeBreakpoint !== null) { + _.activeBreakpoint = null; + _.options = _.originalSettings; + if (initial === true) { + _.currentSlide = _.options.initialSlide; + } + _.refresh(initial); + triggerBreakpoint = targetBreakpoint; + } + } + + // only trigger breakpoints during an actual break. not on initialize. + if( !initial && triggerBreakpoint !== false ) { + _.$slider.trigger('breakpoint', [_, triggerBreakpoint]); + } + } + + }; + + Slick.prototype.changeSlide = function(event, dontAnimate) { + + var _ = this, + $target = $(event.currentTarget), + indexOffset, slideOffset, unevenOffset; + + // If target is a link, prevent default action. + if($target.is('a')) { + event.preventDefault(); + } + + // If target is not the <li> element (ie: a child), find the <li>. + if(!$target.is('li')) { + $target = $target.closest('li'); + } + + unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0); + indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll; + + switch (event.data.message) { + + case 'previous': + slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset; + if (_.slideCount > _.options.slidesToShow) { + _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate); + } + break; + + case 'next': + slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset; + if (_.slideCount > _.options.slidesToShow) { + _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate); + } + break; + + case 'index': + var index = event.data.index === 0 ? 0 : + event.data.index || $target.index() * _.options.slidesToScroll; + + _.slideHandler(_.checkNavigable(index), false, dontAnimate); + $target.children().trigger('focus'); + break; + + default: + return; + } + + }; + + Slick.prototype.checkNavigable = function(index) { + + var _ = this, + navigables, prevNavigable; + + navigables = _.getNavigableIndexes(); + prevNavigable = 0; + if (index > navigables[navigables.length - 1]) { + index = navigables[navigables.length - 1]; + } else { + for (var n in navigables) { + if (index < navigables[n]) { + index = prevNavigable; + break; + } + prevNavigable = navigables[n]; + } + } + + return index; + }; + + Slick.prototype.cleanUpEvents = function() { + + var _ = this; + + if (_.options.dots && _.$dots !== null) { + + $('li', _.$dots) + .off('click.slick', _.changeSlide) + .off('mouseenter.slick', $.proxy(_.interrupt, _, true)) + .off('mouseleave.slick', $.proxy(_.interrupt, _, false)); + + if (_.options.accessibility === true) { + _.$dots.off('keydown.slick', _.keyHandler); + } + } + + _.$slider.off('focus.slick blur.slick'); + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide); + _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide); + + if (_.options.accessibility === true) { + _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler); + _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler); + } + } + + _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler); + _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler); + _.$list.off('touchend.slick mouseup.slick', _.swipeHandler); + _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler); + + _.$list.off('click.slick', _.clickHandler); + + $(document).off(_.visibilityChange, _.visibility); + + _.cleanUpSlideEvents(); + + if (_.options.accessibility === true) { + _.$list.off('keydown.slick', _.keyHandler); + } + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().off('click.slick', _.selectHandler); + } + + $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange); + + $(window).off('resize.slick.slick-' + _.instanceUid, _.resize); + + $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault); + + $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition); + + }; + + Slick.prototype.cleanUpSlideEvents = function() { + + var _ = this; + + _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true)); + _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false)); + + }; + + Slick.prototype.cleanUpRows = function() { + + var _ = this, originalSlides; + + if(_.options.rows > 0) { + originalSlides = _.$slides.children().children(); + originalSlides.removeAttr('style'); + _.$slider.empty().append(originalSlides); + } + + }; + + Slick.prototype.clickHandler = function(event) { + + var _ = this; + + if (_.shouldClick === false) { + event.stopImmediatePropagation(); + event.stopPropagation(); + event.preventDefault(); + } + + }; + + Slick.prototype.destroy = function(refresh) { + + var _ = this; + + _.autoPlayClear(); + + _.touchObject = {}; + + _.cleanUpEvents(); + + $('.slick-cloned', _.$slider).detach(); + + if (_.$dots) { + _.$dots.remove(); + } + + if ( _.$prevArrow && _.$prevArrow.length ) { + + _.$prevArrow + .removeClass('slick-disabled slick-arrow slick-hidden') + .removeAttr('aria-hidden aria-disabled tabindex') + .css('display',''); + + if ( _.htmlExpr.test( _.options.prevArrow )) { + _.$prevArrow.remove(); + } + } + + if ( _.$nextArrow && _.$nextArrow.length ) { + + _.$nextArrow + .removeClass('slick-disabled slick-arrow slick-hidden') + .removeAttr('aria-hidden aria-disabled tabindex') + .css('display',''); + + if ( _.htmlExpr.test( _.options.nextArrow )) { + _.$nextArrow.remove(); + } + } + + + if (_.$slides) { + + _.$slides + .removeClass('slick-slide slick-active slick-center slick-visible slick-current') + .removeAttr('aria-hidden') + .removeAttr('data-slick-index') + .each(function(){ + $(this).attr('style', $(this).data('originalStyling')); + }); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slideTrack.detach(); + + _.$list.detach(); + + _.$slider.append(_.$slides); + } + + _.cleanUpRows(); + + _.$slider.removeClass('slick-slider'); + _.$slider.removeClass('slick-initialized'); + _.$slider.removeClass('slick-dotted'); + + _.unslicked = true; + + if(!refresh) { + _.$slider.trigger('destroy', [_]); + } + + }; + + Slick.prototype.disableTransition = function(slide) { + + var _ = this, + transition = {}; + + transition[_.transitionType] = ''; + + if (_.options.fade === false) { + _.$slideTrack.css(transition); + } else { + _.$slides.eq(slide).css(transition); + } + + }; + + Slick.prototype.fadeSlide = function(slideIndex, callback) { + + var _ = this; + + if (_.cssTransitions === false) { + + _.$slides.eq(slideIndex).css({ + zIndex: _.options.zIndex + }); + + _.$slides.eq(slideIndex).animate({ + opacity: 1 + }, _.options.speed, _.options.easing, callback); + + } else { + + _.applyTransition(slideIndex); + + _.$slides.eq(slideIndex).css({ + opacity: 1, + zIndex: _.options.zIndex + }); + + if (callback) { + setTimeout(function() { + + _.disableTransition(slideIndex); + + callback.call(); + }, _.options.speed); + } + + } + + }; + + Slick.prototype.fadeSlideOut = function(slideIndex) { + + var _ = this; + + if (_.cssTransitions === false) { + + _.$slides.eq(slideIndex).animate({ + opacity: 0, + zIndex: _.options.zIndex - 2 + }, _.options.speed, _.options.easing); + + } else { + + _.applyTransition(slideIndex); + + _.$slides.eq(slideIndex).css({ + opacity: 0, + zIndex: _.options.zIndex - 2 + }); + + } + + }; + + Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) { + + var _ = this; + + if (filter !== null) { + + _.$slidesCache = _.$slides; + + _.unload(); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slidesCache.filter(filter).appendTo(_.$slideTrack); + + _.reinit(); + + } + + }; + + Slick.prototype.focusHandler = function() { + + var _ = this; + + _.$slider + .off('focus.slick blur.slick') + .on('focus.slick blur.slick', '*', function(event) { + + event.stopImmediatePropagation(); + var $sf = $(this); + + setTimeout(function() { + + if( _.options.pauseOnFocus ) { + _.focussed = $sf.is(':focus'); + _.autoPlay(); + } + + }, 0); + + }); + }; + + Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() { + + var _ = this; + return _.currentSlide; + + }; + + Slick.prototype.getDotCount = function() { + + var _ = this; + + var breakPoint = 0; + var counter = 0; + var pagerQty = 0; + + if (_.options.infinite === true) { + if (_.slideCount <= _.options.slidesToShow) { + ++pagerQty; + } else { + while (breakPoint < _.slideCount) { + ++pagerQty; + breakPoint = counter + _.options.slidesToScroll; + counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; + } + } + } else if (_.options.centerMode === true) { + pagerQty = _.slideCount; + } else if(!_.options.asNavFor) { + pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll); + }else { + while (breakPoint < _.slideCount) { + ++pagerQty; + breakPoint = counter + _.options.slidesToScroll; + counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; + } + } + + return pagerQty - 1; + + }; + + Slick.prototype.getLeft = function(slideIndex) { + + var _ = this, + targetLeft, + verticalHeight, + verticalOffset = 0, + targetSlide, + coef; + + _.slideOffset = 0; + verticalHeight = _.$slides.first().outerHeight(true); + + if (_.options.infinite === true) { + if (_.slideCount > _.options.slidesToShow) { + _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1; + coef = -1 + + if (_.options.vertical === true && _.options.centerMode === true) { + if (_.options.slidesToShow === 2) { + coef = -1.5; + } else if (_.options.slidesToShow === 1) { + coef = -2 + } + } + verticalOffset = (verticalHeight * _.options.slidesToShow) * coef; + } + if (_.slideCount % _.options.slidesToScroll !== 0) { + if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) { + if (slideIndex > _.slideCount) { + _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1; + verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1; + } else { + _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1; + verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1; + } + } + } + } else { + if (slideIndex + _.options.slidesToShow > _.slideCount) { + _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth; + verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight; + } + } + + if (_.slideCount <= _.options.slidesToShow) { + _.slideOffset = 0; + verticalOffset = 0; + } + + if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) { + _.slideOffset = ((_.slideWidth * Math.floor(_.options.slidesToShow)) / 2) - ((_.slideWidth * _.slideCount) / 2); + } else if (_.options.centerMode === true && _.options.infinite === true) { + _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth; + } else if (_.options.centerMode === true) { + _.slideOffset = 0; + _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2); + } + + if (_.options.vertical === false) { + targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset; + } else { + targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset; + } + + if (_.options.variableWidth === true) { + + if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); + } else { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow); + } + + if (_.options.rtl === true) { + if (targetSlide[0]) { + targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; + } else { + targetLeft = 0; + } + } else { + targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; + } + + if (_.options.centerMode === true) { + if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); + } else { + targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1); + } + + if (_.options.rtl === true) { + if (targetSlide[0]) { + targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; + } else { + targetLeft = 0; + } + } else { + targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; + } + + targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2; + } + } + + return targetLeft; + + }; + + Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) { + + var _ = this; + + return _.options[option]; + + }; + + Slick.prototype.getNavigableIndexes = function() { + + var _ = this, + breakPoint = 0, + counter = 0, + indexes = [], + max; + + if (_.options.infinite === false) { + max = _.slideCount; + } else { + breakPoint = _.options.slidesToScroll * -1; + counter = _.options.slidesToScroll * -1; + max = _.slideCount * 2; + } + + while (breakPoint < max) { + indexes.push(breakPoint); + breakPoint = counter + _.options.slidesToScroll; + counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; + } + + return indexes; + + }; + + Slick.prototype.getSlick = function() { + + return this; + + }; + + Slick.prototype.getSlideCount = function() { + + var _ = this, + slidesTraversed, swipedSlide, centerOffset; + + centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0; + + if (_.options.swipeToSlide === true) { + _.$slideTrack.find('.slick-slide').each(function(index, slide) { + if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) { + swipedSlide = slide; + return false; + } + }); + + slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1; + + return slidesTraversed; + + } else { + return _.options.slidesToScroll; + } + + }; + + Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) { + + var _ = this; + + _.changeSlide({ + data: { + message: 'index', + index: parseInt(slide) + } + }, dontAnimate); + + }; + + Slick.prototype.init = function(creation) { + + var _ = this; + + if (!$(_.$slider).hasClass('slick-initialized')) { + + $(_.$slider).addClass('slick-initialized'); + + _.buildRows(); + _.buildOut(); + _.setProps(); + _.startLoad(); + _.loadSlider(); + _.initializeEvents(); + _.updateArrows(); + _.updateDots(); + _.checkResponsive(true); + _.focusHandler(); + + } + + if (creation) { + _.$slider.trigger('init', [_]); + } + + if (_.options.accessibility === true) { + _.initADA(); + } + + if ( _.options.autoplay ) { + + _.paused = false; + _.autoPlay(); + + } + + }; + + Slick.prototype.initADA = function() { + var _ = this, + numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow), + tabControlIndexes = _.getNavigableIndexes().filter(function(val) { + return (val >= 0) && (val < _.slideCount); + }); + + _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({ + 'aria-hidden': 'true', + 'tabindex': '-1' + }).find('a, input, button, select').attr({ + 'tabindex': '-1' + }); + + if (_.$dots !== null) { + _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function(i) { + var slideControlIndex = tabControlIndexes.indexOf(i); + + $(this).attr({ + 'role': 'tabpanel', + 'id': 'slick-slide' + _.instanceUid + i, + 'tabindex': -1 + }); + + if (slideControlIndex !== -1) { + var ariaButtonControl = 'slick-slide-control' + _.instanceUid + slideControlIndex + if ($('#' + ariaButtonControl).length) { + $(this).attr({ + 'aria-describedby': ariaButtonControl + }); + } + } + }); + + _.$dots.attr('role', 'tablist').find('li').each(function(i) { + var mappedSlideIndex = tabControlIndexes[i]; + + $(this).attr({ + 'role': 'presentation' + }); + + $(this).find('button').first().attr({ + 'role': 'tab', + 'id': 'slick-slide-control' + _.instanceUid + i, + 'aria-controls': 'slick-slide' + _.instanceUid + mappedSlideIndex, + 'aria-label': (i + 1) + ' of ' + numDotGroups, + 'aria-selected': null, + 'tabindex': '-1' + }); + + }).eq(_.currentSlide).find('button').attr({ + 'aria-selected': 'true', + 'tabindex': '0' + }).end(); + } + + for (var i=_.currentSlide, max=i+_.options.slidesToShow; i < max; i++) { + if (_.options.focusOnChange) { + _.$slides.eq(i).attr({'tabindex': '0'}); + } else { + _.$slides.eq(i).removeAttr('tabindex'); + } + } + + _.activateADA(); + + }; + + Slick.prototype.initArrowEvents = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + _.$prevArrow + .off('click.slick') + .on('click.slick', { + message: 'previous' + }, _.changeSlide); + _.$nextArrow + .off('click.slick') + .on('click.slick', { + message: 'next' + }, _.changeSlide); + + if (_.options.accessibility === true) { + _.$prevArrow.on('keydown.slick', _.keyHandler); + _.$nextArrow.on('keydown.slick', _.keyHandler); + } + } + + }; + + Slick.prototype.initDotEvents = function() { + + var _ = this; + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + $('li', _.$dots).on('click.slick', { + message: 'index' + }, _.changeSlide); + + if (_.options.accessibility === true) { + _.$dots.on('keydown.slick', _.keyHandler); + } + } + + if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) { + + $('li', _.$dots) + .on('mouseenter.slick', $.proxy(_.interrupt, _, true)) + .on('mouseleave.slick', $.proxy(_.interrupt, _, false)); + + } + + }; + + Slick.prototype.initSlideEvents = function() { + + var _ = this; + + if ( _.options.pauseOnHover ) { + + _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true)); + _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false)); + + } + + }; + + Slick.prototype.initializeEvents = function() { + + var _ = this; + + _.initArrowEvents(); + + _.initDotEvents(); + _.initSlideEvents(); + + _.$list.on('touchstart.slick mousedown.slick', { + action: 'start' + }, _.swipeHandler); + _.$list.on('touchmove.slick mousemove.slick', { + action: 'move' + }, _.swipeHandler); + _.$list.on('touchend.slick mouseup.slick', { + action: 'end' + }, _.swipeHandler); + _.$list.on('touchcancel.slick mouseleave.slick', { + action: 'end' + }, _.swipeHandler); + + _.$list.on('click.slick', _.clickHandler); + + $(document).on(_.visibilityChange, $.proxy(_.visibility, _)); + + if (_.options.accessibility === true) { + _.$list.on('keydown.slick', _.keyHandler); + } + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().on('click.slick', _.selectHandler); + } + + $(window).on('orientationchange.slick.slick-' + _.instanceUid, $.proxy(_.orientationChange, _)); + + $(window).on('resize.slick.slick-' + _.instanceUid, $.proxy(_.resize, _)); + + $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault); + + $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition); + $(_.setPosition); + + }; + + Slick.prototype.initUI = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + + _.$prevArrow.show(); + _.$nextArrow.show(); + + } + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + _.$dots.show(); + + } + + }; + + Slick.prototype.keyHandler = function(event) { + + var _ = this; + //Dont slide if the cursor is inside the form fields and arrow keys are pressed + if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) { + if (event.keyCode === 37 && _.options.accessibility === true) { + _.changeSlide({ + data: { + message: _.options.rtl === true ? 'next' : 'previous' + } + }); + } else if (event.keyCode === 39 && _.options.accessibility === true) { + _.changeSlide({ + data: { + message: _.options.rtl === true ? 'previous' : 'next' + } + }); + } + } + + }; + + Slick.prototype.lazyLoad = function() { + + var _ = this, + loadRange, cloneRange, rangeStart, rangeEnd; + + function loadImages(imagesScope) { + + $('img[data-lazy]', imagesScope).each(function() { + + var image = $(this), + imageSource = $(this).attr('data-lazy'), + imageSrcSet = $(this).attr('data-srcset'), + imageSizes = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'), + imageToLoad = document.createElement('img'); + + imageToLoad.onload = function() { + + image + .animate({ opacity: 0 }, 100, function() { + + if (imageSrcSet) { + image + .attr('srcset', imageSrcSet ); + + if (imageSizes) { + image + .attr('sizes', imageSizes ); + } + } + + image + .attr('src', imageSource) + .animate({ opacity: 1 }, 200, function() { + image + .removeAttr('data-lazy data-srcset data-sizes') + .removeClass('slick-loading'); + }); + _.$slider.trigger('lazyLoaded', [_, image, imageSource]); + }); + + }; + + imageToLoad.onerror = function() { + + image + .removeAttr( 'data-lazy' ) + .removeClass( 'slick-loading' ) + .addClass( 'slick-lazyload-error' ); + + _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]); + + }; + + imageToLoad.src = imageSource; + + }); + + } + + if (_.options.centerMode === true) { + if (_.options.infinite === true) { + rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1); + rangeEnd = rangeStart + _.options.slidesToShow + 2; + } else { + rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1)); + rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide; + } + } else { + rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide; + rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow); + if (_.options.fade === true) { + if (rangeStart > 0) rangeStart--; + if (rangeEnd <= _.slideCount) rangeEnd++; + } + } + + loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd); + + if (_.options.lazyLoad === 'anticipated') { + var prevSlide = rangeStart - 1, + nextSlide = rangeEnd, + $slides = _.$slider.find('.slick-slide'); + + for (var i = 0; i < _.options.slidesToScroll; i++) { + if (prevSlide < 0) prevSlide = _.slideCount - 1; + loadRange = loadRange.add($slides.eq(prevSlide)); + loadRange = loadRange.add($slides.eq(nextSlide)); + prevSlide--; + nextSlide++; + } + } + + loadImages(loadRange); + + if (_.slideCount <= _.options.slidesToShow) { + cloneRange = _.$slider.find('.slick-slide'); + loadImages(cloneRange); + } else + if (_.currentSlide >= _.slideCount - _.options.slidesToShow) { + cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow); + loadImages(cloneRange); + } else if (_.currentSlide === 0) { + cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1); + loadImages(cloneRange); + } + + }; + + Slick.prototype.loadSlider = function() { + + var _ = this; + + _.setPosition(); + + _.$slideTrack.css({ + opacity: 1 + }); + + _.$slider.removeClass('slick-loading'); + + _.initUI(); + + if (_.options.lazyLoad === 'progressive') { + _.progressiveLazyLoad(); + } + + }; + + Slick.prototype.next = Slick.prototype.slickNext = function() { + + var _ = this; + + _.changeSlide({ + data: { + message: 'next' + } + }); + + }; + + Slick.prototype.orientationChange = function() { + + var _ = this; + + _.checkResponsive(); + _.setPosition(); + + }; + + Slick.prototype.pause = Slick.prototype.slickPause = function() { + + var _ = this; + + _.autoPlayClear(); + _.paused = true; + + }; + + Slick.prototype.play = Slick.prototype.slickPlay = function() { + + var _ = this; + + _.autoPlay(); + _.options.autoplay = true; + _.paused = false; + _.focussed = false; + _.interrupted = false; + + }; + + Slick.prototype.postSlide = function(index) { + + var _ = this; + + if( !_.unslicked ) { + + _.$slider.trigger('afterChange', [_, index]); + + _.animating = false; + + if (_.slideCount > _.options.slidesToShow) { + _.setPosition(); + } + + _.swipeLeft = null; + + if ( _.options.autoplay ) { + _.autoPlay(); + } + + if (_.options.accessibility === true) { + _.initADA(); + + if (_.options.focusOnChange) { + var $currentSlide = $(_.$slides.get(_.currentSlide)); + $currentSlide.attr('tabindex', 0).focus(); + } + } + + } + + }; + + Slick.prototype.prev = Slick.prototype.slickPrev = function() { + + var _ = this; + + _.changeSlide({ + data: { + message: 'previous' + } + }); + + }; + + Slick.prototype.preventDefault = function(event) { + + event.preventDefault(); + + }; + + Slick.prototype.progressiveLazyLoad = function( tryCount ) { + + tryCount = tryCount || 1; + + var _ = this, + $imgsToLoad = $( 'img[data-lazy]', _.$slider ), + image, + imageSource, + imageSrcSet, + imageSizes, + imageToLoad; + + if ( $imgsToLoad.length ) { + + image = $imgsToLoad.first(); + imageSource = image.attr('data-lazy'); + imageSrcSet = image.attr('data-srcset'); + imageSizes = image.attr('data-sizes') || _.$slider.attr('data-sizes'); + imageToLoad = document.createElement('img'); + + imageToLoad.onload = function() { + + if (imageSrcSet) { + image + .attr('srcset', imageSrcSet ); + + if (imageSizes) { + image + .attr('sizes', imageSizes ); + } + } + + image + .attr( 'src', imageSource ) + .removeAttr('data-lazy data-srcset data-sizes') + .removeClass('slick-loading'); + + if ( _.options.adaptiveHeight === true ) { + _.setPosition(); + } + + _.$slider.trigger('lazyLoaded', [ _, image, imageSource ]); + _.progressiveLazyLoad(); + + }; + + imageToLoad.onerror = function() { + + if ( tryCount < 3 ) { + + /** + * try to load the image 3 times, + * leave a slight delay so we don't get + * servers blocking the request. + */ + setTimeout( function() { + _.progressiveLazyLoad( tryCount + 1 ); + }, 500 ); + + } else { + + image + .removeAttr( 'data-lazy' ) + .removeClass( 'slick-loading' ) + .addClass( 'slick-lazyload-error' ); + + _.$slider.trigger('lazyLoadError', [ _, image, imageSource ]); + + _.progressiveLazyLoad(); + + } + + }; + + imageToLoad.src = imageSource; + + } else { + + _.$slider.trigger('allImagesLoaded', [ _ ]); + + } + + }; + + Slick.prototype.refresh = function( initializing ) { + + var _ = this, currentSlide, lastVisibleIndex; + + lastVisibleIndex = _.slideCount - _.options.slidesToShow; + + // in non-infinite sliders, we don't want to go past the + // last visible index. + if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) { + _.currentSlide = lastVisibleIndex; + } + + // if less slides than to show, go to start. + if ( _.slideCount <= _.options.slidesToShow ) { + _.currentSlide = 0; + + } + + currentSlide = _.currentSlide; + + _.destroy(true); + + $.extend(_, _.initials, { currentSlide: currentSlide }); + + _.init(); + + if( !initializing ) { + + _.changeSlide({ + data: { + message: 'index', + index: currentSlide + } + }, false); + + } + + }; + + Slick.prototype.registerBreakpoints = function() { + + var _ = this, breakpoint, currentBreakpoint, l, + responsiveSettings = _.options.responsive || null; + + if ( $.type(responsiveSettings) === 'array' && responsiveSettings.length ) { + + _.respondTo = _.options.respondTo || 'window'; + + for ( breakpoint in responsiveSettings ) { + + l = _.breakpoints.length-1; + + if (responsiveSettings.hasOwnProperty(breakpoint)) { + currentBreakpoint = responsiveSettings[breakpoint].breakpoint; + + // loop through the breakpoints and cut out any existing + // ones with the same breakpoint number, we don't want dupes. + while( l >= 0 ) { + if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) { + _.breakpoints.splice(l,1); + } + l--; + } + + _.breakpoints.push(currentBreakpoint); + _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings; + + } + + } + + _.breakpoints.sort(function(a, b) { + return ( _.options.mobileFirst ) ? a-b : b-a; + }); + + } + + }; + + Slick.prototype.reinit = function() { + + var _ = this; + + _.$slides = + _.$slideTrack + .children(_.options.slide) + .addClass('slick-slide'); + + _.slideCount = _.$slides.length; + + if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) { + _.currentSlide = _.currentSlide - _.options.slidesToScroll; + } + + if (_.slideCount <= _.options.slidesToShow) { + _.currentSlide = 0; + } + + _.registerBreakpoints(); + + _.setProps(); + _.setupInfinite(); + _.buildArrows(); + _.updateArrows(); + _.initArrowEvents(); + _.buildDots(); + _.updateDots(); + _.initDotEvents(); + _.cleanUpSlideEvents(); + _.initSlideEvents(); + + _.checkResponsive(false, true); + + if (_.options.focusOnSelect === true) { + $(_.$slideTrack).children().on('click.slick', _.selectHandler); + } + + _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); + + _.setPosition(); + _.focusHandler(); + + _.paused = !_.options.autoplay; + _.autoPlay(); + + _.$slider.trigger('reInit', [_]); + + }; + + Slick.prototype.resize = function() { + + var _ = this; + + if ($(window).width() !== _.windowWidth) { + clearTimeout(_.windowDelay); + _.windowDelay = window.setTimeout(function() { + _.windowWidth = $(window).width(); + _.checkResponsive(); + if( !_.unslicked ) { _.setPosition(); } + }, 50); + } + }; + + Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) { + + var _ = this; + + if (typeof(index) === 'boolean') { + removeBefore = index; + index = removeBefore === true ? 0 : _.slideCount - 1; + } else { + index = removeBefore === true ? --index : index; + } + + if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) { + return false; + } + + _.unload(); + + if (removeAll === true) { + _.$slideTrack.children().remove(); + } else { + _.$slideTrack.children(this.options.slide).eq(index).remove(); + } + + _.$slides = _.$slideTrack.children(this.options.slide); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slideTrack.append(_.$slides); + + _.$slidesCache = _.$slides; + + _.reinit(); + + }; + + Slick.prototype.setCSS = function(position) { + + var _ = this, + positionProps = {}, + x, y; + + if (_.options.rtl === true) { + position = -position; + } + x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px'; + y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px'; + + positionProps[_.positionProp] = position; + + if (_.transformsEnabled === false) { + _.$slideTrack.css(positionProps); + } else { + positionProps = {}; + if (_.cssTransitions === false) { + positionProps[_.animType] = 'translate(' + x + ', ' + y + ')'; + _.$slideTrack.css(positionProps); + } else { + positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)'; + _.$slideTrack.css(positionProps); + } + } + + }; + + Slick.prototype.setDimensions = function() { + + var _ = this; + + if (_.options.vertical === false) { + if (_.options.centerMode === true) { + _.$list.css({ + padding: ('0px ' + _.options.centerPadding) + }); + } + } else { + _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow); + if (_.options.centerMode === true) { + _.$list.css({ + padding: (_.options.centerPadding + ' 0px') + }); + } + } + + _.listWidth = _.$list.width(); + _.listHeight = _.$list.height(); + + + if (_.options.vertical === false && _.options.variableWidth === false) { + _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow); + _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length))); + + } else if (_.options.variableWidth === true) { + _.$slideTrack.width(5000 * _.slideCount); + } else { + _.slideWidth = Math.ceil(_.listWidth); + _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length))); + } + + var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width(); + if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset); + + }; + + Slick.prototype.setFade = function() { + + var _ = this, + targetLeft; + + _.$slides.each(function(index, element) { + targetLeft = (_.slideWidth * index) * -1; + if (_.options.rtl === true) { + $(element).css({ + position: 'relative', + right: targetLeft, + top: 0, + zIndex: _.options.zIndex - 2, + opacity: 0 + }); + } else { + $(element).css({ + position: 'relative', + left: targetLeft, + top: 0, + zIndex: _.options.zIndex - 2, + opacity: 0 + }); + } + }); + + _.$slides.eq(_.currentSlide).css({ + zIndex: _.options.zIndex - 1, + opacity: 1 + }); + + }; + + Slick.prototype.setHeight = function() { + + var _ = this; + + if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { + var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); + _.$list.css('height', targetHeight); + } + + }; + + Slick.prototype.setOption = + Slick.prototype.slickSetOption = function() { + + /** + * accepts arguments in format of: + * + * - for changing a single option's value: + * .slick("setOption", option, value, refresh ) + * + * - for changing a set of responsive options: + * .slick("setOption", 'responsive', [{}, ...], refresh ) + * + * - for updating multiple values at once (not responsive) + * .slick("setOption", { 'option': value, ... }, refresh ) + */ + + var _ = this, l, item, option, value, refresh = false, type; + + if( $.type( arguments[0] ) === 'object' ) { + + option = arguments[0]; + refresh = arguments[1]; + type = 'multiple'; + + } else if ( $.type( arguments[0] ) === 'string' ) { + + option = arguments[0]; + value = arguments[1]; + refresh = arguments[2]; + + if ( arguments[0] === 'responsive' && $.type( arguments[1] ) === 'array' ) { + + type = 'responsive'; + + } else if ( typeof arguments[1] !== 'undefined' ) { + + type = 'single'; + + } + + } + + if ( type === 'single' ) { + + _.options[option] = value; + + + } else if ( type === 'multiple' ) { + + $.each( option , function( opt, val ) { + + _.options[opt] = val; + + }); + + + } else if ( type === 'responsive' ) { + + for ( item in value ) { + + if( $.type( _.options.responsive ) !== 'array' ) { + + _.options.responsive = [ value[item] ]; + + } else { + + l = _.options.responsive.length-1; + + // loop through the responsive object and splice out duplicates. + while( l >= 0 ) { + + if( _.options.responsive[l].breakpoint === value[item].breakpoint ) { + + _.options.responsive.splice(l,1); + + } + + l--; + + } + + _.options.responsive.push( value[item] ); + + } + + } + + } + + if ( refresh ) { + + _.unload(); + _.reinit(); + + } + + }; + + Slick.prototype.setPosition = function() { + + var _ = this; + + _.setDimensions(); + + _.setHeight(); + + if (_.options.fade === false) { + _.setCSS(_.getLeft(_.currentSlide)); + } else { + _.setFade(); + } + + _.$slider.trigger('setPosition', [_]); + + }; + + Slick.prototype.setProps = function() { + + var _ = this, + bodyStyle = document.body.style; + + _.positionProp = _.options.vertical === true ? 'top' : 'left'; + + if (_.positionProp === 'top') { + _.$slider.addClass('slick-vertical'); + } else { + _.$slider.removeClass('slick-vertical'); + } + + if (bodyStyle.WebkitTransition !== undefined || + bodyStyle.MozTransition !== undefined || + bodyStyle.msTransition !== undefined) { + if (_.options.useCSS === true) { + _.cssTransitions = true; + } + } + + if ( _.options.fade ) { + if ( typeof _.options.zIndex === 'number' ) { + if( _.options.zIndex < 3 ) { + _.options.zIndex = 3; + } + } else { + _.options.zIndex = _.defaults.zIndex; + } + } + + if (bodyStyle.OTransform !== undefined) { + _.animType = 'OTransform'; + _.transformType = '-o-transform'; + _.transitionType = 'OTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; + } + if (bodyStyle.MozTransform !== undefined) { + _.animType = 'MozTransform'; + _.transformType = '-moz-transform'; + _.transitionType = 'MozTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false; + } + if (bodyStyle.webkitTransform !== undefined) { + _.animType = 'webkitTransform'; + _.transformType = '-webkit-transform'; + _.transitionType = 'webkitTransition'; + if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; + } + if (bodyStyle.msTransform !== undefined) { + _.animType = 'msTransform'; + _.transformType = '-ms-transform'; + _.transitionType = 'msTransition'; + if (bodyStyle.msTransform === undefined) _.animType = false; + } + if (bodyStyle.transform !== undefined && _.animType !== false) { + _.animType = 'transform'; + _.transformType = 'transform'; + _.transitionType = 'transition'; + } + _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false); + }; + + + Slick.prototype.setSlideClasses = function(index) { + + var _ = this, + centerOffset, allSlides, indexOffset, remainder; + + allSlides = _.$slider + .find('.slick-slide') + .removeClass('slick-active slick-center slick-current') + .attr('aria-hidden', 'true'); + + _.$slides + .eq(index) + .addClass('slick-current'); + + if (_.options.centerMode === true) { + + var evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0; + + centerOffset = Math.floor(_.options.slidesToShow / 2); + + if (_.options.infinite === true) { + + if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) { + _.$slides + .slice(index - centerOffset + evenCoef, index + centerOffset + 1) + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } else { + + indexOffset = _.options.slidesToShow + index; + allSlides + .slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2) + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } + + if (index === 0) { + + allSlides + .eq(allSlides.length - 1 - _.options.slidesToShow) + .addClass('slick-center'); + + } else if (index === _.slideCount - 1) { + + allSlides + .eq(_.options.slidesToShow) + .addClass('slick-center'); + + } + + } + + _.$slides + .eq(index) + .addClass('slick-center'); + + } else { + + if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) { + + _.$slides + .slice(index, index + _.options.slidesToShow) + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } else if (allSlides.length <= _.options.slidesToShow) { + + allSlides + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } else { + + remainder = _.slideCount % _.options.slidesToShow; + indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index; + + if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) { + + allSlides + .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder) + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } else { + + allSlides + .slice(indexOffset, indexOffset + _.options.slidesToShow) + .addClass('slick-active') + .attr('aria-hidden', 'false'); + + } + + } + + } + + if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') { + _.lazyLoad(); + } + }; + + Slick.prototype.setupInfinite = function() { + + var _ = this, + i, slideIndex, infiniteCount; + + if (_.options.fade === true) { + _.options.centerMode = false; + } + + if (_.options.infinite === true && _.options.fade === false) { + + slideIndex = null; + + if (_.slideCount > _.options.slidesToShow) { + + if (_.options.centerMode === true) { + infiniteCount = _.options.slidesToShow + 1; + } else { + infiniteCount = _.options.slidesToShow; + } + + for (i = _.slideCount; i > (_.slideCount - + infiniteCount); i -= 1) { + slideIndex = i - 1; + $(_.$slides[slideIndex]).clone(true).attr('id', '') + .attr('data-slick-index', slideIndex - _.slideCount) + .prependTo(_.$slideTrack).addClass('slick-cloned'); + } + for (i = 0; i < infiniteCount + _.slideCount; i += 1) { + slideIndex = i; + $(_.$slides[slideIndex]).clone(true).attr('id', '') + .attr('data-slick-index', slideIndex + _.slideCount) + .appendTo(_.$slideTrack).addClass('slick-cloned'); + } + _.$slideTrack.find('.slick-cloned').find('[id]').each(function() { + $(this).attr('id', ''); + }); + + } + + } + + }; + + Slick.prototype.interrupt = function( toggle ) { + + var _ = this; + + if( !toggle ) { + _.autoPlay(); + } + _.interrupted = toggle; + + }; + + Slick.prototype.selectHandler = function(event) { + + var _ = this; + + var targetElement = + $(event.target).is('.slick-slide') ? + $(event.target) : + $(event.target).parents('.slick-slide'); + + var index = parseInt(targetElement.attr('data-slick-index')); + + if (!index) index = 0; + + if (_.slideCount <= _.options.slidesToShow) { + + _.slideHandler(index, false, true); + return; + + } + + _.slideHandler(index); + + }; + + Slick.prototype.slideHandler = function(index, sync, dontAnimate) { + + var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null, + _ = this, navTarget; + + sync = sync || false; + + if (_.animating === true && _.options.waitForAnimate === true) { + return; + } + + if (_.options.fade === true && _.currentSlide === index) { + return; + } + + if (sync === false) { + _.asNavFor(index); + } + + targetSlide = index; + targetLeft = _.getLeft(targetSlide); + slideLeft = _.getLeft(_.currentSlide); + + _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft; + + if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) { + if (_.options.fade === false) { + targetSlide = _.currentSlide; + if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { + _.animateSlide(slideLeft, function() { + _.postSlide(targetSlide); + }); + } else { + _.postSlide(targetSlide); + } + } + return; + } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) { + if (_.options.fade === false) { + targetSlide = _.currentSlide; + if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { + _.animateSlide(slideLeft, function() { + _.postSlide(targetSlide); + }); + } else { + _.postSlide(targetSlide); + } + } + return; + } + + if ( _.options.autoplay ) { + clearInterval(_.autoPlayTimer); + } + + if (targetSlide < 0) { + if (_.slideCount % _.options.slidesToScroll !== 0) { + animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll); + } else { + animSlide = _.slideCount + targetSlide; + } + } else if (targetSlide >= _.slideCount) { + if (_.slideCount % _.options.slidesToScroll !== 0) { + animSlide = 0; + } else { + animSlide = targetSlide - _.slideCount; + } + } else { + animSlide = targetSlide; + } + + _.animating = true; + + _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]); + + oldSlide = _.currentSlide; + _.currentSlide = animSlide; + + _.setSlideClasses(_.currentSlide); + + if ( _.options.asNavFor ) { + + navTarget = _.getNavTarget(); + navTarget = navTarget.slick('getSlick'); + + if ( navTarget.slideCount <= navTarget.options.slidesToShow ) { + navTarget.setSlideClasses(_.currentSlide); + } + + } + + _.updateDots(); + _.updateArrows(); + + if (_.options.fade === true) { + if (dontAnimate !== true) { + + _.fadeSlideOut(oldSlide); + + _.fadeSlide(animSlide, function() { + _.postSlide(animSlide); + }); + + } else { + _.postSlide(animSlide); + } + _.animateHeight(); + return; + } + + if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { + _.animateSlide(targetLeft, function() { + _.postSlide(animSlide); + }); + } else { + _.postSlide(animSlide); + } + + }; + + Slick.prototype.startLoad = function() { + + var _ = this; + + if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { + + _.$prevArrow.hide(); + _.$nextArrow.hide(); + + } + + if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { + + _.$dots.hide(); + + } + + _.$slider.addClass('slick-loading'); + + }; + + Slick.prototype.swipeDirection = function() { + + var xDist, yDist, r, swipeAngle, _ = this; + + xDist = _.touchObject.startX - _.touchObject.curX; + yDist = _.touchObject.startY - _.touchObject.curY; + r = Math.atan2(yDist, xDist); + + swipeAngle = Math.round(r * 180 / Math.PI); + if (swipeAngle < 0) { + swipeAngle = 360 - Math.abs(swipeAngle); + } + + if ((swipeAngle <= 45) && (swipeAngle >= 0)) { + return (_.options.rtl === false ? 'left' : 'right'); + } + if ((swipeAngle <= 360) && (swipeAngle >= 315)) { + return (_.options.rtl === false ? 'left' : 'right'); + } + if ((swipeAngle >= 135) && (swipeAngle <= 225)) { + return (_.options.rtl === false ? 'right' : 'left'); + } + if (_.options.verticalSwiping === true) { + if ((swipeAngle >= 35) && (swipeAngle <= 135)) { + return 'down'; + } else { + return 'up'; + } + } + + return 'vertical'; + + }; + + Slick.prototype.swipeEnd = function(event) { + + var _ = this, + slideCount, + direction; + + _.dragging = false; + _.swiping = false; + + if (_.scrolling) { + _.scrolling = false; + return false; + } + + _.interrupted = false; + _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true; + + if ( _.touchObject.curX === undefined ) { + return false; + } + + if ( _.touchObject.edgeHit === true ) { + _.$slider.trigger('edge', [_, _.swipeDirection() ]); + } + + if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) { + + direction = _.swipeDirection(); + + switch ( direction ) { + + case 'left': + case 'down': + + slideCount = + _.options.swipeToSlide ? + _.checkNavigable( _.currentSlide + _.getSlideCount() ) : + _.currentSlide + _.getSlideCount(); + + _.currentDirection = 0; + + break; + + case 'right': + case 'up': + + slideCount = + _.options.swipeToSlide ? + _.checkNavigable( _.currentSlide - _.getSlideCount() ) : + _.currentSlide - _.getSlideCount(); + + _.currentDirection = 1; + + break; + + default: + + + } + + if( direction != 'vertical' ) { + + _.slideHandler( slideCount ); + _.touchObject = {}; + _.$slider.trigger('swipe', [_, direction ]); + + } + + } else { + + if ( _.touchObject.startX !== _.touchObject.curX ) { + + _.slideHandler( _.currentSlide ); + _.touchObject = {}; + + } + + } + + }; + + Slick.prototype.swipeHandler = function(event) { + + var _ = this; + + if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) { + return; + } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) { + return; + } + + _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? + event.originalEvent.touches.length : 1; + + _.touchObject.minSwipe = _.listWidth / _.options + .touchThreshold; + + if (_.options.verticalSwiping === true) { + _.touchObject.minSwipe = _.listHeight / _.options + .touchThreshold; + } + + switch (event.data.action) { + + case 'start': + _.swipeStart(event); + break; + + case 'move': + _.swipeMove(event); + break; + + case 'end': + _.swipeEnd(event); + break; + + } + + }; + + Slick.prototype.swipeMove = function(event) { + + var _ = this, + edgeWasHit = false, + curLeft, swipeDirection, swipeLength, positionOffset, touches, verticalSwipeLength; + + touches = event.originalEvent !== undefined ? event.originalEvent.touches : null; + + if (!_.dragging || _.scrolling || touches && touches.length !== 1) { + return false; + } + + curLeft = _.getLeft(_.currentSlide); + + _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX; + _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY; + + _.touchObject.swipeLength = Math.round(Math.sqrt( + Math.pow(_.touchObject.curX - _.touchObject.startX, 2))); + + verticalSwipeLength = Math.round(Math.sqrt( + Math.pow(_.touchObject.curY - _.touchObject.startY, 2))); + + if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) { + _.scrolling = true; + return false; + } + + if (_.options.verticalSwiping === true) { + _.touchObject.swipeLength = verticalSwipeLength; + } + + swipeDirection = _.swipeDirection(); + + if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) { + _.swiping = true; + event.preventDefault(); + } + + positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1); + if (_.options.verticalSwiping === true) { + positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1; + } + + + swipeLength = _.touchObject.swipeLength; + + _.touchObject.edgeHit = false; + + if (_.options.infinite === false) { + if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) { + swipeLength = _.touchObject.swipeLength * _.options.edgeFriction; + _.touchObject.edgeHit = true; + } + } + + if (_.options.vertical === false) { + _.swipeLeft = curLeft + swipeLength * positionOffset; + } else { + _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset; + } + if (_.options.verticalSwiping === true) { + _.swipeLeft = curLeft + swipeLength * positionOffset; + } + + if (_.options.fade === true || _.options.touchMove === false) { + return false; + } + + if (_.animating === true) { + _.swipeLeft = null; + return false; + } + + _.setCSS(_.swipeLeft); + + }; + + Slick.prototype.swipeStart = function(event) { + + var _ = this, + touches; + + _.interrupted = true; + + if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) { + _.touchObject = {}; + return false; + } + + if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) { + touches = event.originalEvent.touches[0]; + } + + _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX; + _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY; + + _.dragging = true; + + }; + + Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() { + + var _ = this; + + if (_.$slidesCache !== null) { + + _.unload(); + + _.$slideTrack.children(this.options.slide).detach(); + + _.$slidesCache.appendTo(_.$slideTrack); + + _.reinit(); + + } + + }; + + Slick.prototype.unload = function() { + + var _ = this; + + $('.slick-cloned', _.$slider).remove(); + + if (_.$dots) { + _.$dots.remove(); + } + + if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) { + _.$prevArrow.remove(); + } + + if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) { + _.$nextArrow.remove(); + } + + _.$slides + .removeClass('slick-slide slick-active slick-visible slick-current') + .attr('aria-hidden', 'true') + .css('width', ''); + + }; + + Slick.prototype.unslick = function(fromBreakpoint) { + + var _ = this; + _.$slider.trigger('unslick', [_, fromBreakpoint]); + _.destroy(); + + }; + + Slick.prototype.updateArrows = function() { + + var _ = this, + centerOffset; + + centerOffset = Math.floor(_.options.slidesToShow / 2); + + if ( _.options.arrows === true && + _.slideCount > _.options.slidesToShow && + !_.options.infinite ) { + + _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); + _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); + + if (_.currentSlide === 0) { + + _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); + _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); + + } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) { + + _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); + _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); + + } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) { + + _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); + _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); + + } + + } + + }; + + Slick.prototype.updateDots = function() { + + var _ = this; + + if (_.$dots !== null) { + + _.$dots + .find('li') + .removeClass('slick-active') + .end(); + + _.$dots + .find('li') + .eq(Math.floor(_.currentSlide / _.options.slidesToScroll)) + .addClass('slick-active'); + + } + + }; + + Slick.prototype.visibility = function() { + + var _ = this; + + if ( _.options.autoplay ) { + + if ( document[_.hidden] ) { + + _.interrupted = true; + + } else { + + _.interrupted = false; + + } + + } + + }; + + $.fn.slick = function() { + var _ = this, + opt = arguments[0], + args = Array.prototype.slice.call(arguments, 1), + l = _.length, + i, + ret; + for (i = 0; i < l; i++) { + if (typeof opt == 'object' || typeof opt == 'undefined') + _[i].slick = new Slick(_[i], opt); + else + ret = _[i].slick[opt].apply(_[i].slick, args); + if (typeof ret != 'undefined') return ret; + } + return _; + }; + +})); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.less b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.less new file mode 100644 index 000000000..8d1fc9f11 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.less @@ -0,0 +1,100 @@ +/* Slider */ + +.slick-slider { + position: relative; + display: block; + box-sizing: border-box; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} +.slick-list { + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + + &:focus { + outline: none; + } + + &.dragging { + cursor: pointer; + cursor: hand; + } +} +.slick-slider .slick-track, +.slick-slider .slick-list { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track { + position: relative; + left: 0; + top: 0; + display: block; + margin-left: auto; + margin-right: auto; + + &:before, + &:after { + content: ""; + display: table; + } + + &:after { + clear: both; + } + + .slick-loading & { + visibility: hidden; + } +} +.slick-slide { + float: left; + height: 100%; + min-height: 1px; + [dir="rtl"] & { + float: right; + } + img { + display: block; + } + &.slick-loading img { + display: none; + } + + display: none; + + &.dragging img { + pointer-events: none; + } + + .slick-initialized & { + display: block; + } + + .slick-loading & { + visibility: hidden; + } + + .slick-vertical & { + display: block; + height: auto; + border: 1px solid transparent; + } +} +.slick-arrow.slick-hidden { + display: none; +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.css new file mode 100644 index 000000000..0d537c931 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.css @@ -0,0 +1 @@ +.slick-list,.slick-slider,.slick-track{position:relative;display:block}.slick-loading .slick-slide,.slick-loading .slick-track{visibility:hidden}.slick-slider{box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{top:0;left:0;margin-left:auto;margin-right:auto}.slick-track:after,.slick-track:before{display:table;content:''}.slick-track:after{clear:both}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.js new file mode 100644 index 000000000..eb9489a5c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.min.js @@ -0,0 +1,2 @@ +!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};e=function(){function e(e,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(e),appendDots:i(e),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(e),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(e).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=t++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}var t=0;return e}(),e.prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this,o=t.getNavTarget();null!==o&&"object"==typeof o&&o.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots&&o.slideCount>o.options.slidesToShow){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>0){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t,o=this;if(e=o.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var s in e){if(i<e[s]){i=t;break}t=e[s]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>0&&(i=e.$slides.children().children(),i.removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(".slick-slide").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);if(i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),-1!==s){var n="slick-slide-control"+e.instanceUid+s;i("#"+n).length&&i(this).attr({"aria-describedby":n})}}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.options.focusOnChange?e.$slides.eq(s).attr({tabindex:"0"}):e.$slides.eq(s).removeAttr("tabindex");e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&e.slideCount>e.options.slidesToShow&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&e.slideCount>e.options.slidesToShow&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||r.$slider.attr("data-sizes"),n=document.createElement("img");n.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),r.$slider.trigger("lazyLoaded",[r,e,t])})},n.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),r.$slider.trigger("lazyLoadError",[r,e,t])},n.src=t})}var t,o,s,n,r=this;if(!0===r.options.centerMode?!0===r.options.infinite?(s=r.currentSlide+(r.options.slidesToShow/2+1),n=s+r.options.slidesToShow+2):(s=Math.max(0,r.currentSlide-(r.options.slidesToShow/2+1)),n=r.options.slidesToShow/2+1+2+r.currentSlide):(s=r.options.infinite?r.options.slidesToShow+r.currentSlide:r.currentSlide,n=Math.ceil(s+r.options.slidesToShow),!0===r.options.fade&&(s>0&&s--,n<=r.slideCount&&n++)),t=r.$slider.find(".slick-slide").slice(s,n),"anticipated"===r.options.lazyLoad)for(var l=s-1,d=n,a=r.$slider.find(".slick-slide"),c=0;c<r.options.slidesToScroll;c++)l<0&&(l=r.slideCount-1),t=t.add(a.eq(l)),t=t.add(a.eq(d)),l--,d++;e(t),r.slideCount<=r.options.slidesToShow?(o=r.$slider.find(".slick-slide"),e(o)):r.currentSlide>=r.slideCount-r.options.slidesToShow?(o=r.$slider.find(".slick-cloned").slice(0,r.options.slidesToShow),e(o)):0===r.currentSlide&&(o=r.$slider.find(".slick-cloned").slice(-1*r.options.slidesToShow),e(o))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;if(!t.unslicked&&(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange))){i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()}},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),r=document.createElement("img"),r.onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if("boolean"==typeof i?(e=i,i=!0===e?0:o.slideCount-1):i=!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"), +void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));if(s||(s=0),t.slideCount<=t.options.slidesToShow)return void t.slideHandler(s,!1,!0);t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i)){if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))return void(!1===a.options.fade&&(o=a.currentSlide,!0!==t&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o)));if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))return void(!1===a.options.fade&&(o=a.currentSlide,!0!==t&&a.slideCount>a.options.slidesToShow?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o)));if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=a.getNavTarget(),l=l.slick("getSlick"),l.slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide)),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t&&a.slideCount>a.options.slidesToShow?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),o=Math.round(180*t/Math.PI),o<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}}); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.scss b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.scss new file mode 100644 index 000000000..8d1fc9f11 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/slideshow/slick/slick.scss @@ -0,0 +1,100 @@ +/* Slider */ + +.slick-slider { + position: relative; + display: block; + box-sizing: border-box; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} +.slick-list { + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; + + &:focus { + outline: none; + } + + &.dragging { + cursor: pointer; + cursor: hand; + } +} +.slick-slider .slick-track, +.slick-slider .slick-list { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track { + position: relative; + left: 0; + top: 0; + display: block; + margin-left: auto; + margin-right: auto; + + &:before, + &:after { + content: ""; + display: table; + } + + &:after { + clear: both; + } + + .slick-loading & { + visibility: hidden; + } +} +.slick-slide { + float: left; + height: 100%; + min-height: 1px; + [dir="rtl"] & { + float: right; + } + img { + display: block; + } + &.slick-loading img { + display: none; + } + + display: none; + + &.dragging img { + pointer-events: none; + } + + .slick-initialized & { + display: block; + } + + .slick-loading & { + visibility: hidden; + } + + .slick-vertical & { + display: block; + height: auto; + border: 1px solid transparent; + } +} +.slick-arrow.slick-hidden { + display: none; +} diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css index bc640c38c..4d583af41 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.css @@ -37,7 +37,7 @@ } .ngg-gallery-thumbnail a { - display: block; + display: block; margin: 4px; border: none; box-shadow: none; @@ -52,10 +52,6 @@ height: auto; } -.ngg-gallery-thumbnail img:hover { - background-color: #A9A9A9; -} - .ngg-gallery-thumbnail span { /* Images description */ font-size: 90%; @@ -63,6 +59,215 @@ display: block; } +/* ----------- New Default Styling September 2018 -----------*/ + +.ngg-galleryoverview { + margin-top: 40px; + margin-bottom: 50px; + -webkit-transition: width 1s, height 1s, background-color 1s, -webkit-transform 1s; + transition: width 1s, height 1s, background-color 1s, transform 1s; + min-height: 100px; +} + +.ngg-gallery-thumbnail-box.ngg-1-columns { + width: 100%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-2-columns { + width: 50%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-3-columns { + width: 33.33333%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-4-columns { + width: 25%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-5-columns { + width: 20%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-6-columns { + width: 16.6666%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-7-columns { + width: 14.2857%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-8-columns { + width: 12.5%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-9-columns { + width: 11.1111%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-10-columns { + width: 10%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-11-columns { + width: 9.09%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-12-columns { + width: 8.3333%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-13-columns { + width: 7.692%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-14-columns { + width: 7.142%; + float: left !important; +} + +.ngg-gallery-thumbnail-box.ngg-15-columns { + width: 6.6666%; + float: left !important; +} + +@media (max-width: 800px) { + .ngg-gallery-thumbnail-box.ngg-5-columns, + .ngg-gallery-thumbnail-box.ngg-6-columns, + .ngg-gallery-thumbnail-box.ngg-7-columns, + .ngg-gallery-thumbnail-box.ngg-8-columns, + .ngg-gallery-thumbnail-box.ngg-9-columns, + .ngg-gallery-thumbnail-box.ngg-10-columns, + .ngg-gallery-thumbnail-box.ngg-11-columns, + .ngg-gallery-thumbnail-box.ngg-12-columns, + .ngg-gallery-thumbnail-box.ngg-13-columns, + .ngg-gallery-thumbnail-box.ngg-14-columns, + .ngg-gallery-thumbnail-box.ngg-15-columns, + .ngg-gallery-thumbnail-box.ngg-16-columns, + .ngg-gallery-thumbnail-box.ngg-17-columns, + .ngg-gallery-thumbnail-box.ngg-18-columns, + .ngg-gallery-thumbnail-box.ngg-19-columns, + .ngg-gallery-thumbnail-box.ngg-29-columns { + width: 25%; + } +} + +@media (max-width: 600px) { + .ngg-gallery-thumbnail-box.ngg-4-columns, + .ngg-gallery-thumbnail-box.ngg-5-columns, + .ngg-gallery-thumbnail-box.ngg-6-columns, + .ngg-gallery-thumbnail-box.ngg-7-columns, + .ngg-gallery-thumbnail-box.ngg-8-columns, + .ngg-gallery-thumbnail-box.ngg-9-columns, + .ngg-gallery-thumbnail-box.ngg-10-columns, + .ngg-gallery-thumbnail-box.ngg-11-columns, + .ngg-gallery-thumbnail-box.ngg-12-columns, + .ngg-gallery-thumbnail-box.ngg-13-columns, + .ngg-gallery-thumbnail-box.ngg-14-columns, + .ngg-gallery-thumbnail-box.ngg-15-columns, + .ngg-gallery-thumbnail-box.ngg-16-columns, + .ngg-gallery-thumbnail-box.ngg-17-columns, + .ngg-gallery-thumbnail-box.ngg-18-columns, + .ngg-gallery-thumbnail-box.ngg-19-columns, + .ngg-gallery-thumbnail-box.ngg-29-columns { + width: 33.33333%; + } +} + +@media (max-width: 400px) { + .ngg-gallery-thumbnail-box.ngg-3-columns, + .ngg-gallery-thumbnail-box.ngg-4-columns, + .ngg-gallery-thumbnail-box.ngg-5-columns, + .ngg-gallery-thumbnail-box.ngg-6-columns, + .ngg-gallery-thumbnail-box.ngg-7-columns, + .ngg-gallery-thumbnail-box.ngg-8-columns, + .ngg-gallery-thumbnail-box.ngg-9-columns, + .ngg-gallery-thumbnail-box.ngg-10-columns, + .ngg-gallery-thumbnail-box.ngg-11-columns, + .ngg-gallery-thumbnail-box.ngg-12-columns, + .ngg-gallery-thumbnail-box.ngg-13-columns, + .ngg-gallery-thumbnail-box.ngg-14-columns, + .ngg-gallery-thumbnail-box.ngg-15-columns, + .ngg-gallery-thumbnail-box.ngg-16-columns, + .ngg-gallery-thumbnail-box.ngg-17-columns, + .ngg-gallery-thumbnail-box.ngg-18-columns, + .ngg-gallery-thumbnail-box.ngg-19-columns, + .ngg-gallery-thumbnail-box.ngg-29-columns { + width: 50%; + } +} + +/* ----------- Styling for Basic Thumbnail Simple Template September 2018 -----------*/ + +.ngg-galleryoverview.default-view { + text-align: center; + font-size: 0 !important; + letter-spacing: 0 !important; +} + +.ngg-galleryoverview.default-view .ngg-gallery-thumbnail-box { + display:inline-block; + float: none; + vertical-align: middle; +} + +.ngg-galleryoverview.default-view .ngg-gallery-thumbnail { + background-color: transparent; + border: none; + margin: 0; + margin-right: 0; + position: relative; +} + +.ngg-galleryoverview.default-view .ngg-gallery-thumbnail a { + margin: 2px; + box-shadow: none; +} + +.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img:hover { + opacity: .8; +} + +.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img { + margin: 0 auto; + box-shadow: none; + cursor: pointer; +} + +.ngg-galleryoverview.default-view .slideshowlink { + margin: 24px auto 0; + text-align: center; + text-transform: uppercase; +} + +.ngg-galleryoverview.default-view .slideshowlink a { + font-size: 13px; + letter-spacing: .75px; + cursor: pointer; + text-decoration: none; + box-shadow: none; + border: none; +} + +.ngg-galleryoverview.default-view .slideshowlink a:hover { + text-decoration: none !important; + box-shadow: none !important; + border: none !important; +} + /* ----------- Gallery list (Carousel template) -------------*/ .ngg-galleryoverview ul li:before { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css index 7de1c82e4..c22ac2106 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/static/thumbnails/nextgen_basic_thumbnails.min.css @@ -1 +1 @@ -.ngg-galleryoverview{overflow:hidden;margin-top:10px;width:100%;clear:both;display:block!important}.ngg-galleryoverview .desc{margin:0 10px 10px 0;padding:5px}.ngg-gallery-thumbnail-box{float:left;max-width:100%!important}.ngg-template-caption .ngg-gallery-thumbnail-box{margin-right:0}.ngg-gallery-thumbnail{text-align:center;max-width:100%!important;background-color:#fff;border:1px solid #a9a9a9;margin-right:5px;margin:5px}.ngg-template-caption .ngg-gallery-thumbnail{margin-right:0}.ngg-gallery-thumbnail a{display:block;margin:4px;border:none;box-shadow:none}.ngg-gallery-thumbnail img{display:block;margin:0;padding:0;position:relative;max-width:100%!important;height:auto}.ngg-gallery-thumbnail img:hover{background-color:#a9a9a9}.ngg-gallery-thumbnail span{font-size:90%;padding-left:5px;display:block}.ngg-galleryoverview ul li:before{content:''!important}.ngg-gallery-list{list-style-type:none;padding:0!important;text-indent:0!important}.ngg-galleryoverview div.pic img{width:100%;border:0;border-radius:0}.ngg-gallery-list li{float:left;margin:0 2px 0 2px!important;overflow:hidden}.ngg-gallery-list li a{border:1px solid #ccc;display:block;padding:2px}.ngg-gallery-list li.selected a{-moz-background-inline-policy:continuous;-moz-background-origin:padding;background:#000 none repeat scroll 0 0}.ngg-gallery-list li img{height:40px;width:40px}li.ngg-next,li.ngg-prev{height:40px;width:40px;font-size:3.5em}li.ngg-next a,li.ngg-prev a{padding-top:10px;border:none;text-decoration:none} \ No newline at end of file +.ngg-galleryoverview{overflow:hidden;width:100%;clear:both;display:block!important}.ngg-galleryoverview .desc{margin:0 10px 10px 0;padding:5px}.ngg-gallery-thumbnail-box{float:left;max-width:100%!important}.ngg-template-caption .ngg-gallery-thumbnail-box{margin-right:0}.ngg-gallery-thumbnail{text-align:center;max-width:100%!important;background-color:#FFF;border:1px solid #A9A9A9;margin:5px}.ngg-template-caption .ngg-gallery-thumbnail{margin-right:0}.ngg-gallery-thumbnail a{display:block;margin:4px;border:none;box-shadow:none}.ngg-gallery-thumbnail img{display:block;margin:0;padding:0;position:relative;max-width:100%!important;height:auto}.ngg-gallery-thumbnail span{font-size:90%;padding-left:5px;display:block}.ngg-galleryoverview{margin-top:40px;margin-bottom:50px;-webkit-transition:width 1s,height 1s,background-color 1s,-webkit-transform 1s;transition:width 1s,height 1s,background-color 1s,transform 1s;min-height:100px}.ngg-gallery-thumbnail-box.ngg-1-columns{width:100%;float:left!important}.ngg-gallery-thumbnail-box.ngg-2-columns{width:50%;float:left!important}.ngg-gallery-thumbnail-box.ngg-3-columns{width:33.33333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-4-columns{width:25%;float:left!important}.ngg-gallery-thumbnail-box.ngg-5-columns{width:20%;float:left!important}.ngg-gallery-thumbnail-box.ngg-6-columns{width:16.6666%;float:left!important}.ngg-gallery-thumbnail-box.ngg-7-columns{width:14.2857%;float:left!important}.ngg-gallery-thumbnail-box.ngg-8-columns{width:12.5%;float:left!important}.ngg-gallery-thumbnail-box.ngg-9-columns{width:11.1111%;float:left!important}.ngg-gallery-thumbnail-box.ngg-10-columns{width:10%;float:left!important}.ngg-gallery-thumbnail-box.ngg-11-columns{width:9.09%;float:left!important}.ngg-gallery-thumbnail-box.ngg-12-columns{width:8.3333%;float:left!important}.ngg-gallery-thumbnail-box.ngg-13-columns{width:7.692%;float:left!important}.ngg-gallery-thumbnail-box.ngg-14-columns{width:7.142%;float:left!important}.ngg-gallery-thumbnail-box.ngg-15-columns{width:6.6666%;float:left!important}@media (max-width:800px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:25%}}@media (max-width:600px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:33.33333%}}@media (max-width:400px){.ngg-gallery-thumbnail-box.ngg-10-columns,.ngg-gallery-thumbnail-box.ngg-11-columns,.ngg-gallery-thumbnail-box.ngg-12-columns,.ngg-gallery-thumbnail-box.ngg-13-columns,.ngg-gallery-thumbnail-box.ngg-14-columns,.ngg-gallery-thumbnail-box.ngg-15-columns,.ngg-gallery-thumbnail-box.ngg-16-columns,.ngg-gallery-thumbnail-box.ngg-17-columns,.ngg-gallery-thumbnail-box.ngg-18-columns,.ngg-gallery-thumbnail-box.ngg-19-columns,.ngg-gallery-thumbnail-box.ngg-29-columns,.ngg-gallery-thumbnail-box.ngg-3-columns,.ngg-gallery-thumbnail-box.ngg-4-columns,.ngg-gallery-thumbnail-box.ngg-5-columns,.ngg-gallery-thumbnail-box.ngg-6-columns,.ngg-gallery-thumbnail-box.ngg-7-columns,.ngg-gallery-thumbnail-box.ngg-8-columns,.ngg-gallery-thumbnail-box.ngg-9-columns{width:50%}}.ngg-galleryoverview.default-view{text-align:center;font-size:0!important;letter-spacing:0!important}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail-box{display:inline-block;float:none;vertical-align:middle}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail{background-color:transparent;border:none;margin:0;position:relative}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail a{margin:2px;box-shadow:none}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img:hover{opacity:.8}.ngg-galleryoverview.default-view .ngg-gallery-thumbnail img{margin:0 auto;box-shadow:none;cursor:pointer}.ngg-galleryoverview.default-view .slideshowlink{margin:24px auto 0;text-align:center;text-transform:uppercase}.ngg-galleryoverview.default-view .slideshowlink a{font-size:13px;letter-spacing:.75px;cursor:pointer;text-decoration:none;box-shadow:none;border:none}.ngg-galleryoverview.default-view .slideshowlink a:hover{text-decoration:none!important;box-shadow:none!important;border:none!important}.ngg-galleryoverview ul li:before{content:''!important}.ngg-gallery-list{list-style-type:none;padding:0!important;text-indent:0!important}.ngg-galleryoverview div.pic img{width:100%;border:0;border-radius:0}.ngg-gallery-list li{float:left;margin:0 2px!important;overflow:hidden}.ngg-gallery-list li a{border:1px solid #CCC;display:block;padding:2px}.ngg-gallery-list li.selected a{-moz-background-inline-policy:continuous;-moz-background-origin:padding;background:#000}.ngg-gallery-list li img{height:40px;width:40px}li.ngg-next,li.ngg-prev{height:40px;width:40px;font-size:3.5em}li.ngg-next a,li.ngg-prev a{padding-top:10px;border:none;text-decoration:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php index 8b97dee12..0b8de1b10 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/slideshow/index.php @@ -1,93 +1,58 @@ <?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?> -<?php if ($show_thumbnail_link) { ?> - <!-- Thumbnails Link --> - <div class="slideshowlink"> - <a href='<?php echo esc_attr($thumbnail_link); ?>'><?php echo esc_html($thumbnail_link_text); ?></a> - </div> -<?php } ?> - -<div class="ngg-slideshow-image-list ngg-slideshow-nojs" id="<?php echo esc_attr($anchor); ?>-image-list"> - <?php - $this->include_template('photocrati-nextgen_gallery_display#list/before'); - for ($i = 0; $i < count($images); $i++) { - // Determine image dimensions - $image = $images[$i]; - $image_size = $storage->get_original_dimensions($image); - if ($image_size == null) - { - $image_size['width'] = $image->meta_data['width']; - $image_size['height'] = $image->meta_data['height']; - } +<?php $this->include_template('photocrati-nextgen_gallery_display#container/before'); ?> - // Determine whether an image is hidden or not - if (isset($image->hidden) && $image->hidden) { - $image->style = 'style="display: none;"'; - } - else { - $image->style = ''; - } +<div class="ngg-galleryoverview ngg-slideshow" + id="<?php echo esc_attr($anchor); ?>" + style="max-width: <?php echo esc_attr($gallery_width); ?>px; max-height: <?php echo esc_attr($gallery_height); ?>px;"> - // Determine image aspect ratio - $image_ratio = $image_size['width'] / $image_size['height']; - if ($image_ratio > $aspect_ratio) - { - if ($image_size['width'] > $gallery_width) - { - $image_size['width'] = $gallery_width; - $image_size['height'] = (int) round($gallery_width / $image_ratio); - } - } - else { - if ($image_size['height'] > $gallery_height) - { - $image_size['width'] = (int) round($gallery_height * $image_ratio); - $image_size['height'] = $gallery_height; - } - } + <?php for ($i = 0; $i < count($images); $i++) { + $image = $images[$i]; + $image->style = 'style="height:' . esc_attr($gallery_height) . 'px"'; $template_params = array( 'index' => $i, 'class' => 'ngg-gallery-slideshow-image' ); $template_params = array_merge(get_defined_vars(), $template_params); - $this->include_template('photocrati-nextgen_gallery_display#image/before', $template_params); - ?> - <img data-image-id='<?php echo esc_attr($image->pid); ?>' - title="<?php echo esc_attr($image->description)?>" - alt="<?php echo esc_attr($image->alttext)?>" - src="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>" - width="<?php echo esc_attr($image_size['width'])?>" - height="<?php echo esc_attr($image_size['height'])?>"/> - <?php - $this->include_template('photocrati-nextgen_gallery_display#image/after', $template_params); - } - $this->include_template('photocrati-nextgen_gallery_display#list/after'); - ?> -</div> -<?php $this->include_template('photocrati-nextgen_gallery_display#container/before'); ?> -<div class="ngg-galleryoverview ngg-slideshow" - id="<?php echo esc_attr($anchor); ?>" - data-placeholder="<?php echo nextgen_esc_url($placeholder); ?>" - style="max-width: <?php echo esc_attr($gallery_width); ?>px; max-height: <?php echo esc_attr($gallery_height); ?>px;"> - <div class="ngg-slideshow-loader" - id="<?php echo esc_attr($anchor); ?>-loader" - style="width: <?php echo esc_attr($gallery_width); ?>px; height: <?php echo esc_attr($gallery_height); ?>px;"> - <img src="<?php echo esc_attr(NGGALLERY_URLPATH); ?>images/loader.gif" alt=""/> - </div> + + $this->include_template('photocrati-nextgen_gallery_display#image/before', $template_params); + + ?> + + <a href="<?php echo esc_attr($storage->get_image_url($image)); ?>" + title="<?php echo esc_attr($image->description); ?>" + data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>" + data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>" + data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>" + data-title="<?php echo esc_attr($image->alttext); ?>" + data-description="<?php echo esc_attr(stripslashes($image->description)); ?>" + <?php echo $effect_code ?>> + + <img data-image-id='<?php echo esc_attr($image->pid); ?>' + title="<?php echo esc_attr($image->description)?>" + alt="<?php echo esc_attr($image->alttext)?>" + src="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>" + style="max-height: <?php echo esc_attr($gallery_height -20); ?>px;" + /> + + </a> + + <?php + + $this->include_template('photocrati-nextgen_gallery_display#image/after', $template_params); + + } ?> + </div> + <?php $this->include_template('photocrati-nextgen_gallery_display#container/after'); ?> -<script type="text/javascript"> - jQuery('#<?php echo esc_attr($anchor); ?>-image-list').hide().removeClass('ngg-slideshow-nojs'); - jQuery(function($) { - jQuery('#<?php echo esc_attr($anchor); ?>').nggShowSlideshow({ - id: '<?php echo esc_attr($displayed_gallery_id); ?>', - fx: '<?php echo esc_attr($cycle_effect); ?>', - width: <?php echo esc_attr($gallery_width); ?>, - height: <?php echo esc_attr($gallery_height); ?>, - domain: '<?php echo esc_attr(trailingslashit(home_url())); ?>', - timeout: <?php echo esc_attr(intval($cycle_interval) * 1000); ?> - }); - }); -</script> -<?php $this->end_element(); ?> + +<?php if ($show_thumbnail_link) { ?> + <!-- Thumbnails Link --> + <div class="slideshowlink" style="max-width: <?php echo esc_attr($gallery_width); ?>px;"> + <a href='<?php echo esc_attr($thumbnail_link); ?>'><?php echo esc_html($thumbnail_link_text); ?></a> + </div> +<?php } ?> + +<?php $this->end_element(); ?> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/default-view.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/default-view.php new file mode 100644 index 000000000..c17120494 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_gallery/templates/thumbnails/default-view.php @@ -0,0 +1,92 @@ +<?php + +$this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); + +?> +<div + class="ngg-galleryoverview default-view <?php if (!intval($ajax_pagination)) echo ' ngg-ajax-pagination-none'; ?>" + id="ngg-gallery-<?php echo esc_attr($displayed_gallery_id)?>-<?php echo esc_attr($current_page)?>"> + + <?php + + $this->start_element('nextgen_gallery.image_list_container', 'container', $images); + + ?> + <!-- Thumbnails --> + <?php for ($i=0; $i<count($images); $i++): + $image = $images[$i]; + $thumb_size = $storage->get_image_dimensions($image, $thumbnail_size_name); + $style = isset($image->style) ? $image->style : null; + $column_class = 'ngg-' . $number_of_columns . '-columns'; + + if (isset($image->hidden) && $image->hidden) { + $style = 'style="display: none;"'; + } + else { + $style = null; + } + + $this->start_element('nextgen_gallery.image_panel', 'item', $image); + + ?> + <div id="<?php echo esc_attr('ngg-image-' . $i) ?>" class="ngg-gallery-thumbnail-box <?php if ($number_of_columns > 0 && empty($show_all_in_lightbox)) { echo $column_class; } ?>" <?php if ($style) echo $style; ?>> + <?php + + $this->start_element('nextgen_gallery.image', 'item', $image); + + ?> + <div class="ngg-gallery-thumbnail"> + <a href="<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE))?>" + title="<?php echo esc_attr($image->description)?>" + data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>" + data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>" + data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>" + data-title="<?php echo esc_attr($image->alttext); ?>" + data-description="<?php echo esc_attr(stripslashes($image->description)); ?>" + data-image-slug="<?php echo esc_attr($image->image_slug); ?>" + <?php echo $effect_code ?>> + <img + title="<?php echo esc_attr($image->alttext)?>" + alt="<?php echo esc_attr($image->alttext)?>" + src="<?php echo esc_attr($storage->get_image_url($image, $thumbnail_size_name, TRUE))?>" + width="<?php echo esc_attr($thumb_size['width'])?>" + height="<?php echo esc_attr($thumb_size['height'])?>" + style="max-width:100%;" + /> + </a> + </div> + <?php + + $this->end_element(); + + ?> + </div> + <?php + + $this->end_element(); + + ?> + + <?php endfor ?> + + <br style="clear: both" /> + + <?php + + $this->end_element(); + + if (!empty($slideshow_link)): ?> + <div class="slideshowlink"> + <a href='<?php echo esc_attr($slideshow_link) ?>'><?php echo esc_html($slideshow_link_text) ?></a> + + </div> + <?php endif ?> + + <?php if ($pagination): ?> + <!-- Pagination --> + <?php echo $pagination ?> + <?php else: ?> + <div class="ngg-clear"></div> + <?php endif ?> +</div> +<?php $this->end_element(); ?> diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php index 4adef121e..d8f3080d3 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/module.nextgen_basic_imagebrowser.php @@ -26,7 +26,7 @@ class M_NextGen_Basic_ImageBrowser extends C_Base_Module 'photocrati-nextgen_basic_imagebrowser', 'NextGEN Basic ImageBrowser', 'Provides the NextGEN Basic ImageBrowser Display Type', - '3.0.0', + '3.0.0.4', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -144,8 +144,9 @@ class M_NextGen_Basic_ImageBrowser extends C_Base_Module /** * Show an image browser. Ngglegacy function - * @param $galleryID + * @param int $galleryID * @param string $template + * @return string */ function nggShowImageBrowser($galleryID, $template = '') { @@ -161,8 +162,9 @@ function nggShowImageBrowser($galleryID, $template = '') /** * Create an image browser from a list of image objects. Ngglegacy function - * @param $picturelist - * @param string $template + * @param array $picturelist + * @param string $template (optional) + * @return string */ function nggCreateImageBrowser($picturelist, $template = '') { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php index c88cf7eda..ea6e5ebeb 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/package.module.nextgen_basic_imagebrowser.php @@ -27,6 +27,9 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin */ function index_action($displayed_gallery, $return = FALSE) { + // We now hide option for triggers on this display type. + // This ensures they do not show based on past settings. + $displayed_gallery->display_settings['ngg_triggers_display'] = 'never'; $picture_list = array(); foreach ($displayed_gallery->get_included_entities() as $image) { $picture_list[$image->{$image->id_field}] = $image; @@ -46,7 +49,7 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin /** * Returns the rendered template of an image browser display * - * @param C_Displayed_Gallery + * @param C_Displayed_Gallery $displayed_gallery * @param array $picture_list * @return string Rendered HTML (probably) */ @@ -153,7 +156,7 @@ class A_NextGen_Basic_ImageBrowser_Controller extends Mixin function enqueue_frontend_resources($displayed_gallery) { $this->call_parent('enqueue_frontend_resources', $displayed_gallery); - wp_enqueue_style('nextgen_basic_imagebrowser_style', $this->get_static_url('photocrati-nextgen_basic_imagebrowser#style.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_imagebrowser_style', $this->get_static_url('photocrati-nextgen_basic_imagebrowser#style.css'), array(), NGG_SCRIPT_VERSION); $this->enqueue_ngg_styles(); } } @@ -173,7 +176,7 @@ class A_NextGen_Basic_ImageBrowser_Form extends Mixin_Display_Type_Form */ function _get_field_names() { - return array('ajax_pagination', 'nextgen_basic_templates_template'); + return array('ajax_pagination', 'display_view', 'nextgen_basic_templates_template'); } } /** @@ -187,7 +190,10 @@ class A_NextGen_Basic_ImageBrowser_Mapper extends Mixin { $this->call_parent('set_defaults', $entity); if (isset($entity->name) && $entity->name == NGG_BASIC_IMAGEBROWSER) { + $default_template = isset($entity->settings["template"]) ? 'default' : 'default-view.php'; + $this->object->_set_default_value($entity, 'settings', 'display_view', $default_template); $this->object->_set_default_value($entity, 'settings', 'template', ''); + $this->object->_set_default_value($entity, 'settings', 'ajax_pagination', '1'); // Part of the pro-modules $this->object->_set_default_value($entity, 'settings', 'ngg_triggers_display', 'never'); } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css index a33846ea8..a38d79c91 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.css @@ -1,6 +1,8 @@ /* ----------- Image browser style -------------*/ .ngg-imagebrowser { + margin-top: 20px; + margin-bottom: 30px; } .ngg-imagebrowser h3 { @@ -17,6 +19,7 @@ margin-bottom: 10px; border: 1px solid #A9A9A9; } + .ngg-imagebrowser .pic a { display: block !important; font-size: 0px; @@ -58,10 +61,9 @@ } -/* TEMPLATES: Imagebrowser Simple and Dark */ +/* TEMPLATES: Updated Default Template */ -.ngg-imagebrowser.ngg-imagebrowser-simple, -.ngg-imagebrowser.ngg-imagebrowser-dark { +.ngg-imagebrowser.default-view { padding: 0; margin: 40px 0 !important; text-align: center; @@ -70,14 +72,7 @@ box-sizing: border-box; } -.ngg-imagebrowser.ngg-imagebrowser-dark { - background: #000; - padding: 0 20px; - box-shadow: 0 0 2px 1px rgba(150,150,150,.1); -} - -.ngg-imagebrowser.ngg-imagebrowser-simple h3, -.ngg-imagebrowser.ngg-imagebrowser-dark h3 { +.ngg-imagebrowser.default-view h3 { font-size: 18px !important; margin: 0 !important; padding: 20px !important; @@ -85,116 +80,92 @@ font-weight: bold; } -.ngg-imagebrowser.ngg-imagebrowser-dark h3 { - color: #fff; -} - -.ngg-imagebrowser.ngg-imagebrowser-simple img, -.ngg-imagebrowser.ngg-imagebrowser-dark img { +.ngg-imagebrowser.default-view img { max-height: 500px; } -.ngg-imagebrowser.ngg-imagebrowser-simple .pic, -.ngg-imagebrowser.ngg-imagebrowser-simple .pic a, -.ngg-imagebrowser.ngg-imagebrowser-dark .pic, -.ngg-imagebrowser.ngg-imagebrowser-dark .pic a { +.ngg-imagebrowser.default-view .pic, +.ngg-imagebrowser.default-view .pic a { margin: 0; border: none; + box-shadow: none; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav { text-align: center; padding: 20px 20px 5px; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .back, -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .next, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .back, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .next { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .back, +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .next { float: none; display: inline-block; border: none; - background-color: rgba(0,0,0,.5); - border-radius: 15px; - width: 30px; height: 30px; padding: 0; + width: 80px; + border-radius: 2px; + cursor: pointer; + background: #999; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .back:hover, +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .next:hover { + background: #666; +} + +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa { font-size: 16px; color: #fff; padding: 0 !important; line-height: 30px; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa-chevron-right, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa-chevron-right { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa-chevron-right { margin-left: 2px; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa-chevron-left, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa-chevron-left { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa-chevron-left { margin-right: 2px; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a, -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a:hover, -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a:focus, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a:hover, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a:focus { +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a, +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a:hover, +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a:focus { box-shadow: none; text-decoration: none; padding: 0; + border: none; } -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .counter, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .counter { - margin: 20px 0 22px; +.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .counter { + /*margin: 20px 0 22px;*/ font-size: 12px !important; color: rgba(150,150,150,.7); + margin: 10px 0 6px; } -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .counter { - color: #666; -} - -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc { +.ngg-imagebrowser.default-view .ngg-imagebrowser-desc { text-align: center; padding: 0 50px; font-size: 14px; } -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc { - color: #999; - padding-bottom: 20px; -} - -.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc p:first-of-type, -.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc p:first-of-type { +.ngg-imagebrowser.default-view .ngg-imagebrowser-desc p:first-of-type { margin-top: 0; padding-top: 0; } @media (max-width: 800px) { - .ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav, - .ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav { + .ngg-imagebrowser.default-view .ngg-imagebrowser-nav { text-align: center; padding: 20px 10px 5px; } - .ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc, - .ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc { + .ngg-imagebrowser.default-view .ngg-imagebrowser-desc { padding: 0; font-size: 12px; } - .ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc { - padding-bottom: 20px; - } } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.min.css index 38c0ecc15..751d6fead 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/static/style.min.css @@ -1 +1 @@ -.ngg-imagebrowser h3{text-align:center}.ngg-imagebrowser-desc{clear:both}.ngg-imagebrowser .pic{max-width:100%;margin-top:10px;margin-bottom:10px;border:1px solid #a9a9a9}.ngg-imagebrowser .pic a{display:block!important;font-size:0;margin:5px;text-align:center}.ngg-imagebrowser img{max-width:100%;margin:0 auto;padding:0;border:none}.ngg-imagebrowser-nav{padding:5px}.ngg-imagebrowser-nav .back{float:left;border:1px solid #ddd;padding:3px 7px}.ngg-imagebrowser-nav .next{float:right;border:1px solid #ddd;padding:3px 7px}.ngg-imagebrowser-nav .counter{text-align:center;font-size:.9em!important}.exif-data{margin-left:auto!important;margin-right:auto!important}.ngg-imagebrowser.ngg-imagebrowser-dark,.ngg-imagebrowser.ngg-imagebrowser-simple{padding:0;margin:40px 0!important;text-align:center;max-width:1200px;margin:0 auto;box-sizing:border-box}.ngg-imagebrowser.ngg-imagebrowser-dark{background:#000;padding:0 20px;box-shadow:0 0 2px 1px rgba(150,150,150,.1)}.ngg-imagebrowser.ngg-imagebrowser-dark h3,.ngg-imagebrowser.ngg-imagebrowser-simple h3{font-size:18px!important;margin:0!important;padding:20px!important;text-align:center;font-weight:700}.ngg-imagebrowser.ngg-imagebrowser-dark h3{color:#fff}.ngg-imagebrowser.ngg-imagebrowser-dark img,.ngg-imagebrowser.ngg-imagebrowser-simple img{max-height:500px}.ngg-imagebrowser.ngg-imagebrowser-dark .pic,.ngg-imagebrowser.ngg-imagebrowser-dark .pic a,.ngg-imagebrowser.ngg-imagebrowser-simple .pic,.ngg-imagebrowser.ngg-imagebrowser-simple .pic a{margin:0;border:none}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav{text-align:center;padding:20px 20px 5px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .back,.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .next,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .back,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .next{float:none;display:inline-block;border:none;background-color:rgba(0,0,0,.5);border-radius:15px;width:30px;height:30px;padding:0}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa{font-size:16px;color:#fff;padding:0!important;line-height:30px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa-chevron-right,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa-chevron-right{margin-left:2px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .fa-chevron-left,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .fa-chevron-left{margin-right:2px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a,.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a:focus,.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav a:hover,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a:focus,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav a:hover{box-shadow:none;text-decoration:none;padding:0}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .counter,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav .counter{margin:20px 0 22px;font-size:12px!important;color:rgba(150,150,150,.7)}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav .counter{color:#666}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc{text-align:center;padding:0 50px;font-size:14px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc{color:#999;padding-bottom:20px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc p:first-of-type,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc p:first-of-type{margin-top:0;padding-top:0}@media (max-width:800px){.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-nav,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-nav{text-align:center;padding:20px 10px 5px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc,.ngg-imagebrowser.ngg-imagebrowser-simple .ngg-imagebrowser-desc{padding:0;font-size:12px}.ngg-imagebrowser.ngg-imagebrowser-dark .ngg-imagebrowser-desc{padding-bottom:20px}} \ No newline at end of file +.ngg-imagebrowser{margin-top:20px;margin-bottom:30px}.ngg-imagebrowser h3{text-align:center}.ngg-imagebrowser-desc{clear:both}.ngg-imagebrowser .pic{max-width:100%;margin-top:10px;margin-bottom:10px;border:1px solid #A9A9A9}.ngg-imagebrowser .pic a{display:block!important;font-size:0;margin:5px;text-align:center}.ngg-imagebrowser img{max-width:100%;margin:0 auto;padding:0;border:none}.ngg-imagebrowser-nav{padding:5px}.ngg-imagebrowser-nav .back{float:left;border:1px solid #DDD;padding:3px 7px}.ngg-imagebrowser-nav .next{float:right;border:1px solid #DDD;padding:3px 7px}.ngg-imagebrowser-nav .counter{text-align:center;font-size:.9em!important}.exif-data{margin-left:auto!important;margin-right:auto!important}.ngg-imagebrowser.default-view{padding:0;margin:40px 0!important;text-align:center;max-width:1200px;box-sizing:border-box}.ngg-imagebrowser.default-view h3{font-size:18px!important;margin:0!important;padding:20px!important;text-align:center;font-weight:700}.ngg-imagebrowser.default-view img{max-height:500px}.ngg-imagebrowser.default-view .pic,.ngg-imagebrowser.default-view .pic a{margin:0;border:none;box-shadow:none}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav{text-align:center;padding:20px 20px 5px}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .back,.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .next{float:none;display:inline-block;border:none;height:30px;padding:0;width:80px;border-radius:2px;cursor:pointer;background:#999}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .back:hover,.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .next:hover{background:#666}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa{font-size:16px;color:#fff;padding:0!important;line-height:30px}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa-chevron-right{margin-left:2px}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .fa-chevron-left{margin-right:2px}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a,.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a:focus,.ngg-imagebrowser.default-view .ngg-imagebrowser-nav a:hover{box-shadow:none;text-decoration:none;padding:0;border:none}.ngg-imagebrowser.default-view .ngg-imagebrowser-nav .counter{font-size:12px!important;color:rgba(150,150,150,.7);margin:10px 0 6px}.ngg-imagebrowser.default-view .ngg-imagebrowser-desc{text-align:center;padding:0 50px;font-size:14px}.ngg-imagebrowser.default-view .ngg-imagebrowser-desc p:first-of-type{margin-top:0;padding-top:0}@media (max-width:800px){.ngg-imagebrowser.default-view .ngg-imagebrowser-nav{text-align:center;padding:20px 10px 5px}.ngg-imagebrowser.default-view .ngg-imagebrowser-desc{padding:0;font-size:12px}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php new file mode 100644 index 000000000..041d163c7 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_imagebrowser/templates/default-view.php @@ -0,0 +1,71 @@ +<?php $this->start_element('nextgen_gallery.gallery_container', 'container', $displayed_gallery); ?> + <div class='ngg-imagebrowser default-view' id='<?php echo $anchor; ?>' data-nextgen-gallery-id="<?php echo $displayed_gallery->id(); ?>"> + + <h3><?php echo esc_attr($image->alttext); ?></h3> + + <?php + + $template_params = array( + 'index' => 0, + 'class' => 'pic', + 'image' => $image, + ); + + $this->include_template('photocrati-nextgen_gallery_display#image/before', $template_params); + + ?> + <a href='<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE)); ?>' + title='<?php echo esc_attr($image->description); ?>' + data-src="<?php echo esc_attr($storage->get_image_url($image)); ?>" + data-thumbnail="<?php echo esc_attr($storage->get_image_url($image, 'thumb')); ?>" + data-image-id="<?php echo esc_attr($image->{$image->id_field}); ?>" + data-title="<?php echo esc_attr($image->alttext); ?>" + data-description="<?php echo esc_attr(stripslashes($image->description)); ?>" + <?php echo $effect_code ?>> + <img title='<?php echo esc_attr($image->alttext); ?>' + alt='<?php echo esc_attr($image->alttext); ?>' + src='<?php echo esc_attr($storage->get_image_url($image, 'full', TRUE)); ?>'/> + </a> + <?php + + $this->include_template('photocrati-nextgen_gallery_display#image/after', $template_params); + + ?> + + <div class='ngg-imagebrowser-nav'> + + <div class='back'> + <a class='ngg-browser-prev' + id='ngg-prev-<?php echo $previous_pid; ?>' + href='<?php echo $previous_image_link; ?>'> + <i class="fa fa-chevron-left" aria-hidden="true"></i> + </a> + </div> + + <div class='next'> + <a class='ngg-browser-next' + id='ngg-next-<?php echo $next_pid; ?>' + href='<?php echo $next_image_link; ?>'> + <i class="fa fa-chevron-right" aria-hidden="true"></i> + </a> + </div> + + <div class='counter'> + <?php _e('Image', 'nggallery'); ?> <?php echo $number; ?> <?php _e('of', 'nggallery'); ?> <?php echo $total; ?> + </div> + + <div class='ngg-imagebrowser-desc'> + <p> + <?php print wp_kses($image->description, M_I18N::get_kses_allowed_html()); ?> + </p> + </div> + + </div> + +</div> +<?php $this->end_element(); ?> +<script type='text/javascript'> + jQuery(function($) { + new NggPaginatedGallery('<?php echo $displayed_gallery->id() ?>', '.ngg-imagebrowser'); + }); +</script> \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php index 7ac9177c7..b4c06c7db 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/module.nextgen_basic_singlepic.php @@ -24,7 +24,7 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module NGG_BASIC_SINGLEPIC, 'NextGen Basic Singlepic', 'Provides a singlepic gallery for NextGEN Gallery', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -90,7 +90,7 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module function is_rest_request() { - return strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; + return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; } /** @@ -106,7 +106,7 @@ class M_NextGen_Basic_Singlepic extends C_Base_Module wp_enqueue_style( 'nextgen_basic_singlepic_style', $router->get_static_url(NGG_BASIC_SINGLEPIC . '#nextgen_basic_singlepic.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php index c0138868e..a2a987d95 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php @@ -23,7 +23,9 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin /** * Displays the 'singlepic' display type * - * @param stdClass|C_Displayed_Gallery|C_DataMapper_Model $displayed_gallery + * @param C_Displayed_Gallery + * @param bool $return (optional) + * @return string */ function index_action($displayed_gallery, $return = FALSE) { @@ -32,7 +34,8 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin $display_settings = $displayed_gallery->display_settings; // use this over get_included_entities() so we can display images marked 'excluded' $displayed_gallery->skip_excluding_globally_excluded_images = TRUE; - $image = array_shift($displayed_gallery->get_entities(1, FALSE, FALSE, 'included')); + $entities = $displayed_gallery->get_entities(1, FALSE, FALSE, 'included'); + $image = array_shift($entities); if (!$image) { return $this->object->render_partial("photocrati-nextgen_gallery_display#no_images_found", array(), $return); } @@ -135,6 +138,8 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin } /** * Intentionally disable the application of the effect code + * @param string $thumbcode Unused + * @return string */ function strip_thumbcode($thumbcode) { @@ -148,7 +153,7 @@ class A_NextGen_Basic_Singlepic_Controller extends Mixin function enqueue_frontend_resources($displayed_gallery) { $this->call_parent('enqueue_frontend_resources', $displayed_gallery); - wp_enqueue_style('nextgen_basic_singlepic_style', $this->get_static_url('photocrati-nextgen_basic_singlepic#nextgen_basic_singlepic.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_singlepic_style', $this->get_static_url('photocrati-nextgen_basic_singlepic#nextgen_basic_singlepic.css'), array(), NGG_SCRIPT_VERSION); $this->enqueue_ngg_styles(); } } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.min.css index 330c4b574..db8229f3c 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/static/nextgen_basic_singlepic.min.css @@ -1 +1 @@ -.ngg-gallery-singlepic-image{margin:0 auto 1em auto}.ngg-gallery-singlepic-image a{max-width:100%}.ngg-gallery-singlepic-image img{margin:0;max-width:100%;border:none}.ngg-singlepic{background-color:#fff;display:block;padding:4px}.ngg-left{float:left;margin-right:10px}.ngg-right{float:right;margin-left:10px}.ngg-center{margin-left:auto!important;margin-right:auto!important}.ngg-gallery-singlepic-image .ngg-trigger-buttons{margin:5px 0 0 0} \ No newline at end of file +.ngg-gallery-singlepic-image{margin:0 auto 1em}.ngg-gallery-singlepic-image a{max-width:100%}.ngg-gallery-singlepic-image img{margin:0;max-width:100%;border:none}.ngg-singlepic{background-color:#FFF;display:block;padding:4px}.ngg-left{float:left;margin-right:10px}.ngg-right{float:right;margin-left:10px}.ngg-center{margin-left:auto!important;margin-right:auto!important}.ngg-gallery-singlepic-image .ngg-trigger-buttons{margin:5px 0 0} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php index f2e2f4ed4..8992e14da 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/module.nextgen_basic_tagcloud.php @@ -24,7 +24,7 @@ class M_NextGen_Basic_Tagcloud extends C_Base_Module NGG_BASIC_TAGCLOUD, 'NextGen Basic Tagcloud', 'Provides a tagcloud for NextGEN Gallery', - '3.0.0', + '3.0.0.1', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -167,6 +167,7 @@ class C_NextGen_Basic_Tagcloud_Installer extends C_Gallery_Display_Installer { /** * Installs the display type for NextGEN Basic Tagcloud + * @param bool $reset (optional) Unused */ function install($reset = FALSE) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php index 114bec58b..1c60d38cf 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/package.module.nextgen_basic_tagcloud.php @@ -28,7 +28,9 @@ class A_NextGen_Basic_Tagcloud_Controller extends Mixin /** * Displays the 'tagcloud' display type * - * @param stdClass|C_Displayed_Gallery|C_DataMapper_Model $displayed_gallery + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return (optional) + * @return string */ function index_action($displayed_gallery, $return = FALSE) { @@ -54,7 +56,6 @@ class A_NextGen_Basic_Tagcloud_Controller extends Mixin } $params = $display_settings; $params['inner_content'] = $displayed_gallery->inner_content; - $params['storage'] =& $storage; $params['tagcloud'] = wp_generate_tag_cloud($tags, $args); $params['displayed_gallery_id'] = $displayed_gallery->id(); $params = $this->object->prepare_display_parameters($displayed_gallery, $params); @@ -68,7 +69,7 @@ class A_NextGen_Basic_Tagcloud_Controller extends Mixin function enqueue_frontend_resources($displayed_gallery) { $this->call_parent('enqueue_frontend_resources', $displayed_gallery); - wp_enqueue_style('photocrati-nextgen_basic_tagcloud-style', $this->get_static_url('photocrati-nextgen_basic_tagcloud#nextgen_basic_tagcloud.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('photocrati-nextgen_basic_tagcloud-style', $this->get_static_url('photocrati-nextgen_basic_tagcloud#nextgen_basic_tagcloud.css'), array(), NGG_SCRIPT_VERSION); $this->enqueue_ngg_styles(); } } @@ -196,7 +197,7 @@ class C_Taxonomy_Controller extends C_MVC_Controller /** * Returns an instance of this class * - * @param string $context + * @param string|bool $context * @return C_Taxonomy_Controller */ static function get_instance($context = FALSE) @@ -218,12 +219,13 @@ class C_Taxonomy_Controller extends C_MVC_Controller // Respect the global display type setting $display_type = $mapper->find_by_name(NGG_BASIC_TAGCLOUD, TRUE); $display_type = !empty($display_type->settings['gallery_display_type']) ? $display_type->settings['gallery_display_type'] : NGG_BASIC_THUMBNAILS; - return "[ngg_images source='tags' container_ids='{$tag}' slug='{$tag}' display_type='{$display_type}']"; + return "[ngg source='tags' container_ids='{$tag}' slug='{$tag}' display_type='{$display_type}']"; } /** * Determines if the current page is /ngg_tag/{*} * * @param $posts Wordpress post objects + * @param WP_Query $wp_query_local * @return array Wordpress post objects */ function detect_ngg_tag($posts, $wp_query_local) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/static/nextgen_basic_tagcloud.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/static/nextgen_basic_tagcloud.min.css index 4502edf40..e8f694854 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/static/nextgen_basic_tagcloud.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_tagcloud/static/nextgen_basic_tagcloud.min.css @@ -1 +1 @@ -.ngg-tagcloud{display:inline-block}.ngg-tagcloud ul.wp-tag-cloud{margin:0;padding:0}.ngg-tagcloud ul.wp-tag-cloud li{list-style:none;float:left;height:30pt;margin:0 4px 0 0;padding:0}.ngg-tagcloud ul.wp-tag-cloud li a{display:table-cell;vertical-align:bottom;height:30pt} \ No newline at end of file +.ngg-tagcloud{display:inline-block}.ngg-tagcloud ul.wp-tag-cloud{margin:0;padding:0}.ngg-tagcloud ul.wp-tag-cloud li{list-style:none;float:left;height:30pt;margin:0 4px 0 0;padding:0}.ngg-tagcloud ul.wp-tag-cloud li a{display:table-cell;display:block\9;vertical-align:bottom;height:30pt} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php index 3d500eca0..751712607 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/module.nextgen_basic_templates.php @@ -22,7 +22,7 @@ class M_NextGen_Basic_Templates extends C_Base_Module 'photocrati-nextgen_basic_templates', 'NextGen Basic Templates', 'Provides a NextGen-Legacy compatible thumbnail gallery for NextGEN Gallery', - '3.0.0', + '3.0.0.2', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php index 0ffc9edc3..5a5c5dec8 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_templates/package.module.nextgen_basic_templates.php @@ -44,7 +44,7 @@ class A_NextGen_Basic_Template_Form extends Mixin } // add <default> template that acts the same way as having no template specified $templates['default'] = __('Default', 'nggallery'); - return $this->object->render_partial('photocrati-nextgen_basic_templates#nextgen_basic_templates_settings_template', array('display_type_name' => $display_type->name, 'template_label' => __('Template', 'nggallery'), 'template_text' => __('Use a legacy template when rendering (not recommended).', 'nggallery'), 'chosen_file' => $display_type->settings['template'], 'templates' => $templates), True); + return $this->object->render_partial('photocrati-nextgen_basic_templates#nextgen_basic_templates_settings_template', array('display_type_name' => $display_type->name, 'template_label' => __('Legacy (Old) Templates', 'nggallery'), 'template_text' => __('Use a legacy template when rendering (not recommended).', 'nggallery'), 'chosen_file' => $display_type->settings['template'], 'templates' => $templates), True); } /** * Retrieves listing of available templates @@ -187,6 +187,10 @@ class C_Legacy_Template_Locator extends C_Component $this->add_mixin('Mixin_Legacy_Template_Locator'); $this->implement('I_Legacy_Template_Locator'); } + /** + * @param bool|string $context + * @return C_Legacy_Template_Locator + */ static function get_instance($context = FALSE) { if (!isset(self::$_instances[$context])) { @@ -261,7 +265,8 @@ class Mixin_Legacy_Template_Locator extends Mixin } /** * Find a particular template by name - * @param $template + * @param string $template_name + * @return string */ function find($template_name) { @@ -310,9 +315,10 @@ class Mixin_NextGen_Basic_Templates extends Mixin * Renders NextGen-Legacy style templates * * @param string $template_name File name - * @param array $vars Specially formatted array of parameters - * @param bool $callback - * @param bool $return + * @param array $vars (optional) Specially formatted array of parameters + * @param bool $return (optional) + * @param string $prefix (optional) + * @return string */ function legacy_render($template_name, $vars = array(), $return = FALSE, $prefix = NULL) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php new file mode 100644 index 000000000..8639a0be1 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/module.nextgen_block.php @@ -0,0 +1,60 @@ +<?php + +/*** +{ + Module: photocrati-nextgen_block, +} +***/ + +define('NEXTGEN_BLOCK', 'photocrati-nextgen_block'); + +class M_NextGEN_Block extends C_Base_Module +{ + function define($id = 'pope-module', + $name = 'Pope Module', + $description = '', + $version = '', + $uri = '', + $author = '', + $author_uri = '', + $context = FALSE) + { + parent::define( + 'photocrati-nextgen_block', + 'NextGEN Block', + 'Provides a NextGEN Block for the Gutenberg interface.', + '3.1.1', + 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', + 'Imagely', + 'https://www.imagely.com' + ); + } + + function _register_hooks() + { + add_action( 'enqueue_block_editor_assets', array($this, 'nextgen_block_editor_assets') ); + } + + function nextgen_block_editor_assets() { + + $router = C_Router::get_instance(); + + wp_enqueue_script( + 'nextgen-block-js', + $router->get_static_url(NEXTGEN_BLOCK . '#build/block.min.js'), + array( 'wp-blocks', 'wp-i18n', 'wp-element'), + NGG_SCRIPT_VERSION, + TRUE + ); + + wp_enqueue_style( + 'nextgen-block-css', + $router->get_static_url(NEXTGEN_BLOCK . '#editor.css'), + array( 'wp-edit-blocks' ), + NGG_SCRIPT_VERSION + ); + } + +} + +new M_NextGEN_Block(); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/package.module.nextgen_block.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/package.module.nextgen_block.php new file mode 100644 index 000000000..b3d9bbc7f --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/package.module.nextgen_block.php @@ -0,0 +1 @@ +<?php diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js new file mode 100644 index 000000000..17d66fee5 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js @@ -0,0 +1,15 @@ +!function(C){var e={};function t(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return C[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.m=C,t.c=e,t.d=function(C,e,n){t.o(C,e)||Object.defineProperty(C,e,{enumerable:!0,get:n})},t.r=function(C){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(C,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(C,"__esModule",{value:!0})},t.t=function(C,e){if(1&e&&(C=t(C)),8&e)return C;if(4&e&&"object"==typeof C&&C&&C.__esModule)return C;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:C}),2&e&&"string"!=typeof C)for(var r in C)t.d(n,r,function(e){return C[e]}.bind(null,r));return n},t.n=function(C){var e=C&&C.__esModule?function(){return C.default}:function(){return C};return t.d(e,"a",e),e},t.o=function(C,e){return Object.prototype.hasOwnProperty.call(C,e)},t.p="",t(t.s=3)}([function(C,e,t){"use strict";C.exports=t(1)},function(C,e,t){"use strict"; +/** @license React v16.6.1 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */function n(C){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(C){return typeof C}:function(C){return C&&"function"==typeof Symbol&&C.constructor===Symbol&&C!==Symbol.prototype?"symbol":typeof C})(C)}var r=t(2),o="function"==typeof Symbol&&Symbol.for,l=o?Symbol.for("react.element"):60103,i=o?Symbol.for("react.portal"):60106,u=o?Symbol.for("react.fragment"):60107,a=o?Symbol.for("react.strict_mode"):60108,c=o?Symbol.for("react.profiler"):60114,f=o?Symbol.for("react.provider"):60109,s=o?Symbol.for("react.context"):60110,p=o?Symbol.for("react.concurrent_mode"):60111,d=o?Symbol.for("react.forward_ref"):60112,y=o?Symbol.for("react.suspense"):60113,h=o?Symbol.for("react.memo"):60115,m=o?Symbol.for("react.lazy"):60116,b="function"==typeof Symbol&&Symbol.iterator;function v(C){for(var e=arguments.length-1,t="https://reactjs.org/docs/error-decoder.html?invariant="+C,n=0;n<e;n++)t+="&args[]="+encodeURIComponent(arguments[n+1]);!function(C,e,t,n,r,o,l,i){if(!C){if(C=void 0,void 0===e)C=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[t,n,r,o,l,i],a=0;(C=Error(e.replace(/%s/g,function(){return u[a++]}))).name="Invariant Violation"}throw C.framesToPop=1,C}}(!1,"Minified React error #"+C+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",t)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_={};function k(C,e,t){this.props=C,this.context=e,this.refs=_,this.updater=t||g}function S(){}function w(C,e,t){this.props=C,this.context=e,this.refs=_,this.updater=t||g}k.prototype.isReactComponent={},k.prototype.setState=function(C,e){"object"!==n(C)&&"function"!=typeof C&&null!=C&&v("85"),this.updater.enqueueSetState(this,C,e,"setState")},k.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")},S.prototype=k.prototype;var O=w.prototype=new S;O.constructor=w,r(O,k.prototype),O.isPureReactComponent=!0;var j={current:null,currentDispatcher:null},E=Object.prototype.hasOwnProperty,R={key:!0,ref:!0,__self:!0,__source:!0};function P(C,e,t){var n=void 0,r={},o=null,i=null;if(null!=e)for(n in void 0!==e.ref&&(i=e.ref),void 0!==e.key&&(o=""+e.key),e)E.call(e,n)&&!R.hasOwnProperty(n)&&(r[n]=e[n]);var u=arguments.length-2;if(1===u)r.children=t;else if(1<u){for(var a=Array(u),c=0;c<u;c++)a[c]=arguments[c+2];r.children=a}if(C&&C.defaultProps)for(n in u=C.defaultProps)void 0===r[n]&&(r[n]=u[n]);return{$$typeof:l,type:C,key:o,ref:i,props:r,_owner:j.current}}function x(C){return"object"===n(C)&&null!==C&&C.$$typeof===l}var $=/\/+/g,M=[];function G(C,e,t,n){if(M.length){var r=M.pop();return r.result=C,r.keyPrefix=e,r.func=t,r.context=n,r.count=0,r}return{result:C,keyPrefix:e,func:t,context:n,count:0}}function A(C){C.result=null,C.keyPrefix=null,C.func=null,C.context=null,C.count=0,10>M.length&&M.push(C)}function N(C,e,t){return null==C?0:function C(e,t,r,o){var u=n(e);"undefined"!==u&&"boolean"!==u||(e=null);var a=!1;if(null===e)a=!0;else switch(u){case"string":case"number":a=!0;break;case"object":switch(e.$$typeof){case l:case i:a=!0}}if(a)return r(o,e,""===t?"."+T(e,0):t),1;if(a=0,t=""===t?".":t+":",Array.isArray(e))for(var c=0;c<e.length;c++){var f=t+T(u=e[c],c);a+=C(u,f,r,o)}else if(f=null===e||"object"!==n(e)?null:"function"==typeof(f=b&&e[b]||e["@@iterator"])?f:null,"function"==typeof f)for(e=f.call(e),c=0;!(u=e.next()).done;)a+=C(u=u.value,f=t+T(u,c++),r,o);else"object"===u&&v("31","[object Object]"==(r=""+e)?"object with keys {"+Object.keys(e).join(", ")+"}":r,"");return a}(C,"",e,t)}function T(C,e){return"object"===n(C)&&null!==C&&null!=C.key?function(C){var e={"=":"=0",":":"=2"};return"$"+(""+C).replace(/[=:]/g,function(C){return e[C]})}(C.key):e.toString(36)}function B(C,e){C.func.call(C.context,e,C.count++)}function I(C,e,t){var n=C.result,r=C.keyPrefix;C=C.func.call(C.context,e,C.count++),Array.isArray(C)?F(C,n,t,function(C){return C}):null!=C&&(x(C)&&(C=function(C,e){return{$$typeof:l,type:C.type,key:e,ref:C.ref,props:C.props,_owner:C._owner}}(C,r+(!C.key||e&&e.key===C.key?"":(""+C.key).replace($,"$&/")+"/")+t)),n.push(C))}function F(C,e,t,n,r){var o="";null!=t&&(o=(""+t).replace($,"$&/")+"/"),N(C,I,e=G(e,o,n,r)),A(e)}var U={Children:{map:function(C,e,t){if(null==C)return C;var n=[];return F(C,n,null,e,t),n},forEach:function(C,e,t){if(null==C)return C;N(C,B,e=G(null,null,e,t)),A(e)},count:function(C){return N(C,function(){return null},null)},toArray:function(C){var e=[];return F(C,e,null,function(C){return C}),e},only:function(C){return x(C)||v("143"),C}},createRef:function(){return{current:null}},Component:k,PureComponent:w,createContext:function(C,e){return void 0===e&&(e=null),(C={$$typeof:s,_calculateChangedBits:e,_currentValue:C,_currentValue2:C,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:f,_context:C},C.Consumer=C},forwardRef:function(C){return{$$typeof:d,render:C}},lazy:function(C){return{$$typeof:m,_ctor:C,_status:-1,_result:null}},memo:function(C,e){return{$$typeof:h,type:C,compare:void 0===e?null:e}},Fragment:u,StrictMode:a,Suspense:y,createElement:P,cloneElement:function(C,e,t){(null===C||void 0===C)&&v("267",C);var n=void 0,o=r({},C.props),i=C.key,u=C.ref,a=C._owner;if(null!=e){void 0!==e.ref&&(u=e.ref,a=j.current),void 0!==e.key&&(i=""+e.key);var c=void 0;for(n in C.type&&C.type.defaultProps&&(c=C.type.defaultProps),e)E.call(e,n)&&!R.hasOwnProperty(n)&&(o[n]=void 0===e[n]&&void 0!==c?c[n]:e[n])}if(1===(n=arguments.length-2))o.children=t;else if(1<n){c=Array(n);for(var f=0;f<n;f++)c[f]=arguments[f+2];o.children=c}return{$$typeof:l,type:C.type,key:i,ref:u,props:o,_owner:a}},createFactory:function(C){var e=P.bind(null,C);return e.type=C,e},isValidElement:x,version:"16.6.3",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:j,assign:r}};U.unstable_ConcurrentMode=p,U.unstable_Profiler=c;var q={default:U},D=q&&U||q;C.exports=D.default||D},function(C,e,t){"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/var n=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,o=Object.prototype.propertyIsEnumerable;C.exports=function(){try{if(!Object.assign)return!1;var C=new String("abc");if(C[5]="de","5"===Object.getOwnPropertyNames(C)[0])return!1;for(var e={},t=0;t<10;t++)e["_"+String.fromCharCode(t)]=t;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(C){return e[C]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(C){n[C]=C}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(C){return!1}}()?Object.assign:function(C,e){for(var t,l,i=function(C){if(null===C||void 0===C)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(C)}(C),u=1;u<arguments.length;u++){for(var a in t=Object(arguments[u]))r.call(t,a)&&(i[a]=t[a]);if(n){l=n(t);for(var c=0;c<l.length;c++)o.call(t,l[c])&&(i[l[c]]=t[l[c]])}}return i}},function(C,e,t){"use strict";function n(C){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(C){return typeof C}:function(C){return C&&"function"==typeof Symbol&&C.constructor===Symbol&&C!==Symbol.prototype?"symbol":typeof C})(C)}function r(C,e){for(var t=0;t<e.length;t++){var n=e[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(C,n.key,n)}}function o(C,e,t){return(o="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(C,e,t){var n=function(C,e){for(;!Object.prototype.hasOwnProperty.call(C,e)&&null!==(C=l(C)););return C}(C,e);if(n){var r=Object.getOwnPropertyDescriptor(n,e);return r.get?r.get.call(t):r.value}})(C,e,t||C)}function l(C){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(C){return C.__proto__||Object.getPrototypeOf(C)})(C)}function i(C,e){return(i=Object.setPrototypeOf||function(C,e){return C.__proto__=e,C})(C,e)}function u(C){if(void 0===C)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return C}t.r(e);wp.i18n.__;var a=(0,lodash.memoize)(function(C,e){return function(t){function a(C){var e;return function(C,e){if(!(C instanceof e))throw new TypeError("Cannot call a class as a function")}(this,a),(e=function(C,e){return!e||"object"!==n(e)&&"function"!=typeof e?u(C):e}(this,l(a).call(this,C))).openIGW=e.openIGW.bind(u(u(e))),e.updateContent=e.updateContent.bind(u(u(e))),e.hasGallery=e.hasGallery.bind(u(u(e))),e.toggleAddGalleryBtn=e.toggleAddGalleryBtn.bind(u(u(e))),e}return function(C,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");C.prototype=Object.create(e&&e.prototype,{constructor:{value:C,writable:!0,configurable:!0}}),e&&i(C,e)}(a,e),function(C,e,t){e&&r(C.prototype,e),t&&r(C,t)}(a,[{key:"hasGallery",value:function(){return this.props.attributes.content&&this.props.attributes.content.length>0}},{key:"componentDidMount",value:function(){o(l(a.prototype),"componentDidMount",this).call(this),C(this.ref).addClass("freeform-toolbar").addClass("ngg-freeform-toolbar"),this.toggleAddGalleryBtn()}},{key:"componentDidUpdate",value:function(){this.toggleAddGalleryBtn()}},{key:"toggleAddGalleryBtn",value:function(){this.props.attributes.content?(C(this.ref).addClass("hidden"),C(this.ref).siblings(".add-ngg-gallery-wrap").hide()):(C(this.ref).removeClass("hidden"),C(this.ref).siblings(".add-ngg-gallery-wrap").show())}},{key:"updateContent",value:function(C){this.props.setAttributes({content:C})}},{key:"onSetup",value:function(C){o(l(a.prototype),"onSetup",this).call(this,C);var e=this.updateContent.bind(this);C.on("ngg-removed",function(){return e("")}),C.on("ngg-inserted",function(C){var t=C.shortcode;return e(t)})}},{key:"openIGW",value:function(){this.editor.execCommand("ngg_attach_to_post")}},{key:"render",value:function(){return[o(l(a.prototype),"render",this).call(this),React.createElement("div",{className:"add-ngg-gallery-wrap"},React.createElement("div",{className:"add-ngg-gallery",onClick:this.openIGW},ngg_tinymce_plugin.i18n.button_label))]}}]),a}()}),c={};c.nextgen=React.createElement("svg",{id:"svg",version:"1.1",width:"400",height:"385.8088930936613",viewBox:"0 0 400 385.8088930936613"},React.createElement("g",{id:"svgg"},React.createElement("path",{id:"path0",d:"",stroke:"none",fill:"#000055","fill-rule":"evenodd"}),React.createElement("path",{id:"path1",d:"",stroke:"none",fill:"#002424","fill-rule":"evenodd"}),React.createElement("path",{id:"path2",d:"M194.418 152.698 C 154.152 157.677,135.139 203.873,160.388 235.383 C 179.730 259.522,217.168 260.458,237.772 237.316 C 261.954 210.156,250.860 167.167,216.592 155.239 C 210.224 153.023,200.657 151.926,194.418 152.698 ",stroke:"none",fill:"#143650","fill-rule":"evenodd"}),React.createElement("path",{id:"path3",d:"",stroke:"none",fill:"#555500","fill-rule":"evenodd"}),React.createElement("path",{id:"path4",d:"M109.430 274.467 C 109.368 274.629,109.202 274.717,109.061 274.663 C 108.920 274.609,108.715 274.732,108.606 274.936 C 108.496 275.140,108.286 275.307,108.139 275.307 C 107.992 275.307,107.796 275.441,107.705 275.605 C 107.536 275.907,106.895 276.338,106.291 276.556 C 106.109 276.622,105.960 276.753,105.960 276.848 C 105.960 276.942,105.747 277.101,105.487 277.200 C 105.227 277.299,105.014 277.467,105.014 277.573 C 105.014 277.680,104.920 277.767,104.805 277.767 C 104.690 277.767,104.285 278.009,103.906 278.303 C 103.527 278.598,103.068 278.894,102.886 278.960 C 102.703 279.026,102.554 279.168,102.554 279.275 C 102.554 279.382,102.427 279.470,102.272 279.470 C 102.117 279.470,101.884 279.640,101.754 279.849 C 101.624 280.057,101.367 280.227,101.184 280.227 C 101.001 280.227,100.851 280.314,100.851 280.421 C 100.851 280.528,100.639 280.696,100.378 280.795 C 100.118 280.894,99.905 281.071,99.905 281.189 C 99.905 281.306,99.793 281.360,99.655 281.307 C 99.518 281.254,99.304 281.373,99.181 281.570 C 99.057 281.768,98.838 281.930,98.694 281.930 C 98.550 281.930,98.383 282.059,98.322 282.217 C 98.262 282.374,97.997 282.585,97.734 282.685 C 97.471 282.785,97.256 282.954,97.256 283.061 C 97.256 283.167,97.095 283.254,96.898 283.254 C 96.701 283.254,96.491 283.382,96.431 283.538 C 96.371 283.694,96.201 283.822,96.053 283.822 C 95.904 283.822,95.731 283.959,95.667 284.126 C 95.603 284.292,95.438 284.386,95.302 284.334 C 95.165 284.281,94.952 284.400,94.829 284.598 C 94.705 284.796,94.529 284.957,94.437 284.957 C 94.344 284.957,93.996 285.213,93.661 285.525 C 93.327 285.837,92.965 286.093,92.857 286.093 C 92.748 286.093,92.296 286.391,91.851 286.755 C 91.407 287.119,90.958 287.417,90.854 287.417 C 90.750 287.417,90.637 287.481,90.602 287.559 C 90.471 287.855,89.293 288.565,89.116 288.455 C 89.014 288.392,88.931 288.476,88.931 288.641 C 88.931 288.805,88.718 289.021,88.458 289.120 C 88.198 289.219,87.985 289.392,87.985 289.505 C 87.985 289.617,87.602 289.879,87.133 290.086 C 86.665 290.293,86.282 290.546,86.282 290.647 C 86.282 290.749,86.090 290.915,85.856 291.017 C 85.220 291.292,84.692 291.646,84.522 291.911 C 84.439 292.041,84.245 292.148,84.091 292.148 C 83.936 292.148,83.761 292.275,83.701 292.431 C 83.641 292.588,83.504 292.715,83.396 292.715 C 83.287 292.715,82.835 293.013,82.391 293.377 C 81.946 293.742,81.493 294.040,81.384 294.040 C 81.276 294.040,81.097 294.207,80.988 294.411 C 80.871 294.629,80.673 294.738,80.508 294.675 C 80.337 294.609,80.227 294.677,80.227 294.850 C 80.227 295.006,80.014 295.187,79.754 295.253 C 79.494 295.318,79.281 295.455,79.281 295.557 C 79.281 295.659,79.162 295.743,79.017 295.743 C 78.872 295.743,78.707 295.864,78.650 296.012 C 78.594 296.160,78.223 296.433,77.826 296.619 C 77.429 296.804,76.994 297.108,76.858 297.295 C 76.722 297.482,76.488 297.635,76.337 297.635 C 76.187 297.635,76.064 297.715,76.064 297.814 C 76.064 297.990,75.336 298.457,74.693 298.693 C 74.510 298.760,74.361 298.892,74.361 298.986 C 74.361 299.081,74.170 299.241,73.936 299.342 C 73.345 299.597,72.922 299.894,72.049 300.662 C 71.636 301.026,71.221 301.325,71.127 301.325 C 71.032 301.325,70.662 301.559,70.303 301.845 C 69.945 302.131,69.562 302.365,69.452 302.365 C 69.342 302.365,69.253 302.449,69.253 302.551 C 69.253 302.653,69.040 302.790,68.780 302.855 C 68.519 302.920,68.307 303.102,68.307 303.259 C 68.307 303.451,68.183 303.512,67.928 303.446 C 67.680 303.381,67.550 303.440,67.550 303.617 C 67.550 303.766,67.337 303.969,67.077 304.068 C 66.816 304.167,66.604 304.337,66.604 304.447 C 66.604 304.556,66.391 304.726,66.131 304.825 C 65.870 304.924,65.658 305.092,65.658 305.199 C 65.658 305.305,65.487 305.393,65.279 305.393 C 65.071 305.393,64.901 305.480,64.901 305.587 C 64.901 305.693,64.688 305.861,64.428 305.960 C 64.167 306.059,63.955 306.227,63.955 306.334 C 63.955 306.441,63.784 306.528,63.576 306.528 C 63.368 306.528,63.198 306.615,63.198 306.722 C 63.198 306.828,62.985 306.997,62.725 307.096 C 62.465 307.194,62.252 307.361,62.252 307.465 C 62.252 307.570,61.907 307.831,61.486 308.046 C 61.064 308.261,60.672 308.561,60.614 308.712 C 60.556 308.864,60.389 308.988,60.243 308.988 C 60.097 308.988,59.835 309.154,59.662 309.356 C 59.488 309.559,59.285 309.687,59.210 309.641 C 59.135 309.595,58.800 309.812,58.467 310.124 C 58.133 310.436,57.748 310.691,57.612 310.691 C 57.475 310.691,57.335 310.754,57.301 310.833 C 57.184 311.095,55.380 312.394,55.132 312.394 C 54.996 312.394,54.803 312.547,54.703 312.735 C 54.602 312.923,54.174 313.242,53.752 313.445 C 53.330 313.647,52.983 313.879,52.982 313.959 C 52.981 314.040,52.789 314.189,52.554 314.290 C 51.958 314.548,51.520 314.853,50.731 315.562 C 50.355 315.900,49.942 316.176,49.812 316.177 C 49.683 316.177,49.476 316.340,49.353 316.537 C 49.229 316.735,49.027 316.858,48.903 316.810 C 48.779 316.763,48.626 316.856,48.564 317.018 C 48.502 317.181,48.339 317.313,48.203 317.313 C 48.067 317.313,47.695 317.547,47.375 317.833 C 46.625 318.507,45.782 319.104,45.364 319.259 C 45.182 319.327,45.033 319.470,45.033 319.578 C 45.033 319.685,44.903 319.773,44.743 319.773 C 44.584 319.773,44.405 319.901,44.345 320.057 C 44.285 320.213,44.075 320.341,43.878 320.341 C 43.622 320.341,43.519 320.476,43.519 320.814 C 43.519 321.074,43.587 321.287,43.670 321.287 C 43.753 321.287,44.147 321.798,44.545 322.422 C 44.942 323.046,45.343 323.557,45.434 323.557 C 45.526 323.557,45.601 323.655,45.601 323.774 C 45.601 323.894,45.899 324.355,46.263 324.799 C 46.627 325.244,46.925 325.700,46.925 325.812 C 46.925 325.925,47.010 326.017,47.114 326.017 C 47.219 326.017,47.304 326.132,47.304 326.272 C 47.304 326.411,47.474 326.680,47.682 326.868 C 47.890 327.057,48.061 327.331,48.061 327.477 C 48.061 327.634,48.209 327.719,48.420 327.685 C 48.728 327.634,49.763 328.480,49.763 328.783 C 49.763 328.837,49.976 329.160,50.237 329.501 C 50.497 329.842,50.710 330.217,50.710 330.335 C 50.710 330.610,51.587 331.190,51.802 331.058 C 51.891 331.002,52.123 331.229,52.316 331.562 C 52.509 331.894,52.780 332.235,52.918 332.318 C 53.056 332.401,53.169 332.587,53.169 332.731 C 53.169 332.875,53.347 333.049,53.565 333.118 C 53.783 333.187,54.082 333.533,54.230 333.888 C 54.378 334.242,54.578 334.532,54.675 334.532 C 54.772 334.532,54.964 334.766,55.102 335.052 C 55.239 335.338,55.492 335.574,55.663 335.575 C 56.001 335.578,56.764 336.191,56.764 336.461 C 56.764 336.713,57.567 337.748,57.763 337.748 C 57.981 337.748,58.642 338.535,58.650 338.804 C 58.654 338.917,58.888 339.130,59.171 339.277 C 59.786 339.598,61.757 341.524,61.929 341.973 C 61.996 342.147,62.168 342.289,62.311 342.289 C 62.454 342.289,62.725 342.577,62.915 342.929 C 63.125 343.319,63.542 343.693,63.985 343.889 C 64.385 344.065,64.711 344.333,64.711 344.485 C 64.711 344.637,64.882 344.825,65.091 344.902 C 65.299 344.979,65.628 345.336,65.821 345.696 C 66.014 346.056,66.335 346.394,66.535 346.449 C 66.972 346.567,68.307 347.617,68.307 347.843 C 68.307 348.075,69.693 349.274,69.850 349.177 C 69.923 349.132,70.037 349.267,70.103 349.477 C 70.170 349.687,70.389 349.858,70.590 349.858 C 70.791 349.858,70.956 349.924,70.956 350.004 C 70.956 350.370,72.658 351.980,72.934 351.874 C 73.117 351.804,73.226 351.868,73.226 352.046 C 73.226 352.202,73.370 352.385,73.545 352.452 C 73.721 352.520,74.109 352.853,74.408 353.193 C 74.727 353.556,75.063 353.768,75.222 353.707 C 75.385 353.645,75.552 353.757,75.637 353.986 C 75.778 354.360,77.338 355.718,77.633 355.722 C 77.925 355.725,78.903 356.556,78.903 356.800 C 78.903 356.937,78.988 357.048,79.093 357.048 C 79.198 357.048,79.469 357.261,79.695 357.521 C 79.921 357.781,80.240 357.997,80.403 357.999 C 80.566 358.002,81.069 358.343,81.520 358.756 C 81.972 359.170,82.451 359.508,82.586 359.508 C 82.721 359.508,82.876 359.678,82.931 359.886 C 82.988 360.104,83.189 360.265,83.404 360.265 C 83.627 360.265,83.821 360.428,83.883 360.668 C 83.961 360.965,84.092 361.045,84.379 360.970 C 84.624 360.906,84.768 360.959,84.768 361.114 C 84.768 361.353,85.288 361.680,85.572 361.619 C 85.650 361.603,85.714 361.717,85.714 361.873 C 85.714 362.029,85.864 362.157,86.048 362.157 C 86.231 362.157,86.466 362.349,86.570 362.583 C 86.674 362.817,86.908 362.997,87.090 362.982 C 87.272 362.967,87.686 363.202,88.008 363.503 C 88.331 363.805,88.863 364.179,89.191 364.334 C 89.518 364.490,89.998 364.809,90.257 365.043 C 90.517 365.277,90.814 365.478,90.918 365.489 C 91.452 365.547,91.958 365.827,91.958 366.064 C 91.958 366.211,92.107 366.386,92.289 366.453 C 92.472 366.520,92.693 366.695,92.781 366.842 C 92.883 367.012,93.105 367.067,93.396 366.994 C 93.646 366.932,93.851 366.963,93.851 367.063 C 93.851 367.400,94.783 368.258,95.042 368.158 C 95.182 368.105,95.398 368.222,95.521 368.420 C 95.645 368.618,95.905 368.780,96.100 368.780 C 96.294 368.780,96.559 368.907,96.689 369.063 C 96.818 369.219,97.049 369.347,97.202 369.347 C 97.355 369.347,97.828 369.645,98.254 370.009 C 98.679 370.374,99.129 370.672,99.254 370.672 C 99.379 370.672,99.586 370.798,99.714 370.953 C 99.843 371.108,100.024 371.189,100.116 371.131 C 100.208 371.074,100.284 371.112,100.284 371.214 C 100.284 371.425,101.342 371.996,101.732 371.996 C 101.872 371.996,101.965 372.103,101.939 372.233 C 101.912 372.372,102.130 372.493,102.470 372.526 C 102.801 372.558,103.360 372.861,103.781 373.235 C 104.185 373.594,104.655 373.888,104.826 373.888 C 104.997 373.888,105.342 374.106,105.592 374.372 C 105.873 374.671,106.180 374.821,106.396 374.765 C 106.594 374.713,106.953 374.853,107.220 375.085 C 107.480 375.311,107.751 375.501,107.820 375.506 C 108.117 375.528,108.913 375.843,109.149 376.032 C 109.289 376.145,109.518 376.254,109.657 376.274 C 109.796 376.294,110.249 376.584,110.664 376.917 C 111.079 377.251,111.501 377.472,111.602 377.410 C 111.704 377.348,111.837 377.429,111.899 377.591 C 111.962 377.753,112.093 377.836,112.191 377.776 C 112.289 377.715,112.694 377.851,113.091 378.077 C 114.435 378.844,114.758 378.995,115.057 378.996 C 115.221 378.997,115.558 379.214,115.807 379.478 C 116.071 379.759,116.425 379.938,116.658 379.907 C 116.877 379.879,117.263 379.987,117.516 380.147 C 117.769 380.308,118.444 380.635,119.016 380.874 C 119.588 381.114,120.203 381.438,120.381 381.595 C 120.559 381.753,120.847 381.827,121.021 381.760 C 121.216 381.685,121.596 381.838,122.021 382.162 C 122.398 382.449,122.810 382.660,122.938 382.631 C 123.065 382.602,123.363 382.702,123.600 382.854 C 123.837 383.006,124.201 383.158,124.409 383.192 C 124.617 383.226,124.903 383.410,125.045 383.601 C 125.219 383.834,125.444 383.912,125.735 383.839 C 125.999 383.772,126.203 383.825,126.261 383.974 C 126.364 384.244,127.909 384.408,127.909 384.150 C 127.909 384.061,128.172 383.720,128.493 383.391 C 128.979 382.894,129.056 382.698,128.951 382.220 C 128.843 381.728,128.872 381.664,129.154 381.773 C 129.421 381.875,129.463 381.821,129.376 381.489 C 129.294 381.175,129.353 381.079,129.625 381.079 C 129.919 381.079,129.961 380.981,129.868 380.513 C 129.795 380.146,129.862 379.784,130.062 379.479 C 130.231 379.221,130.369 378.916,130.369 378.801 C 130.369 378.686,130.500 378.461,130.659 378.301 C 130.886 378.075,130.901 377.952,130.726 377.742 C 130.546 377.525,130.624 377.364,131.121 376.920 C 131.619 376.476,131.716 376.274,131.618 375.885 C 131.552 375.619,131.565 375.402,131.649 375.402 C 131.907 375.402,132.450 374.330,132.450 373.821 C 132.450 373.241,132.798 372.415,133.253 371.913 C 133.436 371.711,133.568 371.456,133.546 371.346 C 133.477 370.988,133.777 370.104,133.968 370.104 C 134.070 370.104,134.153 369.891,134.153 369.631 C 134.153 369.354,134.251 369.178,134.390 369.205 C 134.539 369.235,134.621 369.043,134.613 368.685 C 134.606 368.373,134.720 368.028,134.867 367.918 C 135.013 367.809,135.108 367.596,135.077 367.445 C 135.005 367.096,135.651 365.752,135.891 365.752 C 135.991 365.752,136.055 365.561,136.034 365.326 C 135.986 364.807,136.396 363.671,136.632 363.671 C 136.725 363.671,136.802 363.467,136.802 363.218 C 136.802 362.969,136.939 362.713,137.106 362.649 C 137.318 362.567,137.376 362.395,137.297 362.082 C 137.226 361.799,137.288 361.546,137.466 361.399 C 137.621 361.270,137.748 361.086,137.748 360.989 C 137.748 360.893,137.919 360.462,138.127 360.031 C 138.335 359.600,138.505 359.088,138.505 358.894 C 138.505 358.699,138.590 358.592,138.694 358.657 C 138.804 358.724,138.884 358.547,138.884 358.239 C 138.884 357.944,139.096 357.390,139.357 357.008 C 139.617 356.625,139.830 356.124,139.830 355.895 C 139.830 355.368,140.756 353.453,141.011 353.453 C 141.121 353.453,141.154 353.217,141.089 352.892 C 141.008 352.486,141.062 352.282,141.283 352.159 C 141.484 352.046,141.552 351.844,141.480 351.570 C 141.399 351.260,141.440 351.179,141.641 351.256 C 141.842 351.334,141.911 351.196,141.911 350.715 C 141.911 350.360,141.990 350.021,142.086 349.962 C 142.182 349.902,142.316 349.599,142.385 349.288 C 142.453 348.977,142.613 348.723,142.741 348.723 C 142.871 348.723,143.126 348.120,143.321 347.351 C 143.512 346.596,143.784 345.845,143.925 345.680 C 144.066 345.516,144.182 345.249,144.182 345.086 C 144.182 344.923,144.315 344.739,144.479 344.676 C 144.671 344.602,144.735 344.434,144.660 344.198 C 144.596 343.997,144.713 343.465,144.918 343.014 C 145.572 341.583,145.955 340.687,145.995 340.492 C 146.130 339.835,146.342 339.451,146.569 339.451 C 146.727 339.451,146.833 339.245,146.837 338.931 C 146.840 338.645,146.966 338.247,147.117 338.048 C 147.304 337.801,147.332 337.612,147.204 337.458 C 147.074 337.302,147.105 337.156,147.301 336.993 C 147.459 336.863,147.588 336.596,147.588 336.401 C 147.588 336.205,147.673 336.045,147.777 336.045 C 147.881 336.045,147.966 335.837,147.966 335.583 C 147.966 335.329,148.129 335.006,148.329 334.866 C 148.539 334.719,148.741 334.286,148.808 333.839 C 148.871 333.414,149.091 332.719,149.296 332.294 C 149.792 331.268,149.789 330.258,149.290 329.991 C 149.082 329.879,148.912 329.700,148.912 329.593 C 148.912 329.485,148.699 329.119,148.439 328.777 C 148.179 328.436,147.966 328.086,147.966 327.998 C 147.966 327.911,147.625 327.435,147.209 326.941 C 146.793 326.448,146.452 325.953,146.452 325.841 C 146.452 325.730,146.386 325.639,146.306 325.639 C 146.226 325.639,145.991 325.321,145.786 324.934 C 145.580 324.546,145.284 324.090,145.128 323.921 C 144.619 323.370,144.182 322.798,144.182 322.684 C 144.182 322.622,143.926 322.248,143.614 321.854 C 143.302 321.460,143.046 321.041,143.046 320.922 C 143.046 320.804,142.919 320.658,142.763 320.598 C 142.606 320.538,142.479 320.406,142.479 320.305 C 142.479 320.203,142.181 319.757,141.816 319.312 C 141.452 318.868,141.154 318.404,141.154 318.281 C 141.154 318.158,141.026 318.009,140.870 317.949 C 140.714 317.889,140.587 317.719,140.587 317.571 C 140.587 317.423,140.459 317.252,140.303 317.192 C 140.147 317.132,140.019 317.004,140.019 316.907 C 140.019 316.698,139.230 315.544,139.026 315.453 C 138.947 315.418,138.884 315.282,138.884 315.151 C 138.884 315.019,138.713 314.758,138.505 314.570 C 138.297 314.381,138.127 314.113,138.127 313.973 C 138.127 313.833,138.040 313.718,137.933 313.718 C 137.826 313.718,137.658 313.505,137.559 313.245 C 137.460 312.985,137.306 312.772,137.216 312.772 C 137.067 312.772,136.696 312.128,136.642 311.775 C 136.630 311.695,136.443 311.440,136.228 311.208 C 135.601 310.532,134.359 308.771,134.237 308.384 C 134.175 308.189,133.939 307.836,133.713 307.599 C 133.487 307.362,133.174 306.971,133.018 306.730 C 132.862 306.489,132.644 306.196,132.534 306.079 C 132.424 305.962,132.169 305.573,131.967 305.216 C 131.764 304.858,131.450 304.390,131.268 304.175 C 130.563 303.344,130.452 303.186,130.089 302.503 C 129.884 302.115,129.647 301.798,129.564 301.798 C 129.481 301.798,129.333 301.585,129.234 301.325 C 129.135 301.064,128.967 300.851,128.860 300.851 C 128.753 300.851,128.666 300.737,128.666 300.597 C 128.666 300.457,128.496 300.188,128.288 300.000 C 128.079 299.812,127.909 299.579,127.909 299.484 C 127.909 299.389,127.803 299.200,127.673 299.064 C 127.543 298.928,127.308 298.626,127.152 298.393 C 126.996 298.160,126.734 297.788,126.570 297.566 C 126.405 297.344,126.216 297.013,126.150 296.831 C 126.083 296.649,125.950 296.500,125.853 296.500 C 125.756 296.500,125.489 296.138,125.260 295.695 C 125.030 295.253,124.723 294.823,124.578 294.740 C 124.433 294.657,124.314 294.465,124.314 294.314 C 124.314 294.163,124.226 294.040,124.119 294.040 C 124.012 294.040,123.869 293.891,123.802 293.709 C 123.735 293.526,123.503 293.122,123.287 292.810 C 123.071 292.498,122.809 292.106,122.705 291.939 C 122.487 291.589,121.384 290.080,121.101 289.743 C 120.995 289.617,120.908 289.459,120.908 289.392 C 120.908 289.289,119.878 287.898,119.207 287.094 C 119.102 286.968,119.016 286.810,119.016 286.743 C 119.016 286.675,118.761 286.298,118.448 285.904 C 118.136 285.509,117.881 285.097,117.881 284.987 C 117.881 284.877,117.774 284.719,117.644 284.636 C 117.344 284.444,116.556 283.327,116.556 283.093 C 116.556 282.996,116.429 282.868,116.272 282.808 C 116.116 282.748,115.989 282.577,115.989 282.429 C 115.989 282.281,115.861 282.111,115.705 282.051 C 115.549 281.991,115.421 281.851,115.421 281.739 C 115.421 281.511,114.646 280.356,114.428 280.259 C 114.350 280.224,114.286 280.079,114.286 279.937 C 114.286 279.795,114.179 279.610,114.049 279.527 C 113.749 279.335,112.961 278.218,112.961 277.984 C 112.961 277.887,112.833 277.759,112.677 277.699 C 112.521 277.639,112.394 277.503,112.394 277.396 C 112.394 276.953,110.065 274.176,109.691 274.173 C 109.610 274.173,109.493 274.305,109.430 274.467 ",stroke:"none",fill:"#8ca516","fill-rule":"evenodd"}),React.createElement("path",{id:"path5",d:"",stroke:"none",fill:"#6db600","fill-rule":"evenodd"}),React.createElement("path",{id:"path6",d:"M79.186 45.256 C 78.978 45.372,78.369 45.838,77.832 46.291 C 77.295 46.744,76.809 47.114,76.752 47.114 C 76.696 47.114,76.441 47.306,76.186 47.540 C 75.500 48.170,75.046 48.533,74.934 48.540 C 74.693 48.557,73.983 49.116,73.983 49.289 C 73.982 49.611,72.116 51.366,71.950 51.200 C 71.890 51.140,71.722 51.260,71.577 51.468 C 71.431 51.675,71.190 51.845,71.039 51.845 C 70.889 51.845,70.766 52.019,70.766 52.232 C 70.766 52.464,70.539 52.748,70.200 52.942 C 69.888 53.119,69.633 53.328,69.632 53.406 C 69.632 53.484,69.461 53.548,69.253 53.548 C 69.044 53.548,68.874 53.634,68.874 53.739 C 68.874 53.992,67.915 55.061,67.688 55.061 C 67.590 55.061,67.342 55.274,67.137 55.535 C 66.933 55.795,66.647 56.008,66.502 56.008 C 66.357 56.008,66.137 56.197,66.013 56.429 C 65.743 56.933,65.537 57.138,64.871 57.564 C 64.594 57.741,64.126 58.227,63.830 58.644 C 63.452 59.177,63.194 59.371,62.961 59.300 C 62.776 59.244,62.630 59.297,62.630 59.421 C 62.630 59.747,61.733 60.786,61.150 61.136 C 60.865 61.307,60.668 61.576,60.699 61.751 C 60.730 61.922,60.634 62.062,60.487 62.062 C 60.249 62.062,59.039 63.359,58.877 63.788 C 58.843 63.879,58.688 63.955,58.533 63.955 C 58.258 63.955,57.711 64.387,57.711 64.603 C 57.711 64.663,57.561 64.867,57.379 65.056 C 57.197 65.246,56.793 65.714,56.482 66.097 C 56.170 66.480,55.804 66.793,55.668 66.793 C 55.532 66.793,55.296 67.091,55.144 67.455 C 54.992 67.819,54.762 68.121,54.633 68.125 C 54.505 68.130,53.463 69.275,52.318 70.671 C 51.173 72.067,50.086 73.262,49.903 73.326 C 49.719 73.390,49.605 73.501,49.649 73.573 C 49.805 73.824,49.216 74.409,48.921 74.296 C 48.711 74.216,48.627 74.303,48.625 74.604 C 48.622 75.122,48.429 75.402,48.074 75.402 C 47.926 75.402,47.741 75.638,47.663 75.927 C 47.586 76.216,47.349 76.642,47.137 76.874 C 46.126 77.977,44.276 80.266,44.276 80.414 C 44.276 80.505,44.106 80.634,43.898 80.700 C 43.690 80.766,43.519 80.985,43.519 81.186 C 43.519 81.387,43.390 81.701,43.233 81.883 C 41.478 83.908,40.527 85.119,40.618 85.210 C 40.679 85.271,40.378 85.740,39.948 86.253 C 39.519 86.766,39.167 87.281,39.167 87.396 C 39.167 87.512,39.040 87.606,38.884 87.606 C 38.728 87.606,38.600 87.763,38.600 87.954 C 38.600 88.146,38.324 88.625,37.988 89.019 C 37.651 89.413,37.374 89.838,37.373 89.964 C 37.371 90.090,36.944 90.679,36.424 91.275 C 35.904 91.870,35.500 92.441,35.527 92.542 C 35.554 92.644,35.398 92.916,35.181 93.147 C 34.964 93.378,34.676 93.822,34.542 94.134 C 34.408 94.447,34.074 94.941,33.800 95.232 C 33.526 95.524,33.302 95.856,33.302 95.971 C 33.302 96.086,33.089 96.459,32.829 96.800 C 32.569 97.141,32.356 97.527,32.356 97.657 C 32.356 97.788,32.194 98.070,31.996 98.285 C 31.656 98.654,31.110 99.547,30.515 100.706 C 30.370 100.990,30.171 101.272,30.073 101.332 C 29.976 101.392,29.896 101.592,29.896 101.776 C 29.896 101.960,29.683 102.310,29.423 102.554 C 29.163 102.799,28.950 103.139,28.950 103.311 C 28.950 103.483,28.745 103.816,28.495 104.051 C 28.245 104.286,27.983 104.780,27.914 105.149 C 27.845 105.518,27.539 106.085,27.233 106.410 C 26.928 106.735,26.716 107.099,26.761 107.220 C 26.806 107.340,26.678 107.587,26.477 107.769 C 26.276 107.951,26.112 108.252,26.112 108.438 C 26.112 108.624,26.032 108.825,25.934 108.886 C 25.725 109.015,25.166 110.097,25.166 110.374 C 25.166 110.480,25.049 110.701,24.908 110.865 C 24.766 111.029,24.497 111.573,24.310 112.072 C 24.124 112.572,23.805 113.098,23.602 113.240 C 23.388 113.390,23.291 113.594,23.372 113.724 C 23.448 113.848,23.409 114.012,23.285 114.089 C 23.161 114.166,23.040 114.357,23.017 114.513 C 22.994 114.669,22.842 115.001,22.679 115.251 C 22.516 115.500,22.320 115.918,22.245 116.178 C 22.005 117.008,21.524 117.971,21.276 118.117 C 21.144 118.196,20.979 118.600,20.908 119.016 C 20.838 119.432,20.703 119.773,20.608 119.773 C 20.513 119.773,20.435 119.909,20.435 120.075 C 20.435 120.390,19.954 121.350,19.531 121.878 C 19.395 122.047,19.304 122.260,19.328 122.351 C 19.423 122.710,19.048 123.830,18.710 124.192 C 18.514 124.402,18.354 124.722,18.354 124.902 C 18.354 125.081,18.265 125.258,18.156 125.294 C 18.048 125.331,17.934 125.593,17.904 125.878 C 17.874 126.163,17.792 126.453,17.723 126.522 C 17.654 126.591,17.597 126.800,17.597 126.985 C 17.597 127.171,17.456 127.402,17.284 127.498 C 17.104 127.598,17.019 127.797,17.083 127.965 C 17.148 128.134,17.072 128.303,16.903 128.368 C 16.743 128.430,16.659 128.604,16.718 128.756 C 16.776 128.908,16.742 129.083,16.643 129.144 C 16.543 129.206,16.462 129.496,16.462 129.789 C 16.462 130.083,16.337 130.426,16.184 130.553 C 16.031 130.680,15.913 130.839,15.922 130.907 C 15.975 131.306,15.854 131.666,15.559 131.989 C 15.375 132.191,15.231 132.483,15.240 132.640 C 15.254 132.898,14.806 134.251,14.394 135.194 C 14.034 136.017,13.441 137.881,13.325 138.555 C 13.257 138.946,13.127 139.313,13.034 139.370 C 12.942 139.427,12.867 139.724,12.867 140.030 C 12.867 140.336,12.781 140.587,12.677 140.587 C 12.573 140.587,12.488 140.752,12.488 140.954 C 12.488 141.156,12.403 141.374,12.299 141.438 C 12.195 141.502,12.108 141.784,12.106 142.064 C 12.103 142.344,11.940 142.928,11.743 143.362 C 11.546 143.796,11.432 144.198,11.489 144.255 C 11.547 144.312,11.412 144.782,11.189 145.299 C 10.967 145.816,10.785 146.405,10.785 146.608 C 10.785 146.811,10.658 147.220,10.503 147.519 C 10.347 147.817,10.219 148.290,10.219 148.570 C 10.218 148.850,10.144 149.124,10.054 149.180 C 9.964 149.236,9.832 149.645,9.760 150.090 C 9.514 151.625,8.933 154.114,8.690 154.683 C 8.531 155.055,8.445 155.436,7.841 158.467 C 7.675 159.300,7.457 160.135,7.357 160.323 C 7.256 160.510,7.122 161.216,7.060 161.890 C 6.997 162.564,6.873 163.160,6.784 163.215 C 6.695 163.270,6.621 163.586,6.620 163.918 C 6.618 164.251,6.490 165.061,6.335 165.719 C 6.180 166.377,6.010 167.271,5.957 167.706 C 5.904 168.140,5.815 168.794,5.757 169.158 C 5.700 169.522,5.628 170.076,5.597 170.388 C 5.566 170.700,5.489 171.083,5.425 171.239 C 5.361 171.395,5.221 172.247,5.113 173.132 C 5.006 174.016,4.874 174.995,4.821 175.307 C 4.767 175.620,4.675 176.471,4.616 177.200 C 4.557 177.928,4.436 178.612,4.347 178.719 C 4.258 178.827,4.184 179.337,4.182 179.854 C 4.180 180.372,4.133 181.306,4.077 181.930 C 4.021 182.554,3.937 183.576,3.890 184.201 C 3.843 184.825,3.790 185.336,3.772 185.336 C 3.711 185.336,3.445 190.033,3.343 192.917 C 3.310 193.860,3.223 194.729,3.149 194.847 C 3.017 195.060,3.058 195.456,3.313 196.452 C 3.388 196.743,3.369 196.973,3.271 196.973 C 2.976 196.973,3.139 207.939,3.515 213.434 C 3.575 214.319,3.650 215.511,3.680 216.083 C 3.711 216.656,3.841 218.188,3.969 219.489 C 4.098 220.790,4.193 222.138,4.181 222.485 C 4.170 222.833,4.219 223.211,4.291 223.327 C 4.449 223.584,4.491 223.880,4.653 225.875 C 4.722 226.734,4.832 227.436,4.897 227.436 C 4.961 227.436,5.029 227.670,5.047 227.956 C 5.081 228.509,5.332 230.268,5.686 232.450 C 5.804 233.179,5.892 234.009,5.880 234.295 C 5.869 234.581,5.927 234.816,6.010 234.816 C 6.092 234.816,6.155 235.163,6.149 235.587 C 6.144 236.012,6.205 236.400,6.286 236.450 C 6.367 236.500,6.433 236.797,6.433 237.110 C 6.433 237.423,6.516 237.833,6.617 238.023 C 6.719 238.212,6.898 238.994,7.016 239.760 C 7.134 240.527,7.282 241.239,7.344 241.342 C 7.407 241.445,7.471 241.785,7.488 242.099 C 7.504 242.412,7.616 243.024,7.736 243.460 C 7.857 243.896,7.937 244.321,7.916 244.406 C 7.894 244.491,8.052 245.128,8.267 245.821 C 8.482 246.515,8.615 247.303,8.564 247.572 C 8.511 247.851,8.557 248.061,8.673 248.061 C 8.785 248.061,8.929 248.380,8.994 248.770 C 9.059 249.160,9.162 249.607,9.224 249.763 C 9.286 249.920,9.352 250.218,9.370 250.426 C 9.389 250.634,9.502 251.044,9.622 251.337 C 9.741 251.630,9.839 252.027,9.839 252.220 C 9.839 252.413,9.929 252.600,10.040 252.637 C 10.150 252.674,10.245 253.071,10.251 253.519 C 10.258 254.029,10.360 254.371,10.524 254.434 C 10.668 254.489,10.785 254.736,10.785 254.982 C 10.785 255.505,11.579 258.598,11.996 259.697 C 12.153 260.114,12.286 260.593,12.291 260.764 C 12.295 260.934,12.426 261.317,12.582 261.615 C 12.737 261.913,12.865 262.292,12.865 262.457 C 12.866 262.621,12.926 262.815,12.998 262.888 C 13.071 262.960,13.152 263.123,13.179 263.251 C 13.404 264.299,13.720 265.234,13.934 265.483 C 14.076 265.648,14.191 265.999,14.191 266.264 C 14.191 266.529,14.319 266.852,14.475 266.982 C 14.631 267.112,14.759 267.458,14.759 267.751 C 14.759 268.044,14.838 268.333,14.936 268.393 C 15.033 268.454,15.252 268.991,15.423 269.587 C 15.594 270.184,15.898 270.953,16.098 271.297 C 16.298 271.642,16.462 272.082,16.462 272.275 C 16.462 272.469,16.558 272.659,16.675 272.698 C 16.792 272.737,16.907 272.936,16.929 273.139 C 17.027 274.010,17.279 274.723,17.524 274.816 C 17.668 274.872,17.786 275.128,17.786 275.385 C 17.786 275.642,17.871 275.905,17.975 275.970 C 18.079 276.034,18.165 276.232,18.165 276.409 C 18.165 276.587,18.335 277.050,18.543 277.438 C 18.751 277.827,18.925 278.294,18.928 278.476 C 18.932 278.659,19.137 279.055,19.384 279.357 C 19.631 279.659,19.788 280.024,19.733 280.169 C 19.678 280.313,19.771 280.583,19.940 280.770 C 20.109 280.957,20.375 281.538,20.530 282.062 C 20.686 282.585,20.983 283.230,21.192 283.495 C 21.400 283.760,21.570 284.084,21.570 284.216 C 21.570 284.347,21.687 284.589,21.830 284.753 C 21.973 284.918,22.233 285.494,22.409 286.035 C 22.585 286.575,22.882 287.214,23.070 287.454 C 23.257 287.694,23.476 288.103,23.555 288.363 C 23.635 288.623,23.944 289.172,24.243 289.583 C 24.542 289.994,24.787 290.569,24.787 290.860 C 24.787 291.152,24.852 291.391,24.931 291.391 C 25.093 291.391,25.194 291.562,26.053 293.295 C 26.385 293.965,26.875 294.806,27.141 295.164 C 27.407 295.523,27.625 295.999,27.625 296.223 C 27.625 296.447,27.796 296.784,28.004 296.973 C 28.212 297.161,28.382 297.402,28.382 297.507 C 28.382 297.613,28.501 297.834,28.647 297.998 C 29.249 298.678,29.679 299.668,29.465 299.882 C 29.311 300.036,29.391 300.234,29.765 300.624 C 30.045 300.917,30.274 301.258,30.274 301.382 C 30.274 301.507,30.346 301.608,30.433 301.608 C 30.521 301.608,30.692 301.800,30.815 302.034 C 30.937 302.268,31.289 302.800,31.596 303.217 C 31.903 303.633,32.157 304.086,32.160 304.224 C 32.164 304.361,32.273 304.592,32.403 304.737 C 32.948 305.345,33.113 305.575,33.113 305.728 C 33.113 305.817,33.367 306.133,33.678 306.431 C 34.339 307.065,34.665 306.968,36.013 305.736 C 36.434 305.351,36.848 305.079,36.934 305.132 C 37.019 305.184,37.140 305.094,37.202 304.932 C 37.265 304.769,37.430 304.636,37.569 304.636 C 37.708 304.636,37.940 304.466,38.086 304.259 C 38.231 304.051,38.408 303.939,38.479 304.011 C 38.550 304.082,38.739 303.953,38.899 303.726 C 39.058 303.498,39.308 303.311,39.453 303.311 C 39.598 303.311,39.784 303.205,39.868 303.075 C 39.951 302.945,40.307 302.677,40.660 302.481 C 41.013 302.284,41.460 301.986,41.653 301.819 C 41.847 301.651,42.169 301.372,42.368 301.198 C 42.568 301.025,42.783 300.935,42.846 300.998 C 42.909 301.061,43.091 300.926,43.251 300.698 C 43.410 300.470,43.655 300.284,43.794 300.284 C 43.933 300.284,44.098 300.151,44.160 299.988 C 44.222 299.825,44.350 299.739,44.443 299.797 C 44.536 299.854,44.941 299.597,45.343 299.225 C 45.745 298.853,46.383 298.390,46.760 298.195 C 47.137 298.000,47.497 297.709,47.558 297.548 C 47.620 297.388,47.790 297.256,47.937 297.256 C 48.083 297.256,48.309 297.130,48.437 296.975 C 48.566 296.820,48.747 296.740,48.840 296.797 C 48.933 296.855,49.061 296.768,49.123 296.605 C 49.186 296.442,49.544 296.163,49.920 295.985 C 50.295 295.806,50.746 295.530,50.921 295.371 C 51.096 295.211,51.463 294.877,51.737 294.629 C 52.011 294.381,52.289 294.231,52.354 294.297 C 52.420 294.362,52.593 294.245,52.740 294.035 C 52.886 293.826,53.080 293.701,53.171 293.757 C 53.261 293.813,53.404 293.750,53.489 293.618 C 53.635 293.389,54.125 293.034,54.633 292.790 C 54.761 292.728,55.229 292.345,55.673 291.939 C 56.117 291.534,56.558 291.202,56.652 291.202 C 56.746 291.202,57.129 290.968,57.503 290.682 C 57.877 290.396,58.245 290.182,58.320 290.207 C 58.395 290.232,58.547 290.082,58.658 289.875 C 58.768 289.668,58.987 289.499,59.142 289.499 C 59.298 289.499,59.476 289.366,59.538 289.204 C 59.601 289.042,59.753 288.948,59.877 288.996 C 60.001 289.043,60.204 288.921,60.327 288.723 C 60.451 288.525,60.636 288.363,60.740 288.363 C 60.843 288.363,61.097 288.214,61.306 288.032 C 61.514 287.850,61.861 287.545,62.078 287.354 C 62.295 287.163,62.515 287.050,62.567 287.102 C 62.619 287.154,62.825 287.055,63.024 286.881 C 63.224 286.708,63.550 286.424,63.750 286.250 C 63.949 286.077,64.164 285.987,64.227 286.050 C 64.290 286.113,64.472 285.978,64.632 285.750 C 64.792 285.522,65.025 285.336,65.150 285.336 C 65.275 285.336,65.484 285.166,65.614 284.957 C 65.744 284.749,65.950 284.579,66.073 284.579 C 66.196 284.579,66.784 284.196,67.380 283.728 C 67.976 283.259,68.556 282.876,68.669 282.876 C 68.782 282.876,68.874 282.801,68.874 282.709 C 68.874 282.617,69.023 282.488,69.205 282.422 C 69.809 282.204,70.450 281.773,70.619 281.471 C 70.710 281.307,70.904 281.173,71.050 281.173 C 71.196 281.173,71.383 281.056,71.466 280.912 C 71.550 280.769,71.919 280.491,72.286 280.296 C 72.944 279.946,73.261 279.714,74.012 279.029 C 74.222 278.838,74.434 278.722,74.483 278.772 C 74.533 278.822,74.773 278.680,75.017 278.457 C 75.752 277.784,76.020 277.596,76.111 277.688 C 76.159 277.735,76.572 277.432,77.030 277.014 C 77.487 276.596,77.959 276.254,78.078 276.254 C 78.197 276.254,78.347 276.117,78.411 275.950 C 78.475 275.783,78.639 275.690,78.776 275.742 C 78.912 275.794,79.127 275.672,79.253 275.470 C 79.379 275.269,79.561 275.152,79.656 275.211 C 79.752 275.270,79.922 275.145,80.035 274.934 C 80.148 274.723,80.356 274.551,80.497 274.551 C 80.639 274.551,80.803 274.423,80.863 274.267 C 80.923 274.111,81.092 273.983,81.239 273.983 C 81.385 273.983,81.609 273.858,81.736 273.705 C 81.863 273.552,82.022 273.446,82.090 273.469 C 82.158 273.491,82.405 273.340,82.640 273.132 C 82.874 272.923,83.243 272.597,83.459 272.406 C 83.676 272.215,83.903 272.108,83.963 272.168 C 84.023 272.229,84.191 272.108,84.336 271.900 C 84.482 271.693,84.723 271.523,84.874 271.523 C 85.024 271.523,85.147 271.438,85.147 271.334 C 85.147 271.230,85.296 271.145,85.480 271.145 C 85.663 271.145,85.921 270.971,86.053 270.759 C 86.186 270.547,86.367 270.418,86.457 270.474 C 86.546 270.529,86.758 270.362,86.928 270.102 C 87.098 269.843,87.362 269.631,87.516 269.631 C 87.670 269.631,87.796 269.554,87.796 269.461 C 87.796 269.367,88.158 269.103,88.600 268.874 C 89.042 268.644,89.472 268.337,89.555 268.192 C 89.639 268.047,89.830 267.928,89.981 267.928 C 90.132 267.928,90.255 267.841,90.255 267.734 C 90.255 267.628,90.468 267.459,90.728 267.360 C 90.989 267.262,91.202 267.113,91.202 267.030 C 91.202 266.947,91.521 266.713,91.911 266.511 C 92.632 266.138,92.857 265.977,93.614 265.288 C 93.848 265.075,94.105 264.922,94.185 264.948 C 94.328 264.994,94.626 264.780,95.394 264.081 C 95.603 263.890,95.823 263.783,95.883 263.843 C 95.943 263.903,96.111 263.782,96.257 263.575 C 96.402 263.367,96.641 263.198,96.787 263.198 C 96.934 263.198,97.145 263.027,97.256 262.819 C 97.368 262.611,97.566 262.441,97.696 262.441 C 97.826 262.441,98.228 262.189,98.588 261.881 C 98.948 261.573,99.345 261.318,99.470 261.313 C 99.595 261.309,99.765 261.199,99.849 261.069 C 99.932 260.939,100.170 260.738,100.378 260.623 C 100.865 260.354,100.977 259.783,100.587 259.564 C 100.420 259.471,100.284 259.324,100.284 259.238 C 100.284 259.151,99.986 258.586,99.622 257.981 C 99.257 257.376,98.959 256.766,98.959 256.626 C 98.959 256.485,98.803 256.202,98.612 255.997 C 98.421 255.792,97.979 255.051,97.629 254.350 C 97.279 253.648,96.927 253.047,96.847 253.014 C 96.766 252.980,96.644 252.639,96.575 252.257 C 96.507 251.874,96.369 251.458,96.270 251.333 C 95.977 250.964,95.364 249.702,95.364 249.469 C 95.364 249.350,95.194 249.057,94.986 248.817 C 94.778 248.577,94.607 248.192,94.607 247.960 C 94.607 247.729,94.480 247.433,94.324 247.304 C 94.167 247.174,94.039 246.972,94.039 246.855 C 94.038 246.737,93.928 246.429,93.794 246.168 C 93.659 245.908,93.364 245.142,93.137 244.465 C 92.909 243.789,92.551 242.898,92.341 242.486 C 92.131 242.074,91.958 241.551,91.958 241.324 C 91.958 241.097,91.831 240.862,91.675 240.802 C 91.518 240.742,91.391 240.480,91.391 240.219 C 91.391 239.959,91.175 239.258,90.912 238.663 C 90.648 238.067,90.474 237.471,90.525 237.339 C 90.576 237.207,90.536 237.048,90.436 236.986 C 90.337 236.925,90.255 236.743,90.255 236.583 C 90.255 236.423,90.138 236.024,89.994 235.696 C 89.633 234.873,89.405 234.170,89.035 232.734 C 88.860 232.058,88.638 231.243,88.540 230.923 C 88.443 230.604,88.363 230.199,88.363 230.024 C 88.363 229.850,88.269 229.707,88.154 229.707 C 88.038 229.707,87.997 229.569,88.062 229.399 C 88.127 229.230,88.106 228.995,88.014 228.879 C 87.923 228.762,87.793 228.249,87.727 227.739 C 87.660 227.229,87.529 226.718,87.435 226.604 C 87.341 226.489,87.205 225.885,87.133 225.260 C 87.061 224.636,86.875 223.674,86.720 223.122 C 86.565 222.570,86.365 221.506,86.276 220.757 C 86.039 218.777,85.722 216.991,85.531 216.556 C 85.440 216.348,85.312 215.241,85.247 214.096 C 85.073 211.034,84.952 209.437,84.844 208.798 C 84.589 207.284,84.477 198.358,84.678 195.553 C 84.730 194.825,84.809 193.718,84.853 193.094 C 84.897 192.469,85.030 190.851,85.149 189.499 C 85.269 188.146,85.391 186.729,85.421 186.350 C 85.452 185.972,85.521 185.588,85.574 185.499 C 85.628 185.409,85.733 184.697,85.808 183.917 C 85.884 183.136,86.031 182.392,86.135 182.264 C 86.239 182.135,86.272 181.893,86.208 181.726 C 86.144 181.559,86.155 181.324,86.233 181.203 C 86.311 181.083,86.476 180.345,86.598 179.565 C 86.721 178.784,86.878 177.933,86.947 177.673 C 87.017 177.412,87.119 176.753,87.174 176.206 C 87.230 175.660,87.347 175.213,87.434 175.213 C 87.522 175.213,87.650 174.785,87.719 174.263 C 87.789 173.740,87.916 173.269,88.001 173.216 C 88.087 173.163,88.214 172.612,88.284 171.990 C 88.355 171.369,88.477 170.861,88.556 170.861 C 88.679 170.861,88.867 170.215,89.051 169.158 C 89.178 168.428,89.542 167.132,89.766 166.612 C 90.345 165.264,90.429 164.986,90.334 164.738 C 90.279 164.594,90.375 164.422,90.548 164.356 C 90.726 164.287,90.816 164.116,90.756 163.959 C 90.698 163.807,90.732 163.633,90.831 163.571 C 90.931 163.510,91.012 163.214,91.012 162.914 C 91.012 162.614,91.097 162.316,91.202 162.252 C 91.306 162.187,91.391 161.991,91.392 161.815 C 91.393 161.639,91.520 161.251,91.676 160.953 C 91.831 160.655,91.958 160.303,91.958 160.172 C 91.958 160.040,92.086 159.827,92.242 159.697 C 92.398 159.568,92.526 159.217,92.526 158.917 C 92.526 158.618,92.611 158.373,92.715 158.373 C 92.819 158.373,92.904 158.207,92.904 158.005 C 92.904 157.803,92.990 157.586,93.094 157.521 C 93.198 157.457,93.283 157.239,93.283 157.037 C 93.283 156.835,93.368 156.670,93.472 156.670 C 93.576 156.670,93.661 156.457,93.661 156.197 C 93.661 155.937,93.746 155.724,93.851 155.724 C 93.955 155.724,94.040 155.558,94.040 155.356 C 94.040 155.154,94.114 154.943,94.205 154.887 C 94.295 154.831,94.424 154.513,94.491 154.179 C 94.557 153.846,94.732 153.439,94.879 153.276 C 95.025 153.113,95.173 152.854,95.207 152.701 C 95.242 152.547,95.372 152.311,95.498 152.175 C 95.624 152.039,95.683 151.814,95.629 151.675 C 95.576 151.535,95.668 151.368,95.835 151.304 C 96.002 151.240,96.122 151.080,96.101 150.949 C 96.052 150.643,96.622 149.354,96.875 149.198 C 96.981 149.132,97.067 148.918,97.067 148.722 C 97.067 148.526,97.247 148.240,97.466 148.086 C 97.686 147.933,97.814 147.725,97.753 147.625 C 97.691 147.525,97.809 147.228,98.016 146.965 C 98.223 146.702,98.392 146.357,98.392 146.197 C 98.392 146.037,98.472 145.857,98.570 145.797 C 98.668 145.736,98.936 145.310,99.166 144.849 C 99.396 144.389,99.678 144.029,99.792 144.049 C 99.907 144.070,99.973 143.930,99.940 143.737 C 99.907 143.545,99.992 143.247,100.129 143.075 C 100.434 142.693,100.816 142.036,101.254 141.139 C 101.437 140.767,101.719 140.352,101.881 140.218 C 102.043 140.083,102.176 139.856,102.176 139.712 C 102.176 139.569,102.472 139.124,102.835 138.723 C 103.197 138.322,103.444 137.944,103.382 137.883 C 103.256 137.756,104.837 135.667,105.059 135.667 C 105.138 135.667,105.203 135.517,105.203 135.334 C 105.203 135.151,105.500 134.661,105.862 134.246 C 106.224 133.831,106.522 133.385,106.524 133.254 C 106.526 133.124,106.627 133.039,106.748 133.065 C 106.869 133.091,107.018 132.927,107.079 132.700 C 107.192 132.281,107.820 131.433,108.930 130.202 C 109.269 129.825,109.549 129.414,109.551 129.288 C 109.553 129.161,109.726 128.967,109.934 128.855 C 110.142 128.744,110.312 128.528,110.312 128.376 C 110.312 128.223,110.405 128.098,110.518 128.098 C 110.815 128.098,111.434 127.306,111.441 126.916 C 111.445 126.717,111.593 126.585,111.813 126.585 C 112.072 126.585,112.197 126.432,112.239 126.064 C 112.280 125.705,112.401 125.552,112.630 125.570 C 112.812 125.585,112.961 125.521,112.961 125.429 C 112.961 125.337,113.259 124.931,113.623 124.528 C 113.988 124.125,114.286 123.699,114.286 123.582 C 114.286 123.464,114.413 123.368,114.570 123.368 C 114.726 123.368,114.854 123.304,114.854 123.226 C 114.855 122.992,116.210 121.476,116.417 121.476 C 116.688 121.476,117.111 120.877,117.118 120.482 C 117.121 120.297,117.270 120.149,117.455 120.147 C 117.637 120.144,118.031 119.811,118.331 119.405 C 118.654 118.970,118.982 118.709,119.135 118.768 C 119.278 118.823,119.395 118.791,119.395 118.698 C 119.395 118.605,119.733 118.149,120.146 117.685 C 120.559 117.220,120.900 116.776,120.903 116.698 C 120.906 116.620,121.026 116.556,121.170 116.556 C 121.313 116.556,121.656 116.262,121.930 115.901 C 122.243 115.491,122.534 115.287,122.710 115.354 C 122.884 115.421,122.990 115.348,122.990 115.161 C 122.990 114.996,123.181 114.810,123.415 114.748 C 123.649 114.687,124.120 114.259,124.462 113.799 C 124.804 113.338,125.169 112.961,125.275 112.961 C 125.625 112.961,126.383 111.929,126.388 111.447 C 126.391 111.052,125.869 110.217,124.884 109.043 C 124.779 108.917,124.689 108.747,124.685 108.665 C 124.681 108.582,124.425 108.220,124.117 107.860 C 123.809 107.499,123.557 107.123,123.557 107.024 C 123.557 106.925,123.427 106.709,123.269 106.544 C 122.761 106.017,121.665 104.476,121.665 104.289 C 121.665 104.190,121.537 104.060,121.381 104.000 C 121.225 103.940,121.097 103.790,121.097 103.668 C 121.097 103.545,120.799 103.081,120.435 102.637 C 120.071 102.192,119.773 101.736,119.773 101.624 C 119.773 101.511,119.688 101.419,119.584 101.419 C 119.480 101.419,119.395 101.305,119.395 101.165 C 119.395 101.025,119.224 100.756,119.016 100.568 C 118.808 100.379,118.638 100.120,118.638 99.991 C 118.638 99.862,118.510 99.708,118.354 99.648 C 118.198 99.588,118.070 99.413,118.070 99.258 C 118.070 99.104,117.959 98.910,117.823 98.827 C 117.687 98.744,117.373 98.335,117.124 97.919 C 116.875 97.502,116.561 97.094,116.425 97.010 C 116.289 96.927,116.178 96.766,116.178 96.652 C 116.178 96.537,115.880 96.080,115.516 95.636 C 115.151 95.191,114.853 94.753,114.853 94.663 C 114.853 94.573,114.601 94.204,114.293 93.843 C 113.985 93.483,113.730 93.121,113.726 93.038 C 113.722 92.956,113.632 92.786,113.527 92.660 C 112.772 91.760,112.204 90.922,112.204 90.709 C 112.204 90.571,112.034 90.367,111.826 90.255 C 111.618 90.144,111.447 89.926,111.447 89.770 C 111.447 89.614,111.320 89.438,111.164 89.378 C 111.008 89.318,110.880 89.189,110.880 89.092 C 110.880 88.883,110.091 87.729,109.886 87.638 C 109.808 87.603,109.745 87.459,109.745 87.316 C 109.745 87.174,109.638 86.990,109.508 86.906 C 109.195 86.706,108.420 85.593,108.420 85.344 C 108.420 85.235,108.333 85.147,108.226 85.147 C 108.120 85.147,107.951 84.934,107.852 84.674 C 107.753 84.413,107.585 84.201,107.479 84.201 C 107.372 84.201,107.285 84.112,107.285 84.004 C 107.285 83.795,106.542 82.672,106.274 82.476 C 106.086 82.338,105.636 81.589,105.472 81.139 C 105.408 80.964,105.236 80.775,105.090 80.719 C 104.944 80.663,104.825 80.496,104.825 80.348 C 104.825 80.200,104.697 80.029,104.541 79.969 C 104.385 79.910,104.257 79.743,104.257 79.600 C 104.257 79.457,104.087 79.186,103.879 78.997 C 103.671 78.809,103.500 78.582,103.500 78.493 C 103.500 78.404,103.032 77.698,102.460 76.924 C 101.887 76.150,101.419 75.467,101.419 75.407 C 101.419 75.346,101.100 74.885,100.710 74.382 C 100.319 73.879,99.872 73.278,99.716 73.046 C 99.560 72.815,99.262 72.431,99.054 72.193 C 98.846 71.956,98.505 71.477,98.297 71.129 C 98.089 70.781,97.769 70.280,97.585 70.016 C 97.402 69.752,97.200 69.387,97.138 69.205 C 97.075 69.023,96.946 68.874,96.851 68.874 C 96.757 68.874,96.598 68.661,96.500 68.401 C 96.401 68.141,96.232 67.928,96.126 67.928 C 96.019 67.928,95.932 67.836,95.932 67.723 C 95.932 67.611,95.634 67.155,95.270 66.711 C 94.905 66.266,94.607 65.805,94.607 65.685 C 94.607 65.566,94.520 65.468,94.413 65.468 C 94.307 65.468,94.137 65.277,94.036 65.043 C 93.750 64.382,93.408 63.889,93.046 63.616 C 92.864 63.478,92.715 63.261,92.715 63.133 C 92.715 63.004,92.463 62.605,92.155 62.245 C 91.847 61.884,91.592 61.522,91.588 61.440 C 91.583 61.357,91.494 61.187,91.389 61.061 C 90.740 60.285,89.688 58.868,89.688 58.772 C 89.688 58.668,88.254 56.616,87.796 56.063 C 87.692 55.937,87.606 55.776,87.606 55.704 C 87.606 55.632,87.308 55.210,86.944 54.765 C 86.580 54.321,86.282 53.872,86.282 53.768 C 86.282 53.664,86.218 53.551,86.140 53.516 C 85.977 53.444,85.147 52.290,85.147 52.136 C 85.147 52.080,84.998 51.870,84.816 51.669 C 84.309 51.111,84.132 50.868,83.637 50.047 C 83.386 49.631,83.070 49.222,82.934 49.139 C 82.798 49.056,82.687 48.894,82.687 48.780 C 82.687 48.666,82.389 48.209,82.025 47.764 C 81.660 47.320,81.362 46.864,81.362 46.752 C 81.362 46.639,81.277 46.547,81.173 46.547 C 81.069 46.547,80.984 46.433,80.984 46.294 C 80.984 46.033,79.963 45.029,79.708 45.039 C 79.629 45.042,79.395 45.140,79.186 45.256 ",stroke:"none",fill:"#9fbb1a","fill-rule":"evenodd"}),React.createElement("path",{id:"path7",d:"M190.728 4.092 C 190.364 4.223,189.799 4.285,189.473 4.229 C 189.135 4.172,188.824 4.219,188.750 4.338 C 188.679 4.453,188.530 4.491,188.419 4.423 C 188.117 4.236,186.136 4.191,185.800 4.363 C 185.639 4.446,184.674 4.555,183.655 4.606 C 182.637 4.658,181.757 4.746,181.700 4.803 C 181.643 4.860,181.445 4.825,181.260 4.726 C 181.028 4.602,180.702 4.639,180.211 4.844 C 179.819 5.008,179.236 5.103,178.916 5.056 C 178.597 5.009,178.153 5.054,177.930 5.155 C 177.665 5.276,177.408 5.275,177.188 5.151 C 176.939 5.012,176.677 5.060,176.193 5.332 C 175.705 5.606,175.498 5.643,175.395 5.476 C 175.317 5.350,175.150 5.315,175.018 5.396 C 174.731 5.574,173.781 5.731,173.132 5.709 C 172.871 5.700,172.531 5.745,172.375 5.809 C 172.219 5.872,171.835 5.942,171.523 5.964 C 171.211 5.986,170.805 6.068,170.621 6.145 C 170.437 6.223,170.057 6.243,169.775 6.189 C 169.494 6.135,168.963 6.205,168.596 6.343 C 168.229 6.481,167.673 6.577,167.360 6.556 C 167.048 6.534,166.553 6.631,166.259 6.771 C 165.966 6.910,165.540 7.007,165.313 6.985 C 165.086 6.963,164.773 6.996,164.617 7.059 C 164.461 7.122,163.936 7.213,163.450 7.261 C 162.965 7.310,162.403 7.437,162.203 7.544 C 162.003 7.651,161.464 7.761,161.005 7.788 C 160.547 7.815,159.865 7.985,159.491 8.166 C 159.117 8.347,158.627 8.447,158.401 8.388 C 158.176 8.329,157.886 8.367,157.757 8.472 C 157.627 8.576,157.223 8.661,156.859 8.658 C 156.495 8.656,155.899 8.785,155.535 8.945 C 155.170 9.104,154.532 9.288,154.115 9.354 C 153.699 9.419,153.018 9.570,152.602 9.689 C 152.185 9.809,151.771 9.888,151.680 9.865 C 151.589 9.842,151.079 9.974,150.545 10.156 C 150.011 10.339,149.404 10.494,149.196 10.501 C 148.988 10.508,148.711 10.580,148.582 10.660 C 148.452 10.741,148.160 10.842,147.933 10.886 C 147.706 10.930,147.466 11.054,147.399 11.162 C 147.333 11.270,146.854 11.388,146.337 11.424 C 145.819 11.460,145.229 11.581,145.025 11.691 C 144.416 12.023,143.918 12.170,143.561 12.126 C 143.375 12.103,142.854 12.291,142.402 12.543 C 141.806 12.877,141.492 12.953,141.259 12.823 C 141.031 12.696,140.841 12.731,140.605 12.944 C 140.423 13.110,140.221 13.245,140.158 13.245 C 140.095 13.245,139.804 13.342,139.511 13.461 C 139.218 13.580,138.851 13.703,138.694 13.735 C 137.405 14.000,136.837 14.157,136.471 14.348 C 135.438 14.886,135.267 14.948,134.805 14.948 C 134.536 14.948,134.188 15.076,134.032 15.232 C 133.876 15.388,133.551 15.516,133.311 15.516 C 133.071 15.516,132.768 15.644,132.638 15.802 C 132.460 16.015,132.336 16.035,132.148 15.879 C 131.958 15.721,131.744 15.777,131.277 16.110 C 130.937 16.353,130.518 16.527,130.348 16.498 C 130.177 16.469,129.991 16.567,129.934 16.715 C 129.877 16.863,129.210 17.172,128.451 17.403 C 127.692 17.633,126.900 17.942,126.691 18.088 C 126.482 18.234,126.171 18.354,126.000 18.354 C 125.829 18.354,125.479 18.520,125.221 18.722 C 124.961 18.927,124.590 19.048,124.387 18.995 C 124.177 18.940,123.727 19.099,123.331 19.367 C 122.952 19.625,122.597 19.791,122.543 19.736 C 122.488 19.682,122.192 19.817,121.883 20.036 C 121.575 20.256,121.143 20.435,120.923 20.435 C 120.702 20.435,120.185 20.648,119.773 20.908 C 119.361 21.168,118.958 21.383,118.878 21.385 C 118.798 21.387,117.966 21.769,117.029 22.235 C 116.093 22.701,115.172 23.082,114.983 23.083 C 114.794 23.084,114.368 23.289,114.037 23.539 C 113.705 23.789,113.117 24.124,112.729 24.284 C 112.341 24.444,111.836 24.750,111.605 24.965 C 111.172 25.369,111.017 25.422,110.449 25.364 C 110.263 25.345,109.604 25.675,108.984 26.099 C 108.364 26.522,107.767 26.868,107.657 26.868 C 107.548 26.868,106.986 27.217,106.409 27.643 C 105.732 28.143,105.231 28.384,104.995 28.322 C 104.763 28.262,104.208 28.515,103.479 29.014 C 102.847 29.447,102.189 29.886,102.016 29.991 C 101.844 30.095,101.650 30.253,101.585 30.342 C 101.520 30.431,101.290 30.448,101.075 30.380 C 100.804 30.294,100.435 30.433,99.869 30.835 C 99.421 31.154,98.845 31.562,98.591 31.743 C 98.336 31.924,97.760 32.349,97.312 32.687 C 96.863 33.025,96.412 33.302,96.309 33.302 C 96.206 33.302,96.121 33.387,96.121 33.491 C 96.121 33.595,96.032 33.680,95.924 33.680 C 95.815 33.680,95.624 33.763,95.498 33.865 C 95.372 33.966,95.019 34.252,94.713 34.501 L 94.157 34.952 94.848 35.972 C 95.229 36.533,96.117 37.818,96.824 38.829 C 97.530 39.840,98.482 41.202,98.939 41.857 C 99.396 42.511,100.152 43.600,100.618 44.276 C 101.085 44.953,101.626 45.682,101.821 45.897 C 102.016 46.112,102.176 46.351,102.176 46.428 C 102.176 46.506,102.474 46.969,102.838 47.457 C 103.690 48.598,103.846 48.816,104.594 49.902 C 105.327 50.967,108.212 55.098,108.792 55.913 C 109.014 56.225,109.932 57.545,110.832 58.846 C 111.732 60.147,112.515 61.254,112.573 61.306 C 112.631 61.358,112.934 61.783,113.246 62.252 C 113.557 62.720,113.878 63.188,113.957 63.292 C 114.786 64.376,115.421 65.277,115.421 65.371 C 115.421 65.434,115.825 66.032,116.320 66.700 C 117.956 68.911,118.920 70.264,119.016 70.484 C 119.068 70.604,119.648 71.461,120.305 72.390 C 124.511 78.336,125.354 79.540,126.329 80.984 C 126.926 81.868,127.674 82.929,127.993 83.340 C 128.311 83.751,128.657 84.236,128.761 84.418 C 128.933 84.718,130.457 86.906,132.027 89.106 C 132.367 89.582,133.022 90.525,133.484 91.202 C 133.945 91.878,134.716 92.985,135.198 93.661 C 135.680 94.338,136.301 95.232,136.580 95.648 C 136.858 96.064,137.171 96.501,137.275 96.618 C 137.379 96.736,137.574 96.991,137.707 97.186 C 137.840 97.381,138.421 98.221,138.998 99.054 C 139.575 99.886,140.190 100.801,140.364 101.087 C 140.778 101.764,141.053 101.743,142.264 100.946 C 142.817 100.581,143.341 100.326,143.427 100.380 C 143.513 100.433,143.697 100.366,143.835 100.231 C 144.299 99.780,145.901 98.770,146.152 98.770 C 146.289 98.770,146.618 98.600,146.882 98.392 C 147.147 98.184,147.483 98.013,147.628 98.013 C 147.774 98.013,148.059 97.888,148.261 97.735 C 148.463 97.583,148.726 97.455,148.846 97.452 C 148.965 97.448,149.509 97.145,150.055 96.778 C 150.600 96.411,151.089 96.153,151.140 96.205 C 151.192 96.257,151.483 96.122,151.786 95.906 C 152.118 95.670,152.519 95.548,152.792 95.600 C 153.102 95.659,153.457 95.512,153.915 95.135 C 154.284 94.831,154.661 94.630,154.754 94.687 C 154.846 94.744,155.137 94.622,155.400 94.416 C 155.663 94.209,156.064 94.040,156.292 94.040 C 156.699 94.040,156.919 93.949,158.510 93.124 C 158.950 92.896,159.546 92.677,159.835 92.638 C 160.332 92.572,161.122 92.273,162.479 91.639 C 162.812 91.484,163.157 91.402,163.247 91.457 C 163.337 91.513,163.916 91.315,164.534 91.018 C 165.152 90.721,165.730 90.547,165.818 90.631 C 165.907 90.716,166.439 90.574,167.002 90.317 C 167.565 90.059,168.344 89.809,168.733 89.762 C 169.521 89.665,170.644 89.319,170.995 89.064 C 171.120 88.973,171.298 88.945,171.391 89.002 C 171.483 89.059,171.986 88.944,172.508 88.746 C 173.207 88.480,173.512 88.441,173.668 88.597 C 173.824 88.753,173.972 88.725,174.230 88.491 C 174.423 88.317,174.760 88.174,174.980 88.174 C 175.200 88.174,175.429 88.095,175.489 87.997 C 175.549 87.900,175.894 87.869,176.255 87.927 C 176.638 87.989,177.025 87.941,177.181 87.811 C 177.329 87.688,177.822 87.566,178.277 87.539 C 178.732 87.512,179.217 87.420,179.356 87.335 C 179.494 87.249,180.025 87.157,180.536 87.129 C 181.047 87.102,181.577 86.986,181.715 86.871 C 181.852 86.757,182.016 86.715,182.079 86.778 C 182.142 86.841,182.631 86.787,183.166 86.659 C 183.701 86.530,184.664 86.406,185.305 86.382 C 185.946 86.358,186.641 86.288,186.850 86.226 C 187.397 86.063,191.399 85.731,194.229 85.613 C 198.932 85.416,201.514 85.397,201.514 85.558 C 201.514 85.654,201.635 85.665,201.783 85.582 C 201.992 85.464,204.170 85.524,206.339 85.706 C 206.505 85.720,207.806 85.733,209.555 85.737 C 209.868 85.738,210.251 85.786,210.407 85.844 C 210.703 85.954,211.110 86.005,212.895 86.157 C 213.483 86.207,214.121 86.329,214.314 86.429 C 214.507 86.528,214.771 86.571,214.901 86.524 C 215.032 86.477,216.032 86.579,217.124 86.751 C 218.216 86.922,219.182 87.017,219.271 86.962 C 219.360 86.907,219.595 86.980,219.792 87.124 C 220.057 87.317,220.216 87.331,220.402 87.177 C 220.589 87.022,220.696 87.038,220.821 87.240 C 220.913 87.390,221.141 87.528,221.327 87.547 C 221.513 87.566,222.067 87.623,222.558 87.674 C 223.049 87.725,223.519 87.808,223.603 87.860 C 223.686 87.911,224.136 88.011,224.602 88.080 C 225.068 88.150,225.542 88.284,225.656 88.378 C 225.770 88.472,225.910 88.502,225.967 88.445 C 226.024 88.388,226.570 88.486,227.179 88.664 C 227.789 88.841,228.415 89.001,228.571 89.019 C 228.728 89.037,229.111 89.160,229.423 89.293 C 229.735 89.426,230.309 89.547,230.699 89.564 C 231.089 89.580,231.408 89.657,231.409 89.735 C 231.409 89.813,231.527 89.877,231.669 89.877 C 231.812 89.877,232.329 90.054,232.818 90.270 C 233.308 90.487,233.820 90.621,233.956 90.568 C 234.093 90.516,234.380 90.596,234.594 90.746 C 234.809 90.896,235.053 90.997,235.136 90.971 C 235.220 90.944,235.544 91.016,235.856 91.130 C 236.168 91.244,236.764 91.446,237.181 91.578 C 237.597 91.710,238.273 91.977,238.683 92.172 C 239.092 92.367,239.620 92.526,239.854 92.526 C 240.089 92.526,240.333 92.611,240.397 92.715 C 240.462 92.819,240.672 92.904,240.866 92.904 C 241.059 92.904,241.246 92.970,241.280 93.049 C 241.315 93.129,242.092 93.441,243.007 93.742 C 243.922 94.043,244.740 94.414,244.825 94.566 C 244.910 94.718,245.209 94.868,245.491 94.899 C 245.772 94.930,246.657 95.268,247.457 95.650 C 248.834 96.308,249.689 96.696,250.331 96.956 C 250.487 97.020,250.870 97.234,251.183 97.434 C 251.495 97.633,251.870 97.803,252.016 97.810 C 252.162 97.818,252.561 98.037,252.902 98.297 C 253.243 98.557,253.630 98.770,253.762 98.770 C 253.893 98.770,254.317 98.989,254.704 99.257 C 255.091 99.526,255.524 99.762,255.666 99.783 C 255.808 99.804,256.191 100.010,256.516 100.242 C 256.841 100.473,257.206 100.662,257.327 100.662 C 257.449 100.662,257.667 100.769,257.812 100.899 C 258.456 101.477,258.653 101.600,259.113 101.716 C 259.382 101.783,259.603 101.966,259.603 102.122 C 259.603 102.289,259.713 102.363,259.871 102.303 C 260.018 102.246,260.183 102.314,260.236 102.453 C 260.289 102.592,260.632 102.804,260.996 102.924 C 261.361 103.045,261.982 103.439,262.376 103.799 C 262.770 104.160,263.182 104.421,263.291 104.379 C 263.401 104.336,263.783 104.590,264.139 104.942 C 264.496 105.294,264.924 105.582,265.091 105.582 C 265.258 105.582,265.962 106.050,266.656 106.623 C 267.350 107.195,268.005 107.663,268.112 107.663 C 268.219 107.663,268.307 107.748,268.307 107.852 C 268.307 107.956,268.436 108.042,268.594 108.042 C 268.753 108.042,268.979 108.254,269.098 108.515 C 269.221 108.785,269.472 108.988,269.684 108.988 C 269.887 108.988,270.385 109.329,270.790 109.746 C 271.194 110.163,271.706 110.532,271.926 110.565 C 272.147 110.599,272.441 110.832,272.581 111.084 C 272.720 111.336,272.837 111.460,272.841 111.360 C 272.845 111.261,273.167 111.516,273.557 111.928 C 274.300 112.712,274.800 113.086,275.355 113.273 C 275.537 113.334,275.686 113.449,275.686 113.528 C 275.686 113.825,277.572 115.636,277.760 115.520 C 277.868 115.453,278.135 115.702,278.353 116.072 C 278.572 116.442,278.827 116.698,278.921 116.640 C 279.015 116.582,279.258 116.817,279.462 117.162 C 279.665 117.507,280.105 117.951,280.439 118.148 C 281.049 118.508,282.687 120.109,282.687 120.345 C 282.687 120.579,283.386 121.281,283.503 121.164 C 283.567 121.101,283.720 121.271,283.844 121.542 C 283.968 121.814,284.213 122.082,284.388 122.138 C 284.564 122.193,284.820 122.449,284.957 122.706 C 285.095 122.962,285.369 123.224,285.567 123.287 C 285.765 123.349,286.020 123.606,286.135 123.857 C 286.249 124.109,286.414 124.314,286.502 124.314 C 286.589 124.314,286.660 124.442,286.660 124.598 C 286.660 124.754,286.740 124.882,286.837 124.882 C 286.934 124.882,287.066 125.048,287.130 125.250 C 287.195 125.453,287.395 125.666,287.575 125.723 C 287.755 125.781,288.042 126.062,288.213 126.348 C 288.945 127.577,289.576 128.101,289.881 127.732 C 290.035 127.546,290.416 127.253,290.728 127.080 C 291.041 126.907,291.807 126.381,292.431 125.911 C 293.056 125.441,293.716 125.007,293.898 124.947 C 294.080 124.887,294.229 124.767,294.229 124.681 C 294.229 124.595,294.437 124.413,294.691 124.277 C 295.220 123.994,297.304 122.597,297.446 122.430 C 297.498 122.369,297.753 122.176,298.013 122.002 C 298.273 121.828,298.912 121.380,299.432 121.007 C 299.953 120.634,300.712 120.108,301.120 119.839 C 301.529 119.569,302.034 119.189,302.244 118.993 C 302.454 118.798,302.730 118.638,302.858 118.638 C 302.986 118.638,303.119 118.570,303.154 118.487 C 303.188 118.404,303.898 117.873,304.730 117.306 C 305.563 116.740,306.287 116.225,306.339 116.161 C 306.391 116.097,306.807 115.798,307.263 115.497 C 308.823 114.465,309.129 114.251,310.763 113.052 C 311.192 112.738,312.053 112.146,312.677 111.736 C 313.302 111.326,313.898 110.924,314.002 110.843 C 314.520 110.440,315.959 109.416,316.457 109.096 C 316.766 108.897,317.187 108.578,317.391 108.388 C 317.596 108.197,317.848 108.042,317.952 108.042 C 318.055 108.042,318.334 107.859,318.571 107.637 C 318.808 107.414,319.161 107.138,319.356 107.022 C 319.885 106.708,321.547 105.551,323.463 104.163 C 324.399 103.484,325.302 102.866,325.469 102.789 C 325.636 102.712,326.019 102.458,326.321 102.224 C 326.622 101.991,327.252 101.502,327.720 101.138 C 328.188 100.774,328.644 100.476,328.733 100.475 C 328.822 100.474,329.163 100.259,329.490 99.997 C 329.817 99.735,330.177 99.448,330.289 99.358 C 330.401 99.268,330.860 98.950,331.308 98.651 C 331.756 98.352,332.440 97.895,332.829 97.635 C 333.217 97.375,333.902 96.917,334.350 96.619 C 334.798 96.320,335.256 95.996,335.368 95.900 C 335.608 95.694,337.379 94.421,338.282 93.806 C 338.627 93.570,339.150 93.186,339.444 92.952 C 339.738 92.718,340.066 92.526,340.172 92.526 C 340.279 92.526,340.394 92.456,340.429 92.371 C 340.488 92.225,340.999 91.856,343.992 89.798 C 344.669 89.333,345.310 88.877,345.416 88.785 C 345.523 88.692,345.864 88.454,346.173 88.255 C 346.483 88.057,347.086 87.638,347.515 87.324 C 349.323 86.002,351.509 84.476,352.195 84.057 C 352.492 83.876,353.295 83.314,353.981 82.808 C 354.667 82.303,355.425 81.799,355.665 81.690 C 356.209 81.442,356.225 80.909,355.707 80.361 C 355.489 80.131,354.905 79.342,354.408 78.606 C 351.941 74.954,351.625 74.551,351.234 74.551 C 350.972 74.551,350.426 74.114,350.426 73.903 C 350.426 73.567,348.578 71.305,348.232 71.218 C 348.005 71.161,347.506 70.660,347.123 70.104 C 346.740 69.549,346.319 69.053,346.186 69.002 C 346.053 68.951,345.633 68.440,345.253 67.866 C 344.872 67.293,344.262 66.640,343.898 66.415 C 343.534 66.189,343.236 65.944,343.236 65.869 C 343.236 65.795,342.767 65.243,342.195 64.642 C 341.623 64.042,341.154 63.478,341.154 63.389 C 341.154 63.301,340.835 63.035,340.445 62.798 C 340.054 62.561,339.661 62.246,339.571 62.098 C 339.481 61.950,339.077 61.488,338.672 61.071 C 338.268 60.655,337.938 60.245,337.938 60.160 C 337.938 60.076,337.773 59.954,337.573 59.891 C 337.372 59.827,337.035 59.481,336.822 59.121 C 336.610 58.762,336.306 58.467,336.146 58.467 C 335.987 58.467,335.856 58.382,335.856 58.278 C 335.856 58.174,335.772 58.089,335.669 58.089 C 335.566 58.089,335.162 57.736,334.771 57.304 C 333.770 56.200,332.960 55.440,332.783 55.440 C 332.588 55.440,330.937 53.717,330.937 53.514 C 330.937 53.428,330.824 53.359,330.687 53.359 C 330.550 53.359,330.151 53.103,329.801 52.791 C 329.452 52.479,329.114 52.223,329.051 52.223 C 328.988 52.223,328.786 51.968,328.602 51.656 C 328.417 51.343,328.149 51.088,328.006 51.088 C 327.863 51.088,327.691 50.918,327.625 50.710 C 327.510 50.348,327.323 50.254,326.836 50.314 C 326.713 50.329,326.559 50.169,326.492 49.958 C 326.425 49.747,326.254 49.574,326.112 49.574 C 325.970 49.574,325.676 49.325,325.458 49.019 C 325.241 48.714,324.873 48.437,324.641 48.404 C 324.409 48.371,324.135 48.153,324.033 47.919 C 323.930 47.684,323.743 47.493,323.616 47.493 C 323.490 47.493,323.319 47.380,323.236 47.242 C 323.152 47.103,322.807 46.830,322.469 46.633 C 322.131 46.437,321.854 46.209,321.854 46.128 C 321.854 46.046,321.764 45.979,321.654 45.979 C 321.544 45.979,321.037 45.543,320.526 45.010 C 319.887 44.344,319.501 44.078,319.289 44.160 C 319.083 44.239,318.950 44.158,318.886 43.916 C 318.834 43.717,318.629 43.512,318.431 43.460 C 318.232 43.408,318.070 43.239,318.070 43.084 C 318.070 42.779,317.569 42.510,317.304 42.673 C 317.214 42.729,316.817 42.432,316.422 42.012 C 316.028 41.593,315.573 41.249,315.411 41.249 C 315.250 41.249,314.654 40.842,314.087 40.345 C 313.520 39.847,312.822 39.338,312.535 39.213 C 312.249 39.089,312.015 38.899,312.015 38.793 C 312.015 38.687,311.890 38.600,311.738 38.600 C 311.586 38.600,311.366 38.423,311.250 38.207 C 311.135 37.990,310.932 37.855,310.799 37.906 C 310.667 37.957,310.232 37.708,309.834 37.353 C 309.435 36.998,308.961 36.708,308.781 36.708 C 308.601 36.708,308.243 36.457,307.985 36.151 C 307.727 35.844,307.476 35.633,307.427 35.682 C 307.379 35.731,307.231 35.641,307.099 35.482 C 306.968 35.324,306.714 35.194,306.536 35.194 C 306.358 35.194,305.964 34.941,305.661 34.632 C 305.357 34.322,304.965 34.067,304.789 34.064 C 304.614 34.061,304.200 33.812,303.870 33.510 C 303.540 33.209,303.030 32.914,302.737 32.856 C 302.443 32.797,301.882 32.427,301.488 32.034 C 301.079 31.625,300.628 31.343,300.434 31.376 C 300.247 31.408,300.095 31.343,300.095 31.232 C 300.095 31.122,299.971 31.031,299.820 31.031 C 299.669 31.031,299.463 30.883,299.361 30.702 C 299.260 30.520,299.116 30.433,299.042 30.507 C 298.890 30.659,297.824 30.087,297.824 29.855 C 297.824 29.774,297.695 29.707,297.538 29.707 C 297.142 29.707,296.529 29.332,295.890 28.700 C 295.593 28.406,295.247 28.204,295.121 28.250 C 294.995 28.296,294.636 28.145,294.324 27.915 C 294.011 27.685,293.511 27.436,293.213 27.362 C 292.914 27.289,292.546 27.105,292.395 26.954 C 292.244 26.803,291.961 26.679,291.767 26.679 C 291.572 26.679,291.360 26.593,291.295 26.488 C 291.230 26.383,290.629 26.040,289.959 25.727 C 289.290 25.414,288.742 25.075,288.742 24.973 C 288.742 24.871,288.593 24.785,288.411 24.783 C 288.228 24.781,287.867 24.612,287.606 24.409 C 287.346 24.205,286.989 24.037,286.813 24.034 C 286.637 24.032,286.440 23.944,286.375 23.838 C 286.309 23.732,286.189 23.687,286.108 23.737 C 286.027 23.787,285.775 23.655,285.547 23.443 C 285.320 23.231,285.030 23.092,284.903 23.136 C 284.777 23.179,284.546 23.071,284.390 22.896 C 284.148 22.624,283.364 22.302,282.814 22.248 C 282.727 22.240,282.540 22.073,282.397 21.878 C 282.246 21.672,282.014 21.570,281.844 21.635 C 281.683 21.697,281.552 21.665,281.552 21.565 C 281.552 21.464,281.432 21.381,281.287 21.381 C 281.141 21.381,280.537 21.126,279.943 20.814 C 279.350 20.501,278.738 20.246,278.583 20.246 C 278.429 20.246,277.698 19.948,276.958 19.584 C 276.219 19.219,275.457 18.921,275.266 18.921 C 275.074 18.921,274.868 18.794,274.808 18.638 C 274.748 18.482,274.494 18.354,274.244 18.354 C 273.994 18.354,273.641 18.279,273.460 18.187 C 273.279 18.095,272.876 17.913,272.564 17.783 C 272.252 17.653,271.826 17.473,271.618 17.383 C 271.410 17.293,271.068 17.196,270.859 17.167 C 270.650 17.138,270.269 16.968,270.013 16.788 C 269.757 16.609,269.370 16.462,269.154 16.462 C 268.938 16.462,268.680 16.394,268.581 16.312 C 268.482 16.230,267.763 15.953,266.982 15.697 C 266.202 15.441,265.535 15.168,265.500 15.090 C 265.465 15.012,265.230 14.948,264.977 14.948 C 264.724 14.948,264.369 14.873,264.189 14.781 C 263.474 14.417,262.885 14.167,262.622 14.114 C 262.470 14.084,262.219 14.011,262.062 13.952 C 261.906 13.893,261.523 13.780,261.211 13.702 C 260.899 13.624,260.601 13.546,260.549 13.529 C 260.497 13.512,260.199 13.434,259.886 13.357 C 259.310 13.213,258.639 12.958,258.044 12.655 C 257.863 12.563,257.549 12.488,257.346 12.488 C 257.142 12.488,256.929 12.413,256.873 12.321 C 256.816 12.229,256.214 12.049,255.535 11.921 C 254.856 11.792,254.253 11.611,254.195 11.517 C 254.137 11.423,254.013 11.394,253.919 11.452 C 253.825 11.510,253.494 11.426,253.184 11.266 C 252.874 11.106,252.408 10.974,252.149 10.974 C 251.890 10.974,251.632 10.901,251.577 10.811 C 251.490 10.670,251.059 10.569,249.571 10.339 C 249.413 10.314,249.194 10.239,249.085 10.171 C 248.975 10.104,248.679 10.009,248.426 9.962 C 247.537 9.795,246.829 9.596,246.641 9.460 C 246.537 9.385,246.325 9.320,246.168 9.316 C 246.012 9.312,245.246 9.168,244.465 8.996 C 243.685 8.824,242.833 8.654,242.573 8.617 C 242.313 8.581,241.845 8.451,241.533 8.330 C 241.220 8.209,240.922 8.121,240.870 8.134 C 240.596 8.206,238.851 7.878,238.653 7.718 C 238.526 7.615,237.917 7.515,237.300 7.494 C 236.683 7.474,236.043 7.345,235.878 7.208 C 235.712 7.071,235.441 7.011,235.274 7.075 C 235.107 7.139,234.872 7.128,234.751 7.051 C 234.630 6.974,234.149 6.900,233.680 6.887 C 233.212 6.874,232.573 6.753,232.261 6.618 C 231.949 6.483,231.626 6.387,231.543 6.406 C 231.460 6.424,230.524 6.303,229.462 6.136 C 228.400 5.969,227.190 5.798,226.774 5.755 C 226.358 5.713,225.634 5.632,225.166 5.576 C 224.697 5.520,223.974 5.439,223.557 5.396 C 223.141 5.354,222.800 5.309,222.800 5.296 C 222.800 5.284,222.460 5.239,222.044 5.196 C 220.557 5.042,219.570 4.935,218.638 4.825 C 217.114 4.646,215.912 4.545,214.096 4.444 C 211.620 4.306,210.155 4.179,209.893 4.078 C 209.766 4.030,209.610 4.075,209.545 4.179 C 209.481 4.282,209.244 4.308,209.019 4.235 C 208.606 4.101,206.004 4.009,202.176 3.994 C 201.031 3.989,199.924 3.983,199.716 3.979 C 198.221 3.955,194.042 3.995,193.188 4.042 C 192.616 4.074,191.977 4.044,191.769 3.977 C 191.561 3.910,191.093 3.962,190.728 4.092 ",stroke:"none",fill:"#b5cb2b","fill-rule":"evenodd"}),React.createElement("path",{id:"path8",d:"",stroke:"none",fill:"#55ff00","fill-rule":"evenodd"}),React.createElement("path",{id:"path9",d:"M364.522 96.081 C 363.619 96.742,362.897 97.244,359.648 99.478 C 358.854 100.024,357.583 100.938,356.822 101.509 C 356.062 102.080,355.333 102.549,355.203 102.551 C 355.073 102.553,354.967 102.627,354.967 102.715 C 354.967 102.851,354.376 103.279,352.707 104.352 C 352.545 104.456,351.944 104.889,351.372 105.314 C 350.799 105.740,350.024 106.293,349.648 106.544 C 347.578 107.929,346.136 108.917,345.885 109.122 C 345.631 109.330,344.163 110.365,341.471 112.233 C 340.970 112.582,340.270 113.079,339.916 113.340 C 339.562 113.600,338.581 114.281,337.736 114.853 C 336.890 115.426,335.705 116.256,335.103 116.698 C 334.500 117.140,333.921 117.502,333.816 117.502 C 333.712 117.502,333.577 117.631,333.516 117.789 C 333.456 117.947,333.212 118.162,332.976 118.267 C 332.595 118.436,331.562 119.112,331.031 119.541 C 330.927 119.624,330.118 120.192,329.234 120.801 C 328.349 121.410,327.597 121.981,327.562 122.071 C 327.528 122.160,327.408 122.233,327.296 122.233 C 327.185 122.233,326.787 122.467,326.413 122.752 C 326.039 123.038,325.180 123.649,324.503 124.109 C 323.827 124.570,323.231 124.997,323.179 125.058 C 323.127 125.119,322.709 125.424,322.250 125.735 C 321.792 126.046,321.229 126.429,320.999 126.585 C 320.769 126.741,320.047 127.252,319.395 127.720 C 318.742 128.188,318.015 128.699,317.780 128.855 C 316.016 130.025,314.359 131.179,313.150 132.081 C 312.370 132.663,311.582 133.194,311.400 133.262 C 311.218 133.329,311.069 133.472,311.069 133.580 C 311.069 133.687,310.971 133.775,310.851 133.775 C 310.731 133.775,310.284 134.034,309.858 134.351 C 308.177 135.600,305.993 137.141,304.778 137.938 C 304.075 138.398,303.500 138.831,303.500 138.901 C 303.500 138.970,303.253 139.129,302.952 139.254 C 302.650 139.379,302.209 139.688,301.972 139.940 C 301.736 140.191,301.463 140.397,301.366 140.397 C 301.269 140.397,300.879 140.639,300.500 140.934 C 300.121 141.228,299.662 141.524,299.480 141.590 C 299.001 141.764,299.066 142.077,299.811 143.183 C 300.175 143.724,300.473 144.297,300.473 144.456 C 300.473 144.615,300.856 145.249,301.325 145.865 C 301.793 146.480,302.176 147.071,302.176 147.178 C 302.176 147.284,302.473 147.940,302.836 148.637 C 303.199 149.333,303.455 149.967,303.406 150.046 C 303.358 150.125,303.615 150.580,303.979 151.057 C 304.343 151.534,304.627 151.991,304.609 152.073 C 304.592 152.156,304.718 152.540,304.890 152.927 C 305.063 153.314,305.203 153.766,305.203 153.933 C 305.203 154.099,305.416 154.514,305.676 154.855 C 305.937 155.197,306.149 155.646,306.149 155.854 C 306.149 156.062,306.308 156.376,306.501 156.551 C 306.726 156.754,306.820 157.034,306.764 157.328 C 306.709 157.616,306.825 157.978,307.075 158.295 C 307.294 158.574,307.474 158.951,307.474 159.132 C 307.474 159.313,307.592 159.560,307.737 159.680 C 307.882 159.800,308.057 160.277,308.127 160.740 C 308.196 161.202,308.339 161.634,308.444 161.699 C 308.549 161.764,308.592 161.928,308.540 162.064 C 308.488 162.200,308.604 162.454,308.798 162.630 C 308.993 162.806,309.105 163.070,309.048 163.218 C 308.992 163.366,309.060 163.625,309.201 163.794 C 309.341 163.963,309.431 164.295,309.400 164.530 C 309.369 164.766,309.434 165.015,309.544 165.083 C 309.654 165.151,309.745 165.404,309.745 165.646 C 309.745 165.887,309.860 166.180,310.002 166.298 C 310.147 166.418,310.220 166.715,310.170 166.976 C 310.117 167.253,310.205 167.564,310.386 167.745 C 310.554 167.913,310.691 168.251,310.691 168.498 C 310.691 168.745,310.776 168.999,310.880 169.063 C 310.984 169.128,311.069 169.388,311.069 169.641 C 311.069 169.895,311.232 170.592,311.432 171.191 C 311.631 171.790,311.849 172.682,311.916 173.174 C 311.982 173.666,312.109 174.113,312.198 174.168 C 312.286 174.223,312.313 174.438,312.259 174.646 C 312.204 174.855,312.254 175.139,312.370 175.279 C 312.485 175.418,312.526 175.585,312.460 175.651 C 312.394 175.717,312.456 175.912,312.599 176.084 C 312.742 176.256,312.881 176.748,312.909 177.177 C 312.958 177.938,313.431 180.323,313.646 180.889 C 313.705 181.045,313.785 181.514,313.822 181.930 C 313.981 183.680,314.099 184.354,314.286 184.579 C 314.413 184.733,314.421 184.979,314.309 185.275 C 314.203 185.553,314.203 185.856,314.307 186.044 C 314.403 186.214,314.514 186.720,314.554 187.169 C 314.594 187.618,314.680 188.453,314.744 189.026 C 315.128 192.434,315.238 194.787,315.312 201.135 C 315.348 204.241,315.301 206.811,315.207 206.929 C 315.114 207.045,315.068 207.746,315.106 208.487 C 315.143 209.228,315.123 209.885,315.061 209.947 C 314.999 210.009,314.935 210.627,314.919 211.321 C 314.894 212.420,314.508 215.779,314.177 217.786 C 314.117 218.150,314.070 218.615,314.073 218.818 C 314.076 219.021,313.991 219.294,313.883 219.424 C 313.775 219.554,313.743 219.839,313.813 220.057 C 313.882 220.275,313.846 220.565,313.734 220.700 C 313.621 220.836,313.534 221.151,313.540 221.401 C 313.558 222.105,312.777 225.972,312.566 226.227 C 312.462 226.352,312.433 226.675,312.501 226.945 C 312.574 227.240,312.544 227.436,312.426 227.436 C 312.317 227.436,312.170 227.841,312.100 228.335 C 311.917 229.615,311.490 231.225,311.260 231.503 C 311.151 231.633,311.112 231.869,311.172 232.026 C 311.233 232.183,311.029 232.869,310.720 233.550 C 310.412 234.231,310.201 234.831,310.253 234.882 C 310.359 234.989,309.875 236.529,308.877 239.262 C 308.801 239.470,308.752 239.704,308.768 239.782 C 308.785 239.860,308.719 239.924,308.621 239.924 C 308.523 239.924,308.442 240.073,308.439 240.255 C 308.431 240.809,307.965 242.384,307.809 242.384 C 307.729 242.384,307.663 242.549,307.663 242.751 C 307.663 242.953,307.578 243.171,307.474 243.236 C 307.370 243.300,307.285 243.551,307.285 243.794 C 307.285 244.037,307.147 244.288,306.979 244.353 C 306.794 244.424,306.710 244.609,306.767 244.825 C 306.820 245.029,306.672 245.410,306.417 245.721 C 306.173 246.019,305.971 246.415,305.967 246.601 C 305.963 246.787,305.828 247.140,305.667 247.385 C 305.506 247.631,305.331 248.075,305.278 248.372 C 305.224 248.669,305.101 248.993,305.003 249.092 C 304.905 249.191,304.825 249.418,304.825 249.596 C 304.825 249.775,304.758 249.950,304.677 249.984 C 304.596 250.019,304.257 250.622,303.924 251.325 C 303.592 252.027,303.232 252.602,303.126 252.602 C 303.020 252.602,302.930 252.793,302.927 253.027 C 302.924 253.262,302.796 253.618,302.643 253.820 C 302.490 254.022,302.365 254.364,302.365 254.579 C 302.365 254.795,302.069 255.311,301.707 255.726 C 301.344 256.141,301.046 256.600,301.044 256.747 C 301.042 256.893,300.828 257.292,300.568 257.633 C 300.307 257.974,300.095 258.386,300.095 258.548 C 300.095 258.710,299.906 259.059,299.676 259.324 C 299.446 259.589,299.169 260.077,299.061 260.409 C 298.953 260.740,298.668 261.110,298.427 261.229 C 298.186 261.349,297.995 261.500,298.001 261.565 C 298.060 262.145,297.957 262.497,297.635 262.819 C 297.427 263.027,297.256 263.277,297.256 263.374 C 297.256 263.471,297.078 263.607,296.861 263.676 C 296.594 263.761,296.495 263.915,296.556 264.148 C 296.612 264.366,296.408 264.755,296.005 265.195 C 295.653 265.579,295.364 266.007,295.364 266.145 C 295.364 266.474,294.426 267.471,294.183 267.400 C 294.079 267.370,294.040 267.466,294.097 267.615 C 294.241 267.992,293.752 268.691,292.337 270.133 C 292.077 270.398,291.862 270.718,291.861 270.843 C 291.859 270.968,291.518 271.416,291.104 271.839 C 290.689 272.261,290.326 272.742,290.297 272.907 C 290.267 273.073,289.926 273.542,289.540 273.950 C 288.536 275.010,287.803 275.939,287.799 276.159 C 287.796 276.263,287.540 276.518,287.228 276.727 C 286.916 276.935,286.661 277.198,286.661 277.312 C 286.661 277.425,286.362 277.679,285.998 277.875 C 285.594 278.093,285.336 278.374,285.336 278.596 C 285.336 278.965,283.437 280.984,283.090 280.984 C 282.987 280.984,282.843 281.167,282.773 281.390 C 282.593 281.958,280.226 284.201,279.808 284.201 C 279.726 284.201,279.659 284.330,279.659 284.489 C 279.659 284.648,279.447 284.859,279.186 284.957 C 278.910 285.062,278.713 285.287,278.713 285.497 C 278.713 285.719,278.495 285.948,278.146 286.093 C 277.833 286.222,277.578 286.446,277.578 286.591 C 277.578 286.736,277.131 287.143,276.585 287.497 C 276.038 287.850,275.367 288.381,275.093 288.677 C 274.558 289.254,274.365 289.412,273.557 289.930 C 272.807 290.412,272.879 290.641,274.487 292.876 C 275.285 293.984,276.285 295.402,276.710 296.026 C 277.135 296.651,277.532 297.204,277.592 297.256 C 277.651 297.308,277.757 297.479,277.825 297.635 C 277.894 297.791,278.418 298.557,278.989 299.338 C 279.561 300.118,280.409 301.310,280.875 301.987 C 281.340 302.663,282.300 304.043,283.008 305.054 C 283.716 306.065,284.551 307.256,284.863 307.702 C 285.175 308.148,286.147 309.535,287.022 310.784 C 288.475 312.858,289.115 313.775,290.954 316.414 C 291.298 316.909,291.895 317.760,292.279 318.307 C 292.664 318.853,294.253 321.131,295.810 323.368 C 297.367 325.605,298.805 327.649,299.004 327.909 C 299.363 328.377,302.341 332.638,303.542 334.403 C 303.883 334.905,304.253 335.415,304.364 335.538 C 304.474 335.661,305.113 336.564,305.783 337.545 C 306.977 339.294,307.255 339.694,309.416 342.763 C 310.003 343.595,310.973 345.000,311.573 345.885 C 312.173 346.769,312.714 347.535,312.775 347.588 C 312.836 347.640,313.265 348.236,313.728 348.912 C 314.191 349.588,314.616 350.184,314.672 350.237 C 314.729 350.289,315.155 350.893,315.618 351.580 C 318.330 355.596,319.517 357.226,319.734 357.232 C 319.869 357.235,320.961 356.535,322.162 355.676 C 323.363 354.818,324.573 353.969,324.850 353.790 C 325.894 353.117,326.206 352.823,326.206 352.517 C 326.206 352.225,327.371 351.257,328.471 350.635 C 329.111 350.273,329.423 349.937,329.423 349.610 C 329.423 349.458,329.820 349.048,330.304 348.698 C 330.789 348.347,331.449 347.799,331.771 347.479 C 332.092 347.159,332.654 346.694,333.018 346.445 C 333.921 345.827,334.153 345.582,334.153 345.249 C 334.153 345.092,334.430 344.773,334.768 344.539 C 335.106 344.306,335.649 343.853,335.973 343.533 C 336.298 343.213,336.809 342.735,337.109 342.470 C 337.408 342.205,337.872 341.737,338.138 341.430 C 338.404 341.122,339.149 340.384,339.793 339.790 C 340.438 339.196,340.965 338.621,340.965 338.513 C 340.965 338.405,341.071 338.313,341.202 338.310 C 341.585 338.300,342.523 337.379,342.421 337.113 C 342.367 336.972,342.600 336.721,342.970 336.522 C 343.324 336.331,343.614 336.062,343.614 335.924 C 343.614 335.785,343.950 335.450,344.360 335.179 C 344.772 334.906,345.132 334.502,345.164 334.277 C 345.196 334.053,345.413 333.786,345.646 333.683 C 345.879 333.581,346.050 333.373,346.025 333.221 C 346.000 333.069,346.173 332.845,346.410 332.725 C 346.647 332.604,347.158 332.085,347.545 331.571 C 348.386 330.457,349.674 329.157,350.232 328.858 C 350.489 328.720,350.614 328.496,350.578 328.236 C 350.539 327.966,350.667 327.757,350.958 327.610 C 351.199 327.489,351.390 327.336,351.384 327.271 C 351.350 326.931,351.406 326.848,351.791 326.677 C 352.022 326.574,352.256 326.300,352.312 326.069 C 352.367 325.837,352.843 325.198,353.370 324.648 C 353.896 324.099,354.449 323.372,354.599 323.034 C 354.749 322.695,355.021 322.370,355.203 322.312 C 355.385 322.255,355.535 322.127,355.535 322.030 C 355.535 321.932,355.747 321.667,356.008 321.441 C 356.268 321.214,356.481 320.872,356.481 320.679 C 356.481 320.486,356.608 320.280,356.764 320.220 C 356.921 320.160,357.048 320.011,357.048 319.888 C 357.048 319.766,357.307 319.512,357.624 319.325 C 358.051 319.073,358.170 318.892,358.084 318.621 C 358.009 318.386,358.073 318.217,358.265 318.143 C 358.428 318.081,358.562 317.917,358.562 317.779 C 358.562 317.641,358.720 317.478,358.914 317.416 C 359.107 317.355,359.423 316.956,359.615 316.529 C 359.807 316.103,360.330 315.378,360.777 314.918 C 361.224 314.458,361.589 313.922,361.589 313.727 C 361.589 313.532,361.845 313.131,362.157 312.836 C 362.469 312.541,362.725 312.190,362.725 312.055 C 362.725 311.813,362.908 311.546,363.503 310.918 C 363.672 310.741,363.959 310.274,364.143 309.880 C 364.326 309.487,364.721 308.903,365.020 308.583 C 365.319 308.263,365.563 307.924,365.563 307.830 C 365.563 307.543,366.016 306.832,366.367 306.567 C 366.549 306.430,366.698 306.159,366.698 305.966 C 366.698 305.772,366.954 305.373,367.266 305.078 C 367.578 304.783,367.833 304.398,367.833 304.222 C 367.833 304.045,367.920 303.848,368.026 303.782 C 368.132 303.717,368.169 303.584,368.108 303.486 C 368.048 303.388,368.132 303.258,368.295 303.195 C 368.457 303.133,368.590 302.972,368.590 302.838 C 368.590 302.704,368.718 302.546,368.874 302.486 C 369.030 302.426,369.158 302.213,369.158 302.013 C 369.158 301.812,369.413 301.375,369.726 301.041 C 370.038 300.706,370.293 300.272,370.293 300.075 C 370.293 299.877,370.442 299.565,370.624 299.379 C 370.807 299.194,371.104 298.747,371.285 298.386 C 371.758 297.447,372.058 296.994,372.319 296.826 C 372.445 296.745,372.498 296.547,372.436 296.386 C 372.374 296.225,372.485 295.866,372.683 295.587 C 372.881 295.308,373.169 294.825,373.323 294.513 C 373.478 294.201,373.710 293.877,373.841 293.794 C 373.971 293.711,374.078 293.537,374.078 293.408 C 374.078 293.138,374.697 291.879,375.024 291.485 C 375.146 291.338,375.191 291.129,375.123 291.021 C 375.056 290.912,375.091 290.823,375.202 290.823 C 375.312 290.823,375.402 290.716,375.402 290.585 C 375.402 290.454,375.577 290.237,375.791 290.104 C 376.054 289.939,376.142 289.744,376.064 289.498 C 375.989 289.261,376.084 289.019,376.338 288.801 C 376.552 288.618,376.727 288.251,376.727 287.985 C 376.727 287.712,376.974 287.231,377.294 286.880 C 377.606 286.538,377.862 286.092,377.862 285.889 C 377.862 285.686,377.943 285.372,378.041 285.191 C 378.477 284.394,379.453 282.202,379.422 282.090 C 379.403 282.022,379.513 281.863,379.665 281.736 C 379.818 281.609,379.943 281.345,379.943 281.149 C 379.943 280.954,380.114 280.476,380.322 280.087 C 380.530 279.699,380.700 279.274,380.700 279.142 C 380.700 279.010,380.785 278.903,380.889 278.903 C 380.993 278.903,381.079 278.724,381.079 278.506 C 381.079 278.047,381.647 277.010,381.898 277.010 C 381.992 277.010,382.028 276.853,381.977 276.660 C 381.927 276.468,382.036 276.111,382.219 275.868 C 382.403 275.624,382.512 275.318,382.462 275.187 C 382.411 275.056,382.499 274.710,382.657 274.419 C 383.245 273.334,383.996 271.427,384.282 270.293 C 384.361 269.981,384.652 269.249,384.928 268.667 C 385.204 268.084,385.430 267.429,385.430 267.211 C 385.430 266.993,385.516 266.763,385.620 266.698 C 385.724 266.634,385.809 266.415,385.809 266.211 C 385.809 266.008,385.886 265.694,385.980 265.513 C 386.074 265.332,386.258 264.823,386.388 264.380 C 386.519 263.938,386.707 263.576,386.805 263.576 C 386.904 263.576,386.940 263.459,386.885 263.316 C 386.830 263.173,386.906 262.822,387.054 262.537 C 387.202 262.252,387.323 261.826,387.323 261.591 C 387.323 261.355,387.454 261.054,387.614 260.920 C 387.801 260.766,387.841 260.613,387.725 260.497 C 387.609 260.381,387.674 260.082,387.906 259.669 C 388.105 259.314,388.269 258.813,388.269 258.556 C 388.269 258.299,388.343 258.089,388.434 258.089 C 388.591 258.089,388.868 256.944,388.922 256.065 C 388.937 255.837,389.103 255.478,389.293 255.269 C 389.530 255.007,389.600 254.737,389.517 254.407 C 389.451 254.143,389.466 253.926,389.550 253.926 C 389.723 253.926,390.211 252.364,390.249 251.690 C 390.262 251.449,390.385 251.183,390.521 251.099 C 390.677 251.003,390.720 250.793,390.638 250.535 C 390.567 250.309,390.592 250.021,390.695 249.896 C 390.798 249.771,390.944 249.243,391.020 248.723 C 391.096 248.202,391.244 247.564,391.349 247.304 C 391.548 246.809,391.566 246.732,391.769 245.506 C 391.838 245.090,391.964 244.579,392.049 244.371 C 392.134 244.163,392.388 243.013,392.613 241.816 C 392.838 240.620,393.106 239.486,393.209 239.298 C 393.311 239.109,393.345 238.797,393.284 238.604 C 393.223 238.411,393.246 238.208,393.336 238.153 C 393.425 238.097,393.513 237.532,393.530 236.896 C 393.551 236.140,393.664 235.638,393.855 235.446 C 394.088 235.213,394.101 235.098,393.917 234.876 C 393.761 234.688,393.750 234.556,393.882 234.470 C 393.990 234.400,394.127 233.798,394.186 233.133 C 394.244 232.468,394.397 231.860,394.524 231.781 C 394.653 231.701,394.709 231.457,394.650 231.232 C 394.592 231.008,394.625 230.553,394.725 230.219 C 394.824 229.885,394.939 229.101,394.979 228.477 C 395.020 227.852,395.111 227.193,395.182 227.010 C 395.252 226.828,395.259 226.545,395.196 226.382 C 395.133 226.218,395.158 225.941,395.252 225.767 C 395.402 225.486,395.487 224.840,395.766 221.854 C 395.805 221.438,395.878 220.501,395.928 219.773 C 395.978 219.044,396.094 217.938,396.186 217.313 C 396.277 216.689,396.334 215.752,396.313 215.232 C 396.291 214.711,396.347 213.859,396.435 213.337 C 396.524 212.815,396.599 211.794,396.602 211.067 C 396.610 208.737,396.636 208.326,396.777 208.325 C 396.871 208.325,396.878 201.377,396.790 196.121 C 396.769 194.872,396.807 193.710,396.875 193.539 C 396.943 193.367,396.907 193.170,396.796 193.101 C 396.674 193.026,396.640 192.687,396.709 192.255 C 396.778 191.822,396.743 191.483,396.622 191.408 C 396.490 191.326,396.479 191.127,396.589 190.836 C 396.683 190.590,396.721 190.350,396.674 190.303 C 396.576 190.205,396.385 187.540,396.367 185.998 C 396.360 185.426,396.305 184.872,396.244 184.768 C 396.184 184.664,396.160 184.342,396.190 184.051 C 396.239 183.590,396.147 182.655,395.738 179.470 C 395.685 179.054,395.606 178.353,395.564 177.914 C 395.521 177.474,395.422 177.009,395.343 176.882 C 395.264 176.754,395.177 176.305,395.149 175.884 C 395.016 173.868,394.930 173.107,394.822 173.000 C 394.758 172.935,394.796 172.774,394.906 172.641 C 395.045 172.474,395.046 172.286,394.912 172.035 C 394.805 171.835,394.674 171.230,394.621 170.691 C 394.569 170.151,394.471 169.622,394.404 169.514 C 394.337 169.406,394.242 168.921,394.191 168.436 C 394.140 167.950,394.023 167.411,393.929 167.236 C 393.836 167.061,393.810 166.666,393.871 166.358 C 393.934 166.044,393.895 165.744,393.783 165.674 C 393.673 165.606,393.628 165.434,393.682 165.292 C 393.737 165.150,393.682 164.972,393.559 164.896 C 393.392 164.793,393.397 164.722,393.579 164.609 C 393.770 164.491,393.756 164.362,393.512 163.989 C 393.342 163.730,393.123 162.868,393.024 162.074 C 392.925 161.279,392.742 160.505,392.616 160.354 C 392.490 160.202,392.434 159.897,392.492 159.676 C 392.549 159.456,392.517 159.115,392.419 158.919 C 392.322 158.722,392.163 158.403,392.067 158.208 C 391.958 157.989,391.959 157.786,392.068 157.677 C 392.178 157.566,392.072 157.073,391.788 156.374 C 391.521 155.716,391.370 155.042,391.426 154.752 C 391.478 154.478,391.428 154.197,391.314 154.126 C 391.200 154.056,391.107 153.791,391.107 153.537 C 391.107 153.283,391.020 153.075,390.914 153.075 C 390.804 153.075,390.771 152.876,390.837 152.612 C 390.901 152.358,390.884 152.039,390.799 151.903 C 390.613 151.605,390.572 151.468,390.416 150.615 C 390.349 150.251,390.179 149.776,390.038 149.559 C 389.897 149.343,389.830 149.117,389.890 149.057 C 389.949 148.997,389.833 148.608,389.632 148.191 C 389.422 147.756,389.330 147.330,389.415 147.191 C 389.500 147.054,389.448 146.782,389.295 146.564 C 389.147 146.352,389.026 146.038,389.026 145.866 C 389.026 145.693,388.902 145.450,388.750 145.324 C 388.528 145.140,388.519 145.021,388.703 144.708 C 388.882 144.404,388.881 144.303,388.694 144.236 C 388.564 144.189,388.458 143.949,388.458 143.704 C 388.458 143.459,388.372 143.205,388.268 143.141 C 388.164 143.076,388.126 142.830,388.186 142.595 C 388.252 142.328,388.181 142.074,387.997 141.921 C 387.834 141.786,387.701 141.547,387.701 141.390 C 387.701 141.233,387.538 140.839,387.338 140.514 C 387.138 140.190,386.919 139.541,386.851 139.073 C 386.784 138.605,386.603 138.027,386.450 137.790 C 386.297 137.553,386.216 137.288,386.270 137.201 C 386.324 137.113,386.201 136.892,385.998 136.708 C 385.744 136.478,385.680 136.282,385.793 136.081 C 385.904 135.881,385.779 135.459,385.399 134.757 C 385.092 134.190,384.879 133.626,384.926 133.504 C 384.973 133.382,384.880 132.988,384.718 132.630 C 384.557 132.271,384.440 131.908,384.459 131.823 C 384.477 131.738,384.320 131.450,384.110 131.183 C 383.900 130.915,383.728 130.577,383.728 130.431 C 383.728 130.286,383.590 129.957,383.423 129.702 C 383.255 129.446,383.170 129.103,383.232 128.939 C 383.296 128.774,383.138 128.335,382.875 127.948 C 382.615 127.566,382.403 127.140,382.403 127.000 C 382.403 126.861,382.270 126.614,382.108 126.452 C 381.946 126.290,381.861 126.033,381.920 125.880 C 381.979 125.728,381.824 125.207,381.577 124.722 C 380.852 123.303,380.533 122.554,380.394 121.949 C 380.322 121.637,380.107 121.178,379.914 120.930 C 379.722 120.682,379.565 120.374,379.565 120.247 C 379.565 120.119,379.352 119.701,379.092 119.318 C 378.832 118.935,378.619 118.538,378.619 118.436 C 378.619 118.335,378.419 117.934,378.175 117.546 C 377.932 117.158,377.770 116.728,377.817 116.590 C 377.864 116.453,377.638 115.915,377.314 115.395 C 376.991 114.875,376.727 114.349,376.727 114.225 C 376.727 114.102,376.429 113.582,376.064 113.069 C 375.678 112.526,375.402 111.912,375.402 111.595 C 375.402 111.297,375.318 110.950,375.216 110.825 C 374.244 109.633,374.008 109.282,373.987 108.999 C 373.974 108.818,373.611 108.155,373.181 107.525 C 372.718 106.846,372.435 106.236,372.486 106.028 C 372.540 105.806,372.151 105.091,371.429 104.088 C 370.665 103.028,370.321 102.386,370.393 102.159 C 370.463 101.939,370.213 101.415,369.688 100.680 C 369.240 100.055,368.491 98.980,368.023 98.292 C 365.775 94.991,365.903 95.072,364.522 96.081 ",stroke:"none",fill:"#d1dc31","fill-rule":"evenodd"}),React.createElement("path",{id:"path10",d:"",stroke:"none",fill:"#99ff33","fill-rule":"evenodd"}),React.createElement("path",{id:"path11",d:"M85.380 215.516 C 85.380 215.880,85.419 216.029,85.466 215.847 C 85.514 215.665,85.514 215.367,85.466 215.184 C 85.419 215.002,85.380 215.151,85.380 215.516 ",stroke:"none",fill:"#ffff00","fill-rule":"evenodd"})));var f=c,s=t(0),p=wp.i18n.__,d=wp.element.RawHTML,y=wp.blocks.registerBlockType,h=wp.data.withSelect,m=lodash.omit,b=h(function(C,e){return{Freeform:C("core/blocks").getBlockType("core/freeform")}})(Object(s.memo)(function(C){C.isSelected=!0;var e=m(C,["Freeform"]),t=a(jQuery,C.Freeform.edit);return React.createElement(t,e)}));y("imagely/nextgen-gallery",{title:p("NextGEN Gallery"),desription:p("A block for adding NextGEN Galleries."),icon:f.nextgen,category:"common",attributes:{content:{type:"string",source:"html"}},supports:{className:!1,customClassName:!1},edit:b,save:function(C){var e=C.attributes.content;return React.createElement(d,null,e)}})}]); +//# sourceMappingURL=block.min.js.map \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js.map b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js.map new file mode 100644 index 000000000..e2bc4d24b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/build/block.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/react/index.js","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/object-assign/index.js","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/edit.min.js","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/icons.min.js","webpack:///./build/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/block.min.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","require","k","for","q","u","v","w","x","y","z","A","B","C","iterator","D","a","b","arguments","length","e","encodeURIComponent","g","h","f","Error","replace","framesToPop","aa","E","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","F","G","this","props","context","refs","updater","H","I","isReactComponent","setState","_typeof","forceUpdate","J","constructor","isPureReactComponent","K","current","currentDispatcher","L","M","ref","__self","__source","N","children","Array","defaultProps","$$typeof","type","_owner","O","P","Q","R","pop","result","keyPrefix","func","count","S","push","V","T","U","isArray","next","done","keys","join","=",":","escape","toString","ca","da","W","ba","X","Children","map","forEach","toArray","only","createRef","Component","PureComponent","createContext","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","forwardRef","render","lazy","_ctor","_status","_result","memo","compare","Fragment","StrictMode","Suspense","createElement","cloneElement","createFactory","isValidElement","version","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","assign","unstable_ConcurrentMode","unstable_Profiler","Y","default","Z","getOwnPropertySymbols","propIsEnumerable","propertyIsEnumerable","test1","String","getOwnPropertyNames","test2","fromCharCode","test3","split","letter","err","shouldUseNative","target","source","from","symbols","to","val","undefined","TypeError","toObject","wp","i18n","__","createNggEditComponent","memoize","lodash","$","Freeform","_Freeform","NggEditor","_this","_classCallCheck","_possibleConstructorReturn","_getPrototypeOf","openIGW","_assertThisInitialized","updateContent","hasGallery","toggleAddGalleryBtn","_inherits","_createClass","attributes","content","_get","addClass","siblings","hide","removeClass","show","setAttributes","editor","on","_ref","shortcode","execCommand","React","className","onClick","ngg_tinymce_plugin","button_label","icons","nextgen","id","width","height","viewBox","stroke","fill","fill-rule","RawHTML","element","registerBlockType","blocks","withSelect","data","omit","edit","select","getBlockType","withFreeform","isSelected","editProps","NggEdit","jQuery","title","desription","icon","category","supports","customClassName","save"],"mappings":"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","file":"block.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/** @license React v16.6.1\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var k=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.concurrent_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112,z=n?Symbol.for(\"react.suspense\"):60113,A=n?Symbol.for(\"react.memo\"):\n60115,B=n?Symbol.for(\"react.lazy\"):60116,C=\"function\"===typeof Symbol&&Symbol.iterator;function aa(a,b,e,c,d,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var l=[e,c,d,g,h,f],m=0;a=Error(b.replace(/%s/g,function(){return l[m++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction D(a){for(var b=arguments.length-1,e=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;c<b;c++)e+=\"&args[]=\"+encodeURIComponent(arguments[c+1]);aa(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",e)}var E={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F={};\nfunction G(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}G.prototype.isReactComponent={};G.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?D(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};G.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function H(){}H.prototype=G.prototype;function I(a,b,e){this.props=a;this.context=b;this.refs=F;this.updater=e||E}var J=I.prototype=new H;\nJ.constructor=I;k(J,G.prototype);J.isPureReactComponent=!0;var K={current:null,currentDispatcher:null},L=Object.prototype.hasOwnProperty,M={key:!0,ref:!0,__self:!0,__source:!0};\nfunction N(a,b,e){var c=void 0,d={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=b[c]);var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){for(var l=Array(f),m=0;m<f;m++)l[m]=arguments[m+2];d.children=l}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===d[c]&&(d[c]=f[c]);return{$$typeof:p,type:a,key:g,ref:h,props:d,_owner:K.current}}\nfunction ba(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,e,c){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=e;d.context=c;d.count=0;return d}return{result:a,keyPrefix:b,func:e,context:c,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,e,c){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return e(c,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){d=a[h];var f=b+U(d,h);g+=T(d,f,e,c)}else if(null===a||\"object\"!==typeof a?f=null:(f=C&&a[C]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),h=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,h++),g+=T(d,f,e,c);else\"object\"===d&&(e=\"\"+a,D(\"31\",\"[object Object]\"===e?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":e,\"\"));return g}function V(a,b,e){return null==a?0:T(a,\"\",b,e)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function ca(a,b){a.func.call(a.context,b,a.count++)}\nfunction da(a,b,e){var c=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?W(a,c,e,function(a){return a}):null!=a&&(O(a)&&(a=ba(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+e)),c.push(a))}function W(a,b,e,c,d){var g=\"\";null!=e&&(g=(\"\"+e).replace(P,\"$&/\")+\"/\");b=R(b,g,c,d);V(a,da,b);S(b)}\nvar X={Children:{map:function(a,b,e){if(null==a)return a;var c=[];W(a,c,null,b,e);return c},forEach:function(a,b,e){if(null==a)return a;b=R(null,null,b,e);V(a,ca,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];W(a,b,null,function(a){return a});return b},only:function(a){O(a)?void 0:D(\"143\");return a}},createRef:function(){return{current:null}},Component:G,PureComponent:I,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,\n_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a},forwardRef:function(a){return{$$typeof:y,render:a}},lazy:function(a){return{$$typeof:B,_ctor:a,_status:-1,_result:null}},memo:function(a,b){return{$$typeof:A,type:a,compare:void 0===b?null:b}},Fragment:r,StrictMode:t,Suspense:z,createElement:N,cloneElement:function(a,b,e){null===a||void 0===a?D(\"267\",a):void 0;var c=void 0,d=k({},a.props),g=a.key,h=a.ref,f=a._owner;\nif(null!=b){void 0!==b.ref&&(h=b.ref,f=K.current);void 0!==b.key&&(g=\"\"+b.key);var l=void 0;a.type&&a.type.defaultProps&&(l=a.type.defaultProps);for(c in b)L.call(b,c)&&!M.hasOwnProperty(c)&&(d[c]=void 0===b[c]&&void 0!==l?l[c]:b[c])}c=arguments.length-2;if(1===c)d.children=e;else if(1<c){l=Array(c);for(var m=0;m<c;m++)l[m]=arguments[m+2];d.children=l}return{$$typeof:p,type:a.type,key:g,ref:h,props:d,_owner:f}},createFactory:function(a){var b=N.bind(null,a);b.type=a;return b},isValidElement:O,version:\"16.6.3\",\n__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:K,assign:k}};X.unstable_ConcurrentMode=x;X.unstable_Profiler=u;var Y={default:X},Z=Y&&X||Y;module.exports=Z.default||Z;\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","const { __ } = wp.i18n;\nconst { memoize } = lodash\n\n// Given jQuery and the Freeform block settings, creates the Ngg Editor Component\nexport const createNggEditComponent = memoize(($, Freeform) => {\n class NggEditor extends Freeform {\n constructor(props) {\n super(props)\n this.openIGW = this.openIGW.bind(this)\n this.updateContent = this.updateContent.bind(this)\n this.hasGallery = this.hasGallery.bind(this)\n this.toggleAddGalleryBtn= this.toggleAddGalleryBtn.bind(this)\n }\n\n hasGallery() {\n return this.props.attributes.content && this.props.attributes.content.length > 0\n }\n\n componentDidMount() {\n super.componentDidMount()\n $(this.ref).addClass('freeform-toolbar').addClass('ngg-freeform-toolbar')\n this.toggleAddGalleryBtn();\n\n }\n\n componentDidUpdate() {\n this.toggleAddGalleryBtn();\n }\n\n toggleAddGalleryBtn() {\n // Determine the UI state\n if (this.props.attributes.content) {\n $(this.ref).addClass('hidden');\n $(this.ref).siblings('.add-ngg-gallery-wrap').hide()\n }\n else {\n $(this.ref).removeClass('hidden');\n $(this.ref).siblings('.add-ngg-gallery-wrap').show()\n }\n }\n\n updateContent(content) {\n this.props.setAttributes({content}) \n }\n\n onSetup(editor){\n super.onSetup(editor);\n const updateContent = this.updateContent.bind(this)\n\n // When NGG is added or removed, we must set the classic \"content\" attribute, \n // which will re-render our component\n editor.on('ngg-removed', () => updateContent(\"\"))\n editor.on('ngg-inserted', ({shortcode}) => updateContent(shortcode))\n }\n\n openIGW() {\n this.editor.execCommand('ngg_attach_to_post')\n }\n\n render(){\n const classic = super.render()\n return [\n classic,\n <div className=\"add-ngg-gallery-wrap\">\n <div className=\"add-ngg-gallery\" onClick={this.openIGW}>\n {ngg_tinymce_plugin.i18n.button_label}\n </div>\n </div>\n ]\n }\n }\n\n return NggEditor\n})","const icons = {};\n\nicons.nextgen =\n<svg id=\"svg\" version=\"1.1\" width=\"400\" height=\"385.8088930936613\" viewBox=\"0 0 400 385.8088930936613\">\n<g id=\"svgg\"><path id=\"path0\" d=\"\" stroke=\"none\" fill=\"#000055\" fill-rule=\"evenodd\"></path><path id=\"path1\" d=\"\" stroke=\"none\" fill=\"#002424\" fill-rule=\"evenodd\"></path><path id=\"path2\" d=\"M194.418 152.698 C 154.152 157.677,135.139 203.873,160.388 235.383 C 179.730 259.522,217.168 260.458,237.772 237.316 C 261.954 210.156,250.860 167.167,216.592 155.239 C 210.224 153.023,200.657 151.926,194.418 152.698 \" stroke=\"none\" fill=\"#143650\" fill-rule=\"evenodd\"></path><path id=\"path3\" d=\"\" stroke=\"none\" fill=\"#555500\" fill-rule=\"evenodd\"></path><path id=\"path4\" d=\"M109.430 274.467 C 109.368 274.629,109.202 274.717,109.061 274.663 C 108.920 274.609,108.715 274.732,108.606 274.936 C 108.496 275.140,108.286 275.307,108.139 275.307 C 107.992 275.307,107.796 275.441,107.705 275.605 C 107.536 275.907,106.895 276.338,106.291 276.556 C 106.109 276.622,105.960 276.753,105.960 276.848 C 105.960 276.942,105.747 277.101,105.487 277.200 C 105.227 277.299,105.014 277.467,105.014 277.573 C 105.014 277.680,104.920 277.767,104.805 277.767 C 104.690 277.767,104.285 278.009,103.906 278.303 C 103.527 278.598,103.068 278.894,102.886 278.960 C 102.703 279.026,102.554 279.168,102.554 279.275 C 102.554 279.382,102.427 279.470,102.272 279.470 C 102.117 279.470,101.884 279.640,101.754 279.849 C 101.624 280.057,101.367 280.227,101.184 280.227 C 101.001 280.227,100.851 280.314,100.851 280.421 C 100.851 280.528,100.639 280.696,100.378 280.795 C 100.118 280.894,99.905 281.071,99.905 281.189 C 99.905 281.306,99.793 281.360,99.655 281.307 C 99.518 281.254,99.304 281.373,99.181 281.570 C 99.057 281.768,98.838 281.930,98.694 281.930 C 98.550 281.930,98.383 282.059,98.322 282.217 C 98.262 282.374,97.997 282.585,97.734 282.685 C 97.471 282.785,97.256 282.954,97.256 283.061 C 97.256 283.167,97.095 283.254,96.898 283.254 C 96.701 283.254,96.491 283.382,96.431 283.538 C 96.371 283.694,96.201 283.822,96.053 283.822 C 95.904 283.822,95.731 283.959,95.667 284.126 C 95.603 284.292,95.438 284.386,95.302 284.334 C 95.165 284.281,94.952 284.400,94.829 284.598 C 94.705 284.796,94.529 284.957,94.437 284.957 C 94.344 284.957,93.996 285.213,93.661 285.525 C 93.327 285.837,92.965 286.093,92.857 286.093 C 92.748 286.093,92.296 286.391,91.851 286.755 C 91.407 287.119,90.958 287.417,90.854 287.417 C 90.750 287.417,90.637 287.481,90.602 287.559 C 90.471 287.855,89.293 288.565,89.116 288.455 C 89.014 288.392,88.931 288.476,88.931 288.641 C 88.931 288.805,88.718 289.021,88.458 289.120 C 88.198 289.219,87.985 289.392,87.985 289.505 C 87.985 289.617,87.602 289.879,87.133 290.086 C 86.665 290.293,86.282 290.546,86.282 290.647 C 86.282 290.749,86.090 290.915,85.856 291.017 C 85.220 291.292,84.692 291.646,84.522 291.911 C 84.439 292.041,84.245 292.148,84.091 292.148 C 83.936 292.148,83.761 292.275,83.701 292.431 C 83.641 292.588,83.504 292.715,83.396 292.715 C 83.287 292.715,82.835 293.013,82.391 293.377 C 81.946 293.742,81.493 294.040,81.384 294.040 C 81.276 294.040,81.097 294.207,80.988 294.411 C 80.871 294.629,80.673 294.738,80.508 294.675 C 80.337 294.609,80.227 294.677,80.227 294.850 C 80.227 295.006,80.014 295.187,79.754 295.253 C 79.494 295.318,79.281 295.455,79.281 295.557 C 79.281 295.659,79.162 295.743,79.017 295.743 C 78.872 295.743,78.707 295.864,78.650 296.012 C 78.594 296.160,78.223 296.433,77.826 296.619 C 77.429 296.804,76.994 297.108,76.858 297.295 C 76.722 297.482,76.488 297.635,76.337 297.635 C 76.187 297.635,76.064 297.715,76.064 297.814 C 76.064 297.990,75.336 298.457,74.693 298.693 C 74.510 298.760,74.361 298.892,74.361 298.986 C 74.361 299.081,74.170 299.241,73.936 299.342 C 73.345 299.597,72.922 299.894,72.049 300.662 C 71.636 301.026,71.221 301.325,71.127 301.325 C 71.032 301.325,70.662 301.559,70.303 301.845 C 69.945 302.131,69.562 302.365,69.452 302.365 C 69.342 302.365,69.253 302.449,69.253 302.551 C 69.253 302.653,69.040 302.790,68.780 302.855 C 68.519 302.920,68.307 303.102,68.307 303.259 C 68.307 303.451,68.183 303.512,67.928 303.446 C 67.680 303.381,67.550 303.440,67.550 303.617 C 67.550 303.766,67.337 303.969,67.077 304.068 C 66.816 304.167,66.604 304.337,66.604 304.447 C 66.604 304.556,66.391 304.726,66.131 304.825 C 65.870 304.924,65.658 305.092,65.658 305.199 C 65.658 305.305,65.487 305.393,65.279 305.393 C 65.071 305.393,64.901 305.480,64.901 305.587 C 64.901 305.693,64.688 305.861,64.428 305.960 C 64.167 306.059,63.955 306.227,63.955 306.334 C 63.955 306.441,63.784 306.528,63.576 306.528 C 63.368 306.528,63.198 306.615,63.198 306.722 C 63.198 306.828,62.985 306.997,62.725 307.096 C 62.465 307.194,62.252 307.361,62.252 307.465 C 62.252 307.570,61.907 307.831,61.486 308.046 C 61.064 308.261,60.672 308.561,60.614 308.712 C 60.556 308.864,60.389 308.988,60.243 308.988 C 60.097 308.988,59.835 309.154,59.662 309.356 C 59.488 309.559,59.285 309.687,59.210 309.641 C 59.135 309.595,58.800 309.812,58.467 310.124 C 58.133 310.436,57.748 310.691,57.612 310.691 C 57.475 310.691,57.335 310.754,57.301 310.833 C 57.184 311.095,55.380 312.394,55.132 312.394 C 54.996 312.394,54.803 312.547,54.703 312.735 C 54.602 312.923,54.174 313.242,53.752 313.445 C 53.330 313.647,52.983 313.879,52.982 313.959 C 52.981 314.040,52.789 314.189,52.554 314.290 C 51.958 314.548,51.520 314.853,50.731 315.562 C 50.355 315.900,49.942 316.176,49.812 316.177 C 49.683 316.177,49.476 316.340,49.353 316.537 C 49.229 316.735,49.027 316.858,48.903 316.810 C 48.779 316.763,48.626 316.856,48.564 317.018 C 48.502 317.181,48.339 317.313,48.203 317.313 C 48.067 317.313,47.695 317.547,47.375 317.833 C 46.625 318.507,45.782 319.104,45.364 319.259 C 45.182 319.327,45.033 319.470,45.033 319.578 C 45.033 319.685,44.903 319.773,44.743 319.773 C 44.584 319.773,44.405 319.901,44.345 320.057 C 44.285 320.213,44.075 320.341,43.878 320.341 C 43.622 320.341,43.519 320.476,43.519 320.814 C 43.519 321.074,43.587 321.287,43.670 321.287 C 43.753 321.287,44.147 321.798,44.545 322.422 C 44.942 323.046,45.343 323.557,45.434 323.557 C 45.526 323.557,45.601 323.655,45.601 323.774 C 45.601 323.894,45.899 324.355,46.263 324.799 C 46.627 325.244,46.925 325.700,46.925 325.812 C 46.925 325.925,47.010 326.017,47.114 326.017 C 47.219 326.017,47.304 326.132,47.304 326.272 C 47.304 326.411,47.474 326.680,47.682 326.868 C 47.890 327.057,48.061 327.331,48.061 327.477 C 48.061 327.634,48.209 327.719,48.420 327.685 C 48.728 327.634,49.763 328.480,49.763 328.783 C 49.763 328.837,49.976 329.160,50.237 329.501 C 50.497 329.842,50.710 330.217,50.710 330.335 C 50.710 330.610,51.587 331.190,51.802 331.058 C 51.891 331.002,52.123 331.229,52.316 331.562 C 52.509 331.894,52.780 332.235,52.918 332.318 C 53.056 332.401,53.169 332.587,53.169 332.731 C 53.169 332.875,53.347 333.049,53.565 333.118 C 53.783 333.187,54.082 333.533,54.230 333.888 C 54.378 334.242,54.578 334.532,54.675 334.532 C 54.772 334.532,54.964 334.766,55.102 335.052 C 55.239 335.338,55.492 335.574,55.663 335.575 C 56.001 335.578,56.764 336.191,56.764 336.461 C 56.764 336.713,57.567 337.748,57.763 337.748 C 57.981 337.748,58.642 338.535,58.650 338.804 C 58.654 338.917,58.888 339.130,59.171 339.277 C 59.786 339.598,61.757 341.524,61.929 341.973 C 61.996 342.147,62.168 342.289,62.311 342.289 C 62.454 342.289,62.725 342.577,62.915 342.929 C 63.125 343.319,63.542 343.693,63.985 343.889 C 64.385 344.065,64.711 344.333,64.711 344.485 C 64.711 344.637,64.882 344.825,65.091 344.902 C 65.299 344.979,65.628 345.336,65.821 345.696 C 66.014 346.056,66.335 346.394,66.535 346.449 C 66.972 346.567,68.307 347.617,68.307 347.843 C 68.307 348.075,69.693 349.274,69.850 349.177 C 69.923 349.132,70.037 349.267,70.103 349.477 C 70.170 349.687,70.389 349.858,70.590 349.858 C 70.791 349.858,70.956 349.924,70.956 350.004 C 70.956 350.370,72.658 351.980,72.934 351.874 C 73.117 351.804,73.226 351.868,73.226 352.046 C 73.226 352.202,73.370 352.385,73.545 352.452 C 73.721 352.520,74.109 352.853,74.408 353.193 C 74.727 353.556,75.063 353.768,75.222 353.707 C 75.385 353.645,75.552 353.757,75.637 353.986 C 75.778 354.360,77.338 355.718,77.633 355.722 C 77.925 355.725,78.903 356.556,78.903 356.800 C 78.903 356.937,78.988 357.048,79.093 357.048 C 79.198 357.048,79.469 357.261,79.695 357.521 C 79.921 357.781,80.240 357.997,80.403 357.999 C 80.566 358.002,81.069 358.343,81.520 358.756 C 81.972 359.170,82.451 359.508,82.586 359.508 C 82.721 359.508,82.876 359.678,82.931 359.886 C 82.988 360.104,83.189 360.265,83.404 360.265 C 83.627 360.265,83.821 360.428,83.883 360.668 C 83.961 360.965,84.092 361.045,84.379 360.970 C 84.624 360.906,84.768 360.959,84.768 361.114 C 84.768 361.353,85.288 361.680,85.572 361.619 C 85.650 361.603,85.714 361.717,85.714 361.873 C 85.714 362.029,85.864 362.157,86.048 362.157 C 86.231 362.157,86.466 362.349,86.570 362.583 C 86.674 362.817,86.908 362.997,87.090 362.982 C 87.272 362.967,87.686 363.202,88.008 363.503 C 88.331 363.805,88.863 364.179,89.191 364.334 C 89.518 364.490,89.998 364.809,90.257 365.043 C 90.517 365.277,90.814 365.478,90.918 365.489 C 91.452 365.547,91.958 365.827,91.958 366.064 C 91.958 366.211,92.107 366.386,92.289 366.453 C 92.472 366.520,92.693 366.695,92.781 366.842 C 92.883 367.012,93.105 367.067,93.396 366.994 C 93.646 366.932,93.851 366.963,93.851 367.063 C 93.851 367.400,94.783 368.258,95.042 368.158 C 95.182 368.105,95.398 368.222,95.521 368.420 C 95.645 368.618,95.905 368.780,96.100 368.780 C 96.294 368.780,96.559 368.907,96.689 369.063 C 96.818 369.219,97.049 369.347,97.202 369.347 C 97.355 369.347,97.828 369.645,98.254 370.009 C 98.679 370.374,99.129 370.672,99.254 370.672 C 99.379 370.672,99.586 370.798,99.714 370.953 C 99.843 371.108,100.024 371.189,100.116 371.131 C 100.208 371.074,100.284 371.112,100.284 371.214 C 100.284 371.425,101.342 371.996,101.732 371.996 C 101.872 371.996,101.965 372.103,101.939 372.233 C 101.912 372.372,102.130 372.493,102.470 372.526 C 102.801 372.558,103.360 372.861,103.781 373.235 C 104.185 373.594,104.655 373.888,104.826 373.888 C 104.997 373.888,105.342 374.106,105.592 374.372 C 105.873 374.671,106.180 374.821,106.396 374.765 C 106.594 374.713,106.953 374.853,107.220 375.085 C 107.480 375.311,107.751 375.501,107.820 375.506 C 108.117 375.528,108.913 375.843,109.149 376.032 C 109.289 376.145,109.518 376.254,109.657 376.274 C 109.796 376.294,110.249 376.584,110.664 376.917 C 111.079 377.251,111.501 377.472,111.602 377.410 C 111.704 377.348,111.837 377.429,111.899 377.591 C 111.962 377.753,112.093 377.836,112.191 377.776 C 112.289 377.715,112.694 377.851,113.091 378.077 C 114.435 378.844,114.758 378.995,115.057 378.996 C 115.221 378.997,115.558 379.214,115.807 379.478 C 116.071 379.759,116.425 379.938,116.658 379.907 C 116.877 379.879,117.263 379.987,117.516 380.147 C 117.769 380.308,118.444 380.635,119.016 380.874 C 119.588 381.114,120.203 381.438,120.381 381.595 C 120.559 381.753,120.847 381.827,121.021 381.760 C 121.216 381.685,121.596 381.838,122.021 382.162 C 122.398 382.449,122.810 382.660,122.938 382.631 C 123.065 382.602,123.363 382.702,123.600 382.854 C 123.837 383.006,124.201 383.158,124.409 383.192 C 124.617 383.226,124.903 383.410,125.045 383.601 C 125.219 383.834,125.444 383.912,125.735 383.839 C 125.999 383.772,126.203 383.825,126.261 383.974 C 126.364 384.244,127.909 384.408,127.909 384.150 C 127.909 384.061,128.172 383.720,128.493 383.391 C 128.979 382.894,129.056 382.698,128.951 382.220 C 128.843 381.728,128.872 381.664,129.154 381.773 C 129.421 381.875,129.463 381.821,129.376 381.489 C 129.294 381.175,129.353 381.079,129.625 381.079 C 129.919 381.079,129.961 380.981,129.868 380.513 C 129.795 380.146,129.862 379.784,130.062 379.479 C 130.231 379.221,130.369 378.916,130.369 378.801 C 130.369 378.686,130.500 378.461,130.659 378.301 C 130.886 378.075,130.901 377.952,130.726 377.742 C 130.546 377.525,130.624 377.364,131.121 376.920 C 131.619 376.476,131.716 376.274,131.618 375.885 C 131.552 375.619,131.565 375.402,131.649 375.402 C 131.907 375.402,132.450 374.330,132.450 373.821 C 132.450 373.241,132.798 372.415,133.253 371.913 C 133.436 371.711,133.568 371.456,133.546 371.346 C 133.477 370.988,133.777 370.104,133.968 370.104 C 134.070 370.104,134.153 369.891,134.153 369.631 C 134.153 369.354,134.251 369.178,134.390 369.205 C 134.539 369.235,134.621 369.043,134.613 368.685 C 134.606 368.373,134.720 368.028,134.867 367.918 C 135.013 367.809,135.108 367.596,135.077 367.445 C 135.005 367.096,135.651 365.752,135.891 365.752 C 135.991 365.752,136.055 365.561,136.034 365.326 C 135.986 364.807,136.396 363.671,136.632 363.671 C 136.725 363.671,136.802 363.467,136.802 363.218 C 136.802 362.969,136.939 362.713,137.106 362.649 C 137.318 362.567,137.376 362.395,137.297 362.082 C 137.226 361.799,137.288 361.546,137.466 361.399 C 137.621 361.270,137.748 361.086,137.748 360.989 C 137.748 360.893,137.919 360.462,138.127 360.031 C 138.335 359.600,138.505 359.088,138.505 358.894 C 138.505 358.699,138.590 358.592,138.694 358.657 C 138.804 358.724,138.884 358.547,138.884 358.239 C 138.884 357.944,139.096 357.390,139.357 357.008 C 139.617 356.625,139.830 356.124,139.830 355.895 C 139.830 355.368,140.756 353.453,141.011 353.453 C 141.121 353.453,141.154 353.217,141.089 352.892 C 141.008 352.486,141.062 352.282,141.283 352.159 C 141.484 352.046,141.552 351.844,141.480 351.570 C 141.399 351.260,141.440 351.179,141.641 351.256 C 141.842 351.334,141.911 351.196,141.911 350.715 C 141.911 350.360,141.990 350.021,142.086 349.962 C 142.182 349.902,142.316 349.599,142.385 349.288 C 142.453 348.977,142.613 348.723,142.741 348.723 C 142.871 348.723,143.126 348.120,143.321 347.351 C 143.512 346.596,143.784 345.845,143.925 345.680 C 144.066 345.516,144.182 345.249,144.182 345.086 C 144.182 344.923,144.315 344.739,144.479 344.676 C 144.671 344.602,144.735 344.434,144.660 344.198 C 144.596 343.997,144.713 343.465,144.918 343.014 C 145.572 341.583,145.955 340.687,145.995 340.492 C 146.130 339.835,146.342 339.451,146.569 339.451 C 146.727 339.451,146.833 339.245,146.837 338.931 C 146.840 338.645,146.966 338.247,147.117 338.048 C 147.304 337.801,147.332 337.612,147.204 337.458 C 147.074 337.302,147.105 337.156,147.301 336.993 C 147.459 336.863,147.588 336.596,147.588 336.401 C 147.588 336.205,147.673 336.045,147.777 336.045 C 147.881 336.045,147.966 335.837,147.966 335.583 C 147.966 335.329,148.129 335.006,148.329 334.866 C 148.539 334.719,148.741 334.286,148.808 333.839 C 148.871 333.414,149.091 332.719,149.296 332.294 C 149.792 331.268,149.789 330.258,149.290 329.991 C 149.082 329.879,148.912 329.700,148.912 329.593 C 148.912 329.485,148.699 329.119,148.439 328.777 C 148.179 328.436,147.966 328.086,147.966 327.998 C 147.966 327.911,147.625 327.435,147.209 326.941 C 146.793 326.448,146.452 325.953,146.452 325.841 C 146.452 325.730,146.386 325.639,146.306 325.639 C 146.226 325.639,145.991 325.321,145.786 324.934 C 145.580 324.546,145.284 324.090,145.128 323.921 C 144.619 323.370,144.182 322.798,144.182 322.684 C 144.182 322.622,143.926 322.248,143.614 321.854 C 143.302 321.460,143.046 321.041,143.046 320.922 C 143.046 320.804,142.919 320.658,142.763 320.598 C 142.606 320.538,142.479 320.406,142.479 320.305 C 142.479 320.203,142.181 319.757,141.816 319.312 C 141.452 318.868,141.154 318.404,141.154 318.281 C 141.154 318.158,141.026 318.009,140.870 317.949 C 140.714 317.889,140.587 317.719,140.587 317.571 C 140.587 317.423,140.459 317.252,140.303 317.192 C 140.147 317.132,140.019 317.004,140.019 316.907 C 140.019 316.698,139.230 315.544,139.026 315.453 C 138.947 315.418,138.884 315.282,138.884 315.151 C 138.884 315.019,138.713 314.758,138.505 314.570 C 138.297 314.381,138.127 314.113,138.127 313.973 C 138.127 313.833,138.040 313.718,137.933 313.718 C 137.826 313.718,137.658 313.505,137.559 313.245 C 137.460 312.985,137.306 312.772,137.216 312.772 C 137.067 312.772,136.696 312.128,136.642 311.775 C 136.630 311.695,136.443 311.440,136.228 311.208 C 135.601 310.532,134.359 308.771,134.237 308.384 C 134.175 308.189,133.939 307.836,133.713 307.599 C 133.487 307.362,133.174 306.971,133.018 306.730 C 132.862 306.489,132.644 306.196,132.534 306.079 C 132.424 305.962,132.169 305.573,131.967 305.216 C 131.764 304.858,131.450 304.390,131.268 304.175 C 130.563 303.344,130.452 303.186,130.089 302.503 C 129.884 302.115,129.647 301.798,129.564 301.798 C 129.481 301.798,129.333 301.585,129.234 301.325 C 129.135 301.064,128.967 300.851,128.860 300.851 C 128.753 300.851,128.666 300.737,128.666 300.597 C 128.666 300.457,128.496 300.188,128.288 300.000 C 128.079 299.812,127.909 299.579,127.909 299.484 C 127.909 299.389,127.803 299.200,127.673 299.064 C 127.543 298.928,127.308 298.626,127.152 298.393 C 126.996 298.160,126.734 297.788,126.570 297.566 C 126.405 297.344,126.216 297.013,126.150 296.831 C 126.083 296.649,125.950 296.500,125.853 296.500 C 125.756 296.500,125.489 296.138,125.260 295.695 C 125.030 295.253,124.723 294.823,124.578 294.740 C 124.433 294.657,124.314 294.465,124.314 294.314 C 124.314 294.163,124.226 294.040,124.119 294.040 C 124.012 294.040,123.869 293.891,123.802 293.709 C 123.735 293.526,123.503 293.122,123.287 292.810 C 123.071 292.498,122.809 292.106,122.705 291.939 C 122.487 291.589,121.384 290.080,121.101 289.743 C 120.995 289.617,120.908 289.459,120.908 289.392 C 120.908 289.289,119.878 287.898,119.207 287.094 C 119.102 286.968,119.016 286.810,119.016 286.743 C 119.016 286.675,118.761 286.298,118.448 285.904 C 118.136 285.509,117.881 285.097,117.881 284.987 C 117.881 284.877,117.774 284.719,117.644 284.636 C 117.344 284.444,116.556 283.327,116.556 283.093 C 116.556 282.996,116.429 282.868,116.272 282.808 C 116.116 282.748,115.989 282.577,115.989 282.429 C 115.989 282.281,115.861 282.111,115.705 282.051 C 115.549 281.991,115.421 281.851,115.421 281.739 C 115.421 281.511,114.646 280.356,114.428 280.259 C 114.350 280.224,114.286 280.079,114.286 279.937 C 114.286 279.795,114.179 279.610,114.049 279.527 C 113.749 279.335,112.961 278.218,112.961 277.984 C 112.961 277.887,112.833 277.759,112.677 277.699 C 112.521 277.639,112.394 277.503,112.394 277.396 C 112.394 276.953,110.065 274.176,109.691 274.173 C 109.610 274.173,109.493 274.305,109.430 274.467 \" stroke=\"none\" fill=\"#8ca516\" fill-rule=\"evenodd\"></path><path id=\"path5\" d=\"\" stroke=\"none\" fill=\"#6db600\" fill-rule=\"evenodd\"></path><path id=\"path6\" d=\"M79.186 45.256 C 78.978 45.372,78.369 45.838,77.832 46.291 C 77.295 46.744,76.809 47.114,76.752 47.114 C 76.696 47.114,76.441 47.306,76.186 47.540 C 75.500 48.170,75.046 48.533,74.934 48.540 C 74.693 48.557,73.983 49.116,73.983 49.289 C 73.982 49.611,72.116 51.366,71.950 51.200 C 71.890 51.140,71.722 51.260,71.577 51.468 C 71.431 51.675,71.190 51.845,71.039 51.845 C 70.889 51.845,70.766 52.019,70.766 52.232 C 70.766 52.464,70.539 52.748,70.200 52.942 C 69.888 53.119,69.633 53.328,69.632 53.406 C 69.632 53.484,69.461 53.548,69.253 53.548 C 69.044 53.548,68.874 53.634,68.874 53.739 C 68.874 53.992,67.915 55.061,67.688 55.061 C 67.590 55.061,67.342 55.274,67.137 55.535 C 66.933 55.795,66.647 56.008,66.502 56.008 C 66.357 56.008,66.137 56.197,66.013 56.429 C 65.743 56.933,65.537 57.138,64.871 57.564 C 64.594 57.741,64.126 58.227,63.830 58.644 C 63.452 59.177,63.194 59.371,62.961 59.300 C 62.776 59.244,62.630 59.297,62.630 59.421 C 62.630 59.747,61.733 60.786,61.150 61.136 C 60.865 61.307,60.668 61.576,60.699 61.751 C 60.730 61.922,60.634 62.062,60.487 62.062 C 60.249 62.062,59.039 63.359,58.877 63.788 C 58.843 63.879,58.688 63.955,58.533 63.955 C 58.258 63.955,57.711 64.387,57.711 64.603 C 57.711 64.663,57.561 64.867,57.379 65.056 C 57.197 65.246,56.793 65.714,56.482 66.097 C 56.170 66.480,55.804 66.793,55.668 66.793 C 55.532 66.793,55.296 67.091,55.144 67.455 C 54.992 67.819,54.762 68.121,54.633 68.125 C 54.505 68.130,53.463 69.275,52.318 70.671 C 51.173 72.067,50.086 73.262,49.903 73.326 C 49.719 73.390,49.605 73.501,49.649 73.573 C 49.805 73.824,49.216 74.409,48.921 74.296 C 48.711 74.216,48.627 74.303,48.625 74.604 C 48.622 75.122,48.429 75.402,48.074 75.402 C 47.926 75.402,47.741 75.638,47.663 75.927 C 47.586 76.216,47.349 76.642,47.137 76.874 C 46.126 77.977,44.276 80.266,44.276 80.414 C 44.276 80.505,44.106 80.634,43.898 80.700 C 43.690 80.766,43.519 80.985,43.519 81.186 C 43.519 81.387,43.390 81.701,43.233 81.883 C 41.478 83.908,40.527 85.119,40.618 85.210 C 40.679 85.271,40.378 85.740,39.948 86.253 C 39.519 86.766,39.167 87.281,39.167 87.396 C 39.167 87.512,39.040 87.606,38.884 87.606 C 38.728 87.606,38.600 87.763,38.600 87.954 C 38.600 88.146,38.324 88.625,37.988 89.019 C 37.651 89.413,37.374 89.838,37.373 89.964 C 37.371 90.090,36.944 90.679,36.424 91.275 C 35.904 91.870,35.500 92.441,35.527 92.542 C 35.554 92.644,35.398 92.916,35.181 93.147 C 34.964 93.378,34.676 93.822,34.542 94.134 C 34.408 94.447,34.074 94.941,33.800 95.232 C 33.526 95.524,33.302 95.856,33.302 95.971 C 33.302 96.086,33.089 96.459,32.829 96.800 C 32.569 97.141,32.356 97.527,32.356 97.657 C 32.356 97.788,32.194 98.070,31.996 98.285 C 31.656 98.654,31.110 99.547,30.515 100.706 C 30.370 100.990,30.171 101.272,30.073 101.332 C 29.976 101.392,29.896 101.592,29.896 101.776 C 29.896 101.960,29.683 102.310,29.423 102.554 C 29.163 102.799,28.950 103.139,28.950 103.311 C 28.950 103.483,28.745 103.816,28.495 104.051 C 28.245 104.286,27.983 104.780,27.914 105.149 C 27.845 105.518,27.539 106.085,27.233 106.410 C 26.928 106.735,26.716 107.099,26.761 107.220 C 26.806 107.340,26.678 107.587,26.477 107.769 C 26.276 107.951,26.112 108.252,26.112 108.438 C 26.112 108.624,26.032 108.825,25.934 108.886 C 25.725 109.015,25.166 110.097,25.166 110.374 C 25.166 110.480,25.049 110.701,24.908 110.865 C 24.766 111.029,24.497 111.573,24.310 112.072 C 24.124 112.572,23.805 113.098,23.602 113.240 C 23.388 113.390,23.291 113.594,23.372 113.724 C 23.448 113.848,23.409 114.012,23.285 114.089 C 23.161 114.166,23.040 114.357,23.017 114.513 C 22.994 114.669,22.842 115.001,22.679 115.251 C 22.516 115.500,22.320 115.918,22.245 116.178 C 22.005 117.008,21.524 117.971,21.276 118.117 C 21.144 118.196,20.979 118.600,20.908 119.016 C 20.838 119.432,20.703 119.773,20.608 119.773 C 20.513 119.773,20.435 119.909,20.435 120.075 C 20.435 120.390,19.954 121.350,19.531 121.878 C 19.395 122.047,19.304 122.260,19.328 122.351 C 19.423 122.710,19.048 123.830,18.710 124.192 C 18.514 124.402,18.354 124.722,18.354 124.902 C 18.354 125.081,18.265 125.258,18.156 125.294 C 18.048 125.331,17.934 125.593,17.904 125.878 C 17.874 126.163,17.792 126.453,17.723 126.522 C 17.654 126.591,17.597 126.800,17.597 126.985 C 17.597 127.171,17.456 127.402,17.284 127.498 C 17.104 127.598,17.019 127.797,17.083 127.965 C 17.148 128.134,17.072 128.303,16.903 128.368 C 16.743 128.430,16.659 128.604,16.718 128.756 C 16.776 128.908,16.742 129.083,16.643 129.144 C 16.543 129.206,16.462 129.496,16.462 129.789 C 16.462 130.083,16.337 130.426,16.184 130.553 C 16.031 130.680,15.913 130.839,15.922 130.907 C 15.975 131.306,15.854 131.666,15.559 131.989 C 15.375 132.191,15.231 132.483,15.240 132.640 C 15.254 132.898,14.806 134.251,14.394 135.194 C 14.034 136.017,13.441 137.881,13.325 138.555 C 13.257 138.946,13.127 139.313,13.034 139.370 C 12.942 139.427,12.867 139.724,12.867 140.030 C 12.867 140.336,12.781 140.587,12.677 140.587 C 12.573 140.587,12.488 140.752,12.488 140.954 C 12.488 141.156,12.403 141.374,12.299 141.438 C 12.195 141.502,12.108 141.784,12.106 142.064 C 12.103 142.344,11.940 142.928,11.743 143.362 C 11.546 143.796,11.432 144.198,11.489 144.255 C 11.547 144.312,11.412 144.782,11.189 145.299 C 10.967 145.816,10.785 146.405,10.785 146.608 C 10.785 146.811,10.658 147.220,10.503 147.519 C 10.347 147.817,10.219 148.290,10.219 148.570 C 10.218 148.850,10.144 149.124,10.054 149.180 C 9.964 149.236,9.832 149.645,9.760 150.090 C 9.514 151.625,8.933 154.114,8.690 154.683 C 8.531 155.055,8.445 155.436,7.841 158.467 C 7.675 159.300,7.457 160.135,7.357 160.323 C 7.256 160.510,7.122 161.216,7.060 161.890 C 6.997 162.564,6.873 163.160,6.784 163.215 C 6.695 163.270,6.621 163.586,6.620 163.918 C 6.618 164.251,6.490 165.061,6.335 165.719 C 6.180 166.377,6.010 167.271,5.957 167.706 C 5.904 168.140,5.815 168.794,5.757 169.158 C 5.700 169.522,5.628 170.076,5.597 170.388 C 5.566 170.700,5.489 171.083,5.425 171.239 C 5.361 171.395,5.221 172.247,5.113 173.132 C 5.006 174.016,4.874 174.995,4.821 175.307 C 4.767 175.620,4.675 176.471,4.616 177.200 C 4.557 177.928,4.436 178.612,4.347 178.719 C 4.258 178.827,4.184 179.337,4.182 179.854 C 4.180 180.372,4.133 181.306,4.077 181.930 C 4.021 182.554,3.937 183.576,3.890 184.201 C 3.843 184.825,3.790 185.336,3.772 185.336 C 3.711 185.336,3.445 190.033,3.343 192.917 C 3.310 193.860,3.223 194.729,3.149 194.847 C 3.017 195.060,3.058 195.456,3.313 196.452 C 3.388 196.743,3.369 196.973,3.271 196.973 C 2.976 196.973,3.139 207.939,3.515 213.434 C 3.575 214.319,3.650 215.511,3.680 216.083 C 3.711 216.656,3.841 218.188,3.969 219.489 C 4.098 220.790,4.193 222.138,4.181 222.485 C 4.170 222.833,4.219 223.211,4.291 223.327 C 4.449 223.584,4.491 223.880,4.653 225.875 C 4.722 226.734,4.832 227.436,4.897 227.436 C 4.961 227.436,5.029 227.670,5.047 227.956 C 5.081 228.509,5.332 230.268,5.686 232.450 C 5.804 233.179,5.892 234.009,5.880 234.295 C 5.869 234.581,5.927 234.816,6.010 234.816 C 6.092 234.816,6.155 235.163,6.149 235.587 C 6.144 236.012,6.205 236.400,6.286 236.450 C 6.367 236.500,6.433 236.797,6.433 237.110 C 6.433 237.423,6.516 237.833,6.617 238.023 C 6.719 238.212,6.898 238.994,7.016 239.760 C 7.134 240.527,7.282 241.239,7.344 241.342 C 7.407 241.445,7.471 241.785,7.488 242.099 C 7.504 242.412,7.616 243.024,7.736 243.460 C 7.857 243.896,7.937 244.321,7.916 244.406 C 7.894 244.491,8.052 245.128,8.267 245.821 C 8.482 246.515,8.615 247.303,8.564 247.572 C 8.511 247.851,8.557 248.061,8.673 248.061 C 8.785 248.061,8.929 248.380,8.994 248.770 C 9.059 249.160,9.162 249.607,9.224 249.763 C 9.286 249.920,9.352 250.218,9.370 250.426 C 9.389 250.634,9.502 251.044,9.622 251.337 C 9.741 251.630,9.839 252.027,9.839 252.220 C 9.839 252.413,9.929 252.600,10.040 252.637 C 10.150 252.674,10.245 253.071,10.251 253.519 C 10.258 254.029,10.360 254.371,10.524 254.434 C 10.668 254.489,10.785 254.736,10.785 254.982 C 10.785 255.505,11.579 258.598,11.996 259.697 C 12.153 260.114,12.286 260.593,12.291 260.764 C 12.295 260.934,12.426 261.317,12.582 261.615 C 12.737 261.913,12.865 262.292,12.865 262.457 C 12.866 262.621,12.926 262.815,12.998 262.888 C 13.071 262.960,13.152 263.123,13.179 263.251 C 13.404 264.299,13.720 265.234,13.934 265.483 C 14.076 265.648,14.191 265.999,14.191 266.264 C 14.191 266.529,14.319 266.852,14.475 266.982 C 14.631 267.112,14.759 267.458,14.759 267.751 C 14.759 268.044,14.838 268.333,14.936 268.393 C 15.033 268.454,15.252 268.991,15.423 269.587 C 15.594 270.184,15.898 270.953,16.098 271.297 C 16.298 271.642,16.462 272.082,16.462 272.275 C 16.462 272.469,16.558 272.659,16.675 272.698 C 16.792 272.737,16.907 272.936,16.929 273.139 C 17.027 274.010,17.279 274.723,17.524 274.816 C 17.668 274.872,17.786 275.128,17.786 275.385 C 17.786 275.642,17.871 275.905,17.975 275.970 C 18.079 276.034,18.165 276.232,18.165 276.409 C 18.165 276.587,18.335 277.050,18.543 277.438 C 18.751 277.827,18.925 278.294,18.928 278.476 C 18.932 278.659,19.137 279.055,19.384 279.357 C 19.631 279.659,19.788 280.024,19.733 280.169 C 19.678 280.313,19.771 280.583,19.940 280.770 C 20.109 280.957,20.375 281.538,20.530 282.062 C 20.686 282.585,20.983 283.230,21.192 283.495 C 21.400 283.760,21.570 284.084,21.570 284.216 C 21.570 284.347,21.687 284.589,21.830 284.753 C 21.973 284.918,22.233 285.494,22.409 286.035 C 22.585 286.575,22.882 287.214,23.070 287.454 C 23.257 287.694,23.476 288.103,23.555 288.363 C 23.635 288.623,23.944 289.172,24.243 289.583 C 24.542 289.994,24.787 290.569,24.787 290.860 C 24.787 291.152,24.852 291.391,24.931 291.391 C 25.093 291.391,25.194 291.562,26.053 293.295 C 26.385 293.965,26.875 294.806,27.141 295.164 C 27.407 295.523,27.625 295.999,27.625 296.223 C 27.625 296.447,27.796 296.784,28.004 296.973 C 28.212 297.161,28.382 297.402,28.382 297.507 C 28.382 297.613,28.501 297.834,28.647 297.998 C 29.249 298.678,29.679 299.668,29.465 299.882 C 29.311 300.036,29.391 300.234,29.765 300.624 C 30.045 300.917,30.274 301.258,30.274 301.382 C 30.274 301.507,30.346 301.608,30.433 301.608 C 30.521 301.608,30.692 301.800,30.815 302.034 C 30.937 302.268,31.289 302.800,31.596 303.217 C 31.903 303.633,32.157 304.086,32.160 304.224 C 32.164 304.361,32.273 304.592,32.403 304.737 C 32.948 305.345,33.113 305.575,33.113 305.728 C 33.113 305.817,33.367 306.133,33.678 306.431 C 34.339 307.065,34.665 306.968,36.013 305.736 C 36.434 305.351,36.848 305.079,36.934 305.132 C 37.019 305.184,37.140 305.094,37.202 304.932 C 37.265 304.769,37.430 304.636,37.569 304.636 C 37.708 304.636,37.940 304.466,38.086 304.259 C 38.231 304.051,38.408 303.939,38.479 304.011 C 38.550 304.082,38.739 303.953,38.899 303.726 C 39.058 303.498,39.308 303.311,39.453 303.311 C 39.598 303.311,39.784 303.205,39.868 303.075 C 39.951 302.945,40.307 302.677,40.660 302.481 C 41.013 302.284,41.460 301.986,41.653 301.819 C 41.847 301.651,42.169 301.372,42.368 301.198 C 42.568 301.025,42.783 300.935,42.846 300.998 C 42.909 301.061,43.091 300.926,43.251 300.698 C 43.410 300.470,43.655 300.284,43.794 300.284 C 43.933 300.284,44.098 300.151,44.160 299.988 C 44.222 299.825,44.350 299.739,44.443 299.797 C 44.536 299.854,44.941 299.597,45.343 299.225 C 45.745 298.853,46.383 298.390,46.760 298.195 C 47.137 298.000,47.497 297.709,47.558 297.548 C 47.620 297.388,47.790 297.256,47.937 297.256 C 48.083 297.256,48.309 297.130,48.437 296.975 C 48.566 296.820,48.747 296.740,48.840 296.797 C 48.933 296.855,49.061 296.768,49.123 296.605 C 49.186 296.442,49.544 296.163,49.920 295.985 C 50.295 295.806,50.746 295.530,50.921 295.371 C 51.096 295.211,51.463 294.877,51.737 294.629 C 52.011 294.381,52.289 294.231,52.354 294.297 C 52.420 294.362,52.593 294.245,52.740 294.035 C 52.886 293.826,53.080 293.701,53.171 293.757 C 53.261 293.813,53.404 293.750,53.489 293.618 C 53.635 293.389,54.125 293.034,54.633 292.790 C 54.761 292.728,55.229 292.345,55.673 291.939 C 56.117 291.534,56.558 291.202,56.652 291.202 C 56.746 291.202,57.129 290.968,57.503 290.682 C 57.877 290.396,58.245 290.182,58.320 290.207 C 58.395 290.232,58.547 290.082,58.658 289.875 C 58.768 289.668,58.987 289.499,59.142 289.499 C 59.298 289.499,59.476 289.366,59.538 289.204 C 59.601 289.042,59.753 288.948,59.877 288.996 C 60.001 289.043,60.204 288.921,60.327 288.723 C 60.451 288.525,60.636 288.363,60.740 288.363 C 60.843 288.363,61.097 288.214,61.306 288.032 C 61.514 287.850,61.861 287.545,62.078 287.354 C 62.295 287.163,62.515 287.050,62.567 287.102 C 62.619 287.154,62.825 287.055,63.024 286.881 C 63.224 286.708,63.550 286.424,63.750 286.250 C 63.949 286.077,64.164 285.987,64.227 286.050 C 64.290 286.113,64.472 285.978,64.632 285.750 C 64.792 285.522,65.025 285.336,65.150 285.336 C 65.275 285.336,65.484 285.166,65.614 284.957 C 65.744 284.749,65.950 284.579,66.073 284.579 C 66.196 284.579,66.784 284.196,67.380 283.728 C 67.976 283.259,68.556 282.876,68.669 282.876 C 68.782 282.876,68.874 282.801,68.874 282.709 C 68.874 282.617,69.023 282.488,69.205 282.422 C 69.809 282.204,70.450 281.773,70.619 281.471 C 70.710 281.307,70.904 281.173,71.050 281.173 C 71.196 281.173,71.383 281.056,71.466 280.912 C 71.550 280.769,71.919 280.491,72.286 280.296 C 72.944 279.946,73.261 279.714,74.012 279.029 C 74.222 278.838,74.434 278.722,74.483 278.772 C 74.533 278.822,74.773 278.680,75.017 278.457 C 75.752 277.784,76.020 277.596,76.111 277.688 C 76.159 277.735,76.572 277.432,77.030 277.014 C 77.487 276.596,77.959 276.254,78.078 276.254 C 78.197 276.254,78.347 276.117,78.411 275.950 C 78.475 275.783,78.639 275.690,78.776 275.742 C 78.912 275.794,79.127 275.672,79.253 275.470 C 79.379 275.269,79.561 275.152,79.656 275.211 C 79.752 275.270,79.922 275.145,80.035 274.934 C 80.148 274.723,80.356 274.551,80.497 274.551 C 80.639 274.551,80.803 274.423,80.863 274.267 C 80.923 274.111,81.092 273.983,81.239 273.983 C 81.385 273.983,81.609 273.858,81.736 273.705 C 81.863 273.552,82.022 273.446,82.090 273.469 C 82.158 273.491,82.405 273.340,82.640 273.132 C 82.874 272.923,83.243 272.597,83.459 272.406 C 83.676 272.215,83.903 272.108,83.963 272.168 C 84.023 272.229,84.191 272.108,84.336 271.900 C 84.482 271.693,84.723 271.523,84.874 271.523 C 85.024 271.523,85.147 271.438,85.147 271.334 C 85.147 271.230,85.296 271.145,85.480 271.145 C 85.663 271.145,85.921 270.971,86.053 270.759 C 86.186 270.547,86.367 270.418,86.457 270.474 C 86.546 270.529,86.758 270.362,86.928 270.102 C 87.098 269.843,87.362 269.631,87.516 269.631 C 87.670 269.631,87.796 269.554,87.796 269.461 C 87.796 269.367,88.158 269.103,88.600 268.874 C 89.042 268.644,89.472 268.337,89.555 268.192 C 89.639 268.047,89.830 267.928,89.981 267.928 C 90.132 267.928,90.255 267.841,90.255 267.734 C 90.255 267.628,90.468 267.459,90.728 267.360 C 90.989 267.262,91.202 267.113,91.202 267.030 C 91.202 266.947,91.521 266.713,91.911 266.511 C 92.632 266.138,92.857 265.977,93.614 265.288 C 93.848 265.075,94.105 264.922,94.185 264.948 C 94.328 264.994,94.626 264.780,95.394 264.081 C 95.603 263.890,95.823 263.783,95.883 263.843 C 95.943 263.903,96.111 263.782,96.257 263.575 C 96.402 263.367,96.641 263.198,96.787 263.198 C 96.934 263.198,97.145 263.027,97.256 262.819 C 97.368 262.611,97.566 262.441,97.696 262.441 C 97.826 262.441,98.228 262.189,98.588 261.881 C 98.948 261.573,99.345 261.318,99.470 261.313 C 99.595 261.309,99.765 261.199,99.849 261.069 C 99.932 260.939,100.170 260.738,100.378 260.623 C 100.865 260.354,100.977 259.783,100.587 259.564 C 100.420 259.471,100.284 259.324,100.284 259.238 C 100.284 259.151,99.986 258.586,99.622 257.981 C 99.257 257.376,98.959 256.766,98.959 256.626 C 98.959 256.485,98.803 256.202,98.612 255.997 C 98.421 255.792,97.979 255.051,97.629 254.350 C 97.279 253.648,96.927 253.047,96.847 253.014 C 96.766 252.980,96.644 252.639,96.575 252.257 C 96.507 251.874,96.369 251.458,96.270 251.333 C 95.977 250.964,95.364 249.702,95.364 249.469 C 95.364 249.350,95.194 249.057,94.986 248.817 C 94.778 248.577,94.607 248.192,94.607 247.960 C 94.607 247.729,94.480 247.433,94.324 247.304 C 94.167 247.174,94.039 246.972,94.039 246.855 C 94.038 246.737,93.928 246.429,93.794 246.168 C 93.659 245.908,93.364 245.142,93.137 244.465 C 92.909 243.789,92.551 242.898,92.341 242.486 C 92.131 242.074,91.958 241.551,91.958 241.324 C 91.958 241.097,91.831 240.862,91.675 240.802 C 91.518 240.742,91.391 240.480,91.391 240.219 C 91.391 239.959,91.175 239.258,90.912 238.663 C 90.648 238.067,90.474 237.471,90.525 237.339 C 90.576 237.207,90.536 237.048,90.436 236.986 C 90.337 236.925,90.255 236.743,90.255 236.583 C 90.255 236.423,90.138 236.024,89.994 235.696 C 89.633 234.873,89.405 234.170,89.035 232.734 C 88.860 232.058,88.638 231.243,88.540 230.923 C 88.443 230.604,88.363 230.199,88.363 230.024 C 88.363 229.850,88.269 229.707,88.154 229.707 C 88.038 229.707,87.997 229.569,88.062 229.399 C 88.127 229.230,88.106 228.995,88.014 228.879 C 87.923 228.762,87.793 228.249,87.727 227.739 C 87.660 227.229,87.529 226.718,87.435 226.604 C 87.341 226.489,87.205 225.885,87.133 225.260 C 87.061 224.636,86.875 223.674,86.720 223.122 C 86.565 222.570,86.365 221.506,86.276 220.757 C 86.039 218.777,85.722 216.991,85.531 216.556 C 85.440 216.348,85.312 215.241,85.247 214.096 C 85.073 211.034,84.952 209.437,84.844 208.798 C 84.589 207.284,84.477 198.358,84.678 195.553 C 84.730 194.825,84.809 193.718,84.853 193.094 C 84.897 192.469,85.030 190.851,85.149 189.499 C 85.269 188.146,85.391 186.729,85.421 186.350 C 85.452 185.972,85.521 185.588,85.574 185.499 C 85.628 185.409,85.733 184.697,85.808 183.917 C 85.884 183.136,86.031 182.392,86.135 182.264 C 86.239 182.135,86.272 181.893,86.208 181.726 C 86.144 181.559,86.155 181.324,86.233 181.203 C 86.311 181.083,86.476 180.345,86.598 179.565 C 86.721 178.784,86.878 177.933,86.947 177.673 C 87.017 177.412,87.119 176.753,87.174 176.206 C 87.230 175.660,87.347 175.213,87.434 175.213 C 87.522 175.213,87.650 174.785,87.719 174.263 C 87.789 173.740,87.916 173.269,88.001 173.216 C 88.087 173.163,88.214 172.612,88.284 171.990 C 88.355 171.369,88.477 170.861,88.556 170.861 C 88.679 170.861,88.867 170.215,89.051 169.158 C 89.178 168.428,89.542 167.132,89.766 166.612 C 90.345 165.264,90.429 164.986,90.334 164.738 C 90.279 164.594,90.375 164.422,90.548 164.356 C 90.726 164.287,90.816 164.116,90.756 163.959 C 90.698 163.807,90.732 163.633,90.831 163.571 C 90.931 163.510,91.012 163.214,91.012 162.914 C 91.012 162.614,91.097 162.316,91.202 162.252 C 91.306 162.187,91.391 161.991,91.392 161.815 C 91.393 161.639,91.520 161.251,91.676 160.953 C 91.831 160.655,91.958 160.303,91.958 160.172 C 91.958 160.040,92.086 159.827,92.242 159.697 C 92.398 159.568,92.526 159.217,92.526 158.917 C 92.526 158.618,92.611 158.373,92.715 158.373 C 92.819 158.373,92.904 158.207,92.904 158.005 C 92.904 157.803,92.990 157.586,93.094 157.521 C 93.198 157.457,93.283 157.239,93.283 157.037 C 93.283 156.835,93.368 156.670,93.472 156.670 C 93.576 156.670,93.661 156.457,93.661 156.197 C 93.661 155.937,93.746 155.724,93.851 155.724 C 93.955 155.724,94.040 155.558,94.040 155.356 C 94.040 155.154,94.114 154.943,94.205 154.887 C 94.295 154.831,94.424 154.513,94.491 154.179 C 94.557 153.846,94.732 153.439,94.879 153.276 C 95.025 153.113,95.173 152.854,95.207 152.701 C 95.242 152.547,95.372 152.311,95.498 152.175 C 95.624 152.039,95.683 151.814,95.629 151.675 C 95.576 151.535,95.668 151.368,95.835 151.304 C 96.002 151.240,96.122 151.080,96.101 150.949 C 96.052 150.643,96.622 149.354,96.875 149.198 C 96.981 149.132,97.067 148.918,97.067 148.722 C 97.067 148.526,97.247 148.240,97.466 148.086 C 97.686 147.933,97.814 147.725,97.753 147.625 C 97.691 147.525,97.809 147.228,98.016 146.965 C 98.223 146.702,98.392 146.357,98.392 146.197 C 98.392 146.037,98.472 145.857,98.570 145.797 C 98.668 145.736,98.936 145.310,99.166 144.849 C 99.396 144.389,99.678 144.029,99.792 144.049 C 99.907 144.070,99.973 143.930,99.940 143.737 C 99.907 143.545,99.992 143.247,100.129 143.075 C 100.434 142.693,100.816 142.036,101.254 141.139 C 101.437 140.767,101.719 140.352,101.881 140.218 C 102.043 140.083,102.176 139.856,102.176 139.712 C 102.176 139.569,102.472 139.124,102.835 138.723 C 103.197 138.322,103.444 137.944,103.382 137.883 C 103.256 137.756,104.837 135.667,105.059 135.667 C 105.138 135.667,105.203 135.517,105.203 135.334 C 105.203 135.151,105.500 134.661,105.862 134.246 C 106.224 133.831,106.522 133.385,106.524 133.254 C 106.526 133.124,106.627 133.039,106.748 133.065 C 106.869 133.091,107.018 132.927,107.079 132.700 C 107.192 132.281,107.820 131.433,108.930 130.202 C 109.269 129.825,109.549 129.414,109.551 129.288 C 109.553 129.161,109.726 128.967,109.934 128.855 C 110.142 128.744,110.312 128.528,110.312 128.376 C 110.312 128.223,110.405 128.098,110.518 128.098 C 110.815 128.098,111.434 127.306,111.441 126.916 C 111.445 126.717,111.593 126.585,111.813 126.585 C 112.072 126.585,112.197 126.432,112.239 126.064 C 112.280 125.705,112.401 125.552,112.630 125.570 C 112.812 125.585,112.961 125.521,112.961 125.429 C 112.961 125.337,113.259 124.931,113.623 124.528 C 113.988 124.125,114.286 123.699,114.286 123.582 C 114.286 123.464,114.413 123.368,114.570 123.368 C 114.726 123.368,114.854 123.304,114.854 123.226 C 114.855 122.992,116.210 121.476,116.417 121.476 C 116.688 121.476,117.111 120.877,117.118 120.482 C 117.121 120.297,117.270 120.149,117.455 120.147 C 117.637 120.144,118.031 119.811,118.331 119.405 C 118.654 118.970,118.982 118.709,119.135 118.768 C 119.278 118.823,119.395 118.791,119.395 118.698 C 119.395 118.605,119.733 118.149,120.146 117.685 C 120.559 117.220,120.900 116.776,120.903 116.698 C 120.906 116.620,121.026 116.556,121.170 116.556 C 121.313 116.556,121.656 116.262,121.930 115.901 C 122.243 115.491,122.534 115.287,122.710 115.354 C 122.884 115.421,122.990 115.348,122.990 115.161 C 122.990 114.996,123.181 114.810,123.415 114.748 C 123.649 114.687,124.120 114.259,124.462 113.799 C 124.804 113.338,125.169 112.961,125.275 112.961 C 125.625 112.961,126.383 111.929,126.388 111.447 C 126.391 111.052,125.869 110.217,124.884 109.043 C 124.779 108.917,124.689 108.747,124.685 108.665 C 124.681 108.582,124.425 108.220,124.117 107.860 C 123.809 107.499,123.557 107.123,123.557 107.024 C 123.557 106.925,123.427 106.709,123.269 106.544 C 122.761 106.017,121.665 104.476,121.665 104.289 C 121.665 104.190,121.537 104.060,121.381 104.000 C 121.225 103.940,121.097 103.790,121.097 103.668 C 121.097 103.545,120.799 103.081,120.435 102.637 C 120.071 102.192,119.773 101.736,119.773 101.624 C 119.773 101.511,119.688 101.419,119.584 101.419 C 119.480 101.419,119.395 101.305,119.395 101.165 C 119.395 101.025,119.224 100.756,119.016 100.568 C 118.808 100.379,118.638 100.120,118.638 99.991 C 118.638 99.862,118.510 99.708,118.354 99.648 C 118.198 99.588,118.070 99.413,118.070 99.258 C 118.070 99.104,117.959 98.910,117.823 98.827 C 117.687 98.744,117.373 98.335,117.124 97.919 C 116.875 97.502,116.561 97.094,116.425 97.010 C 116.289 96.927,116.178 96.766,116.178 96.652 C 116.178 96.537,115.880 96.080,115.516 95.636 C 115.151 95.191,114.853 94.753,114.853 94.663 C 114.853 94.573,114.601 94.204,114.293 93.843 C 113.985 93.483,113.730 93.121,113.726 93.038 C 113.722 92.956,113.632 92.786,113.527 92.660 C 112.772 91.760,112.204 90.922,112.204 90.709 C 112.204 90.571,112.034 90.367,111.826 90.255 C 111.618 90.144,111.447 89.926,111.447 89.770 C 111.447 89.614,111.320 89.438,111.164 89.378 C 111.008 89.318,110.880 89.189,110.880 89.092 C 110.880 88.883,110.091 87.729,109.886 87.638 C 109.808 87.603,109.745 87.459,109.745 87.316 C 109.745 87.174,109.638 86.990,109.508 86.906 C 109.195 86.706,108.420 85.593,108.420 85.344 C 108.420 85.235,108.333 85.147,108.226 85.147 C 108.120 85.147,107.951 84.934,107.852 84.674 C 107.753 84.413,107.585 84.201,107.479 84.201 C 107.372 84.201,107.285 84.112,107.285 84.004 C 107.285 83.795,106.542 82.672,106.274 82.476 C 106.086 82.338,105.636 81.589,105.472 81.139 C 105.408 80.964,105.236 80.775,105.090 80.719 C 104.944 80.663,104.825 80.496,104.825 80.348 C 104.825 80.200,104.697 80.029,104.541 79.969 C 104.385 79.910,104.257 79.743,104.257 79.600 C 104.257 79.457,104.087 79.186,103.879 78.997 C 103.671 78.809,103.500 78.582,103.500 78.493 C 103.500 78.404,103.032 77.698,102.460 76.924 C 101.887 76.150,101.419 75.467,101.419 75.407 C 101.419 75.346,101.100 74.885,100.710 74.382 C 100.319 73.879,99.872 73.278,99.716 73.046 C 99.560 72.815,99.262 72.431,99.054 72.193 C 98.846 71.956,98.505 71.477,98.297 71.129 C 98.089 70.781,97.769 70.280,97.585 70.016 C 97.402 69.752,97.200 69.387,97.138 69.205 C 97.075 69.023,96.946 68.874,96.851 68.874 C 96.757 68.874,96.598 68.661,96.500 68.401 C 96.401 68.141,96.232 67.928,96.126 67.928 C 96.019 67.928,95.932 67.836,95.932 67.723 C 95.932 67.611,95.634 67.155,95.270 66.711 C 94.905 66.266,94.607 65.805,94.607 65.685 C 94.607 65.566,94.520 65.468,94.413 65.468 C 94.307 65.468,94.137 65.277,94.036 65.043 C 93.750 64.382,93.408 63.889,93.046 63.616 C 92.864 63.478,92.715 63.261,92.715 63.133 C 92.715 63.004,92.463 62.605,92.155 62.245 C 91.847 61.884,91.592 61.522,91.588 61.440 C 91.583 61.357,91.494 61.187,91.389 61.061 C 90.740 60.285,89.688 58.868,89.688 58.772 C 89.688 58.668,88.254 56.616,87.796 56.063 C 87.692 55.937,87.606 55.776,87.606 55.704 C 87.606 55.632,87.308 55.210,86.944 54.765 C 86.580 54.321,86.282 53.872,86.282 53.768 C 86.282 53.664,86.218 53.551,86.140 53.516 C 85.977 53.444,85.147 52.290,85.147 52.136 C 85.147 52.080,84.998 51.870,84.816 51.669 C 84.309 51.111,84.132 50.868,83.637 50.047 C 83.386 49.631,83.070 49.222,82.934 49.139 C 82.798 49.056,82.687 48.894,82.687 48.780 C 82.687 48.666,82.389 48.209,82.025 47.764 C 81.660 47.320,81.362 46.864,81.362 46.752 C 81.362 46.639,81.277 46.547,81.173 46.547 C 81.069 46.547,80.984 46.433,80.984 46.294 C 80.984 46.033,79.963 45.029,79.708 45.039 C 79.629 45.042,79.395 45.140,79.186 45.256 \" stroke=\"none\" fill=\"#9fbb1a\" fill-rule=\"evenodd\"></path><path id=\"path7\" d=\"M190.728 4.092 C 190.364 4.223,189.799 4.285,189.473 4.229 C 189.135 4.172,188.824 4.219,188.750 4.338 C 188.679 4.453,188.530 4.491,188.419 4.423 C 188.117 4.236,186.136 4.191,185.800 4.363 C 185.639 4.446,184.674 4.555,183.655 4.606 C 182.637 4.658,181.757 4.746,181.700 4.803 C 181.643 4.860,181.445 4.825,181.260 4.726 C 181.028 4.602,180.702 4.639,180.211 4.844 C 179.819 5.008,179.236 5.103,178.916 5.056 C 178.597 5.009,178.153 5.054,177.930 5.155 C 177.665 5.276,177.408 5.275,177.188 5.151 C 176.939 5.012,176.677 5.060,176.193 5.332 C 175.705 5.606,175.498 5.643,175.395 5.476 C 175.317 5.350,175.150 5.315,175.018 5.396 C 174.731 5.574,173.781 5.731,173.132 5.709 C 172.871 5.700,172.531 5.745,172.375 5.809 C 172.219 5.872,171.835 5.942,171.523 5.964 C 171.211 5.986,170.805 6.068,170.621 6.145 C 170.437 6.223,170.057 6.243,169.775 6.189 C 169.494 6.135,168.963 6.205,168.596 6.343 C 168.229 6.481,167.673 6.577,167.360 6.556 C 167.048 6.534,166.553 6.631,166.259 6.771 C 165.966 6.910,165.540 7.007,165.313 6.985 C 165.086 6.963,164.773 6.996,164.617 7.059 C 164.461 7.122,163.936 7.213,163.450 7.261 C 162.965 7.310,162.403 7.437,162.203 7.544 C 162.003 7.651,161.464 7.761,161.005 7.788 C 160.547 7.815,159.865 7.985,159.491 8.166 C 159.117 8.347,158.627 8.447,158.401 8.388 C 158.176 8.329,157.886 8.367,157.757 8.472 C 157.627 8.576,157.223 8.661,156.859 8.658 C 156.495 8.656,155.899 8.785,155.535 8.945 C 155.170 9.104,154.532 9.288,154.115 9.354 C 153.699 9.419,153.018 9.570,152.602 9.689 C 152.185 9.809,151.771 9.888,151.680 9.865 C 151.589 9.842,151.079 9.974,150.545 10.156 C 150.011 10.339,149.404 10.494,149.196 10.501 C 148.988 10.508,148.711 10.580,148.582 10.660 C 148.452 10.741,148.160 10.842,147.933 10.886 C 147.706 10.930,147.466 11.054,147.399 11.162 C 147.333 11.270,146.854 11.388,146.337 11.424 C 145.819 11.460,145.229 11.581,145.025 11.691 C 144.416 12.023,143.918 12.170,143.561 12.126 C 143.375 12.103,142.854 12.291,142.402 12.543 C 141.806 12.877,141.492 12.953,141.259 12.823 C 141.031 12.696,140.841 12.731,140.605 12.944 C 140.423 13.110,140.221 13.245,140.158 13.245 C 140.095 13.245,139.804 13.342,139.511 13.461 C 139.218 13.580,138.851 13.703,138.694 13.735 C 137.405 14.000,136.837 14.157,136.471 14.348 C 135.438 14.886,135.267 14.948,134.805 14.948 C 134.536 14.948,134.188 15.076,134.032 15.232 C 133.876 15.388,133.551 15.516,133.311 15.516 C 133.071 15.516,132.768 15.644,132.638 15.802 C 132.460 16.015,132.336 16.035,132.148 15.879 C 131.958 15.721,131.744 15.777,131.277 16.110 C 130.937 16.353,130.518 16.527,130.348 16.498 C 130.177 16.469,129.991 16.567,129.934 16.715 C 129.877 16.863,129.210 17.172,128.451 17.403 C 127.692 17.633,126.900 17.942,126.691 18.088 C 126.482 18.234,126.171 18.354,126.000 18.354 C 125.829 18.354,125.479 18.520,125.221 18.722 C 124.961 18.927,124.590 19.048,124.387 18.995 C 124.177 18.940,123.727 19.099,123.331 19.367 C 122.952 19.625,122.597 19.791,122.543 19.736 C 122.488 19.682,122.192 19.817,121.883 20.036 C 121.575 20.256,121.143 20.435,120.923 20.435 C 120.702 20.435,120.185 20.648,119.773 20.908 C 119.361 21.168,118.958 21.383,118.878 21.385 C 118.798 21.387,117.966 21.769,117.029 22.235 C 116.093 22.701,115.172 23.082,114.983 23.083 C 114.794 23.084,114.368 23.289,114.037 23.539 C 113.705 23.789,113.117 24.124,112.729 24.284 C 112.341 24.444,111.836 24.750,111.605 24.965 C 111.172 25.369,111.017 25.422,110.449 25.364 C 110.263 25.345,109.604 25.675,108.984 26.099 C 108.364 26.522,107.767 26.868,107.657 26.868 C 107.548 26.868,106.986 27.217,106.409 27.643 C 105.732 28.143,105.231 28.384,104.995 28.322 C 104.763 28.262,104.208 28.515,103.479 29.014 C 102.847 29.447,102.189 29.886,102.016 29.991 C 101.844 30.095,101.650 30.253,101.585 30.342 C 101.520 30.431,101.290 30.448,101.075 30.380 C 100.804 30.294,100.435 30.433,99.869 30.835 C 99.421 31.154,98.845 31.562,98.591 31.743 C 98.336 31.924,97.760 32.349,97.312 32.687 C 96.863 33.025,96.412 33.302,96.309 33.302 C 96.206 33.302,96.121 33.387,96.121 33.491 C 96.121 33.595,96.032 33.680,95.924 33.680 C 95.815 33.680,95.624 33.763,95.498 33.865 C 95.372 33.966,95.019 34.252,94.713 34.501 L 94.157 34.952 94.848 35.972 C 95.229 36.533,96.117 37.818,96.824 38.829 C 97.530 39.840,98.482 41.202,98.939 41.857 C 99.396 42.511,100.152 43.600,100.618 44.276 C 101.085 44.953,101.626 45.682,101.821 45.897 C 102.016 46.112,102.176 46.351,102.176 46.428 C 102.176 46.506,102.474 46.969,102.838 47.457 C 103.690 48.598,103.846 48.816,104.594 49.902 C 105.327 50.967,108.212 55.098,108.792 55.913 C 109.014 56.225,109.932 57.545,110.832 58.846 C 111.732 60.147,112.515 61.254,112.573 61.306 C 112.631 61.358,112.934 61.783,113.246 62.252 C 113.557 62.720,113.878 63.188,113.957 63.292 C 114.786 64.376,115.421 65.277,115.421 65.371 C 115.421 65.434,115.825 66.032,116.320 66.700 C 117.956 68.911,118.920 70.264,119.016 70.484 C 119.068 70.604,119.648 71.461,120.305 72.390 C 124.511 78.336,125.354 79.540,126.329 80.984 C 126.926 81.868,127.674 82.929,127.993 83.340 C 128.311 83.751,128.657 84.236,128.761 84.418 C 128.933 84.718,130.457 86.906,132.027 89.106 C 132.367 89.582,133.022 90.525,133.484 91.202 C 133.945 91.878,134.716 92.985,135.198 93.661 C 135.680 94.338,136.301 95.232,136.580 95.648 C 136.858 96.064,137.171 96.501,137.275 96.618 C 137.379 96.736,137.574 96.991,137.707 97.186 C 137.840 97.381,138.421 98.221,138.998 99.054 C 139.575 99.886,140.190 100.801,140.364 101.087 C 140.778 101.764,141.053 101.743,142.264 100.946 C 142.817 100.581,143.341 100.326,143.427 100.380 C 143.513 100.433,143.697 100.366,143.835 100.231 C 144.299 99.780,145.901 98.770,146.152 98.770 C 146.289 98.770,146.618 98.600,146.882 98.392 C 147.147 98.184,147.483 98.013,147.628 98.013 C 147.774 98.013,148.059 97.888,148.261 97.735 C 148.463 97.583,148.726 97.455,148.846 97.452 C 148.965 97.448,149.509 97.145,150.055 96.778 C 150.600 96.411,151.089 96.153,151.140 96.205 C 151.192 96.257,151.483 96.122,151.786 95.906 C 152.118 95.670,152.519 95.548,152.792 95.600 C 153.102 95.659,153.457 95.512,153.915 95.135 C 154.284 94.831,154.661 94.630,154.754 94.687 C 154.846 94.744,155.137 94.622,155.400 94.416 C 155.663 94.209,156.064 94.040,156.292 94.040 C 156.699 94.040,156.919 93.949,158.510 93.124 C 158.950 92.896,159.546 92.677,159.835 92.638 C 160.332 92.572,161.122 92.273,162.479 91.639 C 162.812 91.484,163.157 91.402,163.247 91.457 C 163.337 91.513,163.916 91.315,164.534 91.018 C 165.152 90.721,165.730 90.547,165.818 90.631 C 165.907 90.716,166.439 90.574,167.002 90.317 C 167.565 90.059,168.344 89.809,168.733 89.762 C 169.521 89.665,170.644 89.319,170.995 89.064 C 171.120 88.973,171.298 88.945,171.391 89.002 C 171.483 89.059,171.986 88.944,172.508 88.746 C 173.207 88.480,173.512 88.441,173.668 88.597 C 173.824 88.753,173.972 88.725,174.230 88.491 C 174.423 88.317,174.760 88.174,174.980 88.174 C 175.200 88.174,175.429 88.095,175.489 87.997 C 175.549 87.900,175.894 87.869,176.255 87.927 C 176.638 87.989,177.025 87.941,177.181 87.811 C 177.329 87.688,177.822 87.566,178.277 87.539 C 178.732 87.512,179.217 87.420,179.356 87.335 C 179.494 87.249,180.025 87.157,180.536 87.129 C 181.047 87.102,181.577 86.986,181.715 86.871 C 181.852 86.757,182.016 86.715,182.079 86.778 C 182.142 86.841,182.631 86.787,183.166 86.659 C 183.701 86.530,184.664 86.406,185.305 86.382 C 185.946 86.358,186.641 86.288,186.850 86.226 C 187.397 86.063,191.399 85.731,194.229 85.613 C 198.932 85.416,201.514 85.397,201.514 85.558 C 201.514 85.654,201.635 85.665,201.783 85.582 C 201.992 85.464,204.170 85.524,206.339 85.706 C 206.505 85.720,207.806 85.733,209.555 85.737 C 209.868 85.738,210.251 85.786,210.407 85.844 C 210.703 85.954,211.110 86.005,212.895 86.157 C 213.483 86.207,214.121 86.329,214.314 86.429 C 214.507 86.528,214.771 86.571,214.901 86.524 C 215.032 86.477,216.032 86.579,217.124 86.751 C 218.216 86.922,219.182 87.017,219.271 86.962 C 219.360 86.907,219.595 86.980,219.792 87.124 C 220.057 87.317,220.216 87.331,220.402 87.177 C 220.589 87.022,220.696 87.038,220.821 87.240 C 220.913 87.390,221.141 87.528,221.327 87.547 C 221.513 87.566,222.067 87.623,222.558 87.674 C 223.049 87.725,223.519 87.808,223.603 87.860 C 223.686 87.911,224.136 88.011,224.602 88.080 C 225.068 88.150,225.542 88.284,225.656 88.378 C 225.770 88.472,225.910 88.502,225.967 88.445 C 226.024 88.388,226.570 88.486,227.179 88.664 C 227.789 88.841,228.415 89.001,228.571 89.019 C 228.728 89.037,229.111 89.160,229.423 89.293 C 229.735 89.426,230.309 89.547,230.699 89.564 C 231.089 89.580,231.408 89.657,231.409 89.735 C 231.409 89.813,231.527 89.877,231.669 89.877 C 231.812 89.877,232.329 90.054,232.818 90.270 C 233.308 90.487,233.820 90.621,233.956 90.568 C 234.093 90.516,234.380 90.596,234.594 90.746 C 234.809 90.896,235.053 90.997,235.136 90.971 C 235.220 90.944,235.544 91.016,235.856 91.130 C 236.168 91.244,236.764 91.446,237.181 91.578 C 237.597 91.710,238.273 91.977,238.683 92.172 C 239.092 92.367,239.620 92.526,239.854 92.526 C 240.089 92.526,240.333 92.611,240.397 92.715 C 240.462 92.819,240.672 92.904,240.866 92.904 C 241.059 92.904,241.246 92.970,241.280 93.049 C 241.315 93.129,242.092 93.441,243.007 93.742 C 243.922 94.043,244.740 94.414,244.825 94.566 C 244.910 94.718,245.209 94.868,245.491 94.899 C 245.772 94.930,246.657 95.268,247.457 95.650 C 248.834 96.308,249.689 96.696,250.331 96.956 C 250.487 97.020,250.870 97.234,251.183 97.434 C 251.495 97.633,251.870 97.803,252.016 97.810 C 252.162 97.818,252.561 98.037,252.902 98.297 C 253.243 98.557,253.630 98.770,253.762 98.770 C 253.893 98.770,254.317 98.989,254.704 99.257 C 255.091 99.526,255.524 99.762,255.666 99.783 C 255.808 99.804,256.191 100.010,256.516 100.242 C 256.841 100.473,257.206 100.662,257.327 100.662 C 257.449 100.662,257.667 100.769,257.812 100.899 C 258.456 101.477,258.653 101.600,259.113 101.716 C 259.382 101.783,259.603 101.966,259.603 102.122 C 259.603 102.289,259.713 102.363,259.871 102.303 C 260.018 102.246,260.183 102.314,260.236 102.453 C 260.289 102.592,260.632 102.804,260.996 102.924 C 261.361 103.045,261.982 103.439,262.376 103.799 C 262.770 104.160,263.182 104.421,263.291 104.379 C 263.401 104.336,263.783 104.590,264.139 104.942 C 264.496 105.294,264.924 105.582,265.091 105.582 C 265.258 105.582,265.962 106.050,266.656 106.623 C 267.350 107.195,268.005 107.663,268.112 107.663 C 268.219 107.663,268.307 107.748,268.307 107.852 C 268.307 107.956,268.436 108.042,268.594 108.042 C 268.753 108.042,268.979 108.254,269.098 108.515 C 269.221 108.785,269.472 108.988,269.684 108.988 C 269.887 108.988,270.385 109.329,270.790 109.746 C 271.194 110.163,271.706 110.532,271.926 110.565 C 272.147 110.599,272.441 110.832,272.581 111.084 C 272.720 111.336,272.837 111.460,272.841 111.360 C 272.845 111.261,273.167 111.516,273.557 111.928 C 274.300 112.712,274.800 113.086,275.355 113.273 C 275.537 113.334,275.686 113.449,275.686 113.528 C 275.686 113.825,277.572 115.636,277.760 115.520 C 277.868 115.453,278.135 115.702,278.353 116.072 C 278.572 116.442,278.827 116.698,278.921 116.640 C 279.015 116.582,279.258 116.817,279.462 117.162 C 279.665 117.507,280.105 117.951,280.439 118.148 C 281.049 118.508,282.687 120.109,282.687 120.345 C 282.687 120.579,283.386 121.281,283.503 121.164 C 283.567 121.101,283.720 121.271,283.844 121.542 C 283.968 121.814,284.213 122.082,284.388 122.138 C 284.564 122.193,284.820 122.449,284.957 122.706 C 285.095 122.962,285.369 123.224,285.567 123.287 C 285.765 123.349,286.020 123.606,286.135 123.857 C 286.249 124.109,286.414 124.314,286.502 124.314 C 286.589 124.314,286.660 124.442,286.660 124.598 C 286.660 124.754,286.740 124.882,286.837 124.882 C 286.934 124.882,287.066 125.048,287.130 125.250 C 287.195 125.453,287.395 125.666,287.575 125.723 C 287.755 125.781,288.042 126.062,288.213 126.348 C 288.945 127.577,289.576 128.101,289.881 127.732 C 290.035 127.546,290.416 127.253,290.728 127.080 C 291.041 126.907,291.807 126.381,292.431 125.911 C 293.056 125.441,293.716 125.007,293.898 124.947 C 294.080 124.887,294.229 124.767,294.229 124.681 C 294.229 124.595,294.437 124.413,294.691 124.277 C 295.220 123.994,297.304 122.597,297.446 122.430 C 297.498 122.369,297.753 122.176,298.013 122.002 C 298.273 121.828,298.912 121.380,299.432 121.007 C 299.953 120.634,300.712 120.108,301.120 119.839 C 301.529 119.569,302.034 119.189,302.244 118.993 C 302.454 118.798,302.730 118.638,302.858 118.638 C 302.986 118.638,303.119 118.570,303.154 118.487 C 303.188 118.404,303.898 117.873,304.730 117.306 C 305.563 116.740,306.287 116.225,306.339 116.161 C 306.391 116.097,306.807 115.798,307.263 115.497 C 308.823 114.465,309.129 114.251,310.763 113.052 C 311.192 112.738,312.053 112.146,312.677 111.736 C 313.302 111.326,313.898 110.924,314.002 110.843 C 314.520 110.440,315.959 109.416,316.457 109.096 C 316.766 108.897,317.187 108.578,317.391 108.388 C 317.596 108.197,317.848 108.042,317.952 108.042 C 318.055 108.042,318.334 107.859,318.571 107.637 C 318.808 107.414,319.161 107.138,319.356 107.022 C 319.885 106.708,321.547 105.551,323.463 104.163 C 324.399 103.484,325.302 102.866,325.469 102.789 C 325.636 102.712,326.019 102.458,326.321 102.224 C 326.622 101.991,327.252 101.502,327.720 101.138 C 328.188 100.774,328.644 100.476,328.733 100.475 C 328.822 100.474,329.163 100.259,329.490 99.997 C 329.817 99.735,330.177 99.448,330.289 99.358 C 330.401 99.268,330.860 98.950,331.308 98.651 C 331.756 98.352,332.440 97.895,332.829 97.635 C 333.217 97.375,333.902 96.917,334.350 96.619 C 334.798 96.320,335.256 95.996,335.368 95.900 C 335.608 95.694,337.379 94.421,338.282 93.806 C 338.627 93.570,339.150 93.186,339.444 92.952 C 339.738 92.718,340.066 92.526,340.172 92.526 C 340.279 92.526,340.394 92.456,340.429 92.371 C 340.488 92.225,340.999 91.856,343.992 89.798 C 344.669 89.333,345.310 88.877,345.416 88.785 C 345.523 88.692,345.864 88.454,346.173 88.255 C 346.483 88.057,347.086 87.638,347.515 87.324 C 349.323 86.002,351.509 84.476,352.195 84.057 C 352.492 83.876,353.295 83.314,353.981 82.808 C 354.667 82.303,355.425 81.799,355.665 81.690 C 356.209 81.442,356.225 80.909,355.707 80.361 C 355.489 80.131,354.905 79.342,354.408 78.606 C 351.941 74.954,351.625 74.551,351.234 74.551 C 350.972 74.551,350.426 74.114,350.426 73.903 C 350.426 73.567,348.578 71.305,348.232 71.218 C 348.005 71.161,347.506 70.660,347.123 70.104 C 346.740 69.549,346.319 69.053,346.186 69.002 C 346.053 68.951,345.633 68.440,345.253 67.866 C 344.872 67.293,344.262 66.640,343.898 66.415 C 343.534 66.189,343.236 65.944,343.236 65.869 C 343.236 65.795,342.767 65.243,342.195 64.642 C 341.623 64.042,341.154 63.478,341.154 63.389 C 341.154 63.301,340.835 63.035,340.445 62.798 C 340.054 62.561,339.661 62.246,339.571 62.098 C 339.481 61.950,339.077 61.488,338.672 61.071 C 338.268 60.655,337.938 60.245,337.938 60.160 C 337.938 60.076,337.773 59.954,337.573 59.891 C 337.372 59.827,337.035 59.481,336.822 59.121 C 336.610 58.762,336.306 58.467,336.146 58.467 C 335.987 58.467,335.856 58.382,335.856 58.278 C 335.856 58.174,335.772 58.089,335.669 58.089 C 335.566 58.089,335.162 57.736,334.771 57.304 C 333.770 56.200,332.960 55.440,332.783 55.440 C 332.588 55.440,330.937 53.717,330.937 53.514 C 330.937 53.428,330.824 53.359,330.687 53.359 C 330.550 53.359,330.151 53.103,329.801 52.791 C 329.452 52.479,329.114 52.223,329.051 52.223 C 328.988 52.223,328.786 51.968,328.602 51.656 C 328.417 51.343,328.149 51.088,328.006 51.088 C 327.863 51.088,327.691 50.918,327.625 50.710 C 327.510 50.348,327.323 50.254,326.836 50.314 C 326.713 50.329,326.559 50.169,326.492 49.958 C 326.425 49.747,326.254 49.574,326.112 49.574 C 325.970 49.574,325.676 49.325,325.458 49.019 C 325.241 48.714,324.873 48.437,324.641 48.404 C 324.409 48.371,324.135 48.153,324.033 47.919 C 323.930 47.684,323.743 47.493,323.616 47.493 C 323.490 47.493,323.319 47.380,323.236 47.242 C 323.152 47.103,322.807 46.830,322.469 46.633 C 322.131 46.437,321.854 46.209,321.854 46.128 C 321.854 46.046,321.764 45.979,321.654 45.979 C 321.544 45.979,321.037 45.543,320.526 45.010 C 319.887 44.344,319.501 44.078,319.289 44.160 C 319.083 44.239,318.950 44.158,318.886 43.916 C 318.834 43.717,318.629 43.512,318.431 43.460 C 318.232 43.408,318.070 43.239,318.070 43.084 C 318.070 42.779,317.569 42.510,317.304 42.673 C 317.214 42.729,316.817 42.432,316.422 42.012 C 316.028 41.593,315.573 41.249,315.411 41.249 C 315.250 41.249,314.654 40.842,314.087 40.345 C 313.520 39.847,312.822 39.338,312.535 39.213 C 312.249 39.089,312.015 38.899,312.015 38.793 C 312.015 38.687,311.890 38.600,311.738 38.600 C 311.586 38.600,311.366 38.423,311.250 38.207 C 311.135 37.990,310.932 37.855,310.799 37.906 C 310.667 37.957,310.232 37.708,309.834 37.353 C 309.435 36.998,308.961 36.708,308.781 36.708 C 308.601 36.708,308.243 36.457,307.985 36.151 C 307.727 35.844,307.476 35.633,307.427 35.682 C 307.379 35.731,307.231 35.641,307.099 35.482 C 306.968 35.324,306.714 35.194,306.536 35.194 C 306.358 35.194,305.964 34.941,305.661 34.632 C 305.357 34.322,304.965 34.067,304.789 34.064 C 304.614 34.061,304.200 33.812,303.870 33.510 C 303.540 33.209,303.030 32.914,302.737 32.856 C 302.443 32.797,301.882 32.427,301.488 32.034 C 301.079 31.625,300.628 31.343,300.434 31.376 C 300.247 31.408,300.095 31.343,300.095 31.232 C 300.095 31.122,299.971 31.031,299.820 31.031 C 299.669 31.031,299.463 30.883,299.361 30.702 C 299.260 30.520,299.116 30.433,299.042 30.507 C 298.890 30.659,297.824 30.087,297.824 29.855 C 297.824 29.774,297.695 29.707,297.538 29.707 C 297.142 29.707,296.529 29.332,295.890 28.700 C 295.593 28.406,295.247 28.204,295.121 28.250 C 294.995 28.296,294.636 28.145,294.324 27.915 C 294.011 27.685,293.511 27.436,293.213 27.362 C 292.914 27.289,292.546 27.105,292.395 26.954 C 292.244 26.803,291.961 26.679,291.767 26.679 C 291.572 26.679,291.360 26.593,291.295 26.488 C 291.230 26.383,290.629 26.040,289.959 25.727 C 289.290 25.414,288.742 25.075,288.742 24.973 C 288.742 24.871,288.593 24.785,288.411 24.783 C 288.228 24.781,287.867 24.612,287.606 24.409 C 287.346 24.205,286.989 24.037,286.813 24.034 C 286.637 24.032,286.440 23.944,286.375 23.838 C 286.309 23.732,286.189 23.687,286.108 23.737 C 286.027 23.787,285.775 23.655,285.547 23.443 C 285.320 23.231,285.030 23.092,284.903 23.136 C 284.777 23.179,284.546 23.071,284.390 22.896 C 284.148 22.624,283.364 22.302,282.814 22.248 C 282.727 22.240,282.540 22.073,282.397 21.878 C 282.246 21.672,282.014 21.570,281.844 21.635 C 281.683 21.697,281.552 21.665,281.552 21.565 C 281.552 21.464,281.432 21.381,281.287 21.381 C 281.141 21.381,280.537 21.126,279.943 20.814 C 279.350 20.501,278.738 20.246,278.583 20.246 C 278.429 20.246,277.698 19.948,276.958 19.584 C 276.219 19.219,275.457 18.921,275.266 18.921 C 275.074 18.921,274.868 18.794,274.808 18.638 C 274.748 18.482,274.494 18.354,274.244 18.354 C 273.994 18.354,273.641 18.279,273.460 18.187 C 273.279 18.095,272.876 17.913,272.564 17.783 C 272.252 17.653,271.826 17.473,271.618 17.383 C 271.410 17.293,271.068 17.196,270.859 17.167 C 270.650 17.138,270.269 16.968,270.013 16.788 C 269.757 16.609,269.370 16.462,269.154 16.462 C 268.938 16.462,268.680 16.394,268.581 16.312 C 268.482 16.230,267.763 15.953,266.982 15.697 C 266.202 15.441,265.535 15.168,265.500 15.090 C 265.465 15.012,265.230 14.948,264.977 14.948 C 264.724 14.948,264.369 14.873,264.189 14.781 C 263.474 14.417,262.885 14.167,262.622 14.114 C 262.470 14.084,262.219 14.011,262.062 13.952 C 261.906 13.893,261.523 13.780,261.211 13.702 C 260.899 13.624,260.601 13.546,260.549 13.529 C 260.497 13.512,260.199 13.434,259.886 13.357 C 259.310 13.213,258.639 12.958,258.044 12.655 C 257.863 12.563,257.549 12.488,257.346 12.488 C 257.142 12.488,256.929 12.413,256.873 12.321 C 256.816 12.229,256.214 12.049,255.535 11.921 C 254.856 11.792,254.253 11.611,254.195 11.517 C 254.137 11.423,254.013 11.394,253.919 11.452 C 253.825 11.510,253.494 11.426,253.184 11.266 C 252.874 11.106,252.408 10.974,252.149 10.974 C 251.890 10.974,251.632 10.901,251.577 10.811 C 251.490 10.670,251.059 10.569,249.571 10.339 C 249.413 10.314,249.194 10.239,249.085 10.171 C 248.975 10.104,248.679 10.009,248.426 9.962 C 247.537 9.795,246.829 9.596,246.641 9.460 C 246.537 9.385,246.325 9.320,246.168 9.316 C 246.012 9.312,245.246 9.168,244.465 8.996 C 243.685 8.824,242.833 8.654,242.573 8.617 C 242.313 8.581,241.845 8.451,241.533 8.330 C 241.220 8.209,240.922 8.121,240.870 8.134 C 240.596 8.206,238.851 7.878,238.653 7.718 C 238.526 7.615,237.917 7.515,237.300 7.494 C 236.683 7.474,236.043 7.345,235.878 7.208 C 235.712 7.071,235.441 7.011,235.274 7.075 C 235.107 7.139,234.872 7.128,234.751 7.051 C 234.630 6.974,234.149 6.900,233.680 6.887 C 233.212 6.874,232.573 6.753,232.261 6.618 C 231.949 6.483,231.626 6.387,231.543 6.406 C 231.460 6.424,230.524 6.303,229.462 6.136 C 228.400 5.969,227.190 5.798,226.774 5.755 C 226.358 5.713,225.634 5.632,225.166 5.576 C 224.697 5.520,223.974 5.439,223.557 5.396 C 223.141 5.354,222.800 5.309,222.800 5.296 C 222.800 5.284,222.460 5.239,222.044 5.196 C 220.557 5.042,219.570 4.935,218.638 4.825 C 217.114 4.646,215.912 4.545,214.096 4.444 C 211.620 4.306,210.155 4.179,209.893 4.078 C 209.766 4.030,209.610 4.075,209.545 4.179 C 209.481 4.282,209.244 4.308,209.019 4.235 C 208.606 4.101,206.004 4.009,202.176 3.994 C 201.031 3.989,199.924 3.983,199.716 3.979 C 198.221 3.955,194.042 3.995,193.188 4.042 C 192.616 4.074,191.977 4.044,191.769 3.977 C 191.561 3.910,191.093 3.962,190.728 4.092 \" stroke=\"none\" fill=\"#b5cb2b\" fill-rule=\"evenodd\"></path><path id=\"path8\" d=\"\" stroke=\"none\" fill=\"#55ff00\" fill-rule=\"evenodd\"></path><path id=\"path9\" d=\"M364.522 96.081 C 363.619 96.742,362.897 97.244,359.648 99.478 C 358.854 100.024,357.583 100.938,356.822 101.509 C 356.062 102.080,355.333 102.549,355.203 102.551 C 355.073 102.553,354.967 102.627,354.967 102.715 C 354.967 102.851,354.376 103.279,352.707 104.352 C 352.545 104.456,351.944 104.889,351.372 105.314 C 350.799 105.740,350.024 106.293,349.648 106.544 C 347.578 107.929,346.136 108.917,345.885 109.122 C 345.631 109.330,344.163 110.365,341.471 112.233 C 340.970 112.582,340.270 113.079,339.916 113.340 C 339.562 113.600,338.581 114.281,337.736 114.853 C 336.890 115.426,335.705 116.256,335.103 116.698 C 334.500 117.140,333.921 117.502,333.816 117.502 C 333.712 117.502,333.577 117.631,333.516 117.789 C 333.456 117.947,333.212 118.162,332.976 118.267 C 332.595 118.436,331.562 119.112,331.031 119.541 C 330.927 119.624,330.118 120.192,329.234 120.801 C 328.349 121.410,327.597 121.981,327.562 122.071 C 327.528 122.160,327.408 122.233,327.296 122.233 C 327.185 122.233,326.787 122.467,326.413 122.752 C 326.039 123.038,325.180 123.649,324.503 124.109 C 323.827 124.570,323.231 124.997,323.179 125.058 C 323.127 125.119,322.709 125.424,322.250 125.735 C 321.792 126.046,321.229 126.429,320.999 126.585 C 320.769 126.741,320.047 127.252,319.395 127.720 C 318.742 128.188,318.015 128.699,317.780 128.855 C 316.016 130.025,314.359 131.179,313.150 132.081 C 312.370 132.663,311.582 133.194,311.400 133.262 C 311.218 133.329,311.069 133.472,311.069 133.580 C 311.069 133.687,310.971 133.775,310.851 133.775 C 310.731 133.775,310.284 134.034,309.858 134.351 C 308.177 135.600,305.993 137.141,304.778 137.938 C 304.075 138.398,303.500 138.831,303.500 138.901 C 303.500 138.970,303.253 139.129,302.952 139.254 C 302.650 139.379,302.209 139.688,301.972 139.940 C 301.736 140.191,301.463 140.397,301.366 140.397 C 301.269 140.397,300.879 140.639,300.500 140.934 C 300.121 141.228,299.662 141.524,299.480 141.590 C 299.001 141.764,299.066 142.077,299.811 143.183 C 300.175 143.724,300.473 144.297,300.473 144.456 C 300.473 144.615,300.856 145.249,301.325 145.865 C 301.793 146.480,302.176 147.071,302.176 147.178 C 302.176 147.284,302.473 147.940,302.836 148.637 C 303.199 149.333,303.455 149.967,303.406 150.046 C 303.358 150.125,303.615 150.580,303.979 151.057 C 304.343 151.534,304.627 151.991,304.609 152.073 C 304.592 152.156,304.718 152.540,304.890 152.927 C 305.063 153.314,305.203 153.766,305.203 153.933 C 305.203 154.099,305.416 154.514,305.676 154.855 C 305.937 155.197,306.149 155.646,306.149 155.854 C 306.149 156.062,306.308 156.376,306.501 156.551 C 306.726 156.754,306.820 157.034,306.764 157.328 C 306.709 157.616,306.825 157.978,307.075 158.295 C 307.294 158.574,307.474 158.951,307.474 159.132 C 307.474 159.313,307.592 159.560,307.737 159.680 C 307.882 159.800,308.057 160.277,308.127 160.740 C 308.196 161.202,308.339 161.634,308.444 161.699 C 308.549 161.764,308.592 161.928,308.540 162.064 C 308.488 162.200,308.604 162.454,308.798 162.630 C 308.993 162.806,309.105 163.070,309.048 163.218 C 308.992 163.366,309.060 163.625,309.201 163.794 C 309.341 163.963,309.431 164.295,309.400 164.530 C 309.369 164.766,309.434 165.015,309.544 165.083 C 309.654 165.151,309.745 165.404,309.745 165.646 C 309.745 165.887,309.860 166.180,310.002 166.298 C 310.147 166.418,310.220 166.715,310.170 166.976 C 310.117 167.253,310.205 167.564,310.386 167.745 C 310.554 167.913,310.691 168.251,310.691 168.498 C 310.691 168.745,310.776 168.999,310.880 169.063 C 310.984 169.128,311.069 169.388,311.069 169.641 C 311.069 169.895,311.232 170.592,311.432 171.191 C 311.631 171.790,311.849 172.682,311.916 173.174 C 311.982 173.666,312.109 174.113,312.198 174.168 C 312.286 174.223,312.313 174.438,312.259 174.646 C 312.204 174.855,312.254 175.139,312.370 175.279 C 312.485 175.418,312.526 175.585,312.460 175.651 C 312.394 175.717,312.456 175.912,312.599 176.084 C 312.742 176.256,312.881 176.748,312.909 177.177 C 312.958 177.938,313.431 180.323,313.646 180.889 C 313.705 181.045,313.785 181.514,313.822 181.930 C 313.981 183.680,314.099 184.354,314.286 184.579 C 314.413 184.733,314.421 184.979,314.309 185.275 C 314.203 185.553,314.203 185.856,314.307 186.044 C 314.403 186.214,314.514 186.720,314.554 187.169 C 314.594 187.618,314.680 188.453,314.744 189.026 C 315.128 192.434,315.238 194.787,315.312 201.135 C 315.348 204.241,315.301 206.811,315.207 206.929 C 315.114 207.045,315.068 207.746,315.106 208.487 C 315.143 209.228,315.123 209.885,315.061 209.947 C 314.999 210.009,314.935 210.627,314.919 211.321 C 314.894 212.420,314.508 215.779,314.177 217.786 C 314.117 218.150,314.070 218.615,314.073 218.818 C 314.076 219.021,313.991 219.294,313.883 219.424 C 313.775 219.554,313.743 219.839,313.813 220.057 C 313.882 220.275,313.846 220.565,313.734 220.700 C 313.621 220.836,313.534 221.151,313.540 221.401 C 313.558 222.105,312.777 225.972,312.566 226.227 C 312.462 226.352,312.433 226.675,312.501 226.945 C 312.574 227.240,312.544 227.436,312.426 227.436 C 312.317 227.436,312.170 227.841,312.100 228.335 C 311.917 229.615,311.490 231.225,311.260 231.503 C 311.151 231.633,311.112 231.869,311.172 232.026 C 311.233 232.183,311.029 232.869,310.720 233.550 C 310.412 234.231,310.201 234.831,310.253 234.882 C 310.359 234.989,309.875 236.529,308.877 239.262 C 308.801 239.470,308.752 239.704,308.768 239.782 C 308.785 239.860,308.719 239.924,308.621 239.924 C 308.523 239.924,308.442 240.073,308.439 240.255 C 308.431 240.809,307.965 242.384,307.809 242.384 C 307.729 242.384,307.663 242.549,307.663 242.751 C 307.663 242.953,307.578 243.171,307.474 243.236 C 307.370 243.300,307.285 243.551,307.285 243.794 C 307.285 244.037,307.147 244.288,306.979 244.353 C 306.794 244.424,306.710 244.609,306.767 244.825 C 306.820 245.029,306.672 245.410,306.417 245.721 C 306.173 246.019,305.971 246.415,305.967 246.601 C 305.963 246.787,305.828 247.140,305.667 247.385 C 305.506 247.631,305.331 248.075,305.278 248.372 C 305.224 248.669,305.101 248.993,305.003 249.092 C 304.905 249.191,304.825 249.418,304.825 249.596 C 304.825 249.775,304.758 249.950,304.677 249.984 C 304.596 250.019,304.257 250.622,303.924 251.325 C 303.592 252.027,303.232 252.602,303.126 252.602 C 303.020 252.602,302.930 252.793,302.927 253.027 C 302.924 253.262,302.796 253.618,302.643 253.820 C 302.490 254.022,302.365 254.364,302.365 254.579 C 302.365 254.795,302.069 255.311,301.707 255.726 C 301.344 256.141,301.046 256.600,301.044 256.747 C 301.042 256.893,300.828 257.292,300.568 257.633 C 300.307 257.974,300.095 258.386,300.095 258.548 C 300.095 258.710,299.906 259.059,299.676 259.324 C 299.446 259.589,299.169 260.077,299.061 260.409 C 298.953 260.740,298.668 261.110,298.427 261.229 C 298.186 261.349,297.995 261.500,298.001 261.565 C 298.060 262.145,297.957 262.497,297.635 262.819 C 297.427 263.027,297.256 263.277,297.256 263.374 C 297.256 263.471,297.078 263.607,296.861 263.676 C 296.594 263.761,296.495 263.915,296.556 264.148 C 296.612 264.366,296.408 264.755,296.005 265.195 C 295.653 265.579,295.364 266.007,295.364 266.145 C 295.364 266.474,294.426 267.471,294.183 267.400 C 294.079 267.370,294.040 267.466,294.097 267.615 C 294.241 267.992,293.752 268.691,292.337 270.133 C 292.077 270.398,291.862 270.718,291.861 270.843 C 291.859 270.968,291.518 271.416,291.104 271.839 C 290.689 272.261,290.326 272.742,290.297 272.907 C 290.267 273.073,289.926 273.542,289.540 273.950 C 288.536 275.010,287.803 275.939,287.799 276.159 C 287.796 276.263,287.540 276.518,287.228 276.727 C 286.916 276.935,286.661 277.198,286.661 277.312 C 286.661 277.425,286.362 277.679,285.998 277.875 C 285.594 278.093,285.336 278.374,285.336 278.596 C 285.336 278.965,283.437 280.984,283.090 280.984 C 282.987 280.984,282.843 281.167,282.773 281.390 C 282.593 281.958,280.226 284.201,279.808 284.201 C 279.726 284.201,279.659 284.330,279.659 284.489 C 279.659 284.648,279.447 284.859,279.186 284.957 C 278.910 285.062,278.713 285.287,278.713 285.497 C 278.713 285.719,278.495 285.948,278.146 286.093 C 277.833 286.222,277.578 286.446,277.578 286.591 C 277.578 286.736,277.131 287.143,276.585 287.497 C 276.038 287.850,275.367 288.381,275.093 288.677 C 274.558 289.254,274.365 289.412,273.557 289.930 C 272.807 290.412,272.879 290.641,274.487 292.876 C 275.285 293.984,276.285 295.402,276.710 296.026 C 277.135 296.651,277.532 297.204,277.592 297.256 C 277.651 297.308,277.757 297.479,277.825 297.635 C 277.894 297.791,278.418 298.557,278.989 299.338 C 279.561 300.118,280.409 301.310,280.875 301.987 C 281.340 302.663,282.300 304.043,283.008 305.054 C 283.716 306.065,284.551 307.256,284.863 307.702 C 285.175 308.148,286.147 309.535,287.022 310.784 C 288.475 312.858,289.115 313.775,290.954 316.414 C 291.298 316.909,291.895 317.760,292.279 318.307 C 292.664 318.853,294.253 321.131,295.810 323.368 C 297.367 325.605,298.805 327.649,299.004 327.909 C 299.363 328.377,302.341 332.638,303.542 334.403 C 303.883 334.905,304.253 335.415,304.364 335.538 C 304.474 335.661,305.113 336.564,305.783 337.545 C 306.977 339.294,307.255 339.694,309.416 342.763 C 310.003 343.595,310.973 345.000,311.573 345.885 C 312.173 346.769,312.714 347.535,312.775 347.588 C 312.836 347.640,313.265 348.236,313.728 348.912 C 314.191 349.588,314.616 350.184,314.672 350.237 C 314.729 350.289,315.155 350.893,315.618 351.580 C 318.330 355.596,319.517 357.226,319.734 357.232 C 319.869 357.235,320.961 356.535,322.162 355.676 C 323.363 354.818,324.573 353.969,324.850 353.790 C 325.894 353.117,326.206 352.823,326.206 352.517 C 326.206 352.225,327.371 351.257,328.471 350.635 C 329.111 350.273,329.423 349.937,329.423 349.610 C 329.423 349.458,329.820 349.048,330.304 348.698 C 330.789 348.347,331.449 347.799,331.771 347.479 C 332.092 347.159,332.654 346.694,333.018 346.445 C 333.921 345.827,334.153 345.582,334.153 345.249 C 334.153 345.092,334.430 344.773,334.768 344.539 C 335.106 344.306,335.649 343.853,335.973 343.533 C 336.298 343.213,336.809 342.735,337.109 342.470 C 337.408 342.205,337.872 341.737,338.138 341.430 C 338.404 341.122,339.149 340.384,339.793 339.790 C 340.438 339.196,340.965 338.621,340.965 338.513 C 340.965 338.405,341.071 338.313,341.202 338.310 C 341.585 338.300,342.523 337.379,342.421 337.113 C 342.367 336.972,342.600 336.721,342.970 336.522 C 343.324 336.331,343.614 336.062,343.614 335.924 C 343.614 335.785,343.950 335.450,344.360 335.179 C 344.772 334.906,345.132 334.502,345.164 334.277 C 345.196 334.053,345.413 333.786,345.646 333.683 C 345.879 333.581,346.050 333.373,346.025 333.221 C 346.000 333.069,346.173 332.845,346.410 332.725 C 346.647 332.604,347.158 332.085,347.545 331.571 C 348.386 330.457,349.674 329.157,350.232 328.858 C 350.489 328.720,350.614 328.496,350.578 328.236 C 350.539 327.966,350.667 327.757,350.958 327.610 C 351.199 327.489,351.390 327.336,351.384 327.271 C 351.350 326.931,351.406 326.848,351.791 326.677 C 352.022 326.574,352.256 326.300,352.312 326.069 C 352.367 325.837,352.843 325.198,353.370 324.648 C 353.896 324.099,354.449 323.372,354.599 323.034 C 354.749 322.695,355.021 322.370,355.203 322.312 C 355.385 322.255,355.535 322.127,355.535 322.030 C 355.535 321.932,355.747 321.667,356.008 321.441 C 356.268 321.214,356.481 320.872,356.481 320.679 C 356.481 320.486,356.608 320.280,356.764 320.220 C 356.921 320.160,357.048 320.011,357.048 319.888 C 357.048 319.766,357.307 319.512,357.624 319.325 C 358.051 319.073,358.170 318.892,358.084 318.621 C 358.009 318.386,358.073 318.217,358.265 318.143 C 358.428 318.081,358.562 317.917,358.562 317.779 C 358.562 317.641,358.720 317.478,358.914 317.416 C 359.107 317.355,359.423 316.956,359.615 316.529 C 359.807 316.103,360.330 315.378,360.777 314.918 C 361.224 314.458,361.589 313.922,361.589 313.727 C 361.589 313.532,361.845 313.131,362.157 312.836 C 362.469 312.541,362.725 312.190,362.725 312.055 C 362.725 311.813,362.908 311.546,363.503 310.918 C 363.672 310.741,363.959 310.274,364.143 309.880 C 364.326 309.487,364.721 308.903,365.020 308.583 C 365.319 308.263,365.563 307.924,365.563 307.830 C 365.563 307.543,366.016 306.832,366.367 306.567 C 366.549 306.430,366.698 306.159,366.698 305.966 C 366.698 305.772,366.954 305.373,367.266 305.078 C 367.578 304.783,367.833 304.398,367.833 304.222 C 367.833 304.045,367.920 303.848,368.026 303.782 C 368.132 303.717,368.169 303.584,368.108 303.486 C 368.048 303.388,368.132 303.258,368.295 303.195 C 368.457 303.133,368.590 302.972,368.590 302.838 C 368.590 302.704,368.718 302.546,368.874 302.486 C 369.030 302.426,369.158 302.213,369.158 302.013 C 369.158 301.812,369.413 301.375,369.726 301.041 C 370.038 300.706,370.293 300.272,370.293 300.075 C 370.293 299.877,370.442 299.565,370.624 299.379 C 370.807 299.194,371.104 298.747,371.285 298.386 C 371.758 297.447,372.058 296.994,372.319 296.826 C 372.445 296.745,372.498 296.547,372.436 296.386 C 372.374 296.225,372.485 295.866,372.683 295.587 C 372.881 295.308,373.169 294.825,373.323 294.513 C 373.478 294.201,373.710 293.877,373.841 293.794 C 373.971 293.711,374.078 293.537,374.078 293.408 C 374.078 293.138,374.697 291.879,375.024 291.485 C 375.146 291.338,375.191 291.129,375.123 291.021 C 375.056 290.912,375.091 290.823,375.202 290.823 C 375.312 290.823,375.402 290.716,375.402 290.585 C 375.402 290.454,375.577 290.237,375.791 290.104 C 376.054 289.939,376.142 289.744,376.064 289.498 C 375.989 289.261,376.084 289.019,376.338 288.801 C 376.552 288.618,376.727 288.251,376.727 287.985 C 376.727 287.712,376.974 287.231,377.294 286.880 C 377.606 286.538,377.862 286.092,377.862 285.889 C 377.862 285.686,377.943 285.372,378.041 285.191 C 378.477 284.394,379.453 282.202,379.422 282.090 C 379.403 282.022,379.513 281.863,379.665 281.736 C 379.818 281.609,379.943 281.345,379.943 281.149 C 379.943 280.954,380.114 280.476,380.322 280.087 C 380.530 279.699,380.700 279.274,380.700 279.142 C 380.700 279.010,380.785 278.903,380.889 278.903 C 380.993 278.903,381.079 278.724,381.079 278.506 C 381.079 278.047,381.647 277.010,381.898 277.010 C 381.992 277.010,382.028 276.853,381.977 276.660 C 381.927 276.468,382.036 276.111,382.219 275.868 C 382.403 275.624,382.512 275.318,382.462 275.187 C 382.411 275.056,382.499 274.710,382.657 274.419 C 383.245 273.334,383.996 271.427,384.282 270.293 C 384.361 269.981,384.652 269.249,384.928 268.667 C 385.204 268.084,385.430 267.429,385.430 267.211 C 385.430 266.993,385.516 266.763,385.620 266.698 C 385.724 266.634,385.809 266.415,385.809 266.211 C 385.809 266.008,385.886 265.694,385.980 265.513 C 386.074 265.332,386.258 264.823,386.388 264.380 C 386.519 263.938,386.707 263.576,386.805 263.576 C 386.904 263.576,386.940 263.459,386.885 263.316 C 386.830 263.173,386.906 262.822,387.054 262.537 C 387.202 262.252,387.323 261.826,387.323 261.591 C 387.323 261.355,387.454 261.054,387.614 260.920 C 387.801 260.766,387.841 260.613,387.725 260.497 C 387.609 260.381,387.674 260.082,387.906 259.669 C 388.105 259.314,388.269 258.813,388.269 258.556 C 388.269 258.299,388.343 258.089,388.434 258.089 C 388.591 258.089,388.868 256.944,388.922 256.065 C 388.937 255.837,389.103 255.478,389.293 255.269 C 389.530 255.007,389.600 254.737,389.517 254.407 C 389.451 254.143,389.466 253.926,389.550 253.926 C 389.723 253.926,390.211 252.364,390.249 251.690 C 390.262 251.449,390.385 251.183,390.521 251.099 C 390.677 251.003,390.720 250.793,390.638 250.535 C 390.567 250.309,390.592 250.021,390.695 249.896 C 390.798 249.771,390.944 249.243,391.020 248.723 C 391.096 248.202,391.244 247.564,391.349 247.304 C 391.548 246.809,391.566 246.732,391.769 245.506 C 391.838 245.090,391.964 244.579,392.049 244.371 C 392.134 244.163,392.388 243.013,392.613 241.816 C 392.838 240.620,393.106 239.486,393.209 239.298 C 393.311 239.109,393.345 238.797,393.284 238.604 C 393.223 238.411,393.246 238.208,393.336 238.153 C 393.425 238.097,393.513 237.532,393.530 236.896 C 393.551 236.140,393.664 235.638,393.855 235.446 C 394.088 235.213,394.101 235.098,393.917 234.876 C 393.761 234.688,393.750 234.556,393.882 234.470 C 393.990 234.400,394.127 233.798,394.186 233.133 C 394.244 232.468,394.397 231.860,394.524 231.781 C 394.653 231.701,394.709 231.457,394.650 231.232 C 394.592 231.008,394.625 230.553,394.725 230.219 C 394.824 229.885,394.939 229.101,394.979 228.477 C 395.020 227.852,395.111 227.193,395.182 227.010 C 395.252 226.828,395.259 226.545,395.196 226.382 C 395.133 226.218,395.158 225.941,395.252 225.767 C 395.402 225.486,395.487 224.840,395.766 221.854 C 395.805 221.438,395.878 220.501,395.928 219.773 C 395.978 219.044,396.094 217.938,396.186 217.313 C 396.277 216.689,396.334 215.752,396.313 215.232 C 396.291 214.711,396.347 213.859,396.435 213.337 C 396.524 212.815,396.599 211.794,396.602 211.067 C 396.610 208.737,396.636 208.326,396.777 208.325 C 396.871 208.325,396.878 201.377,396.790 196.121 C 396.769 194.872,396.807 193.710,396.875 193.539 C 396.943 193.367,396.907 193.170,396.796 193.101 C 396.674 193.026,396.640 192.687,396.709 192.255 C 396.778 191.822,396.743 191.483,396.622 191.408 C 396.490 191.326,396.479 191.127,396.589 190.836 C 396.683 190.590,396.721 190.350,396.674 190.303 C 396.576 190.205,396.385 187.540,396.367 185.998 C 396.360 185.426,396.305 184.872,396.244 184.768 C 396.184 184.664,396.160 184.342,396.190 184.051 C 396.239 183.590,396.147 182.655,395.738 179.470 C 395.685 179.054,395.606 178.353,395.564 177.914 C 395.521 177.474,395.422 177.009,395.343 176.882 C 395.264 176.754,395.177 176.305,395.149 175.884 C 395.016 173.868,394.930 173.107,394.822 173.000 C 394.758 172.935,394.796 172.774,394.906 172.641 C 395.045 172.474,395.046 172.286,394.912 172.035 C 394.805 171.835,394.674 171.230,394.621 170.691 C 394.569 170.151,394.471 169.622,394.404 169.514 C 394.337 169.406,394.242 168.921,394.191 168.436 C 394.140 167.950,394.023 167.411,393.929 167.236 C 393.836 167.061,393.810 166.666,393.871 166.358 C 393.934 166.044,393.895 165.744,393.783 165.674 C 393.673 165.606,393.628 165.434,393.682 165.292 C 393.737 165.150,393.682 164.972,393.559 164.896 C 393.392 164.793,393.397 164.722,393.579 164.609 C 393.770 164.491,393.756 164.362,393.512 163.989 C 393.342 163.730,393.123 162.868,393.024 162.074 C 392.925 161.279,392.742 160.505,392.616 160.354 C 392.490 160.202,392.434 159.897,392.492 159.676 C 392.549 159.456,392.517 159.115,392.419 158.919 C 392.322 158.722,392.163 158.403,392.067 158.208 C 391.958 157.989,391.959 157.786,392.068 157.677 C 392.178 157.566,392.072 157.073,391.788 156.374 C 391.521 155.716,391.370 155.042,391.426 154.752 C 391.478 154.478,391.428 154.197,391.314 154.126 C 391.200 154.056,391.107 153.791,391.107 153.537 C 391.107 153.283,391.020 153.075,390.914 153.075 C 390.804 153.075,390.771 152.876,390.837 152.612 C 390.901 152.358,390.884 152.039,390.799 151.903 C 390.613 151.605,390.572 151.468,390.416 150.615 C 390.349 150.251,390.179 149.776,390.038 149.559 C 389.897 149.343,389.830 149.117,389.890 149.057 C 389.949 148.997,389.833 148.608,389.632 148.191 C 389.422 147.756,389.330 147.330,389.415 147.191 C 389.500 147.054,389.448 146.782,389.295 146.564 C 389.147 146.352,389.026 146.038,389.026 145.866 C 389.026 145.693,388.902 145.450,388.750 145.324 C 388.528 145.140,388.519 145.021,388.703 144.708 C 388.882 144.404,388.881 144.303,388.694 144.236 C 388.564 144.189,388.458 143.949,388.458 143.704 C 388.458 143.459,388.372 143.205,388.268 143.141 C 388.164 143.076,388.126 142.830,388.186 142.595 C 388.252 142.328,388.181 142.074,387.997 141.921 C 387.834 141.786,387.701 141.547,387.701 141.390 C 387.701 141.233,387.538 140.839,387.338 140.514 C 387.138 140.190,386.919 139.541,386.851 139.073 C 386.784 138.605,386.603 138.027,386.450 137.790 C 386.297 137.553,386.216 137.288,386.270 137.201 C 386.324 137.113,386.201 136.892,385.998 136.708 C 385.744 136.478,385.680 136.282,385.793 136.081 C 385.904 135.881,385.779 135.459,385.399 134.757 C 385.092 134.190,384.879 133.626,384.926 133.504 C 384.973 133.382,384.880 132.988,384.718 132.630 C 384.557 132.271,384.440 131.908,384.459 131.823 C 384.477 131.738,384.320 131.450,384.110 131.183 C 383.900 130.915,383.728 130.577,383.728 130.431 C 383.728 130.286,383.590 129.957,383.423 129.702 C 383.255 129.446,383.170 129.103,383.232 128.939 C 383.296 128.774,383.138 128.335,382.875 127.948 C 382.615 127.566,382.403 127.140,382.403 127.000 C 382.403 126.861,382.270 126.614,382.108 126.452 C 381.946 126.290,381.861 126.033,381.920 125.880 C 381.979 125.728,381.824 125.207,381.577 124.722 C 380.852 123.303,380.533 122.554,380.394 121.949 C 380.322 121.637,380.107 121.178,379.914 120.930 C 379.722 120.682,379.565 120.374,379.565 120.247 C 379.565 120.119,379.352 119.701,379.092 119.318 C 378.832 118.935,378.619 118.538,378.619 118.436 C 378.619 118.335,378.419 117.934,378.175 117.546 C 377.932 117.158,377.770 116.728,377.817 116.590 C 377.864 116.453,377.638 115.915,377.314 115.395 C 376.991 114.875,376.727 114.349,376.727 114.225 C 376.727 114.102,376.429 113.582,376.064 113.069 C 375.678 112.526,375.402 111.912,375.402 111.595 C 375.402 111.297,375.318 110.950,375.216 110.825 C 374.244 109.633,374.008 109.282,373.987 108.999 C 373.974 108.818,373.611 108.155,373.181 107.525 C 372.718 106.846,372.435 106.236,372.486 106.028 C 372.540 105.806,372.151 105.091,371.429 104.088 C 370.665 103.028,370.321 102.386,370.393 102.159 C 370.463 101.939,370.213 101.415,369.688 100.680 C 369.240 100.055,368.491 98.980,368.023 98.292 C 365.775 94.991,365.903 95.072,364.522 96.081 \" stroke=\"none\" fill=\"#d1dc31\" fill-rule=\"evenodd\"></path><path id=\"path10\" d=\"\" stroke=\"none\" fill=\"#99ff33\" fill-rule=\"evenodd\"></path><path id=\"path11\" d=\"M85.380 215.516 C 85.380 215.880,85.419 216.029,85.466 215.847 C 85.514 215.665,85.514 215.367,85.466 215.184 C 85.419 215.002,85.380 215.151,85.380 215.516 \" stroke=\"none\" fill=\"#ffff00\" fill-rule=\"evenodd\"></path></g>\n</svg>;\n\nexport default icons;","// Dependencies\nimport { createNggEditComponent } from './edit.min'\nimport icons from './icons.min';\nimport {memo} from 'react'\n\nconst { __ } \t\t\t\t\t = wp.i18n\nconst { RawHTML } \t = wp.element\nconst { registerBlockType } = wp.blocks\nconst { withSelect} = wp.data\nconst { omit } = lodash \n\n// Provides a higher order component that is aware when the freeform block becomes available\nconst withFreeform = withSelect((select, props) => {\n return {\n Freeform: select('core/blocks').getBlockType('core/freeform')\n }\n})\n\n// When the freeform block is available, we create our edit component for NGG and render it\nconst edit = withFreeform(memo(props => {\n props.isSelected = true\n const editProps = omit(props, ['Freeform'])\n const NggEdit = createNggEditComponent(jQuery, props.Freeform.edit)\n return <NggEdit {...editProps}/>\n}))\n\n// Register our block\nregisterBlockType('imagely/nextgen-gallery', {\n\n title: __('NextGEN Gallery'),\n\n desription: __('A block for adding NextGEN Galleries.'),\n\n icon: icons.nextgen,\n\n category: 'common',\n\n attributes: {\n content: {\n type: 'string',\n source: 'html',\n },\n },\n\n supports: {\n className: false,\n customClassName: false,\n },\n\n edit,\n\n save( { attributes } ) {\n const { content } = attributes;\n return <RawHTML>{ content }</RawHTML>\n },\n});\n\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.css new file mode 100644 index 000000000..76813cea2 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.css @@ -0,0 +1,136 @@ +/** + * ---------------------------------------------------------------------------- + * Editor CSS + * ---------------------------------------------------------------------------- + */ + +/* Customize the overall block */ + +div[data-type="imagely/nextgen-gallery"].is-selected>.editor-block-list__block-edit:before, +div[data-type="imagely/nextgen-gallery"].is-hovered>.editor-block-list__block-edit:before { + outline: none !important; +} + +div[data-type="imagely/nextgen-gallery"] .editor-block-list__breadcrumb { + display:none !important; +} + +/* Customize the tinymce menu bar */ +div[data-type="imagely/nextgen-gallery"] .ngg-freeform-toolbar { + display: none !important; +} + +/* Styling for Add NextGEN Gallery button */ + +div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-wrap { + background-color: #143650; + border: none; + border-top: 5px solid #b8d330; + border-radius: 2px; + display: none; + min-height: 150px; + margin: 0 0 -50px !important; + padding: 46px 20px; + position: relative; + top: -40px; + width: 100%; + z-index: 1; +} + +div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery { + font-size: 14px; + letter-spacing: 1.2px; + line-height: 20px; + font-family: Lato,sans-serif; + font-weight: 900; + color: #fff; + background-color: #9fbb1a; + border: none; + box-shadow: none; + padding: 12px 24px; + margin: 0 auto; + text-transform: uppercase; + width: 260px; + text-align: center; + cursor: pointer; +} + +/* Customize the tinymce editor area */ + +div[data-type="imagely/nextgen-gallery"] .wp-block-freeform.block-library-rich-text__tinymce { + overflow: visible; +} + +div[data-type="imagely/nextgen-gallery"] .mce-drag-container { + left: 0 !important; +} + +/* Customize the NextGEN Gallery placeholder */ + +div[data-type="imagely/nextgen-gallery"] .nggPlaceholder { + background-color: #143650; + border-radius: 2px; + box-shadow: 0 0 4px 1px rgba(0,0,0,.05); + box-sizing: border-box; + border-top: 5px solid #b8d330; + color: #fff; + color: #9fbb1a; + font-family: sans-serif; + font-size: 20px; + margin-bottom: -25px !important; + outline: none !important; + padding: 30px 30px 65px 30px; + position: relative; + text-align: center; + top: -15px; + width: 100%; + z-index: 2; +} + +div[data-type="imagely/nextgen-gallery"] .wp-block-freeform.blocks-rich-text__tinymce > .nggPlaceholder { + margin-top: 0; + z-index: 2; + display: block; + position: relative; +} + +div[data-type="imagely/nextgen-gallery"] .wp-block-freeform.blocks-rich-text__tinymce > .nggPlaceholder { + margin-top: -135px; +} + +div[data-type="imagely/nextgen-gallery"] .nggPlaceholder h3 { + color: #fff !important; + margin-bottom: 8px; + text-transform: uppercase; + font-size: 20px; + font-family: Lato, sans-serif !important; + font-weight: 900 !important; + letter-spacing: 1.5px !important; + margin-bottom: 0; +} + +div[data-type="imagely/nextgen-gallery"] .nggPlaceholderButton { + background: #9ebd00 !important; + border-radius: 2px; + border: none !important; + box-shadow: none !important; + color: #fff !important; + display: inline-block !important; + font-size: 12px; + font-weight: bold; + font-family: Lato, sans-serif !important; + height: 36px !important; + line-height: 36px !important; + letter-spacing: 1.2px; + margin: 0px 4px 2px; + padding: 0; + width: 105px; + text-align: center; + text-transform: uppercase !important; + text-shadow: none !important; + cursor: pointer; +} + +div[data-type="imagely/nextgen-gallery"] .nggPlaceholderButton:hover { + background: #a5c31a !important; +} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css new file mode 100644 index 000000000..0b73b1832 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/editor.min.css @@ -0,0 +1 @@ +div[data-type="imagely/nextgen-gallery"].is-hovered>.editor-block-list__block-edit:before,div[data-type="imagely/nextgen-gallery"].is-selected>.editor-block-list__block-edit:before{outline:0!important}div[data-type="imagely/nextgen-gallery"] .editor-block-list__breadcrumb,div[data-type="imagely/nextgen-gallery"] .ngg-freeform-toolbar{display:none!important}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery-wrap{background-color:#143650;border:none;border-top:5px solid #b8d330;border-radius:2px;display:none;min-height:150px;margin:0 0 -50px!important;padding:46px 20px;position:relative;top:-40px;width:100%;z-index:1}div[data-type="imagely/nextgen-gallery"] .add-ngg-gallery{font-size:14px;letter-spacing:1.2px;line-height:20px;font-family:Lato,sans-serif;font-weight:900;color:#fff;background-color:#9fbb1a;border:none;box-shadow:none;padding:12px 24px;margin:0 auto;text-transform:uppercase;width:260px;text-align:center;cursor:pointer}div[data-type="imagely/nextgen-gallery"] .wp-block-freeform.block-library-rich-text__tinymce{overflow:visible}div[data-type="imagely/nextgen-gallery"] .mce-drag-container{left:0!important}div[data-type="imagely/nextgen-gallery"] .nggPlaceholder{background-color:#143650;border-radius:2px;box-shadow:0 0 4px 1px rgba(0,0,0,.05);box-sizing:border-box;border-top:5px solid #b8d330;color:#9fbb1a;font-family:sans-serif;font-size:20px;margin-bottom:-25px!important;outline:0!important;padding:30px 30px 65px;position:relative;text-align:center;top:-15px;width:100%;z-index:2}div[data-type="imagely/nextgen-gallery"] .wp-block-freeform.blocks-rich-text__tinymce>.nggPlaceholder{z-index:2;display:block;position:relative;margin-top:-135px}div[data-type="imagely/nextgen-gallery"] .nggPlaceholder h3{color:#fff!important;text-transform:uppercase;font-size:20px;font-family:Lato,sans-serif!important;font-weight:900!important;letter-spacing:1.5px!important;margin-bottom:0}div[data-type="imagely/nextgen-gallery"] .nggPlaceholderButton{background:#9ebd00!important;border-radius:2px;border:none!important;box-shadow:none!important;color:#fff!important;display:inline-block!important;font-size:12px;font-weight:700;font-family:Lato,sans-serif!important;height:36px!important;line-height:36px!important;letter-spacing:1.2px;margin:0 4px 2px;padding:0;width:105px;text-align:center;text-transform:uppercase!important;text-shadow:none!important;cursor:pointer}div[data-type="imagely/nextgen-gallery"] .nggPlaceholderButton:hover{background:#a5c31a!important} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/block.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/block.min.js new file mode 100644 index 000000000..b36b33a50 --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/block.min.js @@ -0,0 +1,58 @@ +// Dependencies +import { createNggEditComponent } from './edit.min' +import icons from './icons.min'; +import {memo} from 'react' + +const { __ } = wp.i18n +const { RawHTML } = wp.element +const { registerBlockType } = wp.blocks +const { withSelect} = wp.data +const { omit } = lodash + +// Provides a higher order component that is aware when the freeform block becomes available +const withFreeform = withSelect((select, props) => { + return { + Freeform: select('core/blocks').getBlockType('core/freeform') + } +}) + +// When the freeform block is available, we create our edit component for NGG and render it +const edit = withFreeform(memo(props => { + props.isSelected = true + const editProps = omit(props, ['Freeform']) + const NggEdit = createNggEditComponent(jQuery, props.Freeform.edit) + return <NggEdit {...editProps}/> +})) + +// Register our block +registerBlockType('imagely/nextgen-gallery', { + + title: __('NextGEN Gallery'), + + desription: __('A block for adding NextGEN Galleries.'), + + icon: icons.nextgen, + + category: 'common', + + attributes: { + content: { + type: 'string', + source: 'html', + }, + }, + + supports: { + className: false, + customClassName: false, + }, + + edit, + + save( { attributes } ) { + const { content } = attributes; + return <RawHTML>{ content }</RawHTML> + }, +}); + + diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/edit.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/edit.min.js new file mode 100644 index 000000000..5bffd46fb --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/edit.min.js @@ -0,0 +1,74 @@ +const { __ } = wp.i18n; +const { memoize } = lodash + +// Given jQuery and the Freeform block settings, creates the Ngg Editor Component +export const createNggEditComponent = memoize(($, Freeform) => { + class NggEditor extends Freeform { + constructor(props) { + super(props) + this.openIGW = this.openIGW.bind(this) + this.updateContent = this.updateContent.bind(this) + this.hasGallery = this.hasGallery.bind(this) + this.toggleAddGalleryBtn= this.toggleAddGalleryBtn.bind(this) + } + + hasGallery() { + return this.props.attributes.content && this.props.attributes.content.length > 0 + } + + componentDidMount() { + super.componentDidMount() + $(this.ref).addClass('freeform-toolbar').addClass('ngg-freeform-toolbar') + this.toggleAddGalleryBtn(); + + } + + componentDidUpdate() { + this.toggleAddGalleryBtn(); + } + + toggleAddGalleryBtn() { + // Determine the UI state + if (this.props.attributes.content) { + $(this.ref).addClass('hidden'); + $(this.ref).siblings('.add-ngg-gallery-wrap').hide() + } + else { + $(this.ref).removeClass('hidden'); + $(this.ref).siblings('.add-ngg-gallery-wrap').show() + } + } + + updateContent(content) { + this.props.setAttributes({content}) + } + + onSetup(editor){ + super.onSetup(editor); + const updateContent = this.updateContent.bind(this) + + // When NGG is added or removed, we must set the classic "content" attribute, + // which will re-render our component + editor.on('ngg-removed', () => updateContent("")) + editor.on('ngg-inserted', ({shortcode}) => updateContent(shortcode)) + } + + openIGW() { + this.editor.execCommand('ngg_attach_to_post') + } + + render(){ + const classic = super.render() + return [ + classic, + <div className="add-ngg-gallery-wrap"> + <div className="add-ngg-gallery" onClick={this.openIGW}> + {ngg_tinymce_plugin.i18n.button_label} + </div> + </div> + ] + } + } + + return NggEditor +}) \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/icons.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/icons.min.js new file mode 100644 index 000000000..6f754b33b --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_block/static/src/icons.min.js @@ -0,0 +1,8 @@ +const icons = {}; + +icons.nextgen = +<svg id="svg" version="1.1" width="400" height="385.8088930936613" viewBox="0 0 400 385.8088930936613"> +<g id="svgg"><path id="path0" d="" stroke="none" fill="#000055" fill-rule="evenodd"></path><path id="path1" d="" stroke="none" fill="#002424" fill-rule="evenodd"></path><path id="path2" d="M194.418 152.698 C 154.152 157.677,135.139 203.873,160.388 235.383 C 179.730 259.522,217.168 260.458,237.772 237.316 C 261.954 210.156,250.860 167.167,216.592 155.239 C 210.224 153.023,200.657 151.926,194.418 152.698 " stroke="none" fill="#143650" fill-rule="evenodd"></path><path id="path3" d="" stroke="none" fill="#555500" fill-rule="evenodd"></path><path id="path4" d="M109.430 274.467 C 109.368 274.629,109.202 274.717,109.061 274.663 C 108.920 274.609,108.715 274.732,108.606 274.936 C 108.496 275.140,108.286 275.307,108.139 275.307 C 107.992 275.307,107.796 275.441,107.705 275.605 C 107.536 275.907,106.895 276.338,106.291 276.556 C 106.109 276.622,105.960 276.753,105.960 276.848 C 105.960 276.942,105.747 277.101,105.487 277.200 C 105.227 277.299,105.014 277.467,105.014 277.573 C 105.014 277.680,104.920 277.767,104.805 277.767 C 104.690 277.767,104.285 278.009,103.906 278.303 C 103.527 278.598,103.068 278.894,102.886 278.960 C 102.703 279.026,102.554 279.168,102.554 279.275 C 102.554 279.382,102.427 279.470,102.272 279.470 C 102.117 279.470,101.884 279.640,101.754 279.849 C 101.624 280.057,101.367 280.227,101.184 280.227 C 101.001 280.227,100.851 280.314,100.851 280.421 C 100.851 280.528,100.639 280.696,100.378 280.795 C 100.118 280.894,99.905 281.071,99.905 281.189 C 99.905 281.306,99.793 281.360,99.655 281.307 C 99.518 281.254,99.304 281.373,99.181 281.570 C 99.057 281.768,98.838 281.930,98.694 281.930 C 98.550 281.930,98.383 282.059,98.322 282.217 C 98.262 282.374,97.997 282.585,97.734 282.685 C 97.471 282.785,97.256 282.954,97.256 283.061 C 97.256 283.167,97.095 283.254,96.898 283.254 C 96.701 283.254,96.491 283.382,96.431 283.538 C 96.371 283.694,96.201 283.822,96.053 283.822 C 95.904 283.822,95.731 283.959,95.667 284.126 C 95.603 284.292,95.438 284.386,95.302 284.334 C 95.165 284.281,94.952 284.400,94.829 284.598 C 94.705 284.796,94.529 284.957,94.437 284.957 C 94.344 284.957,93.996 285.213,93.661 285.525 C 93.327 285.837,92.965 286.093,92.857 286.093 C 92.748 286.093,92.296 286.391,91.851 286.755 C 91.407 287.119,90.958 287.417,90.854 287.417 C 90.750 287.417,90.637 287.481,90.602 287.559 C 90.471 287.855,89.293 288.565,89.116 288.455 C 89.014 288.392,88.931 288.476,88.931 288.641 C 88.931 288.805,88.718 289.021,88.458 289.120 C 88.198 289.219,87.985 289.392,87.985 289.505 C 87.985 289.617,87.602 289.879,87.133 290.086 C 86.665 290.293,86.282 290.546,86.282 290.647 C 86.282 290.749,86.090 290.915,85.856 291.017 C 85.220 291.292,84.692 291.646,84.522 291.911 C 84.439 292.041,84.245 292.148,84.091 292.148 C 83.936 292.148,83.761 292.275,83.701 292.431 C 83.641 292.588,83.504 292.715,83.396 292.715 C 83.287 292.715,82.835 293.013,82.391 293.377 C 81.946 293.742,81.493 294.040,81.384 294.040 C 81.276 294.040,81.097 294.207,80.988 294.411 C 80.871 294.629,80.673 294.738,80.508 294.675 C 80.337 294.609,80.227 294.677,80.227 294.850 C 80.227 295.006,80.014 295.187,79.754 295.253 C 79.494 295.318,79.281 295.455,79.281 295.557 C 79.281 295.659,79.162 295.743,79.017 295.743 C 78.872 295.743,78.707 295.864,78.650 296.012 C 78.594 296.160,78.223 296.433,77.826 296.619 C 77.429 296.804,76.994 297.108,76.858 297.295 C 76.722 297.482,76.488 297.635,76.337 297.635 C 76.187 297.635,76.064 297.715,76.064 297.814 C 76.064 297.990,75.336 298.457,74.693 298.693 C 74.510 298.760,74.361 298.892,74.361 298.986 C 74.361 299.081,74.170 299.241,73.936 299.342 C 73.345 299.597,72.922 299.894,72.049 300.662 C 71.636 301.026,71.221 301.325,71.127 301.325 C 71.032 301.325,70.662 301.559,70.303 301.845 C 69.945 302.131,69.562 302.365,69.452 302.365 C 69.342 302.365,69.253 302.449,69.253 302.551 C 69.253 302.653,69.040 302.790,68.780 302.855 C 68.519 302.920,68.307 303.102,68.307 303.259 C 68.307 303.451,68.183 303.512,67.928 303.446 C 67.680 303.381,67.550 303.440,67.550 303.617 C 67.550 303.766,67.337 303.969,67.077 304.068 C 66.816 304.167,66.604 304.337,66.604 304.447 C 66.604 304.556,66.391 304.726,66.131 304.825 C 65.870 304.924,65.658 305.092,65.658 305.199 C 65.658 305.305,65.487 305.393,65.279 305.393 C 65.071 305.393,64.901 305.480,64.901 305.587 C 64.901 305.693,64.688 305.861,64.428 305.960 C 64.167 306.059,63.955 306.227,63.955 306.334 C 63.955 306.441,63.784 306.528,63.576 306.528 C 63.368 306.528,63.198 306.615,63.198 306.722 C 63.198 306.828,62.985 306.997,62.725 307.096 C 62.465 307.194,62.252 307.361,62.252 307.465 C 62.252 307.570,61.907 307.831,61.486 308.046 C 61.064 308.261,60.672 308.561,60.614 308.712 C 60.556 308.864,60.389 308.988,60.243 308.988 C 60.097 308.988,59.835 309.154,59.662 309.356 C 59.488 309.559,59.285 309.687,59.210 309.641 C 59.135 309.595,58.800 309.812,58.467 310.124 C 58.133 310.436,57.748 310.691,57.612 310.691 C 57.475 310.691,57.335 310.754,57.301 310.833 C 57.184 311.095,55.380 312.394,55.132 312.394 C 54.996 312.394,54.803 312.547,54.703 312.735 C 54.602 312.923,54.174 313.242,53.752 313.445 C 53.330 313.647,52.983 313.879,52.982 313.959 C 52.981 314.040,52.789 314.189,52.554 314.290 C 51.958 314.548,51.520 314.853,50.731 315.562 C 50.355 315.900,49.942 316.176,49.812 316.177 C 49.683 316.177,49.476 316.340,49.353 316.537 C 49.229 316.735,49.027 316.858,48.903 316.810 C 48.779 316.763,48.626 316.856,48.564 317.018 C 48.502 317.181,48.339 317.313,48.203 317.313 C 48.067 317.313,47.695 317.547,47.375 317.833 C 46.625 318.507,45.782 319.104,45.364 319.259 C 45.182 319.327,45.033 319.470,45.033 319.578 C 45.033 319.685,44.903 319.773,44.743 319.773 C 44.584 319.773,44.405 319.901,44.345 320.057 C 44.285 320.213,44.075 320.341,43.878 320.341 C 43.622 320.341,43.519 320.476,43.519 320.814 C 43.519 321.074,43.587 321.287,43.670 321.287 C 43.753 321.287,44.147 321.798,44.545 322.422 C 44.942 323.046,45.343 323.557,45.434 323.557 C 45.526 323.557,45.601 323.655,45.601 323.774 C 45.601 323.894,45.899 324.355,46.263 324.799 C 46.627 325.244,46.925 325.700,46.925 325.812 C 46.925 325.925,47.010 326.017,47.114 326.017 C 47.219 326.017,47.304 326.132,47.304 326.272 C 47.304 326.411,47.474 326.680,47.682 326.868 C 47.890 327.057,48.061 327.331,48.061 327.477 C 48.061 327.634,48.209 327.719,48.420 327.685 C 48.728 327.634,49.763 328.480,49.763 328.783 C 49.763 328.837,49.976 329.160,50.237 329.501 C 50.497 329.842,50.710 330.217,50.710 330.335 C 50.710 330.610,51.587 331.190,51.802 331.058 C 51.891 331.002,52.123 331.229,52.316 331.562 C 52.509 331.894,52.780 332.235,52.918 332.318 C 53.056 332.401,53.169 332.587,53.169 332.731 C 53.169 332.875,53.347 333.049,53.565 333.118 C 53.783 333.187,54.082 333.533,54.230 333.888 C 54.378 334.242,54.578 334.532,54.675 334.532 C 54.772 334.532,54.964 334.766,55.102 335.052 C 55.239 335.338,55.492 335.574,55.663 335.575 C 56.001 335.578,56.764 336.191,56.764 336.461 C 56.764 336.713,57.567 337.748,57.763 337.748 C 57.981 337.748,58.642 338.535,58.650 338.804 C 58.654 338.917,58.888 339.130,59.171 339.277 C 59.786 339.598,61.757 341.524,61.929 341.973 C 61.996 342.147,62.168 342.289,62.311 342.289 C 62.454 342.289,62.725 342.577,62.915 342.929 C 63.125 343.319,63.542 343.693,63.985 343.889 C 64.385 344.065,64.711 344.333,64.711 344.485 C 64.711 344.637,64.882 344.825,65.091 344.902 C 65.299 344.979,65.628 345.336,65.821 345.696 C 66.014 346.056,66.335 346.394,66.535 346.449 C 66.972 346.567,68.307 347.617,68.307 347.843 C 68.307 348.075,69.693 349.274,69.850 349.177 C 69.923 349.132,70.037 349.267,70.103 349.477 C 70.170 349.687,70.389 349.858,70.590 349.858 C 70.791 349.858,70.956 349.924,70.956 350.004 C 70.956 350.370,72.658 351.980,72.934 351.874 C 73.117 351.804,73.226 351.868,73.226 352.046 C 73.226 352.202,73.370 352.385,73.545 352.452 C 73.721 352.520,74.109 352.853,74.408 353.193 C 74.727 353.556,75.063 353.768,75.222 353.707 C 75.385 353.645,75.552 353.757,75.637 353.986 C 75.778 354.360,77.338 355.718,77.633 355.722 C 77.925 355.725,78.903 356.556,78.903 356.800 C 78.903 356.937,78.988 357.048,79.093 357.048 C 79.198 357.048,79.469 357.261,79.695 357.521 C 79.921 357.781,80.240 357.997,80.403 357.999 C 80.566 358.002,81.069 358.343,81.520 358.756 C 81.972 359.170,82.451 359.508,82.586 359.508 C 82.721 359.508,82.876 359.678,82.931 359.886 C 82.988 360.104,83.189 360.265,83.404 360.265 C 83.627 360.265,83.821 360.428,83.883 360.668 C 83.961 360.965,84.092 361.045,84.379 360.970 C 84.624 360.906,84.768 360.959,84.768 361.114 C 84.768 361.353,85.288 361.680,85.572 361.619 C 85.650 361.603,85.714 361.717,85.714 361.873 C 85.714 362.029,85.864 362.157,86.048 362.157 C 86.231 362.157,86.466 362.349,86.570 362.583 C 86.674 362.817,86.908 362.997,87.090 362.982 C 87.272 362.967,87.686 363.202,88.008 363.503 C 88.331 363.805,88.863 364.179,89.191 364.334 C 89.518 364.490,89.998 364.809,90.257 365.043 C 90.517 365.277,90.814 365.478,90.918 365.489 C 91.452 365.547,91.958 365.827,91.958 366.064 C 91.958 366.211,92.107 366.386,92.289 366.453 C 92.472 366.520,92.693 366.695,92.781 366.842 C 92.883 367.012,93.105 367.067,93.396 366.994 C 93.646 366.932,93.851 366.963,93.851 367.063 C 93.851 367.400,94.783 368.258,95.042 368.158 C 95.182 368.105,95.398 368.222,95.521 368.420 C 95.645 368.618,95.905 368.780,96.100 368.780 C 96.294 368.780,96.559 368.907,96.689 369.063 C 96.818 369.219,97.049 369.347,97.202 369.347 C 97.355 369.347,97.828 369.645,98.254 370.009 C 98.679 370.374,99.129 370.672,99.254 370.672 C 99.379 370.672,99.586 370.798,99.714 370.953 C 99.843 371.108,100.024 371.189,100.116 371.131 C 100.208 371.074,100.284 371.112,100.284 371.214 C 100.284 371.425,101.342 371.996,101.732 371.996 C 101.872 371.996,101.965 372.103,101.939 372.233 C 101.912 372.372,102.130 372.493,102.470 372.526 C 102.801 372.558,103.360 372.861,103.781 373.235 C 104.185 373.594,104.655 373.888,104.826 373.888 C 104.997 373.888,105.342 374.106,105.592 374.372 C 105.873 374.671,106.180 374.821,106.396 374.765 C 106.594 374.713,106.953 374.853,107.220 375.085 C 107.480 375.311,107.751 375.501,107.820 375.506 C 108.117 375.528,108.913 375.843,109.149 376.032 C 109.289 376.145,109.518 376.254,109.657 376.274 C 109.796 376.294,110.249 376.584,110.664 376.917 C 111.079 377.251,111.501 377.472,111.602 377.410 C 111.704 377.348,111.837 377.429,111.899 377.591 C 111.962 377.753,112.093 377.836,112.191 377.776 C 112.289 377.715,112.694 377.851,113.091 378.077 C 114.435 378.844,114.758 378.995,115.057 378.996 C 115.221 378.997,115.558 379.214,115.807 379.478 C 116.071 379.759,116.425 379.938,116.658 379.907 C 116.877 379.879,117.263 379.987,117.516 380.147 C 117.769 380.308,118.444 380.635,119.016 380.874 C 119.588 381.114,120.203 381.438,120.381 381.595 C 120.559 381.753,120.847 381.827,121.021 381.760 C 121.216 381.685,121.596 381.838,122.021 382.162 C 122.398 382.449,122.810 382.660,122.938 382.631 C 123.065 382.602,123.363 382.702,123.600 382.854 C 123.837 383.006,124.201 383.158,124.409 383.192 C 124.617 383.226,124.903 383.410,125.045 383.601 C 125.219 383.834,125.444 383.912,125.735 383.839 C 125.999 383.772,126.203 383.825,126.261 383.974 C 126.364 384.244,127.909 384.408,127.909 384.150 C 127.909 384.061,128.172 383.720,128.493 383.391 C 128.979 382.894,129.056 382.698,128.951 382.220 C 128.843 381.728,128.872 381.664,129.154 381.773 C 129.421 381.875,129.463 381.821,129.376 381.489 C 129.294 381.175,129.353 381.079,129.625 381.079 C 129.919 381.079,129.961 380.981,129.868 380.513 C 129.795 380.146,129.862 379.784,130.062 379.479 C 130.231 379.221,130.369 378.916,130.369 378.801 C 130.369 378.686,130.500 378.461,130.659 378.301 C 130.886 378.075,130.901 377.952,130.726 377.742 C 130.546 377.525,130.624 377.364,131.121 376.920 C 131.619 376.476,131.716 376.274,131.618 375.885 C 131.552 375.619,131.565 375.402,131.649 375.402 C 131.907 375.402,132.450 374.330,132.450 373.821 C 132.450 373.241,132.798 372.415,133.253 371.913 C 133.436 371.711,133.568 371.456,133.546 371.346 C 133.477 370.988,133.777 370.104,133.968 370.104 C 134.070 370.104,134.153 369.891,134.153 369.631 C 134.153 369.354,134.251 369.178,134.390 369.205 C 134.539 369.235,134.621 369.043,134.613 368.685 C 134.606 368.373,134.720 368.028,134.867 367.918 C 135.013 367.809,135.108 367.596,135.077 367.445 C 135.005 367.096,135.651 365.752,135.891 365.752 C 135.991 365.752,136.055 365.561,136.034 365.326 C 135.986 364.807,136.396 363.671,136.632 363.671 C 136.725 363.671,136.802 363.467,136.802 363.218 C 136.802 362.969,136.939 362.713,137.106 362.649 C 137.318 362.567,137.376 362.395,137.297 362.082 C 137.226 361.799,137.288 361.546,137.466 361.399 C 137.621 361.270,137.748 361.086,137.748 360.989 C 137.748 360.893,137.919 360.462,138.127 360.031 C 138.335 359.600,138.505 359.088,138.505 358.894 C 138.505 358.699,138.590 358.592,138.694 358.657 C 138.804 358.724,138.884 358.547,138.884 358.239 C 138.884 357.944,139.096 357.390,139.357 357.008 C 139.617 356.625,139.830 356.124,139.830 355.895 C 139.830 355.368,140.756 353.453,141.011 353.453 C 141.121 353.453,141.154 353.217,141.089 352.892 C 141.008 352.486,141.062 352.282,141.283 352.159 C 141.484 352.046,141.552 351.844,141.480 351.570 C 141.399 351.260,141.440 351.179,141.641 351.256 C 141.842 351.334,141.911 351.196,141.911 350.715 C 141.911 350.360,141.990 350.021,142.086 349.962 C 142.182 349.902,142.316 349.599,142.385 349.288 C 142.453 348.977,142.613 348.723,142.741 348.723 C 142.871 348.723,143.126 348.120,143.321 347.351 C 143.512 346.596,143.784 345.845,143.925 345.680 C 144.066 345.516,144.182 345.249,144.182 345.086 C 144.182 344.923,144.315 344.739,144.479 344.676 C 144.671 344.602,144.735 344.434,144.660 344.198 C 144.596 343.997,144.713 343.465,144.918 343.014 C 145.572 341.583,145.955 340.687,145.995 340.492 C 146.130 339.835,146.342 339.451,146.569 339.451 C 146.727 339.451,146.833 339.245,146.837 338.931 C 146.840 338.645,146.966 338.247,147.117 338.048 C 147.304 337.801,147.332 337.612,147.204 337.458 C 147.074 337.302,147.105 337.156,147.301 336.993 C 147.459 336.863,147.588 336.596,147.588 336.401 C 147.588 336.205,147.673 336.045,147.777 336.045 C 147.881 336.045,147.966 335.837,147.966 335.583 C 147.966 335.329,148.129 335.006,148.329 334.866 C 148.539 334.719,148.741 334.286,148.808 333.839 C 148.871 333.414,149.091 332.719,149.296 332.294 C 149.792 331.268,149.789 330.258,149.290 329.991 C 149.082 329.879,148.912 329.700,148.912 329.593 C 148.912 329.485,148.699 329.119,148.439 328.777 C 148.179 328.436,147.966 328.086,147.966 327.998 C 147.966 327.911,147.625 327.435,147.209 326.941 C 146.793 326.448,146.452 325.953,146.452 325.841 C 146.452 325.730,146.386 325.639,146.306 325.639 C 146.226 325.639,145.991 325.321,145.786 324.934 C 145.580 324.546,145.284 324.090,145.128 323.921 C 144.619 323.370,144.182 322.798,144.182 322.684 C 144.182 322.622,143.926 322.248,143.614 321.854 C 143.302 321.460,143.046 321.041,143.046 320.922 C 143.046 320.804,142.919 320.658,142.763 320.598 C 142.606 320.538,142.479 320.406,142.479 320.305 C 142.479 320.203,142.181 319.757,141.816 319.312 C 141.452 318.868,141.154 318.404,141.154 318.281 C 141.154 318.158,141.026 318.009,140.870 317.949 C 140.714 317.889,140.587 317.719,140.587 317.571 C 140.587 317.423,140.459 317.252,140.303 317.192 C 140.147 317.132,140.019 317.004,140.019 316.907 C 140.019 316.698,139.230 315.544,139.026 315.453 C 138.947 315.418,138.884 315.282,138.884 315.151 C 138.884 315.019,138.713 314.758,138.505 314.570 C 138.297 314.381,138.127 314.113,138.127 313.973 C 138.127 313.833,138.040 313.718,137.933 313.718 C 137.826 313.718,137.658 313.505,137.559 313.245 C 137.460 312.985,137.306 312.772,137.216 312.772 C 137.067 312.772,136.696 312.128,136.642 311.775 C 136.630 311.695,136.443 311.440,136.228 311.208 C 135.601 310.532,134.359 308.771,134.237 308.384 C 134.175 308.189,133.939 307.836,133.713 307.599 C 133.487 307.362,133.174 306.971,133.018 306.730 C 132.862 306.489,132.644 306.196,132.534 306.079 C 132.424 305.962,132.169 305.573,131.967 305.216 C 131.764 304.858,131.450 304.390,131.268 304.175 C 130.563 303.344,130.452 303.186,130.089 302.503 C 129.884 302.115,129.647 301.798,129.564 301.798 C 129.481 301.798,129.333 301.585,129.234 301.325 C 129.135 301.064,128.967 300.851,128.860 300.851 C 128.753 300.851,128.666 300.737,128.666 300.597 C 128.666 300.457,128.496 300.188,128.288 300.000 C 128.079 299.812,127.909 299.579,127.909 299.484 C 127.909 299.389,127.803 299.200,127.673 299.064 C 127.543 298.928,127.308 298.626,127.152 298.393 C 126.996 298.160,126.734 297.788,126.570 297.566 C 126.405 297.344,126.216 297.013,126.150 296.831 C 126.083 296.649,125.950 296.500,125.853 296.500 C 125.756 296.500,125.489 296.138,125.260 295.695 C 125.030 295.253,124.723 294.823,124.578 294.740 C 124.433 294.657,124.314 294.465,124.314 294.314 C 124.314 294.163,124.226 294.040,124.119 294.040 C 124.012 294.040,123.869 293.891,123.802 293.709 C 123.735 293.526,123.503 293.122,123.287 292.810 C 123.071 292.498,122.809 292.106,122.705 291.939 C 122.487 291.589,121.384 290.080,121.101 289.743 C 120.995 289.617,120.908 289.459,120.908 289.392 C 120.908 289.289,119.878 287.898,119.207 287.094 C 119.102 286.968,119.016 286.810,119.016 286.743 C 119.016 286.675,118.761 286.298,118.448 285.904 C 118.136 285.509,117.881 285.097,117.881 284.987 C 117.881 284.877,117.774 284.719,117.644 284.636 C 117.344 284.444,116.556 283.327,116.556 283.093 C 116.556 282.996,116.429 282.868,116.272 282.808 C 116.116 282.748,115.989 282.577,115.989 282.429 C 115.989 282.281,115.861 282.111,115.705 282.051 C 115.549 281.991,115.421 281.851,115.421 281.739 C 115.421 281.511,114.646 280.356,114.428 280.259 C 114.350 280.224,114.286 280.079,114.286 279.937 C 114.286 279.795,114.179 279.610,114.049 279.527 C 113.749 279.335,112.961 278.218,112.961 277.984 C 112.961 277.887,112.833 277.759,112.677 277.699 C 112.521 277.639,112.394 277.503,112.394 277.396 C 112.394 276.953,110.065 274.176,109.691 274.173 C 109.610 274.173,109.493 274.305,109.430 274.467 " stroke="none" fill="#8ca516" fill-rule="evenodd"></path><path id="path5" d="" stroke="none" fill="#6db600" fill-rule="evenodd"></path><path id="path6" d="M79.186 45.256 C 78.978 45.372,78.369 45.838,77.832 46.291 C 77.295 46.744,76.809 47.114,76.752 47.114 C 76.696 47.114,76.441 47.306,76.186 47.540 C 75.500 48.170,75.046 48.533,74.934 48.540 C 74.693 48.557,73.983 49.116,73.983 49.289 C 73.982 49.611,72.116 51.366,71.950 51.200 C 71.890 51.140,71.722 51.260,71.577 51.468 C 71.431 51.675,71.190 51.845,71.039 51.845 C 70.889 51.845,70.766 52.019,70.766 52.232 C 70.766 52.464,70.539 52.748,70.200 52.942 C 69.888 53.119,69.633 53.328,69.632 53.406 C 69.632 53.484,69.461 53.548,69.253 53.548 C 69.044 53.548,68.874 53.634,68.874 53.739 C 68.874 53.992,67.915 55.061,67.688 55.061 C 67.590 55.061,67.342 55.274,67.137 55.535 C 66.933 55.795,66.647 56.008,66.502 56.008 C 66.357 56.008,66.137 56.197,66.013 56.429 C 65.743 56.933,65.537 57.138,64.871 57.564 C 64.594 57.741,64.126 58.227,63.830 58.644 C 63.452 59.177,63.194 59.371,62.961 59.300 C 62.776 59.244,62.630 59.297,62.630 59.421 C 62.630 59.747,61.733 60.786,61.150 61.136 C 60.865 61.307,60.668 61.576,60.699 61.751 C 60.730 61.922,60.634 62.062,60.487 62.062 C 60.249 62.062,59.039 63.359,58.877 63.788 C 58.843 63.879,58.688 63.955,58.533 63.955 C 58.258 63.955,57.711 64.387,57.711 64.603 C 57.711 64.663,57.561 64.867,57.379 65.056 C 57.197 65.246,56.793 65.714,56.482 66.097 C 56.170 66.480,55.804 66.793,55.668 66.793 C 55.532 66.793,55.296 67.091,55.144 67.455 C 54.992 67.819,54.762 68.121,54.633 68.125 C 54.505 68.130,53.463 69.275,52.318 70.671 C 51.173 72.067,50.086 73.262,49.903 73.326 C 49.719 73.390,49.605 73.501,49.649 73.573 C 49.805 73.824,49.216 74.409,48.921 74.296 C 48.711 74.216,48.627 74.303,48.625 74.604 C 48.622 75.122,48.429 75.402,48.074 75.402 C 47.926 75.402,47.741 75.638,47.663 75.927 C 47.586 76.216,47.349 76.642,47.137 76.874 C 46.126 77.977,44.276 80.266,44.276 80.414 C 44.276 80.505,44.106 80.634,43.898 80.700 C 43.690 80.766,43.519 80.985,43.519 81.186 C 43.519 81.387,43.390 81.701,43.233 81.883 C 41.478 83.908,40.527 85.119,40.618 85.210 C 40.679 85.271,40.378 85.740,39.948 86.253 C 39.519 86.766,39.167 87.281,39.167 87.396 C 39.167 87.512,39.040 87.606,38.884 87.606 C 38.728 87.606,38.600 87.763,38.600 87.954 C 38.600 88.146,38.324 88.625,37.988 89.019 C 37.651 89.413,37.374 89.838,37.373 89.964 C 37.371 90.090,36.944 90.679,36.424 91.275 C 35.904 91.870,35.500 92.441,35.527 92.542 C 35.554 92.644,35.398 92.916,35.181 93.147 C 34.964 93.378,34.676 93.822,34.542 94.134 C 34.408 94.447,34.074 94.941,33.800 95.232 C 33.526 95.524,33.302 95.856,33.302 95.971 C 33.302 96.086,33.089 96.459,32.829 96.800 C 32.569 97.141,32.356 97.527,32.356 97.657 C 32.356 97.788,32.194 98.070,31.996 98.285 C 31.656 98.654,31.110 99.547,30.515 100.706 C 30.370 100.990,30.171 101.272,30.073 101.332 C 29.976 101.392,29.896 101.592,29.896 101.776 C 29.896 101.960,29.683 102.310,29.423 102.554 C 29.163 102.799,28.950 103.139,28.950 103.311 C 28.950 103.483,28.745 103.816,28.495 104.051 C 28.245 104.286,27.983 104.780,27.914 105.149 C 27.845 105.518,27.539 106.085,27.233 106.410 C 26.928 106.735,26.716 107.099,26.761 107.220 C 26.806 107.340,26.678 107.587,26.477 107.769 C 26.276 107.951,26.112 108.252,26.112 108.438 C 26.112 108.624,26.032 108.825,25.934 108.886 C 25.725 109.015,25.166 110.097,25.166 110.374 C 25.166 110.480,25.049 110.701,24.908 110.865 C 24.766 111.029,24.497 111.573,24.310 112.072 C 24.124 112.572,23.805 113.098,23.602 113.240 C 23.388 113.390,23.291 113.594,23.372 113.724 C 23.448 113.848,23.409 114.012,23.285 114.089 C 23.161 114.166,23.040 114.357,23.017 114.513 C 22.994 114.669,22.842 115.001,22.679 115.251 C 22.516 115.500,22.320 115.918,22.245 116.178 C 22.005 117.008,21.524 117.971,21.276 118.117 C 21.144 118.196,20.979 118.600,20.908 119.016 C 20.838 119.432,20.703 119.773,20.608 119.773 C 20.513 119.773,20.435 119.909,20.435 120.075 C 20.435 120.390,19.954 121.350,19.531 121.878 C 19.395 122.047,19.304 122.260,19.328 122.351 C 19.423 122.710,19.048 123.830,18.710 124.192 C 18.514 124.402,18.354 124.722,18.354 124.902 C 18.354 125.081,18.265 125.258,18.156 125.294 C 18.048 125.331,17.934 125.593,17.904 125.878 C 17.874 126.163,17.792 126.453,17.723 126.522 C 17.654 126.591,17.597 126.800,17.597 126.985 C 17.597 127.171,17.456 127.402,17.284 127.498 C 17.104 127.598,17.019 127.797,17.083 127.965 C 17.148 128.134,17.072 128.303,16.903 128.368 C 16.743 128.430,16.659 128.604,16.718 128.756 C 16.776 128.908,16.742 129.083,16.643 129.144 C 16.543 129.206,16.462 129.496,16.462 129.789 C 16.462 130.083,16.337 130.426,16.184 130.553 C 16.031 130.680,15.913 130.839,15.922 130.907 C 15.975 131.306,15.854 131.666,15.559 131.989 C 15.375 132.191,15.231 132.483,15.240 132.640 C 15.254 132.898,14.806 134.251,14.394 135.194 C 14.034 136.017,13.441 137.881,13.325 138.555 C 13.257 138.946,13.127 139.313,13.034 139.370 C 12.942 139.427,12.867 139.724,12.867 140.030 C 12.867 140.336,12.781 140.587,12.677 140.587 C 12.573 140.587,12.488 140.752,12.488 140.954 C 12.488 141.156,12.403 141.374,12.299 141.438 C 12.195 141.502,12.108 141.784,12.106 142.064 C 12.103 142.344,11.940 142.928,11.743 143.362 C 11.546 143.796,11.432 144.198,11.489 144.255 C 11.547 144.312,11.412 144.782,11.189 145.299 C 10.967 145.816,10.785 146.405,10.785 146.608 C 10.785 146.811,10.658 147.220,10.503 147.519 C 10.347 147.817,10.219 148.290,10.219 148.570 C 10.218 148.850,10.144 149.124,10.054 149.180 C 9.964 149.236,9.832 149.645,9.760 150.090 C 9.514 151.625,8.933 154.114,8.690 154.683 C 8.531 155.055,8.445 155.436,7.841 158.467 C 7.675 159.300,7.457 160.135,7.357 160.323 C 7.256 160.510,7.122 161.216,7.060 161.890 C 6.997 162.564,6.873 163.160,6.784 163.215 C 6.695 163.270,6.621 163.586,6.620 163.918 C 6.618 164.251,6.490 165.061,6.335 165.719 C 6.180 166.377,6.010 167.271,5.957 167.706 C 5.904 168.140,5.815 168.794,5.757 169.158 C 5.700 169.522,5.628 170.076,5.597 170.388 C 5.566 170.700,5.489 171.083,5.425 171.239 C 5.361 171.395,5.221 172.247,5.113 173.132 C 5.006 174.016,4.874 174.995,4.821 175.307 C 4.767 175.620,4.675 176.471,4.616 177.200 C 4.557 177.928,4.436 178.612,4.347 178.719 C 4.258 178.827,4.184 179.337,4.182 179.854 C 4.180 180.372,4.133 181.306,4.077 181.930 C 4.021 182.554,3.937 183.576,3.890 184.201 C 3.843 184.825,3.790 185.336,3.772 185.336 C 3.711 185.336,3.445 190.033,3.343 192.917 C 3.310 193.860,3.223 194.729,3.149 194.847 C 3.017 195.060,3.058 195.456,3.313 196.452 C 3.388 196.743,3.369 196.973,3.271 196.973 C 2.976 196.973,3.139 207.939,3.515 213.434 C 3.575 214.319,3.650 215.511,3.680 216.083 C 3.711 216.656,3.841 218.188,3.969 219.489 C 4.098 220.790,4.193 222.138,4.181 222.485 C 4.170 222.833,4.219 223.211,4.291 223.327 C 4.449 223.584,4.491 223.880,4.653 225.875 C 4.722 226.734,4.832 227.436,4.897 227.436 C 4.961 227.436,5.029 227.670,5.047 227.956 C 5.081 228.509,5.332 230.268,5.686 232.450 C 5.804 233.179,5.892 234.009,5.880 234.295 C 5.869 234.581,5.927 234.816,6.010 234.816 C 6.092 234.816,6.155 235.163,6.149 235.587 C 6.144 236.012,6.205 236.400,6.286 236.450 C 6.367 236.500,6.433 236.797,6.433 237.110 C 6.433 237.423,6.516 237.833,6.617 238.023 C 6.719 238.212,6.898 238.994,7.016 239.760 C 7.134 240.527,7.282 241.239,7.344 241.342 C 7.407 241.445,7.471 241.785,7.488 242.099 C 7.504 242.412,7.616 243.024,7.736 243.460 C 7.857 243.896,7.937 244.321,7.916 244.406 C 7.894 244.491,8.052 245.128,8.267 245.821 C 8.482 246.515,8.615 247.303,8.564 247.572 C 8.511 247.851,8.557 248.061,8.673 248.061 C 8.785 248.061,8.929 248.380,8.994 248.770 C 9.059 249.160,9.162 249.607,9.224 249.763 C 9.286 249.920,9.352 250.218,9.370 250.426 C 9.389 250.634,9.502 251.044,9.622 251.337 C 9.741 251.630,9.839 252.027,9.839 252.220 C 9.839 252.413,9.929 252.600,10.040 252.637 C 10.150 252.674,10.245 253.071,10.251 253.519 C 10.258 254.029,10.360 254.371,10.524 254.434 C 10.668 254.489,10.785 254.736,10.785 254.982 C 10.785 255.505,11.579 258.598,11.996 259.697 C 12.153 260.114,12.286 260.593,12.291 260.764 C 12.295 260.934,12.426 261.317,12.582 261.615 C 12.737 261.913,12.865 262.292,12.865 262.457 C 12.866 262.621,12.926 262.815,12.998 262.888 C 13.071 262.960,13.152 263.123,13.179 263.251 C 13.404 264.299,13.720 265.234,13.934 265.483 C 14.076 265.648,14.191 265.999,14.191 266.264 C 14.191 266.529,14.319 266.852,14.475 266.982 C 14.631 267.112,14.759 267.458,14.759 267.751 C 14.759 268.044,14.838 268.333,14.936 268.393 C 15.033 268.454,15.252 268.991,15.423 269.587 C 15.594 270.184,15.898 270.953,16.098 271.297 C 16.298 271.642,16.462 272.082,16.462 272.275 C 16.462 272.469,16.558 272.659,16.675 272.698 C 16.792 272.737,16.907 272.936,16.929 273.139 C 17.027 274.010,17.279 274.723,17.524 274.816 C 17.668 274.872,17.786 275.128,17.786 275.385 C 17.786 275.642,17.871 275.905,17.975 275.970 C 18.079 276.034,18.165 276.232,18.165 276.409 C 18.165 276.587,18.335 277.050,18.543 277.438 C 18.751 277.827,18.925 278.294,18.928 278.476 C 18.932 278.659,19.137 279.055,19.384 279.357 C 19.631 279.659,19.788 280.024,19.733 280.169 C 19.678 280.313,19.771 280.583,19.940 280.770 C 20.109 280.957,20.375 281.538,20.530 282.062 C 20.686 282.585,20.983 283.230,21.192 283.495 C 21.400 283.760,21.570 284.084,21.570 284.216 C 21.570 284.347,21.687 284.589,21.830 284.753 C 21.973 284.918,22.233 285.494,22.409 286.035 C 22.585 286.575,22.882 287.214,23.070 287.454 C 23.257 287.694,23.476 288.103,23.555 288.363 C 23.635 288.623,23.944 289.172,24.243 289.583 C 24.542 289.994,24.787 290.569,24.787 290.860 C 24.787 291.152,24.852 291.391,24.931 291.391 C 25.093 291.391,25.194 291.562,26.053 293.295 C 26.385 293.965,26.875 294.806,27.141 295.164 C 27.407 295.523,27.625 295.999,27.625 296.223 C 27.625 296.447,27.796 296.784,28.004 296.973 C 28.212 297.161,28.382 297.402,28.382 297.507 C 28.382 297.613,28.501 297.834,28.647 297.998 C 29.249 298.678,29.679 299.668,29.465 299.882 C 29.311 300.036,29.391 300.234,29.765 300.624 C 30.045 300.917,30.274 301.258,30.274 301.382 C 30.274 301.507,30.346 301.608,30.433 301.608 C 30.521 301.608,30.692 301.800,30.815 302.034 C 30.937 302.268,31.289 302.800,31.596 303.217 C 31.903 303.633,32.157 304.086,32.160 304.224 C 32.164 304.361,32.273 304.592,32.403 304.737 C 32.948 305.345,33.113 305.575,33.113 305.728 C 33.113 305.817,33.367 306.133,33.678 306.431 C 34.339 307.065,34.665 306.968,36.013 305.736 C 36.434 305.351,36.848 305.079,36.934 305.132 C 37.019 305.184,37.140 305.094,37.202 304.932 C 37.265 304.769,37.430 304.636,37.569 304.636 C 37.708 304.636,37.940 304.466,38.086 304.259 C 38.231 304.051,38.408 303.939,38.479 304.011 C 38.550 304.082,38.739 303.953,38.899 303.726 C 39.058 303.498,39.308 303.311,39.453 303.311 C 39.598 303.311,39.784 303.205,39.868 303.075 C 39.951 302.945,40.307 302.677,40.660 302.481 C 41.013 302.284,41.460 301.986,41.653 301.819 C 41.847 301.651,42.169 301.372,42.368 301.198 C 42.568 301.025,42.783 300.935,42.846 300.998 C 42.909 301.061,43.091 300.926,43.251 300.698 C 43.410 300.470,43.655 300.284,43.794 300.284 C 43.933 300.284,44.098 300.151,44.160 299.988 C 44.222 299.825,44.350 299.739,44.443 299.797 C 44.536 299.854,44.941 299.597,45.343 299.225 C 45.745 298.853,46.383 298.390,46.760 298.195 C 47.137 298.000,47.497 297.709,47.558 297.548 C 47.620 297.388,47.790 297.256,47.937 297.256 C 48.083 297.256,48.309 297.130,48.437 296.975 C 48.566 296.820,48.747 296.740,48.840 296.797 C 48.933 296.855,49.061 296.768,49.123 296.605 C 49.186 296.442,49.544 296.163,49.920 295.985 C 50.295 295.806,50.746 295.530,50.921 295.371 C 51.096 295.211,51.463 294.877,51.737 294.629 C 52.011 294.381,52.289 294.231,52.354 294.297 C 52.420 294.362,52.593 294.245,52.740 294.035 C 52.886 293.826,53.080 293.701,53.171 293.757 C 53.261 293.813,53.404 293.750,53.489 293.618 C 53.635 293.389,54.125 293.034,54.633 292.790 C 54.761 292.728,55.229 292.345,55.673 291.939 C 56.117 291.534,56.558 291.202,56.652 291.202 C 56.746 291.202,57.129 290.968,57.503 290.682 C 57.877 290.396,58.245 290.182,58.320 290.207 C 58.395 290.232,58.547 290.082,58.658 289.875 C 58.768 289.668,58.987 289.499,59.142 289.499 C 59.298 289.499,59.476 289.366,59.538 289.204 C 59.601 289.042,59.753 288.948,59.877 288.996 C 60.001 289.043,60.204 288.921,60.327 288.723 C 60.451 288.525,60.636 288.363,60.740 288.363 C 60.843 288.363,61.097 288.214,61.306 288.032 C 61.514 287.850,61.861 287.545,62.078 287.354 C 62.295 287.163,62.515 287.050,62.567 287.102 C 62.619 287.154,62.825 287.055,63.024 286.881 C 63.224 286.708,63.550 286.424,63.750 286.250 C 63.949 286.077,64.164 285.987,64.227 286.050 C 64.290 286.113,64.472 285.978,64.632 285.750 C 64.792 285.522,65.025 285.336,65.150 285.336 C 65.275 285.336,65.484 285.166,65.614 284.957 C 65.744 284.749,65.950 284.579,66.073 284.579 C 66.196 284.579,66.784 284.196,67.380 283.728 C 67.976 283.259,68.556 282.876,68.669 282.876 C 68.782 282.876,68.874 282.801,68.874 282.709 C 68.874 282.617,69.023 282.488,69.205 282.422 C 69.809 282.204,70.450 281.773,70.619 281.471 C 70.710 281.307,70.904 281.173,71.050 281.173 C 71.196 281.173,71.383 281.056,71.466 280.912 C 71.550 280.769,71.919 280.491,72.286 280.296 C 72.944 279.946,73.261 279.714,74.012 279.029 C 74.222 278.838,74.434 278.722,74.483 278.772 C 74.533 278.822,74.773 278.680,75.017 278.457 C 75.752 277.784,76.020 277.596,76.111 277.688 C 76.159 277.735,76.572 277.432,77.030 277.014 C 77.487 276.596,77.959 276.254,78.078 276.254 C 78.197 276.254,78.347 276.117,78.411 275.950 C 78.475 275.783,78.639 275.690,78.776 275.742 C 78.912 275.794,79.127 275.672,79.253 275.470 C 79.379 275.269,79.561 275.152,79.656 275.211 C 79.752 275.270,79.922 275.145,80.035 274.934 C 80.148 274.723,80.356 274.551,80.497 274.551 C 80.639 274.551,80.803 274.423,80.863 274.267 C 80.923 274.111,81.092 273.983,81.239 273.983 C 81.385 273.983,81.609 273.858,81.736 273.705 C 81.863 273.552,82.022 273.446,82.090 273.469 C 82.158 273.491,82.405 273.340,82.640 273.132 C 82.874 272.923,83.243 272.597,83.459 272.406 C 83.676 272.215,83.903 272.108,83.963 272.168 C 84.023 272.229,84.191 272.108,84.336 271.900 C 84.482 271.693,84.723 271.523,84.874 271.523 C 85.024 271.523,85.147 271.438,85.147 271.334 C 85.147 271.230,85.296 271.145,85.480 271.145 C 85.663 271.145,85.921 270.971,86.053 270.759 C 86.186 270.547,86.367 270.418,86.457 270.474 C 86.546 270.529,86.758 270.362,86.928 270.102 C 87.098 269.843,87.362 269.631,87.516 269.631 C 87.670 269.631,87.796 269.554,87.796 269.461 C 87.796 269.367,88.158 269.103,88.600 268.874 C 89.042 268.644,89.472 268.337,89.555 268.192 C 89.639 268.047,89.830 267.928,89.981 267.928 C 90.132 267.928,90.255 267.841,90.255 267.734 C 90.255 267.628,90.468 267.459,90.728 267.360 C 90.989 267.262,91.202 267.113,91.202 267.030 C 91.202 266.947,91.521 266.713,91.911 266.511 C 92.632 266.138,92.857 265.977,93.614 265.288 C 93.848 265.075,94.105 264.922,94.185 264.948 C 94.328 264.994,94.626 264.780,95.394 264.081 C 95.603 263.890,95.823 263.783,95.883 263.843 C 95.943 263.903,96.111 263.782,96.257 263.575 C 96.402 263.367,96.641 263.198,96.787 263.198 C 96.934 263.198,97.145 263.027,97.256 262.819 C 97.368 262.611,97.566 262.441,97.696 262.441 C 97.826 262.441,98.228 262.189,98.588 261.881 C 98.948 261.573,99.345 261.318,99.470 261.313 C 99.595 261.309,99.765 261.199,99.849 261.069 C 99.932 260.939,100.170 260.738,100.378 260.623 C 100.865 260.354,100.977 259.783,100.587 259.564 C 100.420 259.471,100.284 259.324,100.284 259.238 C 100.284 259.151,99.986 258.586,99.622 257.981 C 99.257 257.376,98.959 256.766,98.959 256.626 C 98.959 256.485,98.803 256.202,98.612 255.997 C 98.421 255.792,97.979 255.051,97.629 254.350 C 97.279 253.648,96.927 253.047,96.847 253.014 C 96.766 252.980,96.644 252.639,96.575 252.257 C 96.507 251.874,96.369 251.458,96.270 251.333 C 95.977 250.964,95.364 249.702,95.364 249.469 C 95.364 249.350,95.194 249.057,94.986 248.817 C 94.778 248.577,94.607 248.192,94.607 247.960 C 94.607 247.729,94.480 247.433,94.324 247.304 C 94.167 247.174,94.039 246.972,94.039 246.855 C 94.038 246.737,93.928 246.429,93.794 246.168 C 93.659 245.908,93.364 245.142,93.137 244.465 C 92.909 243.789,92.551 242.898,92.341 242.486 C 92.131 242.074,91.958 241.551,91.958 241.324 C 91.958 241.097,91.831 240.862,91.675 240.802 C 91.518 240.742,91.391 240.480,91.391 240.219 C 91.391 239.959,91.175 239.258,90.912 238.663 C 90.648 238.067,90.474 237.471,90.525 237.339 C 90.576 237.207,90.536 237.048,90.436 236.986 C 90.337 236.925,90.255 236.743,90.255 236.583 C 90.255 236.423,90.138 236.024,89.994 235.696 C 89.633 234.873,89.405 234.170,89.035 232.734 C 88.860 232.058,88.638 231.243,88.540 230.923 C 88.443 230.604,88.363 230.199,88.363 230.024 C 88.363 229.850,88.269 229.707,88.154 229.707 C 88.038 229.707,87.997 229.569,88.062 229.399 C 88.127 229.230,88.106 228.995,88.014 228.879 C 87.923 228.762,87.793 228.249,87.727 227.739 C 87.660 227.229,87.529 226.718,87.435 226.604 C 87.341 226.489,87.205 225.885,87.133 225.260 C 87.061 224.636,86.875 223.674,86.720 223.122 C 86.565 222.570,86.365 221.506,86.276 220.757 C 86.039 218.777,85.722 216.991,85.531 216.556 C 85.440 216.348,85.312 215.241,85.247 214.096 C 85.073 211.034,84.952 209.437,84.844 208.798 C 84.589 207.284,84.477 198.358,84.678 195.553 C 84.730 194.825,84.809 193.718,84.853 193.094 C 84.897 192.469,85.030 190.851,85.149 189.499 C 85.269 188.146,85.391 186.729,85.421 186.350 C 85.452 185.972,85.521 185.588,85.574 185.499 C 85.628 185.409,85.733 184.697,85.808 183.917 C 85.884 183.136,86.031 182.392,86.135 182.264 C 86.239 182.135,86.272 181.893,86.208 181.726 C 86.144 181.559,86.155 181.324,86.233 181.203 C 86.311 181.083,86.476 180.345,86.598 179.565 C 86.721 178.784,86.878 177.933,86.947 177.673 C 87.017 177.412,87.119 176.753,87.174 176.206 C 87.230 175.660,87.347 175.213,87.434 175.213 C 87.522 175.213,87.650 174.785,87.719 174.263 C 87.789 173.740,87.916 173.269,88.001 173.216 C 88.087 173.163,88.214 172.612,88.284 171.990 C 88.355 171.369,88.477 170.861,88.556 170.861 C 88.679 170.861,88.867 170.215,89.051 169.158 C 89.178 168.428,89.542 167.132,89.766 166.612 C 90.345 165.264,90.429 164.986,90.334 164.738 C 90.279 164.594,90.375 164.422,90.548 164.356 C 90.726 164.287,90.816 164.116,90.756 163.959 C 90.698 163.807,90.732 163.633,90.831 163.571 C 90.931 163.510,91.012 163.214,91.012 162.914 C 91.012 162.614,91.097 162.316,91.202 162.252 C 91.306 162.187,91.391 161.991,91.392 161.815 C 91.393 161.639,91.520 161.251,91.676 160.953 C 91.831 160.655,91.958 160.303,91.958 160.172 C 91.958 160.040,92.086 159.827,92.242 159.697 C 92.398 159.568,92.526 159.217,92.526 158.917 C 92.526 158.618,92.611 158.373,92.715 158.373 C 92.819 158.373,92.904 158.207,92.904 158.005 C 92.904 157.803,92.990 157.586,93.094 157.521 C 93.198 157.457,93.283 157.239,93.283 157.037 C 93.283 156.835,93.368 156.670,93.472 156.670 C 93.576 156.670,93.661 156.457,93.661 156.197 C 93.661 155.937,93.746 155.724,93.851 155.724 C 93.955 155.724,94.040 155.558,94.040 155.356 C 94.040 155.154,94.114 154.943,94.205 154.887 C 94.295 154.831,94.424 154.513,94.491 154.179 C 94.557 153.846,94.732 153.439,94.879 153.276 C 95.025 153.113,95.173 152.854,95.207 152.701 C 95.242 152.547,95.372 152.311,95.498 152.175 C 95.624 152.039,95.683 151.814,95.629 151.675 C 95.576 151.535,95.668 151.368,95.835 151.304 C 96.002 151.240,96.122 151.080,96.101 150.949 C 96.052 150.643,96.622 149.354,96.875 149.198 C 96.981 149.132,97.067 148.918,97.067 148.722 C 97.067 148.526,97.247 148.240,97.466 148.086 C 97.686 147.933,97.814 147.725,97.753 147.625 C 97.691 147.525,97.809 147.228,98.016 146.965 C 98.223 146.702,98.392 146.357,98.392 146.197 C 98.392 146.037,98.472 145.857,98.570 145.797 C 98.668 145.736,98.936 145.310,99.166 144.849 C 99.396 144.389,99.678 144.029,99.792 144.049 C 99.907 144.070,99.973 143.930,99.940 143.737 C 99.907 143.545,99.992 143.247,100.129 143.075 C 100.434 142.693,100.816 142.036,101.254 141.139 C 101.437 140.767,101.719 140.352,101.881 140.218 C 102.043 140.083,102.176 139.856,102.176 139.712 C 102.176 139.569,102.472 139.124,102.835 138.723 C 103.197 138.322,103.444 137.944,103.382 137.883 C 103.256 137.756,104.837 135.667,105.059 135.667 C 105.138 135.667,105.203 135.517,105.203 135.334 C 105.203 135.151,105.500 134.661,105.862 134.246 C 106.224 133.831,106.522 133.385,106.524 133.254 C 106.526 133.124,106.627 133.039,106.748 133.065 C 106.869 133.091,107.018 132.927,107.079 132.700 C 107.192 132.281,107.820 131.433,108.930 130.202 C 109.269 129.825,109.549 129.414,109.551 129.288 C 109.553 129.161,109.726 128.967,109.934 128.855 C 110.142 128.744,110.312 128.528,110.312 128.376 C 110.312 128.223,110.405 128.098,110.518 128.098 C 110.815 128.098,111.434 127.306,111.441 126.916 C 111.445 126.717,111.593 126.585,111.813 126.585 C 112.072 126.585,112.197 126.432,112.239 126.064 C 112.280 125.705,112.401 125.552,112.630 125.570 C 112.812 125.585,112.961 125.521,112.961 125.429 C 112.961 125.337,113.259 124.931,113.623 124.528 C 113.988 124.125,114.286 123.699,114.286 123.582 C 114.286 123.464,114.413 123.368,114.570 123.368 C 114.726 123.368,114.854 123.304,114.854 123.226 C 114.855 122.992,116.210 121.476,116.417 121.476 C 116.688 121.476,117.111 120.877,117.118 120.482 C 117.121 120.297,117.270 120.149,117.455 120.147 C 117.637 120.144,118.031 119.811,118.331 119.405 C 118.654 118.970,118.982 118.709,119.135 118.768 C 119.278 118.823,119.395 118.791,119.395 118.698 C 119.395 118.605,119.733 118.149,120.146 117.685 C 120.559 117.220,120.900 116.776,120.903 116.698 C 120.906 116.620,121.026 116.556,121.170 116.556 C 121.313 116.556,121.656 116.262,121.930 115.901 C 122.243 115.491,122.534 115.287,122.710 115.354 C 122.884 115.421,122.990 115.348,122.990 115.161 C 122.990 114.996,123.181 114.810,123.415 114.748 C 123.649 114.687,124.120 114.259,124.462 113.799 C 124.804 113.338,125.169 112.961,125.275 112.961 C 125.625 112.961,126.383 111.929,126.388 111.447 C 126.391 111.052,125.869 110.217,124.884 109.043 C 124.779 108.917,124.689 108.747,124.685 108.665 C 124.681 108.582,124.425 108.220,124.117 107.860 C 123.809 107.499,123.557 107.123,123.557 107.024 C 123.557 106.925,123.427 106.709,123.269 106.544 C 122.761 106.017,121.665 104.476,121.665 104.289 C 121.665 104.190,121.537 104.060,121.381 104.000 C 121.225 103.940,121.097 103.790,121.097 103.668 C 121.097 103.545,120.799 103.081,120.435 102.637 C 120.071 102.192,119.773 101.736,119.773 101.624 C 119.773 101.511,119.688 101.419,119.584 101.419 C 119.480 101.419,119.395 101.305,119.395 101.165 C 119.395 101.025,119.224 100.756,119.016 100.568 C 118.808 100.379,118.638 100.120,118.638 99.991 C 118.638 99.862,118.510 99.708,118.354 99.648 C 118.198 99.588,118.070 99.413,118.070 99.258 C 118.070 99.104,117.959 98.910,117.823 98.827 C 117.687 98.744,117.373 98.335,117.124 97.919 C 116.875 97.502,116.561 97.094,116.425 97.010 C 116.289 96.927,116.178 96.766,116.178 96.652 C 116.178 96.537,115.880 96.080,115.516 95.636 C 115.151 95.191,114.853 94.753,114.853 94.663 C 114.853 94.573,114.601 94.204,114.293 93.843 C 113.985 93.483,113.730 93.121,113.726 93.038 C 113.722 92.956,113.632 92.786,113.527 92.660 C 112.772 91.760,112.204 90.922,112.204 90.709 C 112.204 90.571,112.034 90.367,111.826 90.255 C 111.618 90.144,111.447 89.926,111.447 89.770 C 111.447 89.614,111.320 89.438,111.164 89.378 C 111.008 89.318,110.880 89.189,110.880 89.092 C 110.880 88.883,110.091 87.729,109.886 87.638 C 109.808 87.603,109.745 87.459,109.745 87.316 C 109.745 87.174,109.638 86.990,109.508 86.906 C 109.195 86.706,108.420 85.593,108.420 85.344 C 108.420 85.235,108.333 85.147,108.226 85.147 C 108.120 85.147,107.951 84.934,107.852 84.674 C 107.753 84.413,107.585 84.201,107.479 84.201 C 107.372 84.201,107.285 84.112,107.285 84.004 C 107.285 83.795,106.542 82.672,106.274 82.476 C 106.086 82.338,105.636 81.589,105.472 81.139 C 105.408 80.964,105.236 80.775,105.090 80.719 C 104.944 80.663,104.825 80.496,104.825 80.348 C 104.825 80.200,104.697 80.029,104.541 79.969 C 104.385 79.910,104.257 79.743,104.257 79.600 C 104.257 79.457,104.087 79.186,103.879 78.997 C 103.671 78.809,103.500 78.582,103.500 78.493 C 103.500 78.404,103.032 77.698,102.460 76.924 C 101.887 76.150,101.419 75.467,101.419 75.407 C 101.419 75.346,101.100 74.885,100.710 74.382 C 100.319 73.879,99.872 73.278,99.716 73.046 C 99.560 72.815,99.262 72.431,99.054 72.193 C 98.846 71.956,98.505 71.477,98.297 71.129 C 98.089 70.781,97.769 70.280,97.585 70.016 C 97.402 69.752,97.200 69.387,97.138 69.205 C 97.075 69.023,96.946 68.874,96.851 68.874 C 96.757 68.874,96.598 68.661,96.500 68.401 C 96.401 68.141,96.232 67.928,96.126 67.928 C 96.019 67.928,95.932 67.836,95.932 67.723 C 95.932 67.611,95.634 67.155,95.270 66.711 C 94.905 66.266,94.607 65.805,94.607 65.685 C 94.607 65.566,94.520 65.468,94.413 65.468 C 94.307 65.468,94.137 65.277,94.036 65.043 C 93.750 64.382,93.408 63.889,93.046 63.616 C 92.864 63.478,92.715 63.261,92.715 63.133 C 92.715 63.004,92.463 62.605,92.155 62.245 C 91.847 61.884,91.592 61.522,91.588 61.440 C 91.583 61.357,91.494 61.187,91.389 61.061 C 90.740 60.285,89.688 58.868,89.688 58.772 C 89.688 58.668,88.254 56.616,87.796 56.063 C 87.692 55.937,87.606 55.776,87.606 55.704 C 87.606 55.632,87.308 55.210,86.944 54.765 C 86.580 54.321,86.282 53.872,86.282 53.768 C 86.282 53.664,86.218 53.551,86.140 53.516 C 85.977 53.444,85.147 52.290,85.147 52.136 C 85.147 52.080,84.998 51.870,84.816 51.669 C 84.309 51.111,84.132 50.868,83.637 50.047 C 83.386 49.631,83.070 49.222,82.934 49.139 C 82.798 49.056,82.687 48.894,82.687 48.780 C 82.687 48.666,82.389 48.209,82.025 47.764 C 81.660 47.320,81.362 46.864,81.362 46.752 C 81.362 46.639,81.277 46.547,81.173 46.547 C 81.069 46.547,80.984 46.433,80.984 46.294 C 80.984 46.033,79.963 45.029,79.708 45.039 C 79.629 45.042,79.395 45.140,79.186 45.256 " stroke="none" fill="#9fbb1a" fill-rule="evenodd"></path><path id="path7" d="M190.728 4.092 C 190.364 4.223,189.799 4.285,189.473 4.229 C 189.135 4.172,188.824 4.219,188.750 4.338 C 188.679 4.453,188.530 4.491,188.419 4.423 C 188.117 4.236,186.136 4.191,185.800 4.363 C 185.639 4.446,184.674 4.555,183.655 4.606 C 182.637 4.658,181.757 4.746,181.700 4.803 C 181.643 4.860,181.445 4.825,181.260 4.726 C 181.028 4.602,180.702 4.639,180.211 4.844 C 179.819 5.008,179.236 5.103,178.916 5.056 C 178.597 5.009,178.153 5.054,177.930 5.155 C 177.665 5.276,177.408 5.275,177.188 5.151 C 176.939 5.012,176.677 5.060,176.193 5.332 C 175.705 5.606,175.498 5.643,175.395 5.476 C 175.317 5.350,175.150 5.315,175.018 5.396 C 174.731 5.574,173.781 5.731,173.132 5.709 C 172.871 5.700,172.531 5.745,172.375 5.809 C 172.219 5.872,171.835 5.942,171.523 5.964 C 171.211 5.986,170.805 6.068,170.621 6.145 C 170.437 6.223,170.057 6.243,169.775 6.189 C 169.494 6.135,168.963 6.205,168.596 6.343 C 168.229 6.481,167.673 6.577,167.360 6.556 C 167.048 6.534,166.553 6.631,166.259 6.771 C 165.966 6.910,165.540 7.007,165.313 6.985 C 165.086 6.963,164.773 6.996,164.617 7.059 C 164.461 7.122,163.936 7.213,163.450 7.261 C 162.965 7.310,162.403 7.437,162.203 7.544 C 162.003 7.651,161.464 7.761,161.005 7.788 C 160.547 7.815,159.865 7.985,159.491 8.166 C 159.117 8.347,158.627 8.447,158.401 8.388 C 158.176 8.329,157.886 8.367,157.757 8.472 C 157.627 8.576,157.223 8.661,156.859 8.658 C 156.495 8.656,155.899 8.785,155.535 8.945 C 155.170 9.104,154.532 9.288,154.115 9.354 C 153.699 9.419,153.018 9.570,152.602 9.689 C 152.185 9.809,151.771 9.888,151.680 9.865 C 151.589 9.842,151.079 9.974,150.545 10.156 C 150.011 10.339,149.404 10.494,149.196 10.501 C 148.988 10.508,148.711 10.580,148.582 10.660 C 148.452 10.741,148.160 10.842,147.933 10.886 C 147.706 10.930,147.466 11.054,147.399 11.162 C 147.333 11.270,146.854 11.388,146.337 11.424 C 145.819 11.460,145.229 11.581,145.025 11.691 C 144.416 12.023,143.918 12.170,143.561 12.126 C 143.375 12.103,142.854 12.291,142.402 12.543 C 141.806 12.877,141.492 12.953,141.259 12.823 C 141.031 12.696,140.841 12.731,140.605 12.944 C 140.423 13.110,140.221 13.245,140.158 13.245 C 140.095 13.245,139.804 13.342,139.511 13.461 C 139.218 13.580,138.851 13.703,138.694 13.735 C 137.405 14.000,136.837 14.157,136.471 14.348 C 135.438 14.886,135.267 14.948,134.805 14.948 C 134.536 14.948,134.188 15.076,134.032 15.232 C 133.876 15.388,133.551 15.516,133.311 15.516 C 133.071 15.516,132.768 15.644,132.638 15.802 C 132.460 16.015,132.336 16.035,132.148 15.879 C 131.958 15.721,131.744 15.777,131.277 16.110 C 130.937 16.353,130.518 16.527,130.348 16.498 C 130.177 16.469,129.991 16.567,129.934 16.715 C 129.877 16.863,129.210 17.172,128.451 17.403 C 127.692 17.633,126.900 17.942,126.691 18.088 C 126.482 18.234,126.171 18.354,126.000 18.354 C 125.829 18.354,125.479 18.520,125.221 18.722 C 124.961 18.927,124.590 19.048,124.387 18.995 C 124.177 18.940,123.727 19.099,123.331 19.367 C 122.952 19.625,122.597 19.791,122.543 19.736 C 122.488 19.682,122.192 19.817,121.883 20.036 C 121.575 20.256,121.143 20.435,120.923 20.435 C 120.702 20.435,120.185 20.648,119.773 20.908 C 119.361 21.168,118.958 21.383,118.878 21.385 C 118.798 21.387,117.966 21.769,117.029 22.235 C 116.093 22.701,115.172 23.082,114.983 23.083 C 114.794 23.084,114.368 23.289,114.037 23.539 C 113.705 23.789,113.117 24.124,112.729 24.284 C 112.341 24.444,111.836 24.750,111.605 24.965 C 111.172 25.369,111.017 25.422,110.449 25.364 C 110.263 25.345,109.604 25.675,108.984 26.099 C 108.364 26.522,107.767 26.868,107.657 26.868 C 107.548 26.868,106.986 27.217,106.409 27.643 C 105.732 28.143,105.231 28.384,104.995 28.322 C 104.763 28.262,104.208 28.515,103.479 29.014 C 102.847 29.447,102.189 29.886,102.016 29.991 C 101.844 30.095,101.650 30.253,101.585 30.342 C 101.520 30.431,101.290 30.448,101.075 30.380 C 100.804 30.294,100.435 30.433,99.869 30.835 C 99.421 31.154,98.845 31.562,98.591 31.743 C 98.336 31.924,97.760 32.349,97.312 32.687 C 96.863 33.025,96.412 33.302,96.309 33.302 C 96.206 33.302,96.121 33.387,96.121 33.491 C 96.121 33.595,96.032 33.680,95.924 33.680 C 95.815 33.680,95.624 33.763,95.498 33.865 C 95.372 33.966,95.019 34.252,94.713 34.501 L 94.157 34.952 94.848 35.972 C 95.229 36.533,96.117 37.818,96.824 38.829 C 97.530 39.840,98.482 41.202,98.939 41.857 C 99.396 42.511,100.152 43.600,100.618 44.276 C 101.085 44.953,101.626 45.682,101.821 45.897 C 102.016 46.112,102.176 46.351,102.176 46.428 C 102.176 46.506,102.474 46.969,102.838 47.457 C 103.690 48.598,103.846 48.816,104.594 49.902 C 105.327 50.967,108.212 55.098,108.792 55.913 C 109.014 56.225,109.932 57.545,110.832 58.846 C 111.732 60.147,112.515 61.254,112.573 61.306 C 112.631 61.358,112.934 61.783,113.246 62.252 C 113.557 62.720,113.878 63.188,113.957 63.292 C 114.786 64.376,115.421 65.277,115.421 65.371 C 115.421 65.434,115.825 66.032,116.320 66.700 C 117.956 68.911,118.920 70.264,119.016 70.484 C 119.068 70.604,119.648 71.461,120.305 72.390 C 124.511 78.336,125.354 79.540,126.329 80.984 C 126.926 81.868,127.674 82.929,127.993 83.340 C 128.311 83.751,128.657 84.236,128.761 84.418 C 128.933 84.718,130.457 86.906,132.027 89.106 C 132.367 89.582,133.022 90.525,133.484 91.202 C 133.945 91.878,134.716 92.985,135.198 93.661 C 135.680 94.338,136.301 95.232,136.580 95.648 C 136.858 96.064,137.171 96.501,137.275 96.618 C 137.379 96.736,137.574 96.991,137.707 97.186 C 137.840 97.381,138.421 98.221,138.998 99.054 C 139.575 99.886,140.190 100.801,140.364 101.087 C 140.778 101.764,141.053 101.743,142.264 100.946 C 142.817 100.581,143.341 100.326,143.427 100.380 C 143.513 100.433,143.697 100.366,143.835 100.231 C 144.299 99.780,145.901 98.770,146.152 98.770 C 146.289 98.770,146.618 98.600,146.882 98.392 C 147.147 98.184,147.483 98.013,147.628 98.013 C 147.774 98.013,148.059 97.888,148.261 97.735 C 148.463 97.583,148.726 97.455,148.846 97.452 C 148.965 97.448,149.509 97.145,150.055 96.778 C 150.600 96.411,151.089 96.153,151.140 96.205 C 151.192 96.257,151.483 96.122,151.786 95.906 C 152.118 95.670,152.519 95.548,152.792 95.600 C 153.102 95.659,153.457 95.512,153.915 95.135 C 154.284 94.831,154.661 94.630,154.754 94.687 C 154.846 94.744,155.137 94.622,155.400 94.416 C 155.663 94.209,156.064 94.040,156.292 94.040 C 156.699 94.040,156.919 93.949,158.510 93.124 C 158.950 92.896,159.546 92.677,159.835 92.638 C 160.332 92.572,161.122 92.273,162.479 91.639 C 162.812 91.484,163.157 91.402,163.247 91.457 C 163.337 91.513,163.916 91.315,164.534 91.018 C 165.152 90.721,165.730 90.547,165.818 90.631 C 165.907 90.716,166.439 90.574,167.002 90.317 C 167.565 90.059,168.344 89.809,168.733 89.762 C 169.521 89.665,170.644 89.319,170.995 89.064 C 171.120 88.973,171.298 88.945,171.391 89.002 C 171.483 89.059,171.986 88.944,172.508 88.746 C 173.207 88.480,173.512 88.441,173.668 88.597 C 173.824 88.753,173.972 88.725,174.230 88.491 C 174.423 88.317,174.760 88.174,174.980 88.174 C 175.200 88.174,175.429 88.095,175.489 87.997 C 175.549 87.900,175.894 87.869,176.255 87.927 C 176.638 87.989,177.025 87.941,177.181 87.811 C 177.329 87.688,177.822 87.566,178.277 87.539 C 178.732 87.512,179.217 87.420,179.356 87.335 C 179.494 87.249,180.025 87.157,180.536 87.129 C 181.047 87.102,181.577 86.986,181.715 86.871 C 181.852 86.757,182.016 86.715,182.079 86.778 C 182.142 86.841,182.631 86.787,183.166 86.659 C 183.701 86.530,184.664 86.406,185.305 86.382 C 185.946 86.358,186.641 86.288,186.850 86.226 C 187.397 86.063,191.399 85.731,194.229 85.613 C 198.932 85.416,201.514 85.397,201.514 85.558 C 201.514 85.654,201.635 85.665,201.783 85.582 C 201.992 85.464,204.170 85.524,206.339 85.706 C 206.505 85.720,207.806 85.733,209.555 85.737 C 209.868 85.738,210.251 85.786,210.407 85.844 C 210.703 85.954,211.110 86.005,212.895 86.157 C 213.483 86.207,214.121 86.329,214.314 86.429 C 214.507 86.528,214.771 86.571,214.901 86.524 C 215.032 86.477,216.032 86.579,217.124 86.751 C 218.216 86.922,219.182 87.017,219.271 86.962 C 219.360 86.907,219.595 86.980,219.792 87.124 C 220.057 87.317,220.216 87.331,220.402 87.177 C 220.589 87.022,220.696 87.038,220.821 87.240 C 220.913 87.390,221.141 87.528,221.327 87.547 C 221.513 87.566,222.067 87.623,222.558 87.674 C 223.049 87.725,223.519 87.808,223.603 87.860 C 223.686 87.911,224.136 88.011,224.602 88.080 C 225.068 88.150,225.542 88.284,225.656 88.378 C 225.770 88.472,225.910 88.502,225.967 88.445 C 226.024 88.388,226.570 88.486,227.179 88.664 C 227.789 88.841,228.415 89.001,228.571 89.019 C 228.728 89.037,229.111 89.160,229.423 89.293 C 229.735 89.426,230.309 89.547,230.699 89.564 C 231.089 89.580,231.408 89.657,231.409 89.735 C 231.409 89.813,231.527 89.877,231.669 89.877 C 231.812 89.877,232.329 90.054,232.818 90.270 C 233.308 90.487,233.820 90.621,233.956 90.568 C 234.093 90.516,234.380 90.596,234.594 90.746 C 234.809 90.896,235.053 90.997,235.136 90.971 C 235.220 90.944,235.544 91.016,235.856 91.130 C 236.168 91.244,236.764 91.446,237.181 91.578 C 237.597 91.710,238.273 91.977,238.683 92.172 C 239.092 92.367,239.620 92.526,239.854 92.526 C 240.089 92.526,240.333 92.611,240.397 92.715 C 240.462 92.819,240.672 92.904,240.866 92.904 C 241.059 92.904,241.246 92.970,241.280 93.049 C 241.315 93.129,242.092 93.441,243.007 93.742 C 243.922 94.043,244.740 94.414,244.825 94.566 C 244.910 94.718,245.209 94.868,245.491 94.899 C 245.772 94.930,246.657 95.268,247.457 95.650 C 248.834 96.308,249.689 96.696,250.331 96.956 C 250.487 97.020,250.870 97.234,251.183 97.434 C 251.495 97.633,251.870 97.803,252.016 97.810 C 252.162 97.818,252.561 98.037,252.902 98.297 C 253.243 98.557,253.630 98.770,253.762 98.770 C 253.893 98.770,254.317 98.989,254.704 99.257 C 255.091 99.526,255.524 99.762,255.666 99.783 C 255.808 99.804,256.191 100.010,256.516 100.242 C 256.841 100.473,257.206 100.662,257.327 100.662 C 257.449 100.662,257.667 100.769,257.812 100.899 C 258.456 101.477,258.653 101.600,259.113 101.716 C 259.382 101.783,259.603 101.966,259.603 102.122 C 259.603 102.289,259.713 102.363,259.871 102.303 C 260.018 102.246,260.183 102.314,260.236 102.453 C 260.289 102.592,260.632 102.804,260.996 102.924 C 261.361 103.045,261.982 103.439,262.376 103.799 C 262.770 104.160,263.182 104.421,263.291 104.379 C 263.401 104.336,263.783 104.590,264.139 104.942 C 264.496 105.294,264.924 105.582,265.091 105.582 C 265.258 105.582,265.962 106.050,266.656 106.623 C 267.350 107.195,268.005 107.663,268.112 107.663 C 268.219 107.663,268.307 107.748,268.307 107.852 C 268.307 107.956,268.436 108.042,268.594 108.042 C 268.753 108.042,268.979 108.254,269.098 108.515 C 269.221 108.785,269.472 108.988,269.684 108.988 C 269.887 108.988,270.385 109.329,270.790 109.746 C 271.194 110.163,271.706 110.532,271.926 110.565 C 272.147 110.599,272.441 110.832,272.581 111.084 C 272.720 111.336,272.837 111.460,272.841 111.360 C 272.845 111.261,273.167 111.516,273.557 111.928 C 274.300 112.712,274.800 113.086,275.355 113.273 C 275.537 113.334,275.686 113.449,275.686 113.528 C 275.686 113.825,277.572 115.636,277.760 115.520 C 277.868 115.453,278.135 115.702,278.353 116.072 C 278.572 116.442,278.827 116.698,278.921 116.640 C 279.015 116.582,279.258 116.817,279.462 117.162 C 279.665 117.507,280.105 117.951,280.439 118.148 C 281.049 118.508,282.687 120.109,282.687 120.345 C 282.687 120.579,283.386 121.281,283.503 121.164 C 283.567 121.101,283.720 121.271,283.844 121.542 C 283.968 121.814,284.213 122.082,284.388 122.138 C 284.564 122.193,284.820 122.449,284.957 122.706 C 285.095 122.962,285.369 123.224,285.567 123.287 C 285.765 123.349,286.020 123.606,286.135 123.857 C 286.249 124.109,286.414 124.314,286.502 124.314 C 286.589 124.314,286.660 124.442,286.660 124.598 C 286.660 124.754,286.740 124.882,286.837 124.882 C 286.934 124.882,287.066 125.048,287.130 125.250 C 287.195 125.453,287.395 125.666,287.575 125.723 C 287.755 125.781,288.042 126.062,288.213 126.348 C 288.945 127.577,289.576 128.101,289.881 127.732 C 290.035 127.546,290.416 127.253,290.728 127.080 C 291.041 126.907,291.807 126.381,292.431 125.911 C 293.056 125.441,293.716 125.007,293.898 124.947 C 294.080 124.887,294.229 124.767,294.229 124.681 C 294.229 124.595,294.437 124.413,294.691 124.277 C 295.220 123.994,297.304 122.597,297.446 122.430 C 297.498 122.369,297.753 122.176,298.013 122.002 C 298.273 121.828,298.912 121.380,299.432 121.007 C 299.953 120.634,300.712 120.108,301.120 119.839 C 301.529 119.569,302.034 119.189,302.244 118.993 C 302.454 118.798,302.730 118.638,302.858 118.638 C 302.986 118.638,303.119 118.570,303.154 118.487 C 303.188 118.404,303.898 117.873,304.730 117.306 C 305.563 116.740,306.287 116.225,306.339 116.161 C 306.391 116.097,306.807 115.798,307.263 115.497 C 308.823 114.465,309.129 114.251,310.763 113.052 C 311.192 112.738,312.053 112.146,312.677 111.736 C 313.302 111.326,313.898 110.924,314.002 110.843 C 314.520 110.440,315.959 109.416,316.457 109.096 C 316.766 108.897,317.187 108.578,317.391 108.388 C 317.596 108.197,317.848 108.042,317.952 108.042 C 318.055 108.042,318.334 107.859,318.571 107.637 C 318.808 107.414,319.161 107.138,319.356 107.022 C 319.885 106.708,321.547 105.551,323.463 104.163 C 324.399 103.484,325.302 102.866,325.469 102.789 C 325.636 102.712,326.019 102.458,326.321 102.224 C 326.622 101.991,327.252 101.502,327.720 101.138 C 328.188 100.774,328.644 100.476,328.733 100.475 C 328.822 100.474,329.163 100.259,329.490 99.997 C 329.817 99.735,330.177 99.448,330.289 99.358 C 330.401 99.268,330.860 98.950,331.308 98.651 C 331.756 98.352,332.440 97.895,332.829 97.635 C 333.217 97.375,333.902 96.917,334.350 96.619 C 334.798 96.320,335.256 95.996,335.368 95.900 C 335.608 95.694,337.379 94.421,338.282 93.806 C 338.627 93.570,339.150 93.186,339.444 92.952 C 339.738 92.718,340.066 92.526,340.172 92.526 C 340.279 92.526,340.394 92.456,340.429 92.371 C 340.488 92.225,340.999 91.856,343.992 89.798 C 344.669 89.333,345.310 88.877,345.416 88.785 C 345.523 88.692,345.864 88.454,346.173 88.255 C 346.483 88.057,347.086 87.638,347.515 87.324 C 349.323 86.002,351.509 84.476,352.195 84.057 C 352.492 83.876,353.295 83.314,353.981 82.808 C 354.667 82.303,355.425 81.799,355.665 81.690 C 356.209 81.442,356.225 80.909,355.707 80.361 C 355.489 80.131,354.905 79.342,354.408 78.606 C 351.941 74.954,351.625 74.551,351.234 74.551 C 350.972 74.551,350.426 74.114,350.426 73.903 C 350.426 73.567,348.578 71.305,348.232 71.218 C 348.005 71.161,347.506 70.660,347.123 70.104 C 346.740 69.549,346.319 69.053,346.186 69.002 C 346.053 68.951,345.633 68.440,345.253 67.866 C 344.872 67.293,344.262 66.640,343.898 66.415 C 343.534 66.189,343.236 65.944,343.236 65.869 C 343.236 65.795,342.767 65.243,342.195 64.642 C 341.623 64.042,341.154 63.478,341.154 63.389 C 341.154 63.301,340.835 63.035,340.445 62.798 C 340.054 62.561,339.661 62.246,339.571 62.098 C 339.481 61.950,339.077 61.488,338.672 61.071 C 338.268 60.655,337.938 60.245,337.938 60.160 C 337.938 60.076,337.773 59.954,337.573 59.891 C 337.372 59.827,337.035 59.481,336.822 59.121 C 336.610 58.762,336.306 58.467,336.146 58.467 C 335.987 58.467,335.856 58.382,335.856 58.278 C 335.856 58.174,335.772 58.089,335.669 58.089 C 335.566 58.089,335.162 57.736,334.771 57.304 C 333.770 56.200,332.960 55.440,332.783 55.440 C 332.588 55.440,330.937 53.717,330.937 53.514 C 330.937 53.428,330.824 53.359,330.687 53.359 C 330.550 53.359,330.151 53.103,329.801 52.791 C 329.452 52.479,329.114 52.223,329.051 52.223 C 328.988 52.223,328.786 51.968,328.602 51.656 C 328.417 51.343,328.149 51.088,328.006 51.088 C 327.863 51.088,327.691 50.918,327.625 50.710 C 327.510 50.348,327.323 50.254,326.836 50.314 C 326.713 50.329,326.559 50.169,326.492 49.958 C 326.425 49.747,326.254 49.574,326.112 49.574 C 325.970 49.574,325.676 49.325,325.458 49.019 C 325.241 48.714,324.873 48.437,324.641 48.404 C 324.409 48.371,324.135 48.153,324.033 47.919 C 323.930 47.684,323.743 47.493,323.616 47.493 C 323.490 47.493,323.319 47.380,323.236 47.242 C 323.152 47.103,322.807 46.830,322.469 46.633 C 322.131 46.437,321.854 46.209,321.854 46.128 C 321.854 46.046,321.764 45.979,321.654 45.979 C 321.544 45.979,321.037 45.543,320.526 45.010 C 319.887 44.344,319.501 44.078,319.289 44.160 C 319.083 44.239,318.950 44.158,318.886 43.916 C 318.834 43.717,318.629 43.512,318.431 43.460 C 318.232 43.408,318.070 43.239,318.070 43.084 C 318.070 42.779,317.569 42.510,317.304 42.673 C 317.214 42.729,316.817 42.432,316.422 42.012 C 316.028 41.593,315.573 41.249,315.411 41.249 C 315.250 41.249,314.654 40.842,314.087 40.345 C 313.520 39.847,312.822 39.338,312.535 39.213 C 312.249 39.089,312.015 38.899,312.015 38.793 C 312.015 38.687,311.890 38.600,311.738 38.600 C 311.586 38.600,311.366 38.423,311.250 38.207 C 311.135 37.990,310.932 37.855,310.799 37.906 C 310.667 37.957,310.232 37.708,309.834 37.353 C 309.435 36.998,308.961 36.708,308.781 36.708 C 308.601 36.708,308.243 36.457,307.985 36.151 C 307.727 35.844,307.476 35.633,307.427 35.682 C 307.379 35.731,307.231 35.641,307.099 35.482 C 306.968 35.324,306.714 35.194,306.536 35.194 C 306.358 35.194,305.964 34.941,305.661 34.632 C 305.357 34.322,304.965 34.067,304.789 34.064 C 304.614 34.061,304.200 33.812,303.870 33.510 C 303.540 33.209,303.030 32.914,302.737 32.856 C 302.443 32.797,301.882 32.427,301.488 32.034 C 301.079 31.625,300.628 31.343,300.434 31.376 C 300.247 31.408,300.095 31.343,300.095 31.232 C 300.095 31.122,299.971 31.031,299.820 31.031 C 299.669 31.031,299.463 30.883,299.361 30.702 C 299.260 30.520,299.116 30.433,299.042 30.507 C 298.890 30.659,297.824 30.087,297.824 29.855 C 297.824 29.774,297.695 29.707,297.538 29.707 C 297.142 29.707,296.529 29.332,295.890 28.700 C 295.593 28.406,295.247 28.204,295.121 28.250 C 294.995 28.296,294.636 28.145,294.324 27.915 C 294.011 27.685,293.511 27.436,293.213 27.362 C 292.914 27.289,292.546 27.105,292.395 26.954 C 292.244 26.803,291.961 26.679,291.767 26.679 C 291.572 26.679,291.360 26.593,291.295 26.488 C 291.230 26.383,290.629 26.040,289.959 25.727 C 289.290 25.414,288.742 25.075,288.742 24.973 C 288.742 24.871,288.593 24.785,288.411 24.783 C 288.228 24.781,287.867 24.612,287.606 24.409 C 287.346 24.205,286.989 24.037,286.813 24.034 C 286.637 24.032,286.440 23.944,286.375 23.838 C 286.309 23.732,286.189 23.687,286.108 23.737 C 286.027 23.787,285.775 23.655,285.547 23.443 C 285.320 23.231,285.030 23.092,284.903 23.136 C 284.777 23.179,284.546 23.071,284.390 22.896 C 284.148 22.624,283.364 22.302,282.814 22.248 C 282.727 22.240,282.540 22.073,282.397 21.878 C 282.246 21.672,282.014 21.570,281.844 21.635 C 281.683 21.697,281.552 21.665,281.552 21.565 C 281.552 21.464,281.432 21.381,281.287 21.381 C 281.141 21.381,280.537 21.126,279.943 20.814 C 279.350 20.501,278.738 20.246,278.583 20.246 C 278.429 20.246,277.698 19.948,276.958 19.584 C 276.219 19.219,275.457 18.921,275.266 18.921 C 275.074 18.921,274.868 18.794,274.808 18.638 C 274.748 18.482,274.494 18.354,274.244 18.354 C 273.994 18.354,273.641 18.279,273.460 18.187 C 273.279 18.095,272.876 17.913,272.564 17.783 C 272.252 17.653,271.826 17.473,271.618 17.383 C 271.410 17.293,271.068 17.196,270.859 17.167 C 270.650 17.138,270.269 16.968,270.013 16.788 C 269.757 16.609,269.370 16.462,269.154 16.462 C 268.938 16.462,268.680 16.394,268.581 16.312 C 268.482 16.230,267.763 15.953,266.982 15.697 C 266.202 15.441,265.535 15.168,265.500 15.090 C 265.465 15.012,265.230 14.948,264.977 14.948 C 264.724 14.948,264.369 14.873,264.189 14.781 C 263.474 14.417,262.885 14.167,262.622 14.114 C 262.470 14.084,262.219 14.011,262.062 13.952 C 261.906 13.893,261.523 13.780,261.211 13.702 C 260.899 13.624,260.601 13.546,260.549 13.529 C 260.497 13.512,260.199 13.434,259.886 13.357 C 259.310 13.213,258.639 12.958,258.044 12.655 C 257.863 12.563,257.549 12.488,257.346 12.488 C 257.142 12.488,256.929 12.413,256.873 12.321 C 256.816 12.229,256.214 12.049,255.535 11.921 C 254.856 11.792,254.253 11.611,254.195 11.517 C 254.137 11.423,254.013 11.394,253.919 11.452 C 253.825 11.510,253.494 11.426,253.184 11.266 C 252.874 11.106,252.408 10.974,252.149 10.974 C 251.890 10.974,251.632 10.901,251.577 10.811 C 251.490 10.670,251.059 10.569,249.571 10.339 C 249.413 10.314,249.194 10.239,249.085 10.171 C 248.975 10.104,248.679 10.009,248.426 9.962 C 247.537 9.795,246.829 9.596,246.641 9.460 C 246.537 9.385,246.325 9.320,246.168 9.316 C 246.012 9.312,245.246 9.168,244.465 8.996 C 243.685 8.824,242.833 8.654,242.573 8.617 C 242.313 8.581,241.845 8.451,241.533 8.330 C 241.220 8.209,240.922 8.121,240.870 8.134 C 240.596 8.206,238.851 7.878,238.653 7.718 C 238.526 7.615,237.917 7.515,237.300 7.494 C 236.683 7.474,236.043 7.345,235.878 7.208 C 235.712 7.071,235.441 7.011,235.274 7.075 C 235.107 7.139,234.872 7.128,234.751 7.051 C 234.630 6.974,234.149 6.900,233.680 6.887 C 233.212 6.874,232.573 6.753,232.261 6.618 C 231.949 6.483,231.626 6.387,231.543 6.406 C 231.460 6.424,230.524 6.303,229.462 6.136 C 228.400 5.969,227.190 5.798,226.774 5.755 C 226.358 5.713,225.634 5.632,225.166 5.576 C 224.697 5.520,223.974 5.439,223.557 5.396 C 223.141 5.354,222.800 5.309,222.800 5.296 C 222.800 5.284,222.460 5.239,222.044 5.196 C 220.557 5.042,219.570 4.935,218.638 4.825 C 217.114 4.646,215.912 4.545,214.096 4.444 C 211.620 4.306,210.155 4.179,209.893 4.078 C 209.766 4.030,209.610 4.075,209.545 4.179 C 209.481 4.282,209.244 4.308,209.019 4.235 C 208.606 4.101,206.004 4.009,202.176 3.994 C 201.031 3.989,199.924 3.983,199.716 3.979 C 198.221 3.955,194.042 3.995,193.188 4.042 C 192.616 4.074,191.977 4.044,191.769 3.977 C 191.561 3.910,191.093 3.962,190.728 4.092 " stroke="none" fill="#b5cb2b" fill-rule="evenodd"></path><path id="path8" d="" stroke="none" fill="#55ff00" fill-rule="evenodd"></path><path id="path9" d="M364.522 96.081 C 363.619 96.742,362.897 97.244,359.648 99.478 C 358.854 100.024,357.583 100.938,356.822 101.509 C 356.062 102.080,355.333 102.549,355.203 102.551 C 355.073 102.553,354.967 102.627,354.967 102.715 C 354.967 102.851,354.376 103.279,352.707 104.352 C 352.545 104.456,351.944 104.889,351.372 105.314 C 350.799 105.740,350.024 106.293,349.648 106.544 C 347.578 107.929,346.136 108.917,345.885 109.122 C 345.631 109.330,344.163 110.365,341.471 112.233 C 340.970 112.582,340.270 113.079,339.916 113.340 C 339.562 113.600,338.581 114.281,337.736 114.853 C 336.890 115.426,335.705 116.256,335.103 116.698 C 334.500 117.140,333.921 117.502,333.816 117.502 C 333.712 117.502,333.577 117.631,333.516 117.789 C 333.456 117.947,333.212 118.162,332.976 118.267 C 332.595 118.436,331.562 119.112,331.031 119.541 C 330.927 119.624,330.118 120.192,329.234 120.801 C 328.349 121.410,327.597 121.981,327.562 122.071 C 327.528 122.160,327.408 122.233,327.296 122.233 C 327.185 122.233,326.787 122.467,326.413 122.752 C 326.039 123.038,325.180 123.649,324.503 124.109 C 323.827 124.570,323.231 124.997,323.179 125.058 C 323.127 125.119,322.709 125.424,322.250 125.735 C 321.792 126.046,321.229 126.429,320.999 126.585 C 320.769 126.741,320.047 127.252,319.395 127.720 C 318.742 128.188,318.015 128.699,317.780 128.855 C 316.016 130.025,314.359 131.179,313.150 132.081 C 312.370 132.663,311.582 133.194,311.400 133.262 C 311.218 133.329,311.069 133.472,311.069 133.580 C 311.069 133.687,310.971 133.775,310.851 133.775 C 310.731 133.775,310.284 134.034,309.858 134.351 C 308.177 135.600,305.993 137.141,304.778 137.938 C 304.075 138.398,303.500 138.831,303.500 138.901 C 303.500 138.970,303.253 139.129,302.952 139.254 C 302.650 139.379,302.209 139.688,301.972 139.940 C 301.736 140.191,301.463 140.397,301.366 140.397 C 301.269 140.397,300.879 140.639,300.500 140.934 C 300.121 141.228,299.662 141.524,299.480 141.590 C 299.001 141.764,299.066 142.077,299.811 143.183 C 300.175 143.724,300.473 144.297,300.473 144.456 C 300.473 144.615,300.856 145.249,301.325 145.865 C 301.793 146.480,302.176 147.071,302.176 147.178 C 302.176 147.284,302.473 147.940,302.836 148.637 C 303.199 149.333,303.455 149.967,303.406 150.046 C 303.358 150.125,303.615 150.580,303.979 151.057 C 304.343 151.534,304.627 151.991,304.609 152.073 C 304.592 152.156,304.718 152.540,304.890 152.927 C 305.063 153.314,305.203 153.766,305.203 153.933 C 305.203 154.099,305.416 154.514,305.676 154.855 C 305.937 155.197,306.149 155.646,306.149 155.854 C 306.149 156.062,306.308 156.376,306.501 156.551 C 306.726 156.754,306.820 157.034,306.764 157.328 C 306.709 157.616,306.825 157.978,307.075 158.295 C 307.294 158.574,307.474 158.951,307.474 159.132 C 307.474 159.313,307.592 159.560,307.737 159.680 C 307.882 159.800,308.057 160.277,308.127 160.740 C 308.196 161.202,308.339 161.634,308.444 161.699 C 308.549 161.764,308.592 161.928,308.540 162.064 C 308.488 162.200,308.604 162.454,308.798 162.630 C 308.993 162.806,309.105 163.070,309.048 163.218 C 308.992 163.366,309.060 163.625,309.201 163.794 C 309.341 163.963,309.431 164.295,309.400 164.530 C 309.369 164.766,309.434 165.015,309.544 165.083 C 309.654 165.151,309.745 165.404,309.745 165.646 C 309.745 165.887,309.860 166.180,310.002 166.298 C 310.147 166.418,310.220 166.715,310.170 166.976 C 310.117 167.253,310.205 167.564,310.386 167.745 C 310.554 167.913,310.691 168.251,310.691 168.498 C 310.691 168.745,310.776 168.999,310.880 169.063 C 310.984 169.128,311.069 169.388,311.069 169.641 C 311.069 169.895,311.232 170.592,311.432 171.191 C 311.631 171.790,311.849 172.682,311.916 173.174 C 311.982 173.666,312.109 174.113,312.198 174.168 C 312.286 174.223,312.313 174.438,312.259 174.646 C 312.204 174.855,312.254 175.139,312.370 175.279 C 312.485 175.418,312.526 175.585,312.460 175.651 C 312.394 175.717,312.456 175.912,312.599 176.084 C 312.742 176.256,312.881 176.748,312.909 177.177 C 312.958 177.938,313.431 180.323,313.646 180.889 C 313.705 181.045,313.785 181.514,313.822 181.930 C 313.981 183.680,314.099 184.354,314.286 184.579 C 314.413 184.733,314.421 184.979,314.309 185.275 C 314.203 185.553,314.203 185.856,314.307 186.044 C 314.403 186.214,314.514 186.720,314.554 187.169 C 314.594 187.618,314.680 188.453,314.744 189.026 C 315.128 192.434,315.238 194.787,315.312 201.135 C 315.348 204.241,315.301 206.811,315.207 206.929 C 315.114 207.045,315.068 207.746,315.106 208.487 C 315.143 209.228,315.123 209.885,315.061 209.947 C 314.999 210.009,314.935 210.627,314.919 211.321 C 314.894 212.420,314.508 215.779,314.177 217.786 C 314.117 218.150,314.070 218.615,314.073 218.818 C 314.076 219.021,313.991 219.294,313.883 219.424 C 313.775 219.554,313.743 219.839,313.813 220.057 C 313.882 220.275,313.846 220.565,313.734 220.700 C 313.621 220.836,313.534 221.151,313.540 221.401 C 313.558 222.105,312.777 225.972,312.566 226.227 C 312.462 226.352,312.433 226.675,312.501 226.945 C 312.574 227.240,312.544 227.436,312.426 227.436 C 312.317 227.436,312.170 227.841,312.100 228.335 C 311.917 229.615,311.490 231.225,311.260 231.503 C 311.151 231.633,311.112 231.869,311.172 232.026 C 311.233 232.183,311.029 232.869,310.720 233.550 C 310.412 234.231,310.201 234.831,310.253 234.882 C 310.359 234.989,309.875 236.529,308.877 239.262 C 308.801 239.470,308.752 239.704,308.768 239.782 C 308.785 239.860,308.719 239.924,308.621 239.924 C 308.523 239.924,308.442 240.073,308.439 240.255 C 308.431 240.809,307.965 242.384,307.809 242.384 C 307.729 242.384,307.663 242.549,307.663 242.751 C 307.663 242.953,307.578 243.171,307.474 243.236 C 307.370 243.300,307.285 243.551,307.285 243.794 C 307.285 244.037,307.147 244.288,306.979 244.353 C 306.794 244.424,306.710 244.609,306.767 244.825 C 306.820 245.029,306.672 245.410,306.417 245.721 C 306.173 246.019,305.971 246.415,305.967 246.601 C 305.963 246.787,305.828 247.140,305.667 247.385 C 305.506 247.631,305.331 248.075,305.278 248.372 C 305.224 248.669,305.101 248.993,305.003 249.092 C 304.905 249.191,304.825 249.418,304.825 249.596 C 304.825 249.775,304.758 249.950,304.677 249.984 C 304.596 250.019,304.257 250.622,303.924 251.325 C 303.592 252.027,303.232 252.602,303.126 252.602 C 303.020 252.602,302.930 252.793,302.927 253.027 C 302.924 253.262,302.796 253.618,302.643 253.820 C 302.490 254.022,302.365 254.364,302.365 254.579 C 302.365 254.795,302.069 255.311,301.707 255.726 C 301.344 256.141,301.046 256.600,301.044 256.747 C 301.042 256.893,300.828 257.292,300.568 257.633 C 300.307 257.974,300.095 258.386,300.095 258.548 C 300.095 258.710,299.906 259.059,299.676 259.324 C 299.446 259.589,299.169 260.077,299.061 260.409 C 298.953 260.740,298.668 261.110,298.427 261.229 C 298.186 261.349,297.995 261.500,298.001 261.565 C 298.060 262.145,297.957 262.497,297.635 262.819 C 297.427 263.027,297.256 263.277,297.256 263.374 C 297.256 263.471,297.078 263.607,296.861 263.676 C 296.594 263.761,296.495 263.915,296.556 264.148 C 296.612 264.366,296.408 264.755,296.005 265.195 C 295.653 265.579,295.364 266.007,295.364 266.145 C 295.364 266.474,294.426 267.471,294.183 267.400 C 294.079 267.370,294.040 267.466,294.097 267.615 C 294.241 267.992,293.752 268.691,292.337 270.133 C 292.077 270.398,291.862 270.718,291.861 270.843 C 291.859 270.968,291.518 271.416,291.104 271.839 C 290.689 272.261,290.326 272.742,290.297 272.907 C 290.267 273.073,289.926 273.542,289.540 273.950 C 288.536 275.010,287.803 275.939,287.799 276.159 C 287.796 276.263,287.540 276.518,287.228 276.727 C 286.916 276.935,286.661 277.198,286.661 277.312 C 286.661 277.425,286.362 277.679,285.998 277.875 C 285.594 278.093,285.336 278.374,285.336 278.596 C 285.336 278.965,283.437 280.984,283.090 280.984 C 282.987 280.984,282.843 281.167,282.773 281.390 C 282.593 281.958,280.226 284.201,279.808 284.201 C 279.726 284.201,279.659 284.330,279.659 284.489 C 279.659 284.648,279.447 284.859,279.186 284.957 C 278.910 285.062,278.713 285.287,278.713 285.497 C 278.713 285.719,278.495 285.948,278.146 286.093 C 277.833 286.222,277.578 286.446,277.578 286.591 C 277.578 286.736,277.131 287.143,276.585 287.497 C 276.038 287.850,275.367 288.381,275.093 288.677 C 274.558 289.254,274.365 289.412,273.557 289.930 C 272.807 290.412,272.879 290.641,274.487 292.876 C 275.285 293.984,276.285 295.402,276.710 296.026 C 277.135 296.651,277.532 297.204,277.592 297.256 C 277.651 297.308,277.757 297.479,277.825 297.635 C 277.894 297.791,278.418 298.557,278.989 299.338 C 279.561 300.118,280.409 301.310,280.875 301.987 C 281.340 302.663,282.300 304.043,283.008 305.054 C 283.716 306.065,284.551 307.256,284.863 307.702 C 285.175 308.148,286.147 309.535,287.022 310.784 C 288.475 312.858,289.115 313.775,290.954 316.414 C 291.298 316.909,291.895 317.760,292.279 318.307 C 292.664 318.853,294.253 321.131,295.810 323.368 C 297.367 325.605,298.805 327.649,299.004 327.909 C 299.363 328.377,302.341 332.638,303.542 334.403 C 303.883 334.905,304.253 335.415,304.364 335.538 C 304.474 335.661,305.113 336.564,305.783 337.545 C 306.977 339.294,307.255 339.694,309.416 342.763 C 310.003 343.595,310.973 345.000,311.573 345.885 C 312.173 346.769,312.714 347.535,312.775 347.588 C 312.836 347.640,313.265 348.236,313.728 348.912 C 314.191 349.588,314.616 350.184,314.672 350.237 C 314.729 350.289,315.155 350.893,315.618 351.580 C 318.330 355.596,319.517 357.226,319.734 357.232 C 319.869 357.235,320.961 356.535,322.162 355.676 C 323.363 354.818,324.573 353.969,324.850 353.790 C 325.894 353.117,326.206 352.823,326.206 352.517 C 326.206 352.225,327.371 351.257,328.471 350.635 C 329.111 350.273,329.423 349.937,329.423 349.610 C 329.423 349.458,329.820 349.048,330.304 348.698 C 330.789 348.347,331.449 347.799,331.771 347.479 C 332.092 347.159,332.654 346.694,333.018 346.445 C 333.921 345.827,334.153 345.582,334.153 345.249 C 334.153 345.092,334.430 344.773,334.768 344.539 C 335.106 344.306,335.649 343.853,335.973 343.533 C 336.298 343.213,336.809 342.735,337.109 342.470 C 337.408 342.205,337.872 341.737,338.138 341.430 C 338.404 341.122,339.149 340.384,339.793 339.790 C 340.438 339.196,340.965 338.621,340.965 338.513 C 340.965 338.405,341.071 338.313,341.202 338.310 C 341.585 338.300,342.523 337.379,342.421 337.113 C 342.367 336.972,342.600 336.721,342.970 336.522 C 343.324 336.331,343.614 336.062,343.614 335.924 C 343.614 335.785,343.950 335.450,344.360 335.179 C 344.772 334.906,345.132 334.502,345.164 334.277 C 345.196 334.053,345.413 333.786,345.646 333.683 C 345.879 333.581,346.050 333.373,346.025 333.221 C 346.000 333.069,346.173 332.845,346.410 332.725 C 346.647 332.604,347.158 332.085,347.545 331.571 C 348.386 330.457,349.674 329.157,350.232 328.858 C 350.489 328.720,350.614 328.496,350.578 328.236 C 350.539 327.966,350.667 327.757,350.958 327.610 C 351.199 327.489,351.390 327.336,351.384 327.271 C 351.350 326.931,351.406 326.848,351.791 326.677 C 352.022 326.574,352.256 326.300,352.312 326.069 C 352.367 325.837,352.843 325.198,353.370 324.648 C 353.896 324.099,354.449 323.372,354.599 323.034 C 354.749 322.695,355.021 322.370,355.203 322.312 C 355.385 322.255,355.535 322.127,355.535 322.030 C 355.535 321.932,355.747 321.667,356.008 321.441 C 356.268 321.214,356.481 320.872,356.481 320.679 C 356.481 320.486,356.608 320.280,356.764 320.220 C 356.921 320.160,357.048 320.011,357.048 319.888 C 357.048 319.766,357.307 319.512,357.624 319.325 C 358.051 319.073,358.170 318.892,358.084 318.621 C 358.009 318.386,358.073 318.217,358.265 318.143 C 358.428 318.081,358.562 317.917,358.562 317.779 C 358.562 317.641,358.720 317.478,358.914 317.416 C 359.107 317.355,359.423 316.956,359.615 316.529 C 359.807 316.103,360.330 315.378,360.777 314.918 C 361.224 314.458,361.589 313.922,361.589 313.727 C 361.589 313.532,361.845 313.131,362.157 312.836 C 362.469 312.541,362.725 312.190,362.725 312.055 C 362.725 311.813,362.908 311.546,363.503 310.918 C 363.672 310.741,363.959 310.274,364.143 309.880 C 364.326 309.487,364.721 308.903,365.020 308.583 C 365.319 308.263,365.563 307.924,365.563 307.830 C 365.563 307.543,366.016 306.832,366.367 306.567 C 366.549 306.430,366.698 306.159,366.698 305.966 C 366.698 305.772,366.954 305.373,367.266 305.078 C 367.578 304.783,367.833 304.398,367.833 304.222 C 367.833 304.045,367.920 303.848,368.026 303.782 C 368.132 303.717,368.169 303.584,368.108 303.486 C 368.048 303.388,368.132 303.258,368.295 303.195 C 368.457 303.133,368.590 302.972,368.590 302.838 C 368.590 302.704,368.718 302.546,368.874 302.486 C 369.030 302.426,369.158 302.213,369.158 302.013 C 369.158 301.812,369.413 301.375,369.726 301.041 C 370.038 300.706,370.293 300.272,370.293 300.075 C 370.293 299.877,370.442 299.565,370.624 299.379 C 370.807 299.194,371.104 298.747,371.285 298.386 C 371.758 297.447,372.058 296.994,372.319 296.826 C 372.445 296.745,372.498 296.547,372.436 296.386 C 372.374 296.225,372.485 295.866,372.683 295.587 C 372.881 295.308,373.169 294.825,373.323 294.513 C 373.478 294.201,373.710 293.877,373.841 293.794 C 373.971 293.711,374.078 293.537,374.078 293.408 C 374.078 293.138,374.697 291.879,375.024 291.485 C 375.146 291.338,375.191 291.129,375.123 291.021 C 375.056 290.912,375.091 290.823,375.202 290.823 C 375.312 290.823,375.402 290.716,375.402 290.585 C 375.402 290.454,375.577 290.237,375.791 290.104 C 376.054 289.939,376.142 289.744,376.064 289.498 C 375.989 289.261,376.084 289.019,376.338 288.801 C 376.552 288.618,376.727 288.251,376.727 287.985 C 376.727 287.712,376.974 287.231,377.294 286.880 C 377.606 286.538,377.862 286.092,377.862 285.889 C 377.862 285.686,377.943 285.372,378.041 285.191 C 378.477 284.394,379.453 282.202,379.422 282.090 C 379.403 282.022,379.513 281.863,379.665 281.736 C 379.818 281.609,379.943 281.345,379.943 281.149 C 379.943 280.954,380.114 280.476,380.322 280.087 C 380.530 279.699,380.700 279.274,380.700 279.142 C 380.700 279.010,380.785 278.903,380.889 278.903 C 380.993 278.903,381.079 278.724,381.079 278.506 C 381.079 278.047,381.647 277.010,381.898 277.010 C 381.992 277.010,382.028 276.853,381.977 276.660 C 381.927 276.468,382.036 276.111,382.219 275.868 C 382.403 275.624,382.512 275.318,382.462 275.187 C 382.411 275.056,382.499 274.710,382.657 274.419 C 383.245 273.334,383.996 271.427,384.282 270.293 C 384.361 269.981,384.652 269.249,384.928 268.667 C 385.204 268.084,385.430 267.429,385.430 267.211 C 385.430 266.993,385.516 266.763,385.620 266.698 C 385.724 266.634,385.809 266.415,385.809 266.211 C 385.809 266.008,385.886 265.694,385.980 265.513 C 386.074 265.332,386.258 264.823,386.388 264.380 C 386.519 263.938,386.707 263.576,386.805 263.576 C 386.904 263.576,386.940 263.459,386.885 263.316 C 386.830 263.173,386.906 262.822,387.054 262.537 C 387.202 262.252,387.323 261.826,387.323 261.591 C 387.323 261.355,387.454 261.054,387.614 260.920 C 387.801 260.766,387.841 260.613,387.725 260.497 C 387.609 260.381,387.674 260.082,387.906 259.669 C 388.105 259.314,388.269 258.813,388.269 258.556 C 388.269 258.299,388.343 258.089,388.434 258.089 C 388.591 258.089,388.868 256.944,388.922 256.065 C 388.937 255.837,389.103 255.478,389.293 255.269 C 389.530 255.007,389.600 254.737,389.517 254.407 C 389.451 254.143,389.466 253.926,389.550 253.926 C 389.723 253.926,390.211 252.364,390.249 251.690 C 390.262 251.449,390.385 251.183,390.521 251.099 C 390.677 251.003,390.720 250.793,390.638 250.535 C 390.567 250.309,390.592 250.021,390.695 249.896 C 390.798 249.771,390.944 249.243,391.020 248.723 C 391.096 248.202,391.244 247.564,391.349 247.304 C 391.548 246.809,391.566 246.732,391.769 245.506 C 391.838 245.090,391.964 244.579,392.049 244.371 C 392.134 244.163,392.388 243.013,392.613 241.816 C 392.838 240.620,393.106 239.486,393.209 239.298 C 393.311 239.109,393.345 238.797,393.284 238.604 C 393.223 238.411,393.246 238.208,393.336 238.153 C 393.425 238.097,393.513 237.532,393.530 236.896 C 393.551 236.140,393.664 235.638,393.855 235.446 C 394.088 235.213,394.101 235.098,393.917 234.876 C 393.761 234.688,393.750 234.556,393.882 234.470 C 393.990 234.400,394.127 233.798,394.186 233.133 C 394.244 232.468,394.397 231.860,394.524 231.781 C 394.653 231.701,394.709 231.457,394.650 231.232 C 394.592 231.008,394.625 230.553,394.725 230.219 C 394.824 229.885,394.939 229.101,394.979 228.477 C 395.020 227.852,395.111 227.193,395.182 227.010 C 395.252 226.828,395.259 226.545,395.196 226.382 C 395.133 226.218,395.158 225.941,395.252 225.767 C 395.402 225.486,395.487 224.840,395.766 221.854 C 395.805 221.438,395.878 220.501,395.928 219.773 C 395.978 219.044,396.094 217.938,396.186 217.313 C 396.277 216.689,396.334 215.752,396.313 215.232 C 396.291 214.711,396.347 213.859,396.435 213.337 C 396.524 212.815,396.599 211.794,396.602 211.067 C 396.610 208.737,396.636 208.326,396.777 208.325 C 396.871 208.325,396.878 201.377,396.790 196.121 C 396.769 194.872,396.807 193.710,396.875 193.539 C 396.943 193.367,396.907 193.170,396.796 193.101 C 396.674 193.026,396.640 192.687,396.709 192.255 C 396.778 191.822,396.743 191.483,396.622 191.408 C 396.490 191.326,396.479 191.127,396.589 190.836 C 396.683 190.590,396.721 190.350,396.674 190.303 C 396.576 190.205,396.385 187.540,396.367 185.998 C 396.360 185.426,396.305 184.872,396.244 184.768 C 396.184 184.664,396.160 184.342,396.190 184.051 C 396.239 183.590,396.147 182.655,395.738 179.470 C 395.685 179.054,395.606 178.353,395.564 177.914 C 395.521 177.474,395.422 177.009,395.343 176.882 C 395.264 176.754,395.177 176.305,395.149 175.884 C 395.016 173.868,394.930 173.107,394.822 173.000 C 394.758 172.935,394.796 172.774,394.906 172.641 C 395.045 172.474,395.046 172.286,394.912 172.035 C 394.805 171.835,394.674 171.230,394.621 170.691 C 394.569 170.151,394.471 169.622,394.404 169.514 C 394.337 169.406,394.242 168.921,394.191 168.436 C 394.140 167.950,394.023 167.411,393.929 167.236 C 393.836 167.061,393.810 166.666,393.871 166.358 C 393.934 166.044,393.895 165.744,393.783 165.674 C 393.673 165.606,393.628 165.434,393.682 165.292 C 393.737 165.150,393.682 164.972,393.559 164.896 C 393.392 164.793,393.397 164.722,393.579 164.609 C 393.770 164.491,393.756 164.362,393.512 163.989 C 393.342 163.730,393.123 162.868,393.024 162.074 C 392.925 161.279,392.742 160.505,392.616 160.354 C 392.490 160.202,392.434 159.897,392.492 159.676 C 392.549 159.456,392.517 159.115,392.419 158.919 C 392.322 158.722,392.163 158.403,392.067 158.208 C 391.958 157.989,391.959 157.786,392.068 157.677 C 392.178 157.566,392.072 157.073,391.788 156.374 C 391.521 155.716,391.370 155.042,391.426 154.752 C 391.478 154.478,391.428 154.197,391.314 154.126 C 391.200 154.056,391.107 153.791,391.107 153.537 C 391.107 153.283,391.020 153.075,390.914 153.075 C 390.804 153.075,390.771 152.876,390.837 152.612 C 390.901 152.358,390.884 152.039,390.799 151.903 C 390.613 151.605,390.572 151.468,390.416 150.615 C 390.349 150.251,390.179 149.776,390.038 149.559 C 389.897 149.343,389.830 149.117,389.890 149.057 C 389.949 148.997,389.833 148.608,389.632 148.191 C 389.422 147.756,389.330 147.330,389.415 147.191 C 389.500 147.054,389.448 146.782,389.295 146.564 C 389.147 146.352,389.026 146.038,389.026 145.866 C 389.026 145.693,388.902 145.450,388.750 145.324 C 388.528 145.140,388.519 145.021,388.703 144.708 C 388.882 144.404,388.881 144.303,388.694 144.236 C 388.564 144.189,388.458 143.949,388.458 143.704 C 388.458 143.459,388.372 143.205,388.268 143.141 C 388.164 143.076,388.126 142.830,388.186 142.595 C 388.252 142.328,388.181 142.074,387.997 141.921 C 387.834 141.786,387.701 141.547,387.701 141.390 C 387.701 141.233,387.538 140.839,387.338 140.514 C 387.138 140.190,386.919 139.541,386.851 139.073 C 386.784 138.605,386.603 138.027,386.450 137.790 C 386.297 137.553,386.216 137.288,386.270 137.201 C 386.324 137.113,386.201 136.892,385.998 136.708 C 385.744 136.478,385.680 136.282,385.793 136.081 C 385.904 135.881,385.779 135.459,385.399 134.757 C 385.092 134.190,384.879 133.626,384.926 133.504 C 384.973 133.382,384.880 132.988,384.718 132.630 C 384.557 132.271,384.440 131.908,384.459 131.823 C 384.477 131.738,384.320 131.450,384.110 131.183 C 383.900 130.915,383.728 130.577,383.728 130.431 C 383.728 130.286,383.590 129.957,383.423 129.702 C 383.255 129.446,383.170 129.103,383.232 128.939 C 383.296 128.774,383.138 128.335,382.875 127.948 C 382.615 127.566,382.403 127.140,382.403 127.000 C 382.403 126.861,382.270 126.614,382.108 126.452 C 381.946 126.290,381.861 126.033,381.920 125.880 C 381.979 125.728,381.824 125.207,381.577 124.722 C 380.852 123.303,380.533 122.554,380.394 121.949 C 380.322 121.637,380.107 121.178,379.914 120.930 C 379.722 120.682,379.565 120.374,379.565 120.247 C 379.565 120.119,379.352 119.701,379.092 119.318 C 378.832 118.935,378.619 118.538,378.619 118.436 C 378.619 118.335,378.419 117.934,378.175 117.546 C 377.932 117.158,377.770 116.728,377.817 116.590 C 377.864 116.453,377.638 115.915,377.314 115.395 C 376.991 114.875,376.727 114.349,376.727 114.225 C 376.727 114.102,376.429 113.582,376.064 113.069 C 375.678 112.526,375.402 111.912,375.402 111.595 C 375.402 111.297,375.318 110.950,375.216 110.825 C 374.244 109.633,374.008 109.282,373.987 108.999 C 373.974 108.818,373.611 108.155,373.181 107.525 C 372.718 106.846,372.435 106.236,372.486 106.028 C 372.540 105.806,372.151 105.091,371.429 104.088 C 370.665 103.028,370.321 102.386,370.393 102.159 C 370.463 101.939,370.213 101.415,369.688 100.680 C 369.240 100.055,368.491 98.980,368.023 98.292 C 365.775 94.991,365.903 95.072,364.522 96.081 " stroke="none" fill="#d1dc31" fill-rule="evenodd"></path><path id="path10" d="" stroke="none" fill="#99ff33" fill-rule="evenodd"></path><path id="path11" d="M85.380 215.516 C 85.380 215.880,85.419 216.029,85.466 215.847 C 85.514 215.665,85.514 215.367,85.466 215.184 C 85.419 215.002,85.380 215.151,85.380 215.516 " stroke="none" fill="#ffff00" fill-rule="evenodd"></path></g> +</svg>; + +export default icons; \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php index 2f1390977..cc42cc9e8 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/module.nextgen_data.php @@ -22,7 +22,7 @@ class M_NextGen_Data extends C_Base_Module 'photocrati-nextgen-data', 'NextGEN Data Tier', "Provides a data tier for NextGEN gallery based on the DataMapper module", - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -47,42 +47,58 @@ class M_NextGen_Data extends C_Base_Module $this->get_registry()->add_utility('I_Gallery_Storage', 'C_Gallery_Storage'); } - function get_type_list() - { - return array( - 'C_Exif_Writer_Wrapper' => 'class.exif_writer_wrapper.php', - 'A_Attachment_Datamapper' => 'adapter.attachment_datamapper.php', - 'A_Customtable_Sorting_Datamapper' => 'adapter.customtable_sorting_datamapper.php', - 'A_Nextgen_Data_Factory' => 'adapter.nextgen_data_factory.php', - 'C_NextGen_Data_Installer' => 'class.nextgen_data_installer.php', - 'A_Parse_Image_Metadata' => 'adapter.parse_image_metadata.php', - 'C_Album' => 'class.album.php', - 'C_Gallery' => 'class.gallery.php', - 'C_Image' => 'class.image.php', - 'C_Album_Mapper' => 'class.album_mapper.php', - 'C_Gallerystorage_Base' => 'class.gallerystorage_base.php', - 'C_Gallerystorage_Driver_Base' => 'class.gallerystorage_driver_base.php', - 'C_Gallery_Mapper' => 'class.gallery_mapper.php', - 'C_Gallery_Storage' => 'class.gallery_storage.php', - 'C_Image_Mapper' => 'class.image_mapper.php', - 'C_Image_Wrapper' => 'class.image_wrapper.php', - 'C_Image_Wrapper_Collection' => 'class.image_wrapper_collection.php', - 'C_Nextgen_Metadata' => 'class.nextgen_metadata.php', - 'Mixin_NextGen_Table_Extras' => 'mixin.nextgen_table_extras.php', - 'C_Ngglegacy_Gallerystorage_Driver' => 'class.ngglegacy_gallerystorage_driver.php', - 'C_Ngglegacy_Thumbnail' => 'class.ngglegacy_thumbnail.php', - 'C_Wordpress_Gallerystorage_Driver' => 'class.wordpress_gallerystorage_driver.php' - ); - } + function initialize() + { + } + + public static function check_gd_requirement() + { + return function_exists("gd_info"); + } + public static function check_pel_min_php_requirement() + { + return version_compare(phpversion(), '5.3.0', '>'); + } - function _register_hooks() + public function check_domdocument_requirement() + { + return class_exists('DOMDocument'); + } + + function _register_hooks() { + add_action('admin_init', array($this, 'register_requirements')); add_action('init', array(&$this, 'register_custom_post_types')); add_filter('posts_orderby', array($this, 'wp_query_order_by'), 10, 2); } - function register_custom_post_types() + public function register_requirements() + { + C_Admin_Requirements_Manager::get_instance()->add( + 'nextgen_data_sanitation', + 'phpext', + array($this, 'check_domdocument_requirement'), + array('message' => __('XML is strongly encouraged for safely editing image data', 'nggallery')) + ); + + C_Admin_Requirements_Manager::get_instance()->add( + 'nextgen_data_pel_min_php_version', + 'phpver', + array($this, 'check_pel_min_php_requirement'), + array('message' => __('PHP 5.3 is required to write EXIF data to thumbnails and resized images', 'nggallery')) + ); + + C_Admin_Requirements_Manager::get_instance()->add( + 'nextgen_data_gd_requirement', + 'phpext', + array($this, 'check_gd_requirement'), + array('message' => __('GD is required for generating image thumbnails, resizing images, and generating watermarks', 'nggallery'), + 'dismissable' => FALSE) + ); + } + + function register_custom_post_types() { $types = array( 'ngg_album' => 'NextGEN Gallery - Album', @@ -99,7 +115,7 @@ class M_NextGen_Data extends C_Base_Module } } - function wp_query_order_by($order_by, $wp_query) + function wp_query_order_by($order_by, $wp_query) { if ($wp_query->get('datamapper_attachment')) { @@ -112,7 +128,7 @@ class M_NextGen_Data extends C_Base_Module return $order_by; } - static function strip_html($data, $just_scripts=FALSE) + static function strip_html($data, $just_scripts=FALSE) { $retval = $data; @@ -121,7 +137,8 @@ class M_NextGen_Data extends C_Base_Module // Remove *ALL* HTML and tag contents $retval = wp_strip_all_tags($retval, TRUE); } - else { + else if (class_exists('DOMDocument')) { + // Allows HTML to remain but we strip nearly all attributes, strip all // <script> tags, and sanitize hrefs to prevent javascript. // @@ -131,6 +148,7 @@ class M_NextGen_Data extends C_Base_Module $allowed_attributes = array( '*' => array('id', 'class', 'href', 'name', 'title', 'rel', 'style'), + 'a' => array('target', 'rel'), 'img' => array('src', 'alt', 'title') ); @@ -227,5 +245,33 @@ class M_NextGen_Data extends C_Base_Module return $retval; } + + function get_type_list() + { + return array( + 'A_Attachment_Datamapper' => 'adapter.attachment_datamapper.php', + 'A_Customtable_Sorting_Datamapper' => 'adapter.customtable_sorting_datamapper.php', + 'A_Nextgen_Data_Factory' => 'adapter.nextgen_data_factory.php', + 'A_Parse_Image_Metadata' => 'adapter.parse_image_metadata.php', + 'C_Album' => 'class.album.php', + 'C_Album_Mapper' => 'class.album_mapper.php', + 'C_Exif_Writer_Wrapper' => 'class.exif_writer_wrapper.php', + 'C_Gallery' => 'class.gallery.php', + 'C_Gallery_Mapper' => 'class.gallery_mapper.php', + 'C_Gallery_Storage' => 'class.gallery_storage.php', + 'C_Gallerystorage_Base' => 'class.gallerystorage_base.php', + 'C_Gallerystorage_Driver_Base' => 'class.gallerystorage_driver_base.php', + 'C_Image' => 'class.image.php', + 'C_Image_Mapper' => 'class.image_mapper.php', + 'C_Image_Wrapper' => 'class.image_wrapper.php', + 'C_Image_Wrapper_Collection' => 'class.image_wrapper_collection.php', + 'C_NextGen_Data_Installer' => 'class.nextgen_data_installer.php', + 'C_Nextgen_Metadata' => 'class.nextgen_metadata.php', + 'C_Ngglegacy_Gallerystorage_Driver' => 'class.ngglegacy_gallerystorage_driver.php', + 'C_Ngglegacy_Thumbnail' => 'class.ngglegacy_thumbnail.php', + 'C_Wordpress_Gallerystorage_Driver' => 'class.wordpress_gallerystorage_driver.php', + 'Mixin_NextGen_Table_Extras' => 'mixin.nextgen_table_extras.php' + ); + } } new M_NextGen_Data(); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php index c8a0e939a..2abdb47ea 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/package.module.nextgen_data.php @@ -12,9 +12,9 @@ class A_Attachment_DataMapper extends Mixin $this->object->_object_name = 'attachment'; } /** - * Saves the entity using the wp_insert_attachment function - * instead of the wp_insert_post - * @param stdObject $entity + * Saves the entity using the wp_insert_attachment function instead of the wp_insert_post + * @param object $entity + * @return int Attachment ID */ function _save_entity($entity) { @@ -107,16 +107,15 @@ class C_Album extends C_DataMapper_Model } /** * Instantiates an Album object - * @param bool|\C_DataMapper|\FALSE $mapper * @param array $properties + * @param C_Album_Mapper|bool $mapper (optional) + * @param string|bool $context (optional) */ function initialize($properties = array(), $mapper = FALSE, $context = FALSE) { - // Get the mapper is not specified if (!$mapper) { $mapper = $this->get_registry()->get_utility($this->_mapper_interface); } - // Initialize parent::initialize($mapper, $properties); } } @@ -133,6 +132,8 @@ class Mixin_NextGen_Album_Instance_Methods extends Mixin } /** * Gets all galleries associated with the album + * @param array|bool $models (optional) + * @return array */ function get_galleries($models = FALSE) { @@ -184,7 +185,7 @@ class C_Album_Mapper extends C_CustomTable_DataMapper_Driver } /** * Returns an instance of the album datamapper - * @param bool|mixed $context + * @param bool|string $context * @return C_Album_Mapper */ static function get_instance($context = FALSE) @@ -238,14 +239,42 @@ class Mixin_Album_Mapper extends Mixin class C_Exif_Writer_Wrapper { // Because our C_Exif_Writer class relies on PEL (a library which uses namespaces) we wrap - // its use through this method which performs a PHP version check before loading the class file + // its use through these methods which performs a PHP version check before loading the class file + /** + * @param $old_file + * @param $new_file + * @throws \lsolesen\pel\PelIfdException + * @throws \lsolesen\pel\PelInvalidArgumentException + * @throws \lsolesen\pel\PelInvalidDataException + * @throws \lsolesen\pel\PelJpegInvalidMarkerException + */ public static function copy_metadata($old_file, $new_file) { - if (version_compare(phpversion(), '5.3.0', '<')) { + if (!M_NextGen_Data::check_pel_min_php_requirement()) { return; } + self::load_pel(); + return @C_Exif_Writer::copy_metadata($old_file, $new_file); + } + public static function read_metadata($filename) + { + if (!M_NextGen_Data::check_pel_min_php_requirement()) { + return array(); + } + self::load_pel(); + return @C_Exif_Writer::read_metadata($filename); + } + public static function write_metadata($filename, $metadata) + { + if (!M_NextGen_Data::check_pel_min_php_requirement()) { + return; + } + self::load_pel(); + return @C_Exif_Writer::write_metadata($filename, $metadata); + } + public static function load_pel() + { require_once __DIR__ . DIRECTORY_SEPARATOR . 'pel-0.9.6' . DIRECTORY_SEPARATOR . 'class.exif_writer.php'; - @C_Exif_Writer::copy_metadata($old_file, $new_file); } } class Mixin_NextGen_Gallery_Validation @@ -282,20 +311,51 @@ class Mixin_NextGen_Gallery_Validation $this->object->path = M_NextGen_Data::strip_html($this->object->path); $this->object->path = str_replace(array('"', "''", ">", "<"), array('', '', '', ''), $this->object->path); } - // Ensure that the gallery path is restriected to $fs->get_document_root('galleries') + // Ensure that the gallery path is restricted to $fs->get_document_root('galleries') $fs = C_Fs::get_instance(); $root = $fs->get_document_root('galleries'); $gallery_abspath = $fs->get_absolute_path($fs->join_paths($root, $this->object->path)); + $storage = C_Gallery_Storage::get_instance(); if ($gallery_abspath[0] != DIRECTORY_SEPARATOR) { $gallery_abspath = DIRECTORY_SEPARATOR . $gallery_abspath; } if (strpos($gallery_abspath, $root) === FALSE) { $this->object->add_error(sprintf(__("Gallery path must be located in %s", 'nggallery'), $root), 'gallerypath'); - $storage = C_Gallery_Storage::get_instance(); $this->object->path = $storage->get_upload_relpath($this->object); - unset($storage); } $this->object->path = trailingslashit($this->object->path); + // Check for '..' in the path + $sections = explode(DIRECTORY_SEPARATOR, trim($this->object->path, '/\\')); + if (in_array('..', $sections, TRUE)) { + $this->object->add_error(__("Gallery paths may not use '..' to access parent directories)", 'nggallery')); + } + // Establish some rules on where galleries can go + $abspath = $storage->get_gallery_abspath($this->object); + // Galleries should at least be a sub-folder, not directly in WP_CONTENT + $not_directly_in = array('content' => WP_CONTENT_DIR, 'wordpress root' => $fs->get_document_root()); + if (!empty($_SERVER['DOCUMENT_ROOT'])) { + $not_directly_in['document root'] = $_SERVER['DOCUMENT_ROOT']; + } + foreach ($not_directly_in as $label => $dir) { + if ($abspath == $dir) { + $this->object->add_error(sprintf(__("Gallery path must be a sub-directory under the %s directory", 'nggallery'), $label), 'gallerypath'); + } + } + // Disallow galleries from being under these directories at all + $not_ever_in = array('plugins' => WP_PLUGIN_DIR, 'must use plugins' => WPMU_PLUGIN_DIR, 'wp-admin' => $fs->join_paths(ABSPATH, 'wp-admin'), 'wp-includes' => $fs->join_paths(ABSPATH, 'wp-admin'), 'themes' => get_theme_root()); + foreach ($not_ever_in as $label => $dir) { + if (strpos($abspath, $dir) === 0) { + $this->object->add_error(sprintf(__("Gallery path cannot be under %s directory", 'nggallery'), $label), 'gallerypath'); + } + } + // Regardless of where they are just don't let the path end in any of these + $never_named = array('wp-admin', 'wp-includes', 'wp-content'); + foreach ($never_named as $name) { + if ($name === end($sections)) { + $this->object->add_error(sprintf(__("Gallery path cannot end with a directory named %s", 'nggallery'), $name), 'gallerypath'); + } + } + unset($storage); $this->object->validates_presence_of('title'); $this->object->validates_presence_of('name'); $this->object->validates_uniqueness_of('slug'); @@ -323,17 +383,15 @@ class C_Gallery extends C_DataMapper_Model } /** * Instantiates a new model - * @param array|stdClass $properties - * @param C_DataMapper $mapper - * @param string $context + * @param array|stdClass $properties (optional) + * @param C_Gallery_Mapper|false $mapper (optional) + * @param string|bool $context (optional) */ function initialize($properties = array(), $mapper = FALSE, $context = FALSE) { - // Get the mapper is not specified if (!$mapper) { $mapper = $this->get_registry()->get_utility($this->_mapper_interface); } - // Initialize parent::initialize($mapper, $properties); } function get_images() @@ -353,7 +411,8 @@ class C_Gallery_Mapper extends C_CustomTable_DataMapper_Driver public static $_instance = NULL; /** * Define the object - * @param string $context + * @param string|bool $context (optional) + * @param mixed $not_used Not used, exists only to prevent PHP warnings */ function define($context = FALSE, $not_used = FALSE) { @@ -386,7 +445,7 @@ class C_Gallery_Mapper extends C_CustomTable_DataMapper_Driver } /** * Returns a singleton of the gallery mapper - * @param string $context + * @param bool|string $context * @return C_Gallery_Mapper */ public static function get_instance($context = False) @@ -401,8 +460,9 @@ class C_Gallery_Mapper extends C_CustomTable_DataMapper_Driver class Mixin_Gallery_Mapper extends Mixin { /** - * Uses the title property as the post title when the Custom Post driver - * is used + * Uses the title property as the post title when the Custom Post driver is used + * @param object $entity + * @return string */ function get_post_title($entity) { @@ -451,7 +511,12 @@ class Mixin_Gallery_Mapper extends Mixin { $retval = FALSE; if ($gallery) { - $gallery_id = is_numeric($gallery) ? $gallery : $gallery->{$gallery->id_field}; + if (is_numeric($gallery)) { + $gallery_id = $gallery; + $gallery = $this->object->find($gallery_id); + } else { + $gallery_id = $gallery->{$gallery->id_field}; + } // TODO: Look into making this operation more efficient if ($with_dependencies) { $image_mapper = C_Image_Mapper::get_instance(); @@ -462,7 +527,9 @@ class Mixin_Gallery_Mapper extends Mixin $storage->delete_gallery($gallery); } // Delete the image records from the DB - $image_mapper->delete()->where(array("galleryid = %d", $gallery_id))->run_query(); + foreach ($image_mapper->find_all_for_gallery($gallery_id) as $image) { + $image_mapper->destroy($image); + } $image_key = $image_mapper->get_primary_key_column(); $image_table = $image_mapper->get_table_name(); // Delete tag associations no longer needed. The following SQL statement @@ -503,6 +570,7 @@ class Mixin_Gallery_Mapper extends Mixin } /** * Sets default values for the gallery + * @param object $entity */ function set_defaults($entity) { @@ -524,8 +592,8 @@ class GalleryStorageDriverNotSelectedException extends RuntimeException class Mixin_GalleryStorage extends Mixin { /** - * Returns the name of the class which provides the gallerystorage - * implementation + * Returns the name of the class which provides the gallerystorage implementation + * @param string|bool $context (optional) * @return string */ function _get_driver_factory_method($context = FALSE) @@ -552,6 +620,7 @@ class C_GalleryStorage_Base extends C_Component * Gets the url or path of an image of a particular size * @param string $method * @param array $args + * @return mixed */ function __call($method, $args) { @@ -581,6 +650,10 @@ class C_Gallery_Storage extends C_GalleryStorage_Base $this->wrap('I_GalleryStorage_Driver', array(&$this, '_get_driver'), $context); $this->implement('I_Gallery_Storage'); } + /** + * @param bool|string $context + * @return C_Gallery_Storage + */ static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { @@ -590,7 +663,7 @@ class C_Gallery_Storage extends C_GalleryStorage_Base } /** * Returns the implementation for the gallerystorage - * @param array $args + * @param string $context * @return mixed */ function _get_driver($context) @@ -683,6 +756,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * Gets the id of a gallery, regardless of whether an integer * or object was passed as an argument * @param mixed $gallery_obj_or_id + * @return null|int */ function _get_gallery_id($gallery_obj_or_id) { @@ -700,7 +774,8 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin /** * Gets the id of an image, regardless of whether an integer * or object was passed as an argument - * @param type $image_obj_or_id + * @param object|int $image_obj_or_id + * @return null|int */ function _get_image_id($image_obj_or_id) { @@ -745,6 +820,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * Backs up an image file * * @param int|object $image + * @return bool */ function backup_image($image) { @@ -776,6 +852,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * @param int|object $gallery * @param boolean $db optionally only copy the image files * @param boolean $move move the image instead of copying + * @return bool */ function copy_images($images, $gallery, $db = TRUE, $move = FALSE) { @@ -785,12 +862,13 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin $gallery_path = $this->object->get_gallery_abspath($gallery); $image_key = $this->object->_image_mapper->get_primary_key_column(); $retval = TRUE; + $fs = C_Fs::get_instance(); // Iterate through each image to copy... foreach ($images as $image) { // Copy each image size foreach ($this->object->get_image_sizes() as $size) { $image_path = $this->object->get_image_abspath($image, $size); - $dst = implode(DIRECTORY_SEPARATOR, array($gallery_path, M_I18n::mb_basename($image_path))); + $dst = $fs->join_paths($gallery_path, M_I18n::mb_basename($image_path)); $success = $move ? move($image_path, $dst) : copy($image_path, $dst); if (!$success) { $retval = FALSE; @@ -810,6 +888,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin } /** * Empties the gallery cache directory of content + * @param object $gallery */ function flush_cache($gallery) { @@ -819,6 +898,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin /** * Gets the absolute path of the backup of an original image * @param string $image + * @return null|string */ function get_backup_abspath($image) { @@ -841,7 +921,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * * Without the gallery parameter the legacy (pre 2.0) shared directory is returned. * - * @param int|stdClass|C_Gallery $gallery (optional) + * @param int|object|false|C_Gallery $gallery (optional) * @return string Absolute path to cache directory */ function get_cache_abspath($gallery = FALSE) @@ -861,6 +941,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin /** * Gets the absolute path where the full-sized image is stored * @param int|object $image + * @return null|string */ function get_full_abspath($image) { @@ -888,6 +969,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * Alias for get_original_url() * * @param int|stdClass|C_Image $image + * @param bool $check_existance (optional) * @return string */ function get_full_url($image, $check_existance = FALSE) @@ -907,7 +989,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * * @param int|object $image * @param string $size - * @return array + * @return null|array */ function get_image_dimensions($image, $size = 'full') { @@ -953,6 +1035,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * Gets the HTML for an image * @param int|object $image * @param string $size + * @param array $attributes (optional) * @return string */ function get_image_html($image, $size = 'full', $attributes = array()) @@ -998,6 +1081,8 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin /** * An alias for get_full_abspath() * @param int|object $image + * @param bool $check_existance + * @return null|string */ function get_original_abspath($image, $check_existance = FALSE) { @@ -1024,6 +1109,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin /** * Gets the url to the original-sized image * @param int|stdClass|C_Image $image + * @param bool $check_existance (optional) * @return string */ function get_original_url($image, $check_existance = FALSE) @@ -1032,7 +1118,8 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin } /** * Gets the upload path, optionally for a particular gallery - * @param int|C_Gallery|stdClass $gallery + * @param int|C_Gallery|object|false $gallery (optional) + * @return string */ function get_upload_relpath($gallery = FALSE) { @@ -1151,7 +1238,9 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * Uploads base64 file to a gallery * @param int|stdClass|C_Gallery $gallery * @param $data base64-encoded string of data representing the image - * @param type $filename specifies the name of the file + * @param string|false (optional) $filename specifies the name of the file + * @param int|false $image_id (optional) + * @param bool $override (optional) * @return C_Image */ function upload_base64_image($gallery, $data, $filename = FALSE, $image_id = FALSE, $override = FALSE) @@ -1435,7 +1524,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * @param string $image_path * @param string $clone_path * @param array $params - * @return array + * @return null|array */ function calculate_image_clone_result($image_path, $clone_path, $params) { @@ -1672,7 +1761,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * @param string $image_path * @param string $clone_path * @param array $params - * @return array + * @return null|array */ function calculate_image_clone_dimensions($image_path, $clone_path, $params) { @@ -1688,8 +1777,7 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin * @param string $image_path * @param string $clone_path * @param array $params - * @param bool $save Whether to call the image save() method - * @return object + * @return null|object */ function generate_image_clone($image_path, $clone_path, $params) { @@ -1822,8 +1910,9 @@ class Mixin_GalleryStorage_Driver_Base extends Mixin $thumbnail->format = strtoupper($format_list[$clone_format]); } $thumbnail = apply_filters('ngg_before_save_thumbnail', $thumbnail); + $exif_iptc = @C_Exif_Writer_Wrapper::read_metadata($image_path); $thumbnail->save($destpath, $quality); - @C_Exif_Writer_Wrapper::copy_metadata($image_path, $destpath); + @C_Exif_Writer_Wrapper::write_metadata($destpath, $exif_iptc); } } return $thumbnail; @@ -1849,6 +1938,10 @@ class C_GalleryStorage_Driver_Base extends C_GalleryStorage_Base $this->_gallery_mapper = C_Gallery_Mapper::get_instance(); $this->_image_mapper = C_Image_Mapper::get_instance(); } + /** + * @param bool|string $context + * @return C_GalleryStorage_Driver_Base + */ public static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { @@ -1899,27 +1992,25 @@ class C_Image extends C_DataMapper_Model } /** * Instantiates a new model - * @param array|stdClass $properties - * @param C_DataMapper $mapper - * @param string $context + * @param array|stdClass $properties (optional) + * @param C_Image_Mapper|false $mapper (optional) + * @param string|false $context (optional) */ function initialize($properties = array(), $mapper = FALSE, $context = FALSE) { - // Get the mapper is not specified if (!$mapper) { $mapper = $this->get_registry()->get_utility($this->_mapper_interface); } - // Initialize parent::initialize($mapper, $properties); } /** * Returns the model representing the gallery associated with this image - * @return C_Gallery|stdClass + * @param object|false $model (optional) + * @return C_Gallery|object */ function get_gallery($model = FALSE) { - $gallery_mapper = C_Gallery_Mapper::get_instance(); - return $gallery_mapper->find($this->galleryid, $model); + return C_Gallery_Mapper::get_instance()->find($this->galleryid, $model); } } /** @@ -1933,7 +2024,8 @@ class C_Image_Mapper extends C_CustomTable_DataMapper_Driver public static $_instance = NULL; /** * Defines the gallery image mapper - * @param type $context + * @param string|false $context (optional) + * @param mixed $not_used */ function define($context = FALSE, $not_used = FALSE) { @@ -1970,6 +2062,10 @@ class C_Image_Mapper extends C_CustomTable_DataMapper_Driver { parent::initialize('ngg_pictures'); } + /** + * @param bool|string $context + * @return C_Image_Mapper + */ static function get_instance($context = False) { if (is_null(self::$_instance)) { @@ -2020,12 +2116,9 @@ class Mixin_Gallery_Image_Mapper extends Mixin $image = $image_or_id; } // Reset all image details that would have normally been imported - $image->alttext = ''; - $image->description = ''; if (is_array($image->meta_data)) { unset($image->meta_data['saved']); } - wp_delete_object_term_relationships($image->{$image->id_field}, 'ngg_tag'); nggAdmin::import_MetaData($image); return $this->object->save($image); } @@ -2144,7 +2237,7 @@ class C_Image_Wrapper /** * Constructor. Converts the image class into an array and fills from defaults any missing values * - * @param object $gallery Individual result from displayed_gallery->get_entities() + * @param object $image Individual result from displayed_gallery->get_entities() * @param object $displayed_gallery Displayed gallery -- MAY BE NULL * @param bool $legacy Whether the image source is from NextGen Legacy or NextGen * @return void @@ -2463,6 +2556,8 @@ class C_Image_Wrapper * Get the thumbnail code (to add effects on thumbnail click) * * Applies the filter 'ngg_get_thumbcode' + * @param string $gallery_name (optional) Default = '' + * @return string */ function get_thumbcode($gallery_name = '') { @@ -2511,10 +2606,10 @@ class C_Image_Wrapper /** * Function exists for legacy support but has been gutted to not do anything * - * @param int $width - * @param int $height + * @param string|int $width (optional) Default = '' + * @param string|int $height (optional) Default = '' * @param string $mode could be watermark | web20 | crop - * @return the url for the image or false if failed + * @return bool|string The url for the image or false if failed */ function cached_singlepic_file($width = '', $height = '', $mode = '') { @@ -2741,7 +2836,7 @@ class C_NextGen_Metadata extends C_Component * nggMeta::get_EXIF() * See also http://trac.wordpress.org/changeset/6313 * - * @return structured EXIF data + * @return bool|array */ function get_EXIF($object = false) { @@ -2811,7 +2906,7 @@ class C_NextGen_Metadata extends C_Component $meta['author'] = $this->utf8_encode($exif['Author']); } if (!empty($exif['Keywords'])) { - $meta['tags'] = $this->utf8_encode($exif['Keywords']); + $meta['keywords'] = $this->utf8_encode($exif['Keywords']); } if (!empty($exif['Subject'])) { $meta['subject'] = $this->utf8_encode($exif['Subject']); @@ -2856,8 +2951,8 @@ class C_NextGen_Metadata extends C_Component /** * nggMeta::readIPTC() - IPTC Data Information for EXIF Display * - * @param mixed $output_tag - * @return IPTC-tags + * @param object $object (optional) + * @return null|bool|array */ function get_IPTC($object = false) { @@ -2891,7 +2986,7 @@ class C_NextGen_Metadata extends C_Component * code by Pekka Saarinen http://photography-on-the.net * * @param mixed $filename - * @return XML data + * @return bool|string */ function extract_XMP($filename) { @@ -2916,7 +3011,7 @@ class C_NextGen_Metadata extends C_Component * * @package Taken from http://php.net/manual/en/function.xml-parse-into-struct.php * @author Alf Marius Foss Olsen & Alex Rabe - * @return XML Array or object + * @return bool|array * */ function get_XMP($object = false) @@ -3054,7 +3149,7 @@ class C_NextGen_Metadata extends C_Component * nggMeta::i8n_name() - localize the tag name * * @param mixed $key - * @return translated $key + * @return string Translated $key */ function i18n_name($key) { @@ -3066,7 +3161,7 @@ class C_NextGen_Metadata extends C_Component } /** * Return the Timestamp from the image , if possible it's read from exif data - * @return int + * @return string */ function get_date_time() { @@ -3156,6 +3251,10 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin { return array('full', 'thumbnail'); } + /** + * @param object|bool $gallery (optional) + * @return string + */ function get_upload_abspath($gallery = FALSE) { // Base upload path @@ -3175,7 +3274,8 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } /** * Get the gallery path persisted in the database for the gallery - * @param int|stdClass|C_NextGen_Gallery $gallery + * @param int|object|C_Gallery $gallery + * @return string */ function get_gallery_abspath($gallery) { @@ -3225,8 +3325,11 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin return $this->object->convert_slashes(rtrim($retval, "/\\")); } /** - * Gets the absolute path where the image is stored - * Can optionally return the path for a particular sized image + * Gets the absolute path where the image is stored. Can optionally return the path for a particular sized image. + * @param int|object $image + * @param string $size (optional) Default = full + * @param bool $check_existance (optional) Default = false + * @return string */ function get_image_abspath($image, $size = 'full', $check_existance = FALSE) { @@ -3300,7 +3403,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin * Gets the url of a particular-sized image * @param int|object $image * @param string $size - * @returns array + * @return string */ function get_image_url($image, $size = 'full', $check_existance = FALSE, $image_abspath = FALSE) { @@ -3337,9 +3440,9 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } /** * Uploads an image for a particular gallerys - * @param int|stdClass|C_NextGEN_Gallery $gallery - * @param type $filename, specifies the name of the file - * @param type $data if specified, expects base64 encoded string of data + * @param int|object|C_Gallery $gallery + * @param string|bool $filename (optional) Specifies the name of the file + * @param string|bool $data (optional) If specified, expects base64 encoded string of data * @return C_Image */ function upload_image($gallery, $filename = FALSE, $data = FALSE) @@ -3470,10 +3573,11 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } /** * Returns an array of dimensional properties (width, height, real_width, real_height) of a resulting clone image if and when generated - * @param string $image_path - * @param string $clone_path + * @param object|int $image Image ID or an image object + * @param string $size * @param array $params - * @return array + * @param bool $skip_defaults + * @return bool|array */ function calculate_image_size_dimensions($image, $size, $params = null, $skip_defaults = false) { @@ -3494,7 +3598,10 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } /** * Generates a specific size for an image - * @param int|stdClass|C_Image $image + * @param int|object|C_Image $image + * @param string $size + * @param array|null $params (optional) + * @param bool $skip_defaults (optional) * @return bool|object */ function generate_image_size($image, $size, $params = null, $skip_defaults = false) @@ -3579,7 +3686,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } /** * Outputs/renders an image - * @param int|stdClass|C_NextGen_Gallery_Image $image + * @param int|stdClass|C_Image $image * @return bool */ function render_image($image, $size = FALSE) @@ -3611,27 +3718,47 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin } return false; } + function _delete_gallery_directory($abspath) + { + // Remove all image files and purge all empty directories left over + $iterator = new DirectoryIterator($abspath); + // Only delete image files! Other files may be stored incorrectly but it's not our place to delete them + $removable_extensions = apply_filters('ngg_allowed_file_types', array('jpeg', 'jpg', 'png', 'gif')); + foreach ($removable_extensions as $extension) { + $removable_extensions[] = $extension . '_backup'; + } + foreach ($iterator as $file) { + if (in_array($file->getBasename(), array('.', '..'))) { + continue; + } elseif ($file->isFile() || $file->isLink()) { + $extension = strtolower(pathinfo($file->getPathname(), PATHINFO_EXTENSION)); + if (in_array($extension, $removable_extensions, TRUE)) { + @unlink($file->getPathname()); + } + } elseif ($file->isDir()) { + $this->object->_delete_gallery_directory($file->getPathname()); + } + } + // DO NOT remove directories that still have files in them. Note: '.' and '..' are included with getSize() + $empty = TRUE; + foreach ($iterator as $file) { + if (in_array($file->getBasename(), array('.', '..'))) { + continue; + } + $empty = FALSE; + } + if ($empty) { + @rmdir($iterator->getPath()); + } + } function delete_gallery($gallery) { - $retval = FALSE; $fs = C_Fs::get_instance(); $safe_dirs = array(DIRECTORY_SEPARATOR, $fs->get_document_root('plugins'), $fs->get_document_root('plugins_mu'), $fs->get_document_root('templates'), $fs->get_document_root('stylesheets'), $fs->get_document_root('content'), $fs->get_document_root('galleries'), $fs->get_document_root()); $abspath = $this->object->get_gallery_abspath($gallery); if ($abspath && file_exists($abspath) && !in_array(stripslashes($abspath), $safe_dirs)) { - // delete the directory and everything in it - $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($abspath), RecursiveIteratorIterator::CHILD_FIRST); - foreach ($iterator as $file) { - if (in_array($file->getBasename(), array('.', '..'))) { - continue; - } elseif ($file->isDir()) { - rmdir($file->getPathname()); - } elseif ($file->isFile() || $file->isLink()) { - unlink($file->getPathname()); - } - } - $retval = @rmdir($abspath); + $this->object->_delete_gallery_directory($abspath); } - return $retval; } function delete_image($image, $size = FALSE) { @@ -3904,7 +4031,7 @@ class Mixin_NggLegacy_GalleryStorage_Driver extends Mixin * Recover image from backup copy and reprocess it * * @param int|stdClass|C_Image $image - * @return string result code + * @return bool|string result code */ function recover_image($image) { @@ -4088,14 +4215,15 @@ class C_NggLegacy_Thumbnail $this->errmsg = 'File is not readable'; $this->error = true; } + $image_size = null; //if there are no errors, determine the file format if ($this->error == false) { // set_time_limit(30); @ini_set('memory_limit', -1); - $data = @getimagesize($this->fileName); - if (isset($data) && is_array($data)) { + $image_size = @getimagesize($this->fileName); + if (isset($image_size) && is_array($image_size)) { $extensions = array('1' => 'GIF', '2' => 'JPG', '3' => 'PNG'); - $extension = array_key_exists($data[2], $extensions) ? $extensions[$data[2]] : ''; + $extension = array_key_exists($image_size[2], $extensions) ? $extensions[$image_size[2]] : ''; if ($extension) { $this->format = $extension; } else { @@ -4148,8 +4276,7 @@ class C_NggLegacy_Thumbnail $this->errmsg = sprintf(__('Create Image failed. %1$s', 'nggallery'), $img_err); $this->error = true; } else { - $size = GetImageSize($this->fileName); - $this->currentDimensions = array('width' => $size[0], 'height' => $size[1]); + $this->currentDimensions = array('width' => $image_size[0], 'height' => $image_size[1]); $this->newImage = $this->oldImage; } } @@ -4162,54 +4289,80 @@ class C_NggLegacy_Thumbnail } /** * Calculate the memory limit + * @param string $filename * */ function checkMemoryForImage($filename) { - if (function_exists('memory_get_usage') && ini_get('memory_limit')) { - $imageInfo = getimagesize($filename); + $imageInfo = getimagesize($filename); + switch ($this->format) { + case 'GIF': + // measured factor 1 is better + $CHANNEL = 1; + break; + case 'JPG': + $CHANNEL = $imageInfo['channels']; + break; + case 'PNG': + // didn't get the channel for png + $CHANNEL = 3; + break; + } + $bits = !empty($imageInfo['bits']) ? $imageInfo['bits'] : 32; + // imgInfo[bits] is not always available + return $this->checkMemoryForData($imageInfo[0], $imageInfo[1], $CHANNEL, $bits); + } + function checkMemoryForData($width, $height, $channels = null, $bits = null) + { + $imageInfo = getimagesize($this->fileName); + if ($channels == null) { switch ($this->format) { case 'GIF': // measured factor 1 is better - $CHANNEL = 1; + $channels = 1; break; case 'JPG': - $CHANNEL = $imageInfo['channels']; + $channels = $imageInfo['channels']; break; case 'PNG': // didn't get the channel for png - $CHANNEL = 3; + $channels = 3; break; } + } + if ($bits == null) { + $bits = !empty($imageInfo['bits']) ? $imageInfo['bits'] : 32; + } + // imgInfo[bits] is not always available + if (function_exists('memory_get_usage') && ini_get('memory_limit')) { $MB = 1048576; // number of bytes in 1M $K64 = 65536; // number of bytes in 64K $TWEAKFACTOR = 1.68; // Or whatever works for you - $bits = !empty($imageInfo['bits']) ? $imageInfo['bits'] : 32; - // imgInfo[bits] is not always available - $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $bits * $CHANNEL / 8 + $K64) * $TWEAKFACTOR); + $memoryNeeded = round((doubleval($width * $height * $bits * $channels) / 8 + $K64) * $TWEAKFACTOR); $memoryNeeded = memory_get_usage() + $memoryNeeded; // get memory limit $memory_limit = ini_get('memory_limit'); // PHP docs : Note that to have no memory limit, set this directive to -1. if ($memory_limit == -1) { - return; + return true; } // Just check megabyte limits, not higher if (strtolower(substr($memory_limit, -1)) == 'm') { if ($memory_limit != '') { - $memory_limit = substr($memory_limit, 0, -1) * 1024 * 1024; + $memory_limit = intval(substr($memory_limit, 0, -1)) * 1024 * 1024; } if ($memoryNeeded > $memory_limit) { $memoryNeeded = round($memoryNeeded / 1024 / 1024, 2); $this->errmsg = 'Exceed Memory limit. Require : ' . $memoryNeeded . " MByte"; $this->error = true; + return false; } } } - return; + return true; } function __destruct() { @@ -4288,10 +4441,13 @@ class C_NggLegacy_Thumbnail * @param int $height * @return array */ - function calcPercent($width, $height) + function calcPercent($width, $height, $percent = -1) { - $newWidth = $width * $this->percent / 100; - $newHeight = $height * $this->percent / 100; + if ($percent == -1) { + $percent = $this->percent; + } + $newWidth = $width * $percent / 100; + $newHeight = $height * $percent / 100; return array('newWidth' => intval($newWidth), 'newHeight' => intval($newHeight)); } /** @@ -4347,9 +4503,13 @@ class C_NggLegacy_Thumbnail * * @param int $Width * @param int $Height + * @param int $deprecated Unused */ function resizeFix($Width = 0, $Height = 0, $deprecated = 3) { + if (!$this->checkMemoryForData($Width, $Height)) { + return; + } $this->newWidth = $Width; $this->newHeight = $Height; if (function_exists("ImageCreateTrueColor")) { @@ -4369,12 +4529,20 @@ class C_NggLegacy_Thumbnail * * @param int $maxWidth * @param int $maxHeight + * @param int $deprecated Unused */ function resize($maxWidth = 0, $maxHeight = 0, $deprecated = 3) { + if (!$this->checkMemoryForData($maxWidth, $maxHeight)) { + return; + } $this->maxWidth = $maxWidth; $this->maxHeight = $maxHeight; $this->calcImageSize($this->currentDimensions['width'], $this->currentDimensions['height']); + if ($this->workingImage != null && $this->workingImage != $this->oldImage) { + ImageDestroy($this->workingImage); + $this->workingImage = null; + } if (function_exists("ImageCreateTrueColor")) { $this->workingImage = ImageCreateTrueColor($this->newDimensions['newWidth'], $this->newDimensions['newHeight']); } else { @@ -4382,6 +4550,7 @@ class C_NggLegacy_Thumbnail } // ImageCopyResampled( $this->imagecopyresampled($this->workingImage, $this->oldImage, 0, 0, 0, 0, $this->newDimensions['newWidth'], $this->newDimensions['newHeight'], $this->currentDimensions['width'], $this->currentDimensions['height']); + ImageDestroy($this->oldImage); $this->oldImage = $this->workingImage; $this->newImage = $this->workingImage; $this->currentDimensions['width'] = $this->newDimensions['newWidth']; @@ -4394,6 +4563,10 @@ class C_NggLegacy_Thumbnail */ function resizePercent($percent = 0) { + $dims = $this->calcPercent($this->currentDimensions['width'], $this->currentDimensions['height'], $percent); + if (!$this->checkMemoryForData($dims['newWidth'], $dims['newHeight'])) { + return; + } $this->percent = $percent; $this->calcImageSizePercent($this->currentDimensions['width'], $this->currentDimensions['height']); if (function_exists("ImageCreateTrueColor")) { @@ -4422,6 +4595,10 @@ class C_NggLegacy_Thumbnail } $cropX = intval(($this->currentDimensions['width'] - $cropSize) / 2); $cropY = intval(($this->currentDimensions['height'] - $cropSize) / 2); + if ($this->workingImage != null && $this->workingImage != $this->oldImage) { + ImageDestroy($this->workingImage); + $this->workingImage = null; + } if (function_exists("ImageCreateTrueColor")) { $this->workingImage = ImageCreateTrueColor($cropSize, $cropSize); } else { @@ -4443,6 +4620,9 @@ class C_NggLegacy_Thumbnail */ function crop($startX, $startY, $width, $height) { + if (!$this->checkMemoryForData($width, $height)) { + return; + } //make sure the cropped area is not greater than the size of the image if ($width > $this->currentDimensions['width']) { $width = $this->currentDimensions['width']; @@ -4463,12 +4643,17 @@ class C_NggLegacy_Thumbnail if ($startY < 0) { $startY = 0; } + if ($this->workingImage != null && $this->workingImage != $this->oldImage) { + ImageDestroy($this->workingImage); + $this->workingImage = null; + } if (function_exists("ImageCreateTrueColor")) { $this->workingImage = ImageCreateTrueColor($width, $height); } else { $this->workingImage = ImageCreate($width, $height); } $this->imagecopyresampled($this->workingImage, $this->oldImage, 0, 0, $startX, $startY, $width, $height, $width, $height); + ImageDestroy($this->oldImage); $this->oldImage = $this->workingImage; $this->newImage = $this->workingImage; $this->currentDimensions['width'] = $width; @@ -4578,6 +4763,7 @@ class C_NggLegacy_Thumbnail * * @param bool $horz flip the image in horizontal mode * @param bool $vert flip the image in vertical mode + * @return true */ function flipImage($horz = false, $vert = false) { @@ -4594,7 +4780,8 @@ class C_NggLegacy_Thumbnail /** * Rotate an image clockwise or counter clockwise * - * @param string $direction could be CW or CCW + * @param string $dir Either CW or CCW + * @return bool */ function rotateImage($dir = 'CW') { @@ -4604,7 +4791,8 @@ class C_NggLegacy_Thumbnail /** * Rotate an image clockwise or counter clockwise * - * @param string $direction could be CW or CCW + * @param int $angle Degrees to rotate the target image + * @return bool */ function rotateImageAngle($angle = 90) { @@ -4922,8 +5110,8 @@ class Mixin_WordPress_GalleryStorage_Driver extends Mixin /** * Gets the upload path for new images in this gallery * This will always be the date-based directory - * @param type $gallery - * @return type + * @param bool|int|object $gallery + * @return bool|string */ function get_upload_abspath($gallery = FALSE) { @@ -4937,9 +5125,9 @@ class Mixin_WordPress_GalleryStorage_Driver extends Mixin return $retval; } /** - * Will always return the same as get_upload_abspath(), as - * WordPress storage is not organized by gallery but by date + * Will always return the same as get_upload_abspath(), as WordPress storage is not organized by gallery but by date * @param int|object $gallery + * @return string */ function get_gallery_abspath($gallery = FALSE) { @@ -4948,7 +5136,7 @@ class Mixin_WordPress_GalleryStorage_Driver extends Mixin /** * Gets the url of a particular sized image * @param int|object $image - * @param type $size + * @param string $size * @return string */ function get_image_url($image = FALSE, $size = 'full') @@ -5024,6 +5212,7 @@ class Mixin_NextGen_Table_Extras extends Mixin * @param $column_name * @param $datatype * @param null $default_value + * @return bool */ function _add_column($column_name, $datatype, $default_value = NULL) { @@ -5068,12 +5257,11 @@ class Mixin_NextGen_Table_Extras extends Mixin $custom_post_entity = $this->create_custom_post_entity($entity); // Try persisting the custom post type record first if ($custom_post_id = $this->object->_custom_post_mapper->save($custom_post_entity)) { - // Try saving the custom table record. If that fails, then destroy the previously - // created custom post type record + // Add the custom post id property + $entity->extras_post_id = $custom_post_id; + // Try saving the custom table record. If that fails, then destroy the previously created custom post type record if (!($retval = $this->call_parent('_create', $entity))) { $this->object->_custom_post_mapper->destroy($custom_post_id); - } else { - $entity->extras_post_id = $custom_post_id; } } return $retval; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/pel-0.9.6/class.exif_writer.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/pel-0.9.6/class.exif_writer.php index 359508475..e130223bc 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/pel-0.9.6/class.exif_writer.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_data/pel-0.9.6/class.exif_writer.php @@ -19,9 +19,17 @@ use lsolesen\pel\PelIfd; class C_Exif_Writer { - static public function copy_metadata($old_file, $new_file) + /** + * @param string $filename + * @return array|void + * @throws \lsolesen\pel\PelIfdException + * @throws \lsolesen\pel\PelInvalidArgumentException + * @throws \lsolesen\pel\PelInvalidDataException + * @throws \lsolesen\pel\PelJpegInvalidMarkerException + */ + static public function read_metadata($filename) { - $data = new PelDataWindow(@file_get_contents($old_file)); + $data = new PelDataWindow(@file_get_contents($filename)); $exif = new PelExif(); if (PelJpeg::isValid($data)) @@ -57,55 +65,114 @@ class C_Exif_Writer $ifd0 = new PelIfd(PelIfd::IFD0); $tiff->setIfd($ifd0); } - - // Copy EXIF data to the new image and write it - $new_image = new PelJpeg($new_file); $tiff->setIfd($ifd0); $exif->setTiff($tiff); - $new_image->setExif($exif); - $new_image->saveFile($new_file); - // IF the original contained IPTC metadata we should copy it - getimagesize($old_file, $iptc); - if (isset($iptc['APP13']) && function_exists('iptcembed')) - { - $parsed = iptcparse($iptc['APP13']); - $newiptc = ''; - foreach ($parsed as $key => $value) { - $tag = str_replace("2#", '', $key); - $newiptc .= self::build_iptc_tag($tag, $value[0]); - } + $retval = array( + 'exif' => $exif, + 'iptc' => NULL + ); - $metadata = iptcembed($newiptc, $new_file); - $fp = fopen($new_file, 'wb'); - fwrite($fp, $metadata); - fclose($fp); - } + @getimagesize($filename, $iptc); + if (!empty($iptc['APP13'])) + $retval['iptc'] = $iptc['APP13']; + + return $retval; + } + + /** + * @param string $origin_file + * @param string $destination_file + * @throws \lsolesen\pel\PelIfdException + * @throws \lsolesen\pel\PelInvalidArgumentException + * @throws \lsolesen\pel\PelInvalidDataException + * @throws \lsolesen\pel\PelJpegInvalidMarkerException + */ + static public function copy_metadata($origin_file, $destination_file) + { + // Read existing data from the source file + $metadata = self::read_metadata($origin_file); + self::write_metadata($destination_file, $metadata); } - public static function build_iptc_tag($tag, $value) + /** + * @param string $filename + * @param array $metadata + * @throws \lsolesen\pel\PelInvalidArgumentException + */ + static public function write_metadata($filename, $metadata) { - $length = strlen($value); - if ($length >= 0x8000) + // Copy EXIF data to the new image and write it + $new_image = new PelJpeg($filename); + $new_image->setExif($metadata['exif']); + $new_image->saveFile($filename); + + // Copy IPTC / APP13 to the new image and write it + if ($metadata['iptc']) { - return chr(0x1c) - . chr(2) - . chr($tag) - . chr(0x80) - . chr(0x04) - . chr(($length >> 24) & 0xff) - . chr(($length >> 16) & 0xff) - . chr(($length >> 8 ) & 0xff) - . chr(($length ) & 0xff) - . $value; + self::write_IPTC($filename, $metadata['iptc']); } - else { - return chr(0x1c) - . chr(2) - . chr($tag) - . chr($length >> 8) - . chr($length & 0xff) - . $value; + } + + /** + * @param string $filename + * @param array $info + * @return bool|int + */ + public static function write_IPTC($filename, $data) + { + $length = strlen($data) + 2; + + // Avoid invalid APP13 regions + if ($length > 0xFFFF) + return FALSE; + + // Wrap existing data in segment container we can embed new content in + $data = chr(0xFF) . chr(0xED) . chr(($length >> 8) & 0xFF) . chr($length & 0xFF) . $data; + + $new_file_contents = @file_get_contents($filename); + + if (!$new_file_contents || strlen($new_file_contents) <= 0) + return FALSE; + + $new_file_contents = substr($new_file_contents, 2); + + // Create new image container wrapper + $new_iptc = chr(0xFF) . chr(0xD8); + + // Track whether content was modified + $new_fields_added = !$data; + + // Loop through each JPEG segment in search of region 13 + while ((substr($new_file_contents, 0, 2) & 0xFFF0) === 0xFFE0) { + + $segment_length = (substr($new_file_contents, 2, 2) & 0xFFFF); + $segment_number = (substr($new_file_contents, 1, 1) & 0x0F); + + // Not a segment we're interested in + if ($segment_length <= 2) + return FALSE; + + $current_segment = substr($new_file_contents, 0, $segment_length + 2); + + if ((13 <= $segment_number) && (!$new_fields_added)) + { + $new_iptc .= $data; + $new_fields_added = TRUE; + if (13 === $segment_number) + $current_segment = ''; + } + + $new_iptc .= $current_segment; + $new_file_contents = substr($new_file_contents, $segment_length + 2); } + + if (!$new_fields_added) + $new_iptc .= $data; + + if ($file = @fopen($filename, 'wb')) + return @fwrite($file, $new_iptc . $new_file_contents); + else + return FALSE; } } \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php index 53aebecf4..d6d2b47bf 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/module.nextgen_gallery_display.php @@ -23,7 +23,7 @@ class M_Gallery_Display extends C_Base_Module 'photocrati-nextgen_gallery_display', 'Gallery Display', 'Provides the ability to display gallery of images', - '3.0.0', + '3.1.0.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -32,7 +32,6 @@ class M_Gallery_Display extends C_Base_Module C_Photocrati_Installer::add_handler($this->module_id, 'C_Display_Type_Installer'); } - /** * Register utilities required for this module */ @@ -75,12 +74,13 @@ class M_Gallery_Display extends C_Base_Module */ function _register_adapters() { - // Provides factory methods for creating display type and - // displayed gallery instances + // Provides factory methods for creating display type and displayed gallery instances $this->get_registry()->add_adapter( 'I_Component_Factory', 'A_Gallery_Display_Factory' ); + $this->get_registry()->add_adapter('I_Displayed_Gallery_Renderer', 'A_Displayed_Gallery_Renderer_Random'); + if (is_admin()) { $this->get_registry()->add_adapter( 'I_Page_Manager', @@ -110,6 +110,7 @@ class M_Gallery_Display extends C_Base_Module { if (!is_admin() && apply_filters('ngg_load_frontend_logic', TRUE, $this->module_id)) { + C_NextGen_Shortcode_Manager::add('ngg', array(&$this, 'display_images')); C_NextGen_Shortcode_Manager::add('ngg_images', array(&$this, 'display_images')); add_action('wp_enqueue_scripts', array(&$this, 'no_resources_mode'), PHP_INT_MAX-1); add_filter('the_content', array($this, '_render_related_images')); @@ -118,7 +119,6 @@ class M_Gallery_Display extends C_Base_Module add_action('init', array(&$this, 'register_resources'), 12); add_action('admin_bar_menu', array(&$this, 'add_admin_bar_menu'), 100); add_filter('run_ngg_resource_manager', array(&$this, 'no_resources_mode')); - add_action('init', array(&$this, 'serve_fontawesome'), 15); // Add hook to delete displayed galleries when removed from a post add_action('pre_post_update', array(&$this, 'locate_stale_displayed_galleries')); @@ -194,83 +194,56 @@ class M_Gallery_Display extends C_Base_Module } } - /** - * Serves the fontawesome woff file via PHP. We do this, as IIS won't serve .woff files. - * @throws E_Clean_Exit - */ - function serve_fontawesome() - { - if (isset($_REQUEST['ngg_serve_fontawesome_woff'])) { - $fs = C_Fs::get_instance(); - $abspath = $fs->find_static_abspath('photocrati-nextgen_gallery_display#fonts/fontawesome-webfont.woff'); - if ($abspath) { - header("Content-Type: application/x-font-woff"); - readfile($abspath); - throw new E_Clean_Exit(); - } - } - elseif (isset($_REQUEST['ngg_serve_fontawesome_css'])) { - $fs = C_Fs::get_instance(); - $abspath = $fs->find_static_abspath('photocrati-nextgen_gallery_display#fontawesome/font-awesome.css'); - if ($abspath) { - $router = C_Router::get_instance(); - $file_content = file_get_contents($abspath); - $file_content = str_replace('../fonts/fontawesome-webfont.eot', $router->get_static_url($this->module_id . '#fonts/fontawesome-webfont.eot'), $file_content); - $file_content = str_replace('../fonts/fontawesome-webfont.svg', $router->get_static_url($this->module_id . '#fonts/fontawesome-webfont.svg'), $file_content); - $file_content = str_replace('../fonts/fontawesome-webfont.ttf', $router->get_static_url($this->module_id . '#fonts/fontawesome-webfont.ttf'), $file_content); - $file_content = str_replace('../fonts/fontawesome-webfont.woff2', $router->get_static_url($this->module_id . '#fonts/fontawesome-webfont.woff2'), $file_content); - $file_content = str_replace('../fonts/fontawesome-webfont.woff', site_url('/?ngg_serve_fontawesome_woff=1'), $file_content); - header('Content-Type: text/css'); - echo $file_content; - throw new E_Clean_Exit(); - } - } - } - - /** - * Enqueues fontawesome. First checks to see if fontawesome is provided by another plugin or already enqueued, - * and if not, enqueues a version of fontawesome that will work with or without IIS - */ static function enqueue_fontawesome() { - if (!wp_style_is('fontawesome', 'registered')) + wp_register_script( + 'fontawesome_v4_shim', + 'https://use.fontawesome.com/releases/v5.3.1/js/v4-shims.js', + array(), + '5.3.1' + ); + if (!wp_script_is('fontawesome', 'registered')) { - wp_enqueue_style( + add_filter('script_loader_tag', 'M_Gallery_Display::fix_fontawesome_script_tag', 10, 2); + wp_enqueue_script( 'fontawesome', - self::get_fontawesome_url(TRUE), - FALSE, - '4.6.1' + 'https://use.fontawesome.com/releases/v5.3.1/js/all.js', + array('fontawesome_v4_shim'), + '5.3.1' ); } - wp_enqueue_style('fontawesome'); - } + if (!wp_style_is('fontawesome', 'registered')) + { + wp_enqueue_style( + 'fontawesome_v4_shim_style', + 'https://use.fontawesome.com/releases/v5.3.1/css/v4-shims.css' + ); + wp_enqueue_style( + 'fontawesome', + 'https://use.fontawesome.com/releases/v5.3.1/css/all.css' + ); + } - /** - * Gets the src url for the registered fontawesome handler - * @param bool $ngg_provided_only - * @return null|string - */ - static function get_fontawesome_url($ngg_provided_only=FALSE) - { - $retval = NULL; + wp_enqueue_script('fontawesome_v4_shim'); + wp_enqueue_script('fontawesome'); - if (wp_style_is('fontawesome', 'registered') && !$ngg_provided_only) { - $style = wp_styles()->registered['fontawesome']; - $retval = $style->src; - } - else { - if (strpos(strtolower($_SERVER['SERVER_SOFTWARE']), 'microsoft-iis') !== FALSE) { - $retval = site_url('/?ngg_serve_fontawesome_css=1'); - } - else { - $router = C_Router::get_instance(); - $retval = $router->get_static_url('photocrati-nextgen_gallery_display#fontawesome/font-awesome.css'); - } - } + } - return $retval; - } + /** + * WP doesn't allow an easy way to set the defer, crossorign, or integrity attributes on our <script> + * + * @param string $tag + * @param string $handle + * @return string + */ + static function fix_fontawesome_script_tag($tag, $handle) + { + if ('fontawesome' !== $handle) + return $tag; + + return str_replace(' src', ' defer integrity="sha384-kW+oWsYx3YpxvjtZjFXqazFpA7UP/MbiY4jvs+RWZo2+N94PFZ36T6TFkc9O3qoB" crossorigin="anonymous" data-auto-replace-svg="false" data-keep-original-source="false" data-search-pseudo-elements src', $tag); + } function no_resources_mode($valid_request=TRUE) { @@ -407,7 +380,7 @@ class M_Gallery_Display extends C_Base_Module wp_register_style( 'nextgen_gallery_display_settings', $router->get_static_url('photocrati-nextgen_gallery_display#nextgen_gallery_display_settings.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); @@ -416,7 +389,7 @@ class M_Gallery_Display extends C_Base_Module wp_register_style( 'nextgen_gallery_related_images', $router->get_static_url('photocrati-nextgen_gallery_display#nextgen_gallery_related_images.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); wp_register_script( @@ -429,9 +402,16 @@ class M_Gallery_Display extends C_Base_Module wp_register_style( 'ngg_trigger_buttons', $router->get_static_url('photocrati-nextgen_gallery_display#trigger_buttons.css'), - FALSE, + array(), NGG_SCRIPT_VERSION ); + + wp_register_script( + 'ngg_waitforimages', + $router->get_static_url('photocrati-nextgen_gallery_display#jquery.waitforimages.js'), + array('jquery'), + NGG_SCRIPT_VERSION + ); } } @@ -479,24 +459,25 @@ class M_Gallery_Display extends C_Base_Module function get_type_list() { return array( + 'A_Display_Settings_Controller' => 'adapter.display_settings_controller.php', + 'A_Display_Settings_Page' => 'adapter.display_settings_page.php', + 'A_Displayed_Gallery_Renderer_Random' => 'adapter.displayed_gallery_renderer_random.php', + 'A_Displayed_Gallery_Trigger_Element' => 'adapter.displayed_gallery_trigger_element.php', + 'A_Displayed_Gallery_Trigger_Resources' => 'adapter.displayed_gallery_trigger_resources.php', + 'A_Gallery_Display_Factory' => 'adapter.gallery_display_factory.php', + 'A_Gallery_Display_View' => 'adapter.gallery_display_view.php', + 'C_Display_Type' => 'class.display_type.php', + 'C_Display_Type_Controller' => 'class.display_type_controller.php', + 'C_Display_Type_Installer' => 'class.gallery_display_installer.php', + 'C_Display_Type_Mapper' => 'class.display_type_mapper.php', + 'C_Displayed_Gallery' => 'class.displayed_gallery.php', + 'C_Displayed_Gallery_Mapper' => 'class.displayed_gallery_mapper.php', + 'C_Displayed_Gallery_Renderer' => 'class.displayed_gallery_renderer.php', + 'C_Displayed_Gallery_Source_Manager' => 'class.displayed_gallery_source_manager.php', 'C_Displayed_Gallery_Trigger' => 'class.displayed_gallery_trigger.php', - 'C_Displayed_Gallery_Trigger_Manager' => 'class.displayed_gallery_trigger_manager.php', - 'A_Displayed_Gallery_Trigger_Element' => 'adapter.displayed_gallery_trigger_element.php', - 'A_Displayed_Gallery_Trigger_Resources' => 'adapter.displayed_gallery_trigger_resources.php', - 'A_Display_Settings_Controller' => 'adapter.display_settings_controller.php', - 'A_Display_Settings_Page' => 'adapter.display_settings_page.php', - 'A_Gallery_Display_Factory' => 'adapter.gallery_display_factory.php', - 'C_Display_Type_Installer' => 'class.gallery_display_installer.php', - 'A_Gallery_Display_View' => 'adapter.gallery_display_view.php', - 'C_Displayed_Gallery' => 'class.displayed_gallery.php', - 'C_Displayed_Gallery_Mapper' => 'class.displayed_gallery_mapper.php', - 'C_Displayed_Gallery_Renderer' => 'class.displayed_gallery_renderer.php', - 'C_Displayed_Gallery_Source_Manager' => 'class.displayed_gallery_source_manager.php', - 'C_Display_Type' => 'class.display_type.php', - 'C_Display_Type_Controller' => 'class.display_type_controller.php', - 'C_Display_Type_Mapper' => 'class.display_type_mapper.php', - 'Hook_Propagate_Thumbnail_Dimensions_To_Settings' => 'hook.propagate_thumbnail_dimensions_to_settings.php', - 'Mixin_Display_Type_Form' => 'mixin.display_type_form.php' + 'C_Displayed_Gallery_Trigger_Manager' => 'class.displayed_gallery_trigger_manager.php', + 'Mixin_Display_Type_Form' => 'mixin.display_type_form.php', + 'Hook_Propagate_Thumbnail_Dimensions_To_Settings' => 'hook.propagate_thumbnail_dimensions_to_settings.php' ); } @@ -583,6 +564,7 @@ class C_Display_Type_Installer /** * Installs displayed gallery sources + * @param bool $reset (optional) Unused */ function install($reset=FALSE) { @@ -591,6 +573,7 @@ class C_Display_Type_Installer /** * Uninstalls this module + * @param bool $hard (optional) Unused */ function uninstall($hard = FALSE) { @@ -606,7 +589,8 @@ class C_Display_Type_Installer /** * Show related images for a post/page. Ngglegacy function * @param $taglist - * @param int $maxImages + * @param int $maxImages (optional) Default = 0 + * @return string */ function nggShowRelatedGallery($taglist, $maxImages = 0) { @@ -624,4 +608,4 @@ function the_related_images($type = 'tags', $maxNumbers = 7) } -new M_Gallery_Display(); +new M_Gallery_Display(); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php index f4f388ae4..66bdb92b5 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php @@ -37,6 +37,94 @@ class A_Display_Settings_Page extends Mixin return $this->call_parent('setup'); } } +class A_Displayed_Gallery_Renderer_Random extends Mixin +{ + /** + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return + * @param mixed $mode + * @return string + */ + function render($displayed_gallery, $return = FALSE, $mode = null) + { + $entity = $displayed_gallery->get_entity(); + // Duplicated from the parent render() method but it's necessary to have for this code to work + if (is_null($displayed_gallery->id())) { + $displayed_gallery->id(md5(json_encode($entity))); + } + if (in_array($displayed_gallery->source, array('random', 'random_images')) && empty($displayed_gallery->entity_ids)) { + // Check if the ID selection has been cached + $key = C_Photocrati_Transient_Manager::create_key('random_displayed_gallery_entity_ids', $entity); + $image_ids = C_Photocrati_Transient_Manager::fetch($key, FALSE); + if (empty($image_ids)) { + $image_ids = $this->get_random_ids_for_cache($displayed_gallery); + // Store our retrieved IDs + C_Photocrati_Transient_Manager::update($key, json_encode($image_ids), 86400); + } else { + // Convert the stored JSON to an array + $image_ids = json_decode($image_ids, TRUE); + } + // Final step: assign the cached IDs to the $displayed_gallery and return control to the parent + if (is_array($image_ids)) { + $displayed_gallery->entity_ids = $image_ids; + } + } + return $this->call_parent('render', $displayed_gallery, $return, $mode); + } + public function query_random_ids_for_cache($limit = 10) + { + global $wpdb; + $mod = rand(3, 9); + return $wpdb->get_col("SELECT pictures.pid from {$wpdb->nggpictures} pictures\n JOIN (SELECT CEIL(MAX(pid) * RAND()) AS pid FROM {$wpdb->nggpictures}) AS x ON pictures.pid >= x.pid\n WHERE pictures.pid MOD {$mod} = 0\n LIMIT {$limit}"); + } + /** + * @param C_Displayed_Gallery $displayed_gallery + * @return int[] + */ + public function get_random_ids_for_cache($displayed_gallery) + { + global $wpdb; + $image_ids = array(); + // Impose a reasonable hard limit + if ($displayed_gallery->maximum_entity_count > 500) { + $displayed_gallery->maximum_entity_count = 500; + } + // Some hosts and/or users prefer to not use or choose to disable mySQL's ORDER BY RAND() feature. For them + // we provide an alternative where we generate some random numbers and check if they exist as image ID and + // continue to do so until our requested cache has filled. + if (defined('NGG_DISABLE_ORDER_BY_RAND') && NGG_DISABLE_ORDER_BY_RAND) { + // Prevent infinite loops: retrieve the image count and if needed just pull in every image available + $total = $wpdb->get_var("SELECT COUNT(`pid`) FROM {$wpdb->nggpictures}"); + if ($total <= $displayed_gallery->maximum_entity_count) { + $image_ids = $wpdb->get_col("SELECT pictures.pid from {$wpdb->nggpictures} pictures LIMIT {$total}"); + } else { + // Start retrieving random ID from the DB and hope they exist; continue looping until our count is full + $segments = ceil($displayed_gallery->maximum_entity_count / 4); + while (count($image_ids) < $displayed_gallery->maximum_entity_count) { + $newID = $this->query_random_ids_for_cache($segments); + $image_ids = array_merge(array_unique($image_ids), $newID); + } + } + // Prevent overflow + if (count($image_ids) > $displayed_gallery->maximum_entity_count) { + array_splice($image_ids, $displayed_gallery->maximum_entity_count); + } + // Give things an extra shake + shuffle($image_ids); + } else { + // Default logic; most users will rely on this method + $sql = "SELECT DISTINCT `pid` FROM `{$wpdb->nggpictures}` WHERE `exclude` = 0"; + if (!empty($displayed_gallery->exclusions)) { + $sql .= sprintf(" AND `pid` NOT IN (%s)", implode(',', $displayed_gallery->exclusions)); + } + $sql .= " ORDER BY RAND() LIMIT {$displayed_gallery->maximum_entity_count}"; + foreach ($wpdb->get_results($sql, ARRAY_N) as $res) { + $image_ids[] = reset($res); + } + } + return $image_ids; + } +} /** * Class A_Displayed_Gallery_Trigger_Element * @mixin C_MVC_View @@ -100,9 +188,9 @@ class A_Gallery_Display_Factory extends Mixin { /** * Instantiates a Display Type - * @param C_DataMapper $mapper - * @param array|stdClass|C_DataMapper_Model $properties - * @param string|array|FALSE $context + * @param array|stdClass|C_DataMapper_Model $properties (optional) + * @param C_Display_Type_Mapper $mapper (optional) + * @param string|array|FALSE $context (optional) */ function display_type($properties = array(), $mapper = FALSE, $context = FALSE) { @@ -110,9 +198,9 @@ class A_Gallery_Display_Factory extends Mixin } /** * Instantiates a Displayed Gallery - * @param C_DataMapper $mapper - * @param array|stdClass|C_DataMapper_Model $properties - * @param string|array|FALSE $context + * @param array|stdClass|C_DataMapper_Model $properties (optional) + * @param C_Displayed_Gallery_Mapper $mapper (optional) + * @param string|array|FALSE $context (optional) */ function displayed_gallery($properties = array(), $mapper = FALSE, $context = FALSE) { @@ -132,7 +220,7 @@ class A_Gallery_Display_View extends Mixin * @param string $template_id * @param C_MVC_View_Element $root_element * @param string $addition_type what kind of addition is being made 'layout', 'decoration', 'style', 'logic' etc. - * @return string|NULL + * @return bool|string */ function _check_addition_rendering($displayed_gallery, $template_id, $root_element, $addition_type) { @@ -180,8 +268,8 @@ class C_Display_Type extends C_DataMapper_Model } /** * Initializes a display type with properties - * @param FALSE|C_Display_Type_Mapper $mapper * @param array|stdClass|C_Display_Type $properties + * @param FALSE|C_Display_Type_Mapper $mapper * @param FALSE|string|array $context */ function initialize($properties = array(), $mapper = FALSE, $context = FALSE) @@ -246,9 +334,8 @@ class Mixin_Display_Type_Validation extends Mixin class Mixin_Display_Type_Instance_Methods extends Mixin { /** - * Determines if this display type is compatible with a displayed gallery - * source - * @param stdClass + * Determines if this display type is compatible with a displayed gallery source + * @param stdClass $source * @return bool */ function is_compatible_with_source($source) @@ -280,7 +367,7 @@ class C_Display_Type_Controller extends C_MVC_Controller } /** * Gets a singleton of the mapper - * @param string|array $context + * @param string|bool $context * @return C_Display_Type_Controller */ public static function get_instance($context = FALSE) @@ -299,7 +386,7 @@ class Mixin_Display_Type_Controller extends Mixin var $_render_mode; /** * Enqueues static resources required for lightbox effects - * @param type $displayed_gallery + * @param object $displayed_gallery */ function enqueue_lightbox_resources($displayed_gallery) { @@ -312,13 +399,14 @@ class Mixin_Display_Type_Controller extends Mixin /** * This method should be overwritten by other adapters/mixins, and call * wp_enqueue_script() / wp_enqueue_style() + * @param C_Displayed_Gallery $displayed_gallery */ function enqueue_frontend_resources($displayed_gallery) { // This script provides common JavaScript among all display types wp_enqueue_script('ngg_common'); // Enqueue the display type library - wp_enqueue_script($displayed_gallery->display_type, $this->object->_get_js_lib_url($displayed_gallery), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_script($displayed_gallery->display_type, $this->object->_get_js_lib_url($displayed_gallery), array(), NGG_SCRIPT_VERSION); // Add "galleries = {};" $this->object->_add_script_data('ngg_common', 'galleries', new stdClass(), TRUE, FALSE); // Add "galleries.gallery_1 = {};" @@ -333,7 +421,7 @@ class Mixin_Display_Type_Controller extends Mixin { $settings = C_NextGen_Settings::get_instance(); if ((!is_multisite() || is_multisite() && $settings->wpmuStyle) && $settings->activateCSS) { - wp_enqueue_style('nggallery', C_NextGen_Style_Manager::get_instance()->get_selected_stylesheet_url(), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nggallery', C_NextGen_Style_Manager::get_instance()->get_selected_stylesheet_url(), array(), NGG_SCRIPT_VERSION); } } function get_render_mode() @@ -362,6 +450,9 @@ class Mixin_Display_Type_Controller extends Mixin } /** * Renders the frontend display of the display type + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return (optional) + * @return string */ function index_action($displayed_gallery, $return = FALSE) { @@ -397,7 +488,8 @@ class Mixin_Display_Type_Controller extends Mixin } /** * Returns the effect HTML code for the displayed gallery - * @param type $displayed_gallery + * @param object $displayed_gallery + * @return string */ function get_effect_code($displayed_gallery) { @@ -423,6 +515,8 @@ class Mixin_Display_Type_Controller extends Mixin * @param string $object_name * @param mixed $object_value * @param bool $define + * @param bool $override + * @return bool */ function _add_script_data($handle, $object_name, $object_value, $define = TRUE, $override = FALSE) { @@ -520,11 +614,7 @@ class Mixin_Display_Type_Controller extends Mixin { if (isset($params['displayed_gallery'])) { if (isset($params['displayed_gallery']->display_settings)) { - if (isset($params['displayed_gallery']->display_settings['display_type_view'])) { - if ('default' !== $params['displayed_gallery']->display_settings['display_type_view']) { - $template = $this->get_display_type_view_abspath($template, $params); - } - } + $template = $this->get_display_type_view_abspath($template, $params); } } return $this->call_parent('create_view', $template, $params, $context); @@ -538,18 +628,51 @@ class Mixin_Display_Type_Controller extends Mixin function get_display_type_view_abspath($template, $params) { /* Identify display type and display_type_view */ + $displayed_gallery = $params['displayed_gallery']; $display_type_name = $params['displayed_gallery']->display_type; - $display_type_view = $params['displayed_gallery']->display_settings['display_type_view']; - /* Fetch array of template directories */ - $dirs = M_Gallery_Display::get_display_type_view_dirs($display_type_name); - /* Set abspath for template based on directory placeholder in display_type_view */ - $path = pathinfo($display_type_view); - if ($path['dirname'] == ".") { - $template = $dirs['default'] . DIRECTORY_SEPARATOR . $path['basename']; - } else { - foreach ($dirs as $dir_name => $dir) { - if ($path['dirname'] == $dir_name) { - $template = $dir . DIRECTORY_SEPARATOR . $path['basename']; + $display_settings = $displayed_gallery->display_settings; + $display_type_view = NULL; + if (isset($display_settings['display_type_view'])) { + $display_type_view = $display_settings['display_type_view']; + } + if (isset($display_settings['display_view'])) { + $display_type_view = $display_settings['display_view']; + } + if ($display_type_view && $display_type_view != 'default') { + /* + * A display type view or display template value looks like this: + * + * "default" + * "imagebrowser-dark-template.php" ("default" category is implicit) + * "custom/customized-template.php" ("custom" category is explicit) + * + * Templates can be found in multiple directories, and each directory is given + * a key, which is used to distinguish it's "category". + */ + $fs = C_Fs::get_instance(); + /* Fetch array of template directories */ + $dirs = M_Gallery_Display::get_display_type_view_dirs($display_type_name); + // If the view starts with a slash, we assume that a filename has been given + if (strpos($display_type_view, DIRECTORY_SEPARATOR) === 0) { + if (@file_exists($display_type_view)) { + $template = $display_type_view; + } + } else { + // Add the missing "default" category name prefix to the template to make it + // more consistent to evaluate + if (strpos($display_type_view, DIRECTORY_SEPARATOR) === FALSE) { + $display_type_view = join(DIRECTORY_SEPARATOR, array('default', $display_type_view)); + } + foreach ($dirs as $category => $dir) { + $category = preg_quote($category . DIRECTORY_SEPARATOR); + if (preg_match("#^{$category}(.*)\$#", $display_type_view, $match)) { + $display_type_view = $match[1]; + $template_abspath = $fs->join_paths($dir, $display_type_view); + if (@file_exists($template_abspath)) { + $template = $template_abspath; + break; + } + } } } } @@ -595,7 +718,7 @@ class C_Display_Type_Mapper extends C_CustomPost_DataMapper_Driver } /** * Gets a singleton of the mapper - * @param string|array $context + * @param string|bool $context * @return C_Display_Type_Mapper */ public static function get_instance($context = False) @@ -614,6 +737,8 @@ class Mixin_Display_Type_Mapper extends Mixin /** * Locates a Display Type by names * @param string $name + * @param bool $model + * @return null|object */ function find_by_name($name, $model = FALSE) { @@ -636,6 +761,7 @@ class Mixin_Display_Type_Mapper extends Mixin /** * Finds display types used to display specific types of entities * @param string|array $entity_type e.g. image, gallery, album + * @param bool $model (optional) * @return array */ function find_by_entity_type($entity_type, $model = FALSE) @@ -663,6 +789,7 @@ class Mixin_Display_Type_Mapper extends Mixin } /** * Sets default values needed for display types + * @param object $entity (optional) */ function set_defaults($entity) { @@ -711,8 +838,8 @@ class C_Displayed_Gallery extends C_DataMapper_Model } /** * Initializes a display type with properties - * @param FALSE|C_Displayed_Gallery_Mapper $mapper * @param array|stdClass|C_Displayed_Gallery $properties + * @param FALSE|C_Displayed_Gallery_Mapper $mapper * @param FALSE|string|array $context */ function initialize($properties = array(), $mapper = FALSE, $context = FALSE) @@ -721,7 +848,6 @@ class C_Displayed_Gallery extends C_DataMapper_Model $mapper = $this->get_registry()->get_utility($this->_mapper_interface); } parent::initialize($mapper, $properties); - $this->select_random_variation(); } } /** @@ -773,24 +899,6 @@ class Mixin_Displayed_Gallery_Validation extends Mixin } class Mixin_Displayed_Gallery_Queries extends Mixin { - function select_random_variation() - { - $retval = FALSE; - $source_obj = $this->object->get_source(); - if ($source_obj && $source_obj->has_variations) { - $max = 0; - if (!defined('NGG_MAX_VARIATIONS')) { - $settings = C_Photocrati_Global_Settings_Manager::get_instance(); - $max = $settings->get('max_variations', 5); - define('NGG_MAX_VARIATIONS', $max); - } else { - $max = NGG_MAX_VARIATIONS; - } - $this->object->variation = floor(rand(1, $max)); - $retval = $this->object->variation; - } - return $retval; - } function get_entities($limit = FALSE, $offset = FALSE, $id_only = FALSE, $returns = 'included') { $retval = array(); @@ -1153,7 +1261,7 @@ class Mixin_Displayed_Gallery_Queries extends Mixin /** * Returns the total number of entities in this displayed gallery * @param string $returns - * @returns int + * @return int */ function get_entity_count($returns = 'included') { @@ -1408,6 +1516,7 @@ class Mixin_Displayed_Gallery_Instance_Methods extends Mixin /** * Applies the values of a transient to this object * @param string $transient_id + * @return bool */ function apply_transient($transient_id = NULL) { @@ -1478,7 +1587,6 @@ class C_Displayed_Gallery_Mapper extends C_CustomPost_DataMapper_Driver } /** * Initializes the mapper - * @param string|array|FALSE $context */ function initialize() { @@ -1486,7 +1594,7 @@ class C_Displayed_Gallery_Mapper extends C_CustomPost_DataMapper_Driver } /** * Gets a singleton of the mapper - * @param string|array $context + * @param string|bool $context * @return C_Displayed_Gallery_Mapper */ public static function get_instance($context = False) @@ -1514,7 +1622,7 @@ class Mixin_Displayed_Gallery_Defaults extends Mixin } /** * Sets defaults needed for the entity - * @param type $entity + * @param object $entity */ function set_defaults($entity) { @@ -1556,7 +1664,7 @@ class C_Displayed_Gallery_Renderer extends C_Component static $_instances = array(); /** * Returns an instance of the class - * @param mixed $context + * @param bool|string $context * @return C_Displayed_Gallery_Renderer */ static function get_instance($context = FALSE) @@ -1589,7 +1697,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin // Get the NextGEN settings to provide some defaults $settings = C_NextGen_Settings::get_instance(); // Configure the arguments - $defaults = array('id' => NULL, 'source' => '', 'container_ids' => array(), 'gallery_ids' => array(), 'album_ids' => array(), 'tag_ids' => array(), 'display_type' => '', 'exclusions' => array(), 'order_by' => $settings->galSort, 'order_direction' => $settings->galSortOrder, 'image_ids' => array(), 'entity_ids' => array(), 'tagcloud' => FALSE, 'returns' => 'included', 'slug' => NULL, 'sortorder' => array()); + $defaults = array('id' => NULL, 'ids' => NULL, 'source' => '', 'src' => '', 'container_ids' => array(), 'gallery_ids' => array(), 'album_ids' => array(), 'tag_ids' => array(), 'display_type' => '', 'display' => '', 'exclusions' => array(), 'order_by' => $settings->galSort, 'order_direction' => $settings->galSortOrder, 'image_ids' => array(), 'entity_ids' => array(), 'tagcloud' => FALSE, 'returns' => 'included', 'slug' => NULL, 'sortorder' => array()); $args = shortcode_atts($defaults, $params); // Are we loading a specific displayed gallery that's persisted? $mapper = C_Displayed_Gallery_Mapper::get_instance(); @@ -1627,6 +1735,10 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin $args['source'] = 'tags'; } // Convert strings to arrays + if (!empty($args['ids']) && !is_array($args['ids'])) { + $args['container_ids'] = preg_split("/,|\\|/", $args['ids']); + unset($args['ids']); + } if (!is_array($args['container_ids'])) { $args['container_ids'] = preg_split("/,|\\|/", $args['container_ids']); } @@ -1639,6 +1751,16 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin if (!is_array($args['sortorder'])) { $args['sortorder'] = preg_split("/,|\\|/", $args['sortorder']); } + // 'src' is used for legibility + if (!empty($args['src']) && empty($args['source'])) { + $args['source'] = $args['src']; + unset($args['src']); + } + // 'display' is used for legibility + if (!empty($args['display']) && empty($args['display_type'])) { + $args['display_type'] = $args['display']; + unset($args['display']); + } // Get the display settings foreach (array_keys($defaults) as $key) { unset($params[$key]); @@ -1671,37 +1793,42 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin * How to use: * * To retrieve images from gallery 1 & 3, but exclude images 4 & 6: - * [ngg_images gallery_ids="1,3" exclusions="4,6" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg gallery_ids="1,3" exclusions="4,6" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve images 1 & 2 from gallery 1: - * [ngg_images gallery_ids="1" image_ids="1,2" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg gallery_ids="1" image_ids="1,2" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve images matching tags "landscapes" and "wedding shoots": - * [ngg_images tag_ids="landscapes,wedding shoots" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg tag_ids="landscapes,wedding shoots" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve galleries from albums 1 & #, but exclude sub-album 1: - * [ngg_images album_ids="1,2" exclusions="a1" display_type="photocrati-nextgen_basic_compact_album"] + * [ngg album_ids="1,2" exclusions="a1" display_type="photocrati-nextgen_basic_compact_album"] * * To retrieve galleries from albums 1 & 2, but exclude gallery 1: - * [ngg_images album_ids="1,2" exclusions="1" display_type="photocrati-nextgen_basic_compact_album"] + * [ngg album_ids="1,2" exclusions="1" display_type="photocrati-nextgen_basic_compact_album"] * * To retrieve image 2, 3, and 5 - independent of what container is used - * [ngg_images image_ids="2,3,5" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg image_ids="2,3,5" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve galleries 3 & 5, custom sorted, in album view - * [ngg_images source="albums" gallery_ids="3,5" display_type="photocrati-nextgen_basic_compact_album"] + * [ngg source="albums" gallery_ids="3,5" display_type="photocrati-nextgen_basic_compact_album"] * * To retrieve recent images, sorted by alt/title text - * [ngg_images source="recent" order_by="alttext" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg source="recent" order_by="alttext" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve random image - * [ngg_images source="random" display_type="photocrati-nextgen_basic_thumbnails"] + * [ngg source="random" display_type="photocrati-nextgen_basic_thumbnails"] * * To retrieve a single image - * [ngg_images image_ids='8' display_type='photocrati-nextgen_basic_singlepic'] + * [ngg image_ids='8' display_type='photocrati-nextgen_basic_singlepic'] * * To retrieve a tag cloud - * [ngg_images tagcloud=yes display_type='photocrati-nextgen_basic_tagcloud'] + * [ngg tagcloud=yes display_type='photocrati-nextgen_basic_tagcloud'] + * + * @param array $params + * @param null|string $inner_content (optional) + * @param bool|null $mode (optional) + * @return string */ function display_images($params, $inner_content = NULL, $mode = NULL) { @@ -1739,9 +1866,28 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin } return $retval; } + /** + * Gets the display type version associated with the displayed gallery + * @param $display_type + * + * @return string + */ + function get_display_type_version($display_type) + { + $retval = NGG_PLUGIN_VERSION; + $registry = C_Component_Registry::get_instance(); + $module = $registry->get_module(isset($display_type->module_id) ? $display_type->module_id : $display_type->name); + if ($module) { + $retval = $module->module_version; + } + return $retval; + } /** * Renders a displayed gallery on the frontend - * @param C_Displayed_Gallery|stdClass $displayed_gallery + * @param C_Displayed_Gallery $displayed_gallery + * @param bool $return + * @param string|null $mode (optional) + * @return string */ function render($displayed_gallery, $return = FALSE, $mode = null) { @@ -1755,16 +1901,8 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin if ($mode == null) { $mode = 'normal'; } - if (apply_filters('ngg_cache_displayed_galleries', FALSE)) { - // Save the displayed gallery as a transient if it hasn't already. Allows for ajax operations - // to add or modify the gallery without losing a retrievable ID - if (!$displayed_gallery->apply_transient()) { - $displayed_gallery->to_transient(); - } - } else { - if (is_null($displayed_gallery->id())) { - $displayed_gallery->id(md5(json_encode($displayed_gallery->get_entity()))); - } + if (is_null($displayed_gallery->id())) { + $displayed_gallery->id(md5(json_encode($displayed_gallery->get_entity()))); } // Get the display type controller $controller = $this->get_registry()->get_utility('I_Display_Type_Controller', $displayed_gallery->display_type); @@ -1800,7 +1938,7 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin $retval .= $this->debug_msg("Lookup!"); // Some settings affect display types $settings = C_NextGen_Settings::get_instance(); - $key_params = apply_filters('ngg_displayed_gallery_cache_params', array($displayed_gallery->get_entity(), $url, $mode, $settings->activateTags, $settings->appendType, $settings->maxImages, $settings->thumbEffect, $settings->thumbCode, $settings->galSort, $settings->galSortDir)); + $key_params = apply_filters('ngg_displayed_gallery_cache_params', array($displayed_gallery->get_entity(), $url, $mode, $settings->activateTags, $settings->appendType, $settings->maxImages, $settings->thumbEffect, $settings->thumbCode, $settings->galSort, $settings->galSortDir, $this->get_display_type_version($displayed_gallery->get_display_type()))); // Any displayed gallery links on the home page will need to be regenerated if the permalink structure // changes if (is_home() or is_front_page()) { @@ -1843,9 +1981,12 @@ class Mixin_Displayed_Gallery_Renderer extends Mixin } return $retval; } + /** + * @return bool + */ function is_rest_request() { - return strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; + return defined('REST_REQUEST') || strpos($_SERVER['REQUEST_URI'], 'wp-json') !== FALSE; } } class C_Displayed_Gallery_Source_Manager @@ -1855,6 +1996,9 @@ class C_Displayed_Gallery_Source_Manager private $_registered_defaults = array(); /* @var C_Displayed_Gallery_Source_Manager */ static $_instance = NULL; + /** + * @return C_Displayed_Gallery_Source_Manager + */ static function get_instance() { if (!isset(self::$_instance)) { @@ -1897,7 +2041,6 @@ class C_Displayed_Gallery_Source_Manager $random->title = __('Random Images', 'nggallery'); $random->aliases = array('random', 'random_image'); $random->returns = array('image'); - $random->has_variations = TRUE; $this->register($random->name, $random); // Recent Images $recent = new stdClass(); @@ -1929,9 +2072,6 @@ class C_Displayed_Gallery_Source_Manager if (!isset($object->aliases)) { $object->aliases = array(); } - if (!isset($object->has_variations)) { - $object->has_variations = FALSE; - } // Add internal reference $this->_sources[$name] = $object; foreach ($object->aliases as $name) { @@ -2052,7 +2192,7 @@ abstract class C_Displayed_Gallery_Trigger } function get_css_class() { - return 'fa fa-circle'; + return 'far fa-circle'; } function get_attributes() { @@ -2352,7 +2492,7 @@ class Mixin_Display_Type_Form extends Mixin /** * Returns the name of the display type. Sub-class should override * @throws Exception - * @returns string + * @return string */ function get_display_type_name() { @@ -2372,7 +2512,7 @@ class Mixin_Display_Type_Form extends Mixin } /** * Returns the title of the form, which is the title of the display type - * @returns string + * @return string */ function get_title() { @@ -2449,6 +2589,15 @@ class Mixin_Display_Type_Form extends Mixin $everything = $override_field . $quality_field . $crop_field . $watermark_field; return $everything; } + function _render_display_view_field($display_type) + { + $display_type_views = $this->get_available_display_type_views($display_type); + $current_value = isset($display_type->settings['display_type_view']) ? $display_type->settings['display_type_view'] : ''; + if (isset($display_type->settings['display_view'])) { + $current_value = $display_type->settings['display_view']; + } + return $this->object->_render_select_field($display_type, 'display_view', __('Select View', 'nggallery'), $display_type_views, $current_value, '', FALSE); + } /** * Renders a field for selecting a template * @@ -2458,7 +2607,7 @@ class Mixin_Display_Type_Form extends Mixin function _render_display_type_view_field($display_type) { $display_type_views = $this->get_available_display_type_views($display_type); - return $this->object->_render_select_field($display_type, 'display_type_view', __('Select Template', 'nggallery'), $display_type_views, $display_type->settings['display_type_view'], '', FALSE); + return $this->object->_render_select_field($display_type, 'display_type_view', __('Select View', 'nggallery'), $display_type_views, $display_type->settings['display_type_view'], '', FALSE); } /** * Gets available templates @@ -2469,7 +2618,11 @@ class Mixin_Display_Type_Form extends Mixin function get_available_display_type_views($display_type) { /* Set up templates array */ - $views = array('default' => __('Default Template', 'nggallery')); + if (strpos($display_type->name, 'basic') !== false) { + $views = array('default' => __('Legacy', 'nggallery')); + } else { + $views = array('default' => __('Default', 'nggallery')); + } /* Fetch array of directories to scan */ $dirs = M_Gallery_Display::get_display_type_view_dirs($display_type); /* Populate the views array by scanning each directory for relevant templates */ @@ -2480,7 +2633,7 @@ class Mixin_Display_Type_Form extends Mixin } /* Scan for template files and create array */ $files = scandir($dir); - $template_files = preg_grep('/^.+\\-template.php$/i', $files); + $template_files = preg_grep('/^.+\\-(template|view).php$/i', $files); $template_files = $template_files ? array_combine($template_files, $template_files) : array(); /* For custom templates only, append directory name placeholder */ foreach ($template_files as $key => $value) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.js new file mode 100644 index 000000000..d51cd2a0c --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.js @@ -0,0 +1,135 @@ +/*! waitForImages jQuery Plugin - v1.4.1 - 2012-10-12 +* https://github.com/alexanderdickson/waitForImages +* Copyright (c) 2012 Alex Dickson; Licensed MIT */ + +(function ($) { + // Namespace all events. + var eventNamespace = 'waitForImages'; + + // CSS properties which contain references to images. + $.waitForImages = { + hasImageProperties: ['backgroundImage', 'listStyleImage', 'borderImage', 'borderCornerImage'] + }; + + // Custom selector to find `img` elements that have a valid `src` attribute and have not already loaded. + $.expr[':'].uncached = function (obj) { + // Ensure we are dealing with an `img` element with a valid `src` attribute. + if (!$(obj).is('img[src!=""]')) { + return false; + } + + // Firefox's `complete` property will always be `true` even if the image has not been downloaded. + // Doing it this way works in Firefox. + var img = new Image(); + img.src = obj.src; + return !img.complete; + }; + + $.fn.waitForImages = function (finishedCallback, eachCallback, waitForAll) { + + var allImgsLength = 0; + var allImgsLoaded = 0; + + // Handle options object. + if ($.isPlainObject(arguments[0])) { + finishedCallback = arguments[0].finished; + eachCallback = arguments[0].each; + waitForAll = arguments[0].waitForAll; + } + + // Handle missing callbacks. + finishedCallback = finishedCallback || $.noop; + eachCallback = eachCallback || $.noop; + + // Convert waitForAll to Boolean + waitForAll = !! waitForAll; + + // Ensure callbacks are functions. + if (!$.isFunction(finishedCallback) || !$.isFunction(eachCallback)) { + throw new TypeError('An invalid callback was supplied.'); + } + + return this.each(function () { + // Build a list of all imgs, dependent on what images will be considered. + var obj = $(this); + var allImgs = []; + // CSS properties which may contain an image. + var hasImgProperties = $.waitForImages.hasImageProperties || []; + // To match `url()` references. + // Spec: http://www.w3.org/TR/CSS2/syndata.html#value-def-uri + var matchUrl = /url\(\s*(['"]?)(.*?)\1\s*\)/g; + + if (waitForAll) { + + // Get all elements (including the original), as any one of them could have a background image. + obj.find('*').andSelf().each(function () { + var element = $(this); + + // If an `img` element, add it. But keep iterating in case it has a background image too. + if (element.is('img:uncached')) { + allImgs.push({ + src: element.attr('src'), + element: element[0] + }); + } + + $.each(hasImgProperties, function (i, property) { + var propertyValue = element.css(property); + var match; + + // If it doesn't contain this property, skip. + if (!propertyValue) { + return true; + } + + // Get all url() of this element. + while (match = matchUrl.exec(propertyValue)) { + allImgs.push({ + src: match[2], + element: element[0] + }); + } + }); + }); + } else { + // For images only, the task is simpler. + obj.find('img:uncached') + .each(function () { + allImgs.push({ + src: this.src, + element: this + }); + }); + } + + allImgsLength = allImgs.length; + allImgsLoaded = 0; + + // If no images found, don't bother. + if (allImgsLength === 0) { + finishedCallback.call(obj[0]); + } + + $.each(allImgs, function (i, img) { + + var image = new Image(); + + // Handle the image loading and error with the same callback. + $(image).bind('load.' + eventNamespace + ' error.' + eventNamespace, function (event) { + allImgsLoaded++; + + // If an error occurred with loading the image, set the third argument accordingly. + eachCallback.call(img.element, allImgsLoaded, allImgsLength, event.type == 'load'); + + if (allImgsLoaded == allImgsLength) { + finishedCallback.call(obj[0]); + return false; + } + + }); + + image.src = img.src; + }); + }); + }; +}(jQuery)); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.min.js b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.min.js new file mode 100644 index 000000000..de819e22e --- /dev/null +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/jquery.waitforimages.min.js @@ -0,0 +1 @@ +!function(e){e.waitForImages={hasImageProperties:["backgroundImage","listStyleImage","borderImage","borderCornerImage"]},e.expr[":"].uncached=function(r){if(!e(r).is('img[src!=""]'))return!1;var n=new Image;return n.src=r.src,!n.complete},e.fn.waitForImages=function(r,n,a){var i=0,c=0;if(e.isPlainObject(arguments[0])&&(r=arguments[0].finished,n=arguments[0].each,a=arguments[0].waitForAll),r=r||e.noop,n=n||e.noop,a=!!a,!e.isFunction(r)||!e.isFunction(n))throw new TypeError("An invalid callback was supplied.");return this.each(function(){var t=e(this),s=[],o=e.waitForImages.hasImageProperties||[],u=/url\(\s*(['"]?)(.*?)\1\s*\)/g;a?t.find("*").andSelf().each(function(){var r=e(this);r.is("img:uncached")&&s.push({src:r.attr("src"),element:r[0]}),e.each(o,function(e,n){var a,i=r.css(n);if(!i)return!0;for(;a=u.exec(i);)s.push({src:a[2],element:r[0]})})}):t.find("img:uncached").each(function(){s.push({src:this.src,element:this})}),i=s.length,c=0,0===i&&r.call(t[0]),e.each(s,function(a,s){var o=new Image;e(o).bind("load.waitForImages error.waitForImages",function(e){if(c++,n.call(s.element,c,i,"load"==e.type),c==i)return r.call(t[0]),!1}),o.src=s.src})})}}(jQuery); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.min.css index b5700d378..18f55b568 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_gallery_display/static/nextgen_gallery_related_images.min.css @@ -1 +1 @@ -.ngg-related-gallery{background:#f9f9f9;border:1px solid #e0e0e0;overflow:hidden;margin-bottom:1em;margin-top:1em;padding:5px}.ngg-related-gallery img{border:1px solid #ddd;float:left;margin:0 3px;padding:2px;height:50px;width:50px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file +.ngg-related-gallery{background:#F9F9F9;border:1px solid #E0E0E0;overflow:hidden;margin-bottom:1em;margin-top:1em;padding:5px}.ngg-related-gallery img{border:1px solid #DDD;float:left;margin:0 3px;padding:2px;height:50px;width:50px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php index 6d31f51af..ef16865e9 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/module.nextgen_other_options.php @@ -23,7 +23,7 @@ class M_NextGen_Other_Options extends C_Base_Module 'photocrati-nextgen_other_options', 'Other Options', 'NextGEN Gallery Others Options Page', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php index 028e7641e..9d3320546 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/package.module.nextgen_other_options.php @@ -118,9 +118,9 @@ class A_Image_Options_Form extends Mixin return array(__('Categories', 'nggallery') => 'category', __('Tags', 'nggallery') => 'tags'); } /** - * Tries to create the gallery storage directory if it doesn't exist - * already - * @return string + * Tries to create the gallery storage directory if it doesn't exist already + * @param null|string $gallerypath (optional) + * @return bool|string */ function _create_gallery_storage_dir($gallerypath = NULL) { @@ -136,7 +136,7 @@ class A_Image_Options_Form extends Mixin } return $retval; } - /* + /** * Renders the form */ function render() @@ -169,6 +169,28 @@ class A_Image_Options_Form extends Mixin } elseif (isset($image_options['gallerypath'])) { unset($image_options['gallerypath']); } + // Sanitize input + foreach ($image_options as $key => &$value) { + switch ($key) { + case 'imgAutoResize': + case 'deleteImg': + case 'imgWidth': + case 'imgHeight': + case 'imgBackup': + case 'imgQuality': + case 'activateTags': + case 'maxImages': + $value = intval($value); + break; + case 'galSort': + case 'galSortDir': + $value = esc_html($value); + break; + case 'relatedHeading': + $value = M_NextGen_Data::strip_html($value, TRUE); + break; + } + } // Update image options if ($save) { $this->object->get_model()->set($image_options)->save(); @@ -319,8 +341,9 @@ class A_Miscellaneous_Form extends Mixin if ($settings = $this->object->param('misc_settings')) { // The Media RSS setting is actually a local setting, not a global one $local_settings = C_NextGen_Settings::get_instance(); - $local_settings->set('useMediaRSS', $settings['useMediaRSS']); + $local_settings->set('useMediaRSS', intval($settings['useMediaRSS'])); unset($settings['useMediaRSS']); + $settings['galleries_in_feeds'] = intval($settings['galleries_in_feeds']); // It's important the router_param_slug never be empty if (empty($settings['router_param_slug'])) { $settings['router_param_slug'] = 'nggallery'; @@ -330,7 +353,8 @@ class A_Miscellaneous_Form extends Mixin C_Photocrati_Transient_Manager::flush('displayed_gallery_rendering'); } // Do not allow this field to ever be unset - if (empty($settings['maximum_entity_count']) || (int) $settings['maximum_entity_count'] <= 0) { + $settings['maximum_entity_count'] = intval($settings['maximum_entity_count']); + if ($settings['maximum_entity_count'] <= 0) { $settings['maximum_entity_count'] = 500; } // Save both setting groups @@ -350,7 +374,7 @@ class A_Other_Options_Controller extends Mixin { $this->call_parent('enqueue_backend_resources'); wp_enqueue_script('nextgen_settings_page', $this->get_static_url('photocrati-nextgen_other_options#nextgen_settings_page.js'), array('jquery-ui-accordion', 'jquery-ui-tooltip', 'wp-color-picker', 'jquery.nextgen_radio_toggle'), NGG_SCRIPT_VERSION); - wp_enqueue_style('nextgen_settings_page', $this->get_static_url('photocrati-nextgen_other_options#nextgen_settings_page.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_settings_page', $this->get_static_url('photocrati-nextgen_other_options#nextgen_settings_page.css'), array(), NGG_SCRIPT_VERSION); } function get_page_title() { @@ -470,6 +494,7 @@ class A_Styles_Form extends Mixin { // Ensure that we have if ($settings = $this->object->param('style_settings')) { + $settings['activateCSS'] = intval($settings['activateCSS']); $valid = TRUE; // the desired file, but users shouldn't use this to write files that don't end in .css anyway $file_info = pathinfo($settings['CSSfile']); @@ -557,6 +582,10 @@ class A_Thumbnail_Options_Form extends Mixin function save_action() { if ($settings = $this->object->param('thumbnail_settings')) { + // Sanitize + foreach ($settings as $key => &$value) { + $value = intval($value); + } $this->object->get_model()->set($settings)->save(); } } @@ -585,11 +614,9 @@ class A_Watermarking_Ajax_Actions extends Mixin $sizeinfo = array('quality' => 100, 'height' => 250, 'crop' => FALSE, 'watermark' => TRUE); $size = $imagegen->get_size_name($sizeinfo); $thumbnail_url = $storage->get_image_url($image, $size); - // Temporarily update the watermark options. Generate a new image based - // on these settings + // Temporarily update the watermark options. Generate a new image based on these settings if ($watermark_options = $this->param('watermark_options')) { - $watermark_options['wmFont'] = trim($watermark_options['wmFont']); - $settings->set($watermark_options); + $settings->set('wmFont', trim($watermark_options['wmFont'])); $storage->generate_image_size($image, $size); $thumbnail_url = $storage->get_image_url($image, $size); $settings->load(); @@ -643,7 +670,7 @@ class A_Watermarks_Form extends Mixin } /** * Renders the fields for a watermark source (image, text) - * @return string + * @return array */ function _get_watermark_source_fields() { @@ -699,6 +726,28 @@ class A_Watermarks_Form extends Mixin function save_action() { if ($settings = $this->object->param('watermark_options')) { + // Sanitize + foreach ($settings as $key => &$value) { + switch ($key) { + case 'wmType': + if (!in_array($value, array('', 'text', 'image'))) { + $value = ''; + } + break; + case 'wmPos': + if (!in_array($value, array('topLeft', 'topCenter', 'topRight', 'midLeft', 'midCenter', 'midRight', 'botLeft', 'botCenter', 'botRight'))) { + $value = 'midCenter'; + } + break; + case 'wmXpos': + case 'wmYpos': + $value = intval($value); + break; + case 'wmText': + $value = M_NextGen_Data::strip_html($value); + break; + } + } $this->object->get_model()->set($settings)->save(); $image = $this->object->_get_preview_image(); if (is_file($image['abspath'])) { @@ -718,6 +767,10 @@ class C_Settings_Model extends C_Component */ var $wrapper = NULL; static $_instances = array(); + /** + * @param bool|string $context + * @return C_Settings_Model + */ static function get_instance($context = FALSE) { if (!isset(self::$_instances[$context])) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.min.css index c4302588f..3958b35f9 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_other_options/static/nextgen_settings_page.min.css @@ -1 +1 @@ -.gallery_page_ngg_other_options table{width:80%;height:100%}#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td{padding:20px;vertical-align:middle;line-height:1.8;padding:20px 20px}.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main table tr td:first-of-type,.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main table tr th:first-of-type{width:325px!important;max-width:100%!important}.gallery_page_ngg_other_options table.image_options{width:100%}.gallery_page_ngg_other_options table td.column1{width:240px}.gallery_page_ngg_other_options table td.column2{width:200px}.gallery_page_ngg_other_options textarea{height:100px;width:100%}.gallery_page_ngg_other_options .image_options td{padding-bottom:8px}.gallery_page_ngg_other_options .select2-results__option--highlighted[aria-selected]{background-color:#9fbb1a}#image_quality,#image_sorting_direction{width:120px!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main table.nextgen_settings_position{display:table!important}.column_wrapper{width:100%;padding-right:7px}#max_related_images{width:auto}#image_height,#image_width{width:40px}#ngg_page_content #thumbnail_dimensions_height,#ngg_page_content #thumbnail_dimensions_width{width:75px;vertical-align:middle}.nextgen-thumb-size-custom br{display:none}.gallery_page_ngg_other_options select.thumbnail_dimensions{width:300px;max-width:100%}.full-width{width:100%}.right-aligned{text-align:right}label.align-to-top,td.align-to-top{vertical-align:top}#lightbox_library_advanced_settings td{text-align:right}.gallery_page_ngg_other_options .ngg_options_promo a{margin-left:0}#advanced_stylesheet_form td{width:100%!important}#cssfile_contents{background:#f9f9f9;font-family:Consolas,Monaco,monospace;font-size:12px;width:100%;height:300px;outline:0}#writable_identicator{display:inline}.entity_errors{color:red}.entity_errors ul{margin-left:30px}.entity_errors ul li{list-style-type:disc}#nextgen_settings_preview_refresh{display:block}@media (max-width:782px){#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td{width:100%}#image_quality,#image_sorting_direction,.gallery_page_ngg_other_options .select2-container,.gallery_page_ngg_other_options input[type=text],.gallery_page_ngg_other_options select{width:100%!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td{padding:5px 20px}} \ No newline at end of file +#lightbox_library_advanced_settings td,.right-aligned{text-align:right}.gallery_page_ngg_other_options table{width:80%;height:100%}#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td{vertical-align:middle;line-height:1.8;padding:20px}.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main table tr td:first-of-type,.gallery_page_ngg_other_options #ngg_page_content .ngg_page_content_main table tr th:first-of-type{width:325px!important;max-width:100%!important}.gallery_page_ngg_other_options table.image_options{width:100%}.gallery_page_ngg_other_options table td.column1{width:240px}.gallery_page_ngg_other_options table td.column2{width:200px}.gallery_page_ngg_other_options textarea{height:100px;width:100%}.gallery_page_ngg_other_options .image_options td{padding-bottom:8px}.gallery_page_ngg_other_options .select2-results__option--highlighted[aria-selected]{background-color:#9fbb1a}#image_quality,#image_sorting_direction{width:120px!important}#ngg_page_content.ngg_settings_page .ngg_page_content_main table.nextgen_settings_position{display:table!important}.column_wrapper{width:100%;padding-right:7px}#max_related_images{width:auto}#image_height,#image_width{width:40px}#ngg_page_content #thumbnail_dimensions_height,#ngg_page_content #thumbnail_dimensions_width{width:75px;vertical-align:middle}.nextgen-thumb-size-custom br{display:none}.gallery_page_ngg_other_options select.thumbnail_dimensions{width:300px;max-width:100%}.full-width{width:100%}label.align-to-top,td.align-to-top{vertical-align:top}.gallery_page_ngg_other_options .ngg_options_promo a{margin-left:0}#advanced_stylesheet_form td{width:100%!important}#cssfile_contents{background:#F9F9F9;font-family:Consolas,Monaco,monospace;font-size:12px;width:100%;height:300px;outline:0}#writable_identicator{display:inline}.entity_errors{color:red}.entity_errors ul{margin-left:30px}.entity_errors ul li{list-style-type:disc}#nextgen_settings_preview_refresh{display:block}@media (max-width:782px){#ngg_page_content.ngg_settings_page .ngg_page_content_main table tr td{width:100%;padding:5px 20px}#image_quality,#image_sorting_direction,.gallery_page_ngg_other_options .select2-container,.gallery_page_ngg_other_options input[type=text],.gallery_page_ngg_other_options select{width:100%!important}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php index 0d04fa6ec..d5d03bd62 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/module.nextgen_pagination.php @@ -19,7 +19,7 @@ class M_NextGen_Pagination extends C_Base_Module 'photocrati-nextgen_pagination', "Pagination", "Provides pagination for display types", - '3.0.0', + '3.0.0.2', "https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/", "Imagely", "https://www.imagely.com" diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php index 777cb0984..36598013f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/package.module.nextgen_pagination.php @@ -10,6 +10,7 @@ class Mixin_NextGen_Basic_Pagination extends Mixin * @param mixed $page * @param int $totalElement * @param int $maxElement + * @param string|null $current_url (optional) * @return array Of data holding prev & next url locations and a formatted HTML string */ public function create_pagination($page, $totalElement, $maxElement = 0, $current_url = NULL) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.css index d630e970e..4c7563d8b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.css @@ -3,39 +3,65 @@ font-size: 0.9em !important; clear: both !important; display: block !important; - padding-top: 15px; + padding-top: 24px; padding-bottom: 3px; text-align: center; } -.ngg-navigation span { - font-weight: bold; - margin: 0pt 6px; -} - .ngg-navigation a.page-numbers, .ngg-navigation a.next, .ngg-navigation a.prev, .ngg-navigation span.page-numbers, .ngg-navigation span.next, -.ngg-navigation span.prev { - border: 1px solid #DDDDDD; +.ngg-navigation span.prev, +.ngg-navigation span.current { + background: #BBB; + border: none; + border-radius: 2px; + box-shadow: none; + color: #fff; + display:inline; + font-size: 14px; + font-weight: bold; margin-right: 3px; - padding: 3px 8px; + padding: 4px 8px; text-decoration: none; + cursor: pointer !important; +} + +.ngg-navigation span.current { + background: #666; +} + +.ngg-navigation a.next, +.ngg-navigation a.prev, +.ngg-navigation span.next, +.ngg-navigation span.prev { + background: transparent; + color: #BBB; + padding: 2px; + border: none; } .ngg-navigation a.page-numbers:hover, -.ngg-navigation a.next:hover, -.ngg-navigation a.prev:hover, .ngg-navigation span.page-numbers:hover, -.ngg-navigation span.next:hover, -.ngg-navigation span.prev:hover { - background-color: #0066CC; +.ngg-navigation span.current:hover { + background: #666; color: #FFFFFF !important; text-decoration: none !important; } +.ngg-navigation a.next:hover, +.ngg-navigation a.prev:hover, +.ngg-navigation span.next, +.ngg-navigation span.prev { + color: #666 !important; +} + +.ngg-navigation a.page-numbers { + display: inline; +} + .ngg-clear { clear: both; } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css index b4c28bbbb..48ef9f3b6 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pagination/static/style.min.css @@ -1 +1 @@ -.ngg-navigation{font-size:.9em!important;clear:both!important;display:block!important;padding-top:15px;padding-bottom:3px;text-align:center}.ngg-navigation span{font-weight:700;margin:0 6px}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{border:1px solid #ddd;margin-right:3px;padding:3px 8px;text-decoration:none}.ngg-navigation a.next:hover,.ngg-navigation a.page-numbers:hover,.ngg-navigation a.prev:hover,.ngg-navigation span.next:hover,.ngg-navigation span.page-numbers:hover,.ngg-navigation span.prev:hover{background-color:#06c;color:#fff!important;text-decoration:none!important}.ngg-clear{clear:both} \ No newline at end of file +.ngg-navigation{font-size:.9em!important;clear:both!important;display:block!important;padding-top:24px;padding-bottom:3px;text-align:center}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.current,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{background:#BBB;border:none;border-radius:2px;box-shadow:none;color:#fff;display:inline;font-size:14px;font-weight:700;margin-right:3px;padding:4px 8px;text-decoration:none;cursor:pointer!important}.ngg-navigation span.current{background:#666}.ngg-navigation a.next,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.prev{background:0 0;color:#BBB;padding:2px;border:none}.ngg-navigation a.page-numbers:hover,.ngg-navigation span.current:hover,.ngg-navigation span.page-numbers:hover{background:#666;color:#FFF!important;text-decoration:none!important}.ngg-navigation a.next:hover,.ngg-navigation a.prev:hover,.ngg-navigation span.next,.ngg-navigation span.prev{color:#666!important}.ngg-navigation a.page-numbers{display:inline}.ngg-clear{clear:both} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php index 1661dfeaa..e5eb875be 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/package.module.nextgen_pro_upgrade.php @@ -35,7 +35,7 @@ class A_NextGen_Pro_Upgrade_Controller extends Mixin function enqueue_backend_resources() { $this->call_parent('enqueue_backend_resources'); - wp_enqueue_style('nextgen_pro_upgrade_page', $this->get_static_url('photocrati-nextgen_pro_upgrade#style.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_pro_upgrade_page', $this->get_static_url('photocrati-nextgen_pro_upgrade#style.css'), array(), NGG_SCRIPT_VERSION); } function get_page_title() { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css index 3ca57a2f3..cac9a35e5 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_pro_upgrade/static/style.min.css @@ -1 +1 @@ -#ngg_page_content #nextgen_pro_upgrade_page .ngg_page_content_main{padding:20px 40px 200px}.gallery_page_ngg_pro_upgrade #update-nag,.gallery_page_ngg_pro_upgrade .update-nag{display:none}#nextgen_pro_upgrade_page{max-width:none}#nextgen_pro_upgrade_page .about-wrap .about-text{min-height:auto}#nextgen_pro_upgrade_page img{width:600px;max-width:100%}#nextgen_pro_upgrade_page h1{margin:40px 0 20px}#nextgen_pro_upgrade_page p{min-height:auto;margin:30px 0;max-width:none;color:#999;width:35%;float:left;max-width:400px;box-sizing:border-box;font-size:22px}#nextgen_pro_upgrade_page p span{font-family:Brush Script MT;color:#d5d5d5;font-size:34px;text-align:right;width:100%;display:block;margin-top:60px;display:none}#nextgen_pro_upgrade_page.nextgen_plus p span{margin-top:30px}#nextgen_pro_upgrade_page .feature-section{float:left;width:60%;margin-top:15px;box-sizing:border-box;margin-left:30px;padding:0;border:1px solid #eee;box-shadow:0 0 4px 2px rgba(0,0,0,.05)}#nextgen_pro_upgrade_page iframe{height:370px;width:650px;max-width:100%}#nextgen_pro_upgrade_page a.button-primary{font-size:15px;height:2.8em;line-height:1.6em;line-height:50px;height:50px!important;padding:0 30px!important;font-size:14px;background-color:#9fbb1a;border:none;box-shadow:none;text-transform:uppercase;height:50px;width:300px;max-width:100%;padding:12px 22px;text-shadow:none;text-align:center;margin:40px 0;font-weight:700}@media (max-width:1150px){#nextgen_pro_upgrade_page p span{display:none}#nextgen_pro_upgrade_page p{width:100%;max-width:100%;float:none}#nextgen_pro_upgrade_page .feature-section{float:none;width:100%;margin-left:0}#nextgen_pro_upgrade_page a.button-primary{margin:40px 0}} \ No newline at end of file +#ngg_page_content #nextgen_pro_upgrade_page .ngg_page_content_main{padding:20px 40px 200px}.gallery_page_ngg_pro_upgrade #update-nag,.gallery_page_ngg_pro_upgrade .update-nag{display:none}#nextgen_pro_upgrade_page{max-width:none}#nextgen_pro_upgrade_page .about-wrap .about-text{min-height:auto}#nextgen_pro_upgrade_page img{width:600px;max-width:100%}#nextgen_pro_upgrade_page h1{margin:40px 0 20px}#nextgen_pro_upgrade_page p{min-height:auto;margin:30px 0;color:#999;width:35%;float:left;max-width:400px;box-sizing:border-box;font-size:22px}#nextgen_pro_upgrade_page p span{font-family:Brush Script MT;color:#d5d5d5;font-size:34px;text-align:right;width:100%;margin-top:60px;display:none}#nextgen_pro_upgrade_page.nextgen_plus p span{margin-top:30px}#nextgen_pro_upgrade_page .feature-section{float:left;width:60%;margin-top:15px;box-sizing:border-box;margin-left:30px;padding:0;border:1px solid #eee;box-shadow:0 0 4px 2px rgba(0,0,0,.05)}#nextgen_pro_upgrade_page iframe{height:370px;width:650px;max-width:100%}#nextgen_pro_upgrade_page a.button-primary{line-height:1.6em;line-height:50px;height:50px!important;padding:0 30px!important;font-size:14px;background-color:#9fbb1a;border:none;box-shadow:none;text-transform:uppercase;width:300px;max-width:100%;text-shadow:none;text-align:center;margin:40px 0;font-weight:700}@media (max-width:1150px){#nextgen_pro_upgrade_page p span{display:none}#nextgen_pro_upgrade_page p{width:100%;max-width:100%;float:none}#nextgen_pro_upgrade_page .feature-section{float:none;width:100%;margin-left:0}#nextgen_pro_upgrade_page a.button-primary{margin:40px 0}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php index 17cfa919c..6df185d42 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_settings/module.nextgen_settings.php @@ -18,7 +18,7 @@ class M_NextGen_Settings extends C_Base_Module 'photocrati-nextgen_settings', 'NextGEN Gallery Settings', 'Provides central management for NextGEN Gallery settings', - '3.0.0', + '3.0.0.2', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -82,30 +82,30 @@ class C_NextGen_Settings_Installer 'thumbquality' => 100, // Thumb Quality // Image Settings - 'imgWidth' => 800, // Image Width - 'imgHeight' => 600, // Image height + 'imgWidth' => 1800, // Image Width + 'imgHeight' => 1200, // Image height 'imgQuality' => 100, // Image Quality 'imgBackup' => True, // Create a backup - 'imgAutoResize' => False, // Resize after upload + 'imgAutoResize' => True, // Resize after upload // Gallery Settings - 'galImages' => '20', // Number of images per page + 'galImages' => '24', // Number of images per page 'galPagedGalleries' => 0, // Number of galleries per page (in a album) 'galColumns' => 0, // Number of columns for the gallery - 'galShowSlide' => True, // Show slideshow - 'galTextSlide' => __('[Show slideshow]', 'nggallery'), // Text for slideshow - 'galTextGallery' => __('[Show thumbnails]', 'nggallery'), // Text for gallery + 'galShowSlide' => False, // Show slideshow + 'galTextSlide' => __('View Slideshow', 'nggallery'), // Text for slideshow + 'galTextGallery' => __('View Thumbnails', 'nggallery'), // Text for gallery 'galShowOrder' => 'gallery', // Show order 'galSort' => 'sortorder', // Sort order 'galSortDir' => 'ASC', // Sort direction 'galNoPages' => True, // use no subpages for gallery 'galImgBrowser' => 0, // Show ImageBrowser => instead effect 'galHiddenImg' => 0, // For paged galleries we can hide image - 'galAjaxNav' => 0, // AJAX Navigation for Shutter effect + 'galAjaxNav' => 1, // AJAX Navigation for Shutter effect // Thumbnail Effect - 'thumbEffect' => 'fancybox', // select effect - 'thumbCode' => 'class="ngg-fancybox" rel="%GALLERY_NAME%"', + 'thumbEffect' => 'simplelightbox', // select effect + 'thumbCode' => 'class="ngg-simplelightbox" rel="%GALLERY_NAME%"', 'thumbEffectContext' => 'nextgen_images', // select effect // Watermark settings @@ -122,9 +122,9 @@ class C_NextGen_Settings_Installer // Image Rotator settings 'slideFX' => 'fade', - 'irWidth' => 600, - 'irHeight' => 400, - 'irRotatetime' => 10, + 'irWidth' => 750, + 'irHeight' => 500, + 'irRotatetime' => 5, // CSS Style 'activateCSS' => 1, // activate the CSS file @@ -190,4 +190,4 @@ class C_NextGen_Settings_Installer } } -new M_NextGen_Settings(); +new M_NextGen_Settings(); \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php index 164db5e67..c160e86b6 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_xmlrpc/package.module.nextgen_xmlrpc.php @@ -124,6 +124,10 @@ class A_NextGen_API_Ajax extends Mixin return round($size); } } + function _get_max_upload_files() + { + return intval(ini_get('max_file_uploads')); + } function enqueue_nextgen_api_task_list_action() { $api = $this->get_nextgen_api(); @@ -208,8 +212,9 @@ class A_NextGen_API_Ajax extends Mixin $handler_maxsize = defined('NGG_API_JOB_HANDLER_MAXSIZE') ? intval(NGG_API_JOB_HANDLER_MAXSIZE) : 0; $handler_maxsize = $handler_maxsize > 0 ? $handler_maxsize : $this->_get_max_upload_size(); /* in bytes */ + $handler_maxfiles = $this->_get_max_upload_files(); $response['result'] = 'ok'; - $response['result_object'] = array('job_id' => $job_id, 'job_post_back' => $post_back, 'job_handler_url' => home_url('?photocrati_ajax=1&action=execute_nextgen_api_task_list'), 'job_handler_delay' => $handler_delay, 'job_handler_maxsize' => $handler_maxsize); + $response['result_object'] = array('job_id' => $job_id, 'job_post_back' => $post_back, 'job_handler_url' => home_url('?photocrati_ajax=1&action=execute_nextgen_api_task_list'), 'job_handler_delay' => $handler_delay, 'job_handler_maxsize' => $handler_maxsize, 'job_handler_maxfiles' => $handler_maxfiles); if (!defined('NGG_API_SUPPRESS_QUICK_EXECUTE') || NGG_API_SUPPRESS_QUICK_EXECUTE == false) { if (!$api->is_execution_locked()) { $this->_start_locked_execute(); @@ -359,6 +364,10 @@ class C_NextGen_API extends C_Component const INFO_EXECUTION_LOCKED = 6004; public static $_instances = array(); var $_start_time; + /** + * @param bool|string $context + * @return C_NextGen_API + */ public static function get_instance($context = false) { if (!isset(self::$_instances[$context])) { @@ -615,6 +624,29 @@ class C_NextGen_API extends C_Component } return $id; } + function _array_find_by_entry(array $array_target, $entry_key, $entry_value) + { + foreach ($array_target as $key => $value) { + $item = $value; + if (isset($item[$entry_key]) && $item[$entry_key] == $entry_value) { + return $key; + } + } + return null; + } + function _array_filter_by_entry(array $array_target, array $array_source, $entry_key) + { + foreach ($array_source as $key => $value) { + $item = $value; + if (isset($item[$entry_key])) { + $find_key = $this->_array_find_by_entry($array_target, $entry_key, $item[$entry_key]); + if ($find_key !== null) { + unset($array_target[$find_key]); + } + } + } + return $array_target; + } // Note: handle_job only worries about processing the job, it does NOT remove finished jobs anymore, the responsibility is on the caller to remove the job when handle_job returns true, this is to allow calling get_job_*() methods after handle_job has been called function handle_job($job_id, $job_data, $app_config, $task_list, $extra_data = null) { @@ -758,10 +790,10 @@ class C_NextGen_API extends C_Component $images_folder = str_replace(array('\\', '/'), $fs_sep, $images_folder); $images = $task_object['image_list']; $result_images = isset($task_result['image_list']) ? $task_result['image_list'] : array(); + $images_todo = array_values($this->_array_filter_by_entry($images, $result_images, 'localId')); $image_count = count($images); $result_image_count = count($result_images); - for ($image_index = $result_image_count; $image_index < $image_count; $image_index++) { - $image = $images[$image_index]; + foreach ($images_todo as $image_index => $image) { $image_id = isset($image['id']) ? $image['id'] : null; $image_filename = isset($image['filename']) ? $image['filename'] : null; $image_path = isset($image['path']) ? $image['path'] : null; @@ -840,7 +872,7 @@ class C_NextGen_API extends C_Component } catch (E_UploadException $e) { $image_error = $e->getMessage . __(' (%1$s).', 'nggallery'); } catch (E_No_Image_Library_Exception $e) { - $error = __('No image library present, image uploads will fail (%1$s).', 'nggallery'); + $image_error = __('No image library present, image uploads will fail (%1$s).', 'nggallery'); // no point in continuing if the image library is not present but we don't break here to ensure that all images are processed (otherwise they'd be processed in further fruitless handle_job calls) } catch (E_InsufficientWriteAccessException $e) { $image_error = __('Inadequate system permissions to write image (%1$s).', 'nggallery'); @@ -1074,6 +1106,10 @@ class C_NextGen_API_XMLRPC extends C_Component parent::define($context); $this->implement('I_NextGen_API_XMLRPC'); } + /** + * @param bool|string $context + * @return C_NextGen_API_XMLRPC + */ public static function get_instance($context = false) { if (!isset(self::$_instances[$context])) { @@ -1083,7 +1119,7 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Gets the version of NextGEN Gallery installed - * @return string + * @return array */ function get_version() { @@ -1143,7 +1179,8 @@ class C_NextGen_API_XMLRPC extends C_Component // his plugin $gallery->gid = (string) $gallery->gid; // Set other gallery properties - $image_counter = array_pop($image_mapper->select('DISTINCT COUNT(*) as counter')->where(array("galleryid = %d", $gallery->gid))->run_query(FALSE, FALSE, TRUE)); + $tmp = $image_mapper->select('DISTINCT COUNT(*) as counter')->where(array("galleryid = %d", $gallery->gid))->run_query(FALSE, FALSE, TRUE); + $image_counter = array_pop($tmp); $gallery->counter = $image_counter->counter; $gallery->abspath = $storage->get_gallery_abspath($gallery); } else { @@ -1153,7 +1190,9 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Returns a single image object - * @param $args (blog_id, username, password, pid) + * @param array $args (blog_id, username, password, pid) + * @param bool $return_model (optional) + * @return object|IXR_Error */ function get_image($args, $return_model = FALSE) { @@ -1194,7 +1233,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Returns a collection of images - * @param $args (blog_id, username, password, gallery_id + * @param array $args (blog_id, username, password, gallery_id + * @return array|IXR_Error */ function get_images($args) { @@ -1231,7 +1271,7 @@ class C_NextGen_API_XMLRPC extends C_Component * o bool overwrite (optional) * o int gallery * o int image_id (optional) - * @return image + * @return object|IXR_Error */ function upload_image($args) { @@ -1288,6 +1328,7 @@ class C_NextGen_API_XMLRPC extends C_Component /** * Edits an image object * @param $args (blog_id, username, password, image_id, alttext, description, exclude, other_properties + * @return IXR_Error|object */ function edit_image($args) { @@ -1314,7 +1355,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Deletes an existing image from a gallery - * @param $args (blog_id, username, password, image_id) + * @param array $args (blog_id, username, password, image_id) + * @return bool */ function delete_image($args) { @@ -1326,7 +1368,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Creates a new gallery - * @param $args (blog_id, username, password, title) + * @param array $args (blog_id, username, password, title) + * @return int|IXR_Error */ function create_gallery($args) { @@ -1353,7 +1396,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Edits an existing gallery - * @param $args (blog_id, username, password, gallery_id, name, title, description, preview_pic_id) + * @param array $args (blog_id, username, password, gallery_id, name, title, description, preview_pic_id) + * @return int|bool|IXR_Error */ function edit_gallery($args) { @@ -1394,7 +1438,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Returns all galleries - * @param $args (blog_id, username, password) + * @param array $args (blog_id, username, password) + * @return array|IXR_Error */ function get_galleries($args) { @@ -1421,7 +1466,9 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Gets a single gallery instance - * @param $args (blog_id, username, password, gallery_id) + * @param array $args (blog_id, username, password, gallery_id) + * @param bool $return_model + * @return object|bool|IXR_Error */ function get_gallery($args, $return_model = FALSE) { @@ -1448,7 +1495,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Deletes a gallery - * @param $args (blog_id, username, password, gallery_id) + * @param array $args (blog_id, username, password, gallery_id) + * @return bool */ function delete_gallery($args) { @@ -1460,7 +1508,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Creates a new album - * @param $args (blog_id, username, password, title, previewpic, description, galleries + * @param array $args (blog_id, username, password, title, previewpic, description, galleries + * @return int|IXR_Error */ function create_album($args) { @@ -1524,7 +1573,9 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Gets a single album - * @param $args (blog_id, username, password, album_id) + * @param array $args (blog_id, username, password, album_id) + * @param bool $return_model (optional) + * @return object|bool|IXR_Error */ function get_album($args, $return_model = FALSE) { @@ -1557,7 +1608,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Deletes an existing album - * @param $args (blog_id, username, password, album_id) + * @param array $args (blog_id, username, password, album_id) + * @return bool */ function delete_album($args) { @@ -1569,7 +1621,8 @@ class C_NextGen_API_XMLRPC extends C_Component } /** * Edit an existing album - * @param $args (blog_id, username, password, album_id, name, preview pic id, description, galleries) + * @param array $args (blog_id, username, password, album_id, name, preview pic id, description, galleries) + * @return object|IXR_Error */ function edit_album($args) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/admin.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/admin.php index 479077faa..dc33c5393 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/admin.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/admin.php @@ -162,7 +162,14 @@ class nggAdminPanel{ // integrate the menu function add_menu() { - add_menu_page( __( 'Gallery', 'Galleries', 1, 'nggallery' ), _n( 'Gallery', 'Galleries', 1, 'nggallery' ), 'NextGEN Gallery overview', NGGFOLDER, array (&$this, 'show_menu'), path_join(NGGALLERY_URLPATH, 'admin/images/imagely_icon.png'), 11 ); + add_menu_page( + __('Gallery', 'nggallery'), + _n('Gallery', 'Galleries', 1, 'nggallery'), + 'NextGEN Gallery overview', + NGGFOLDER, + array ($this, 'show_menu'), + path_join(NGGALLERY_URLPATH, 'admin/images/imagely_icon.png'), 11 + ); add_submenu_page( NGGFOLDER , __('Overview', 'nggallery'), __('Overview', 'nggallery'), 'NextGEN Gallery overview', NGGFOLDER, array (&$this, 'show_menu')); add_submenu_page( NGGFOLDER , __('Manage Galleries', 'nggallery'), __('Manage Galleries', 'nggallery'), 'NextGEN Manage gallery', 'nggallery-manage-gallery', array (&$this, 'show_menu')); add_submenu_page( NGGFOLDER , _n( 'Manage Albums', 'Albums', 1, 'nggallery' ), _n( 'Manage Albums', 'Manage Albums', 1, 'nggallery' ), 'NextGEN Edit album', 'nggallery-manage-album', array (&$this, 'show_menu')); @@ -290,7 +297,7 @@ class nggAdminPanel{ wp_register_script('ngg-progressbar', NGGALLERY_URLPATH .'admin/js/ngg.progressbar.js', array('jquery'), NGG_SCRIPT_VERSION); wp_enqueue_script('wp-color-picker'); - wp_enqueue_style('imagely-admin-font', 'https://fonts.googleapis.com/css?family=Lato:300,400,700,900', false, NGG_SCRIPT_VERSION ); + wp_enqueue_style('imagely-admin-font', 'https://fonts.googleapis.com/css?family=Lato:300,400,700,900', array(), NGG_SCRIPT_VERSION ); switch ($_GET['page']) { case NGGFOLDER : @@ -302,7 +309,7 @@ class nggAdminPanel{ wp_enqueue_script( 'ngg-progressbar' ); wp_enqueue_script( 'jquery-ui-dialog' ); wp_enqueue_script( 'jquery-ui-sortable' ); - wp_register_script('shutter', $router->get_static_url('photocrati-lightbox#shutter/shutter.js'), false, NGG_SCRIPT_VERSION); + wp_register_script('shutter', $router->get_static_url('photocrati-lightbox#shutter/shutter.js'), array(), NGG_SCRIPT_VERSION); wp_localize_script('shutter', 'shutterSettings', array( 'msgLoading' => __('L O A D I N G', 'nggallery'), 'msgClose' => __('Click to Close', 'nggallery'), @@ -335,8 +342,8 @@ class nggAdminPanel{ function load_styles() { global $ngg; - wp_register_style( 'nggadmin', NGGALLERY_URLPATH .'admin/css/nggadmin.css', false, NGG_SCRIPT_VERSION, 'screen' ); - wp_register_style( 'ngg-jqueryui', NGGALLERY_URLPATH .'admin/css/jquery.ui.css', false, NGG_SCRIPT_VERSION, 'screen' ); + wp_register_style( 'nggadmin', NGGALLERY_URLPATH .'admin/css/nggadmin.css', array(), NGG_SCRIPT_VERSION, 'screen' ); + wp_register_style( 'ngg-jqueryui', NGGALLERY_URLPATH .'admin/css/jquery.ui.css', array(), NGG_SCRIPT_VERSION, 'screen' ); // no need to go on if it's not a plugin page if( !isset($_GET['page']) ) @@ -362,7 +369,7 @@ class nggAdminPanel{ wp_enqueue_style( 'nggadmin' ); break; case "nggallery-tags" : - wp_enqueue_style( 'nggtags', NGGALLERY_URLPATH .'admin/css/tags-admin.css', false, NGG_SCRIPT_VERSION, 'screen' ); + wp_enqueue_style( 'nggtags', NGGALLERY_URLPATH .'admin/css/tags-admin.css', array(), NGG_SCRIPT_VERSION, 'screen' ); break; } } @@ -478,7 +485,7 @@ class nggAdminPanel{ * Read an array from a remote url * * @param string $url - * @return array of the content + * @return bool|array Array of content */ function get_remote_array($url) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/album.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/album.php index a7a676870..86428d6bd 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/album.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/album.php @@ -176,7 +176,7 @@ class nggManageAlbum { $this->currentID = $_REQUEST['act_album'] = $album->{$album->id_field}; $this->albums[$this->currentID] = $album; do_action('ngg_add_album', $this->currentID); - nggGallery::show_message(__('Updated Successfully','nggallery')); + wp_redirect(admin_url('admin.php?page=nggallery-manage-album&act_album=' . $album->{$album->id_field})); } else { $this->currentID = $_REQUEST['act_album'] = 0; @@ -450,6 +450,24 @@ function showDialog() { jQuery('#editalbum .dialog-cancel').click(function() { jQuery( "#editalbum" ).dialog("close"); }); } +// Redirect to edit the chosen album when the ngg_select_album field changes +function ngg_redirect_to_album(album_field) { + var this_page_url = '<?php print admin_url('admin.php?page=nggallery-manage-album'); ?>'; + var value = jQuery(album_field).val(); + if (value !== 0 && value !== '0') { + this_page_url += '&act_album=' + value; + } + window.location = this_page_url; +} + +function ngg_confirm_delete_album(form) { + var check = confirm('<?php echo esc_js('Delete album ?','nggallery'); ?>'); + if (check) { + jQuery(form).attr('action', '<?php print admin_url('admin.php?page=nggallery-manage-album'); ?>'); + } + return check; +} + </script> <?php if (isset($action_status) && $action_status['message']!='') : ?> @@ -460,7 +478,9 @@ function showDialog() { <div class="wrap album ngg_manage_albums" id="wrap" > - <div class="ngg_page_content_header"><img src="<?php echo(C_Router::get_instance()->get_static_url('photocrati-nextgen_admin#imagely_icon.png')); ?>"><h3><?php esc_html_e('Manage Albums', 'nggallery') ?></h3> + <div class="ngg_page_content_header"> + <img src="<?php echo(C_Router::get_instance()->get_static_url('photocrati-nextgen_admin#imagely_icon.png')); ?>"/> + <h3><?php esc_html_e('Manage Albums', 'nggallery') ?></h3> </div> <div class='ngg_page_content_main'> @@ -470,10 +490,11 @@ function showDialog() { <div class="albumnav tablenav"> <div class="alignleft actions"> <span class="ngg_select_album"><?php esc_html_e('Select album', 'nggallery') ?></span> - <select id="act_album" name="act_album" onchange="this.form.submit();"> + <select id="act_album" name="act_album" onchange="ngg_redirect_to_album(this)"> <option value="0" ><?php esc_html_e('No album selected', 'nggallery') ?></option> <?php - if( is_array($this->albums) ) { + if (is_array($this->albums)) + { foreach($this->albums as $a) { $selected = ($this->currentID == $a->id) ? 'selected="selected" ' : ''; echo '<option value="' . $a->id . '" ' . $selected . '>' . $a->id . ' - ' . esc_attr( $a->name ) . '</option>'."\n"; @@ -481,19 +502,30 @@ function showDialog() { } ?> </select> - <?php if ($album && $this->currentID){ ?> - <input class="button-primary" type="submit" name="update" value="<?php esc_attr_e('Update', 'nggallery'); ?>"/> - <?php if(nggGallery::current_user_can( 'NextGEN Edit album settings' )) { ?> - <input class="button-primary" type="submit" name="showThickbox" value="<?php esc_attr_e( 'Edit Album', 'nggallery'); ?>" onclick="showDialog(); return false;" /> + <?php if ($album && $this->currentID) { ?> + <input class="button-primary" + type="submit" + name="update" + value="<?php esc_attr_e('Update', 'nggallery'); ?>"/> + <?php if (nggGallery::current_user_can( 'NextGEN Edit album settings' )) { ?> + <input class="button-primary" + type="submit" + name="showThickbox" + value="<?php esc_attr_e( 'Edit Album', 'nggallery'); ?>" + onclick="showDialog(); return false;"/> <?php } ?> - <?php if(nggGallery::current_user_can( 'NextGEN Add/Delete album' )) { ?> - <input class="button-primary action "type="submit" name="delete" value="<?php esc_attr_e('Delete', 'nggallery'); ?>" onclick="javascript:check=confirm('<?php echo esc_js('Delete album ?','nggallery'); ?>');if(check==false) return false;"/> + <?php if (nggGallery::current_user_can( 'NextGEN Add/Delete album' )) { ?> + <input class="button-primary action" + type="submit" + name="delete" + value="<?php esc_attr_e('Delete', 'nggallery'); ?>" + onclick="ngg_confirm_delete_album(this.form);"/> <?php } ?> <?php } else { ?> - <?php if(nggGallery::current_user_can( 'NextGEN Add/Delete album' )) { ?> - <span><?php esc_html_e('Add new album', 'nggallery'); ?> </span> - <input class="search-input" id="newalbum" name="newalbum" type="text" value="" /> - <input class="button-primary action" type="submit" name="add" value="<?php esc_attr_e('Add', 'nggallery'); ?>"/> + <?php if (nggGallery::current_user_can('NextGEN Add/Delete album')) { ?> + <span><?php esc_html_e('Add new album', 'nggallery'); ?> </span> + <input class="search-input" id="newalbum" name="newalbum" type="text" value="" /> + <input class="button-primary action" type="submit" name="add" value="<?php esc_attr_e('Add', 'nggallery'); ?>"/> <?php } ?> <?php } ?> </div> @@ -669,7 +701,7 @@ function showDialog() { * * @param integer $id (the prefix 'a' indidcates that you look for a album * @param bool $used (object will be hidden) - * @return string + * @return null|string */ function get_container($id = 0, $used = false) { global $wpdb, $nggdb; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/jquery.ui.tabs.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/jquery.ui.tabs.min.css index 4e59e178d..024ff0be7 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/jquery.ui.tabs.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/jquery.ui.tabs.min.css @@ -1 +1 @@ -@media projection,screen{.ui-tabs-hide{display:none}}@media print{.ui-tabs-nav{display:none}}#slider{border-color:#ebebeb #ccc #ccc #ebebeb;border-style:solid;border-width:1px;margin:15px 15% 0 15px;padding:2px}#tabs{display:block;background:#f1f1f1 none repeat scroll 0;font-size:14px;overflow:hidden}.ui-tabs-nav{list-style:none;margin:0;padding:0 0 0 10px}.ui-tabs-nav:after{display:block;clear:both;content:" "}.ui-tabs-nav li{float:left;padding:6px 5px;min-width:84px;margin:2px 2px 0 1px!important;text-decoration:none;list-style:none}.ui-tabs-nav a,.ui-tabs-nav a span{display:block;padding:0 1px}.ui-tabs-nav a{margin:1px 0 0;padding-left:0;color:#2583ad;line-height:1.2;text-align:center;text-decoration:none;white-space:nowrap;outline:0}.ui-tabs-nav .ui-tabs-selected{background:#6d6d6d url(../images/menu-bits.gif) repeat-x scroll left top;border-color:#6d6d6d;color:#fff;text-shadow:0 -1px 0 #666;-moz-border-radius-topright:6px;-khtml-border-top-right-radius:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-topleft:6px;-khtml-border-top-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px}.ui-tabs-selected a,.ui-tabs-selected a:hover{color:#fff!important}.ui-tabs-nav .ui-tabs-selected a,.ui-tabs-nav .ui-tabs-selected a:hover{position:relative;top:1px;z-index:2;margin-top:0}.ui-tabs-nav li a:hover{color:#d54e21}.ui-tabs-nav a span{width:64px;min-width:64px;height:18px;min-height:18px;padding-top:6px;padding-right:0}*>.ui-tabs-nav a span{width:auto;height:auto}.ui-tabs-nav .ui-tabs-selected a span{padding-bottom:1px}.ui-tabs-nav .ui-tabs-selected a,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover{background-position:100% -150px}.ui-tabs-nav .ui-tabs-disabled a:active,.ui-tabs-nav .ui-tabs-disabled a:focus,.ui-tabs-nav .ui-tabs-disabled a:hover,.ui-tabs-nav a{background-position:100% -100px}.ui-tabs-nav .ui-tabs-selected a span,.ui-tabs-nav a:active span,.ui-tabs-nav a:focus span,.ui-tabs-nav a:hover span{background-position:0 -50px}.ui-tabs-nav .ui-tabs-disabled a:active span,.ui-tabs-nav .ui-tabs-disabled a:focus span,.ui-tabs-nav .ui-tabs-disabled a:hover span,.ui-tabs-nav a span{background-position:0 0}.ui-tabs-nav .ui-tabs-disabled a:link,.ui-tabs-nav .ui-tabs-disabled a:visited,.ui-tabs-nav .ui-tabs-selected a:link,.ui-tabs-nav .ui-tabs-selected a:visited{cursor:text}.ui-tabs-nav .ui-tabs-unselect a:active,.ui-tabs-nav .ui-tabs-unselect a:focus,.ui-tabs-nav .ui-tabs-unselect a:hover,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover{cursor:pointer}.ui-tabs-disabled{opacity:.4}.ui-tabs-panel{border-top:1px solid #97a5b0!important;padding:1em 8px;background:#fff;border:none!important;height:100%!important;margin:0!important;overflow:visible!important}.ui-tabs-panel a{display:inline}* html .ui-tabs-nav{display:inline-block} \ No newline at end of file +@media projection,screen{.ui-tabs-hide{display:none}}@media print{.ui-tabs-nav{display:none}}#slider{border-color:#EBEBEB #ccc #ccc #ebebeb;border-style:solid;border-width:1px;margin:15px 15% 0 15px;padding:2px}#tabs{display:block;background:0 #F1F1F1;font-size:14px;overflow:hidden}.ui-tabs-nav{list-style:none;margin:0;padding:0 0 0 10px}.ui-tabs-nav:after{display:block;clear:both;content:" "}.ui-tabs-nav li{float:left;padding:6px 5px;min-width:84px;margin:2px 2px 0 1px!important;text-decoration:none;list-style:none}.ui-tabs-nav a,.ui-tabs-nav a span{display:block;padding:0 1px}.ui-tabs-nav a{margin:1px 0 0;padding-left:0;color:#2583AD;line-height:1.2;text-align:center;text-decoration:none;white-space:nowrap;outline:0}.ui-tabs-nav .ui-tabs-selected{background:url(../images/menu-bits.gif) left top repeat-x #6D6D6D;border-color:#6D6D6D;color:#FFF;text-shadow:0 -1px 0 #666;-moz-border-radius-topright:6px;-khtml-border-top-right-radius:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-topleft:6px;-khtml-border-top-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px}.ui-tabs-selected a,.ui-tabs-selected a:hover{color:#FFF!important}.ui-tabs-nav .ui-tabs-selected a,.ui-tabs-nav .ui-tabs-selected a:hover{position:relative;top:1px;z-index:2;margin-top:0}.ui-tabs-nav li a:hover{color:#D54E21}.ui-tabs-nav a span{width:64px;min-width:64px;height:18px;min-height:18px;padding-top:6px;padding-right:0}*>.ui-tabs-nav a span{width:auto;height:auto}.ui-tabs-nav .ui-tabs-selected a span{padding-bottom:1px}.ui-tabs-nav .ui-tabs-selected a,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover{background-position:100% -150px}.ui-tabs-nav .ui-tabs-disabled a:active,.ui-tabs-nav .ui-tabs-disabled a:focus,.ui-tabs-nav .ui-tabs-disabled a:hover,.ui-tabs-nav a{background-position:100% -100px}.ui-tabs-nav .ui-tabs-selected a span,.ui-tabs-nav a:active span,.ui-tabs-nav a:focus span,.ui-tabs-nav a:hover span{background-position:0 -50px}.ui-tabs-nav .ui-tabs-disabled a:active span,.ui-tabs-nav .ui-tabs-disabled a:focus span,.ui-tabs-nav .ui-tabs-disabled a:hover span,.ui-tabs-nav a span{background-position:0 0}.ui-tabs-nav .ui-tabs-disabled a:link,.ui-tabs-nav .ui-tabs-disabled a:visited,.ui-tabs-nav .ui-tabs-selected a:link,.ui-tabs-nav .ui-tabs-selected a:visited{cursor:text}.ui-tabs-nav .ui-tabs-unselect a:active,.ui-tabs-nav .ui-tabs-unselect a:focus,.ui-tabs-nav .ui-tabs-unselect a:hover,.ui-tabs-nav a:active,.ui-tabs-nav a:focus,.ui-tabs-nav a:hover{cursor:pointer}.ui-tabs-disabled{opacity:.4;filter:alpha(opacity=40)}.ui-tabs-panel{border-top:1px solid #97a5b0!important;padding:1em 8px;background:#fff;border:none!important;height:100%!important;margin:0!important;overflow:visible!important}.ui-tabs-panel a{display:inline}* html .ui-tabs-nav{display:inline-block} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggColorPicker.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggColorPicker.min.css index c8123e475..f7d064714 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggColorPicker.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggColorPicker.min.css @@ -1 +1 @@ -#colorSelector{background:transparent url(../images/select.png) repeat scroll 0 0;height:36px;position:relative;width:36px}#colorSelector div{background:transparent url(../images/select.png) repeat scroll center center;height:30px;left:3px;position:absolute;top:3px;width:30px} \ No newline at end of file +#colorSelector{background:url(../images/select.png);height:36px;position:relative;width:36px}#colorSelector div{background:url(../images/select.png) center center;height:30px;left:3px;position:absolute;top:3px;width:30px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggSorter.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggSorter.min.css index 1832d6967..e6c8036e2 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggSorter.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggSorter.min.css @@ -1 +1 @@ -.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto;margin-bottom:2px}.imageBox .imageBox_theImage{border:1px solid #ddd;padding:2px}.imageBoxHighlighted .imageBox_theImage{border:3px solid #316ac5;padding:0}.imageBoxHighlighted span{background-color:#316ac5;color:#fff;padding:2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;position:absolute;z-index:10;display:none} \ No newline at end of file +.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto 2px}.imageBox .imageBox_theImage{border:1px solid #DDD;padding:2px}.imageBoxHighlighted .imageBox_theImage{border:3px solid #316AC5;padding:0}.imageBoxHighlighted span{background-color:#316AC5;color:#FFF;padding:2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;filter:alpha(opacity=40);position:absolute;z-index:10;display:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css index 3721d7bba..655629fd6 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.css @@ -8,6 +8,18 @@ /* OVERVIEW PAGES */ +.toplevel_page_nextgen-gallery #ngg_page_content { + width: 98%; +} + +.toplevel_page_nextgen-gallery #ngg_page_content .about-wrap.ngg_overview { + width: 100%; +} + +.toplevel_page_nextgen-gallery #ngg_page_content .ngg_page_content_main { + padding-right: 40px !important; +} + #newversion { border-color:#CCCCCC; border-style:solid; @@ -117,10 +129,21 @@ box-shadow: 0 0 50px 25px rgba(0,0,0,.03); } +div[data-id="pro-link"] .feature-section { + position: relative; + margin: 40px 0; + padding-bottom: 56.25%; +} + div[data-id="pro-link"] .feature-section iframe { - width: 900px; + width: 900px; height: 506px; - max-width: 100%; + max-width: 100%; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; } #ngg_page_content .button-primary.ngg-pro-upgrade { @@ -210,6 +233,12 @@ a.switch-expert { margin: -10px 0 40px 0; } +.ngg_admin_notice ul { + list-style: circle inside; + margin: 0; + padding: 0; +} + .gallery_page_nggallery-manage-gallery #ngg_page_content .ngg_page_content_main { padding-top: 30px; } @@ -1151,7 +1180,6 @@ DIV that shows the image as you drag it } table#ngg-listimages tr { padding: 10px 5px !important; - border-bottom: ; } #ngg-listimages thead, #ngg-listimages thead th { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css index 75aa49182..a15081355 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/nggadmin.min.css @@ -1 +1 @@ -#iframely h2.title{display:none}#newversion{border-color:#ccc;border-style:solid;border-width:1px;margin-right:7px;margin-top:10px;padding:2px}.ngg-dashboard-widget ul.settings span{padding-left:10px;color:#2583ad;font-weight:700}.ngg-overview .postbox .handlediv{float:right;height:24px;width:24px}#ngg_page_content .ngg_overview .ngg_page_content_header h2{padding-top:2px}#ngg_page_content .ngg_overview .ngg_page_content_main h2{text-align:left;font-size:28px;font-weight:500;color:#444;margin:20px 0}#ngg_page_content .ngg_overview .ngg_page_content_main .about-text{font-size:18px;max-width:none;margin:20px 0}#ngg-gallery-wizard{min-height:auto;position:absolute;top:0;right:0;text-align:right;margin:0 20px 0 0;line-height:80px;color:#fff;font-size:14px;background:rgba(93,134,167,.18);margin-right:0;padding:0 40px;border-left:1px solid #566b7c;color:#a7b8c6}#ngg-gallery-wizard a{font-weight:700;text-decoration:none;margin-left:20px}.warning{color:#9f6000;background-color:#feefb3;border:1px solid;margin:5px 0;padding:5px}#donator_message{margin:5px 0 15px;background-color:#bde5f8;border-color:#00529b;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-topleft:3px;-moz-border-radius-topright:3px;border-style:solid;border-width:1px;margin:5px 15px 2px;padding:0 .6em}#donator_message p{line-height:1;margin:.5em 0;padding:2px;padding-bottom:10px}#donator_message span{padding-top:10px;float:right}#plugin_check img{float:right}#plugin_check p.message{font-size:90%;color:#666}.toplevel_page_nextgen-gallery .feature-video iframe{box-shadow:0 0 50px 25px rgba(0,0,0,.03)}div[data-id=pro-link] .feature-section iframe{width:900px;height:506px;max-width:100%}#ngg_page_content .button-primary.ngg-pro-upgrade{text-transform:uppercase;height:50px!important;padding:0 40px!important;line-height:50px;font-weight:600;letter-spacing:.5px}div[data-id=genesis-link] .feature-section,div[data-id=genesis-link] .feature-section .col,div[data-id=videos-link] .feature-section,div[data-id=videos-link] .feature-section .col{padding:0;margin:0}.ngg-admin .ui-dialog{max-width:100%}.ngg-options th{width:22%}a.switch-expert{text-decoration:none}#wm-preview{float:right;font-size:90%;width:35%;border-color:#ebebeb #ccc #ccc #ebebeb;border-style:solid;border-width:1px;margin-bottom:10px;margin-left:10px;margin-right:8px;padding:2px}#wm-preview h3{background:#f9f9f9 none repeat scroll 0;font-size:14px;font-weight:700;margin:0 0 10px;padding:8px 5px}#wm-position{width:100%;margin-left:40px}.wm-table{border-collapse:collapse;margin-top:1em;width:60%;clear:none}.wm-table td{border-bottom:8px solid #fff;line-height:20px;margin-bottom:9px;padding:10px}.wm-table th{border-bottom:8px solid #fff;padding:10px;text-align:left}.wm-table tr{background:#f9f9f9 none repeat scroll 0}.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content .notice,.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.error,.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.updated{margin:-10px 0 40px 0}.gallery_page_nggallery-manage-gallery #ngg_page_content .ngg_page_content_main{padding-top:30px}.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.updated#message{margin-bottom:35px}.gallery_page_nggallery-manage-gallery #ngg_page_content>.wrap>h2{display:none}#ngg_page_content .ngg_manage_galleries .tablenav{margin:0 0 30px}#ngg_page_content .ngg_manage_images .handlediv{float:none;width:100%;height:50px}#gallerydiv h3{margin-left:10px;display:inline-block;height:50px;float:left;margin:0;line-height:50px}#gallerydiv span.toggle-indicator{display:inline-block;float:left;line-height:50px}#gallerydiv span.toggle-indicator:before{font-size:24px;margin:12px 20px 0 10px}#gallerydiv span.toggle-indicator:hover{cursor:pointer}#gallerydiv h3:active,#gallerydiv h3:focus,#gallerydiv span.toggle-indicator:active,#gallerydiv span.toggle-indicator:focus{outline:0;border:none;-moz-outline-style:none}#ngg_page_content .ngg_manage_images .tablenav{margin:50px 0 30px}#ngg_page_content .ngg_manage_galleries .tablenav.top>div,#ngg_page_content .ngg_manage_images .tablenav.top>div{margin-bottom:10px}#ngg_page_content .ngg_manage_galleries .search-box{margin-bottom:10px}#ngg_page_content .ngg_manage_galleries .tablenav.bottom{margin:15px 0 0}#ngg_page_content .ngg_manage_images .tablenav.bottom{margin:25px 0 0}.ngg-admin #ngg_page_content .ngg_manage_images td{vertical-align:top}#ngg_page_content .ngg_manage_galleries .tablenav input{height:28px;width:50px;padding:0 3px}#ngg_page_content .ngg_manage_galleries .tablenav input.current-page{width:50px!important}#ngg_page_content .ngg_manage_galleries .tablenav .tablenav-pages a,#ngg_page_content .ngg_manage_images .tablenav .tablenav-pages a{background:#9fbb1a;border:none;color:#fff!important;margin:0 2px}#ngg_page_content .ngg_manage_images .tablenav input,#ngg_page_content .ngg_manage_images .tablenav select{width:auto}#ngg_page_content .ngg_manage_galleries table{box-shadow:none;border:1px solid rgba(159,187,26,.08)!important}#ngg_page_content .ngg_manage_galleries table tfoot,#ngg_page_content .ngg_manage_galleries table thead{background-color:#38576f}#ngg_page_content .ngg_manage_galleries table tfoot{background-color:#38576f}#ngg_page_content .ngg_manage_galleries table tfoot td,#ngg_page_content .ngg_manage_galleries table tfoot th,#ngg_page_content .ngg_manage_galleries table thead td,#ngg_page_content .ngg_manage_galleries table thead th{background-color:transparent;border:none}#ngg_page_content .ngg_manage_galleries table td,#ngg_page_content .ngg_manage_galleries table th{padding:12px 10px;font-size:14px}#ngg_page_content .ngg_manage_galleries table th{font-weight:700!important;color:#fff}.ngg_manage_galleries th#id{width:33px}.ngg_manage_galleries th#title{min-width:140px}.ngg_manage_galleries td.title{font-weight:700}.ngg_manage_galleries th#author{min-width:80px}.ngg_manage_galleries th#page_id{min-width:60px}#ngg_page_content .ngg_manage_galleries table tr.alternate{background-color:#f7f8f3}#ngg_page_content .ngg_manage_galleries th a{padding:0!important;color:#fff}div#poststuff{min-width:auto}div#poststuff #gallerydiv{cursor:pointer}p#ngg-inlinebutton{float:right;margin:0;position:relative;top:-25pt}#gallery_fields{width:100%}#gallery_fields td{padding:5px;min-width:105px}#gallery_fields tr td:nth-of-type(2){padding-right:60px}#gallery_fields input[type=text],#gallery_fields select,#gallery_fields textarea{min-width:220px;width:99%;color:#888}table#ngg-listimages{border:1px solid #f7f7f7}#ngg-listimages tfoot,#ngg-listimages thead{background:#f5f5f5;background-color:#38576f}#ngg-listimages tfoot{background:#f5f5f5;background-color:#38576f}#ngg-listimages.widefat thead th,.ngg-admin #ngg_page_content .widefat tfoot th{padding:12px 10px!important}#ngg-listimages tr.alternate{background-color:#f7f8f3}#ngg-listimages td{padding:15px 5px!important}#ngg-listimages .iedit,#ngg-listimages .iedit td,#ngg-listimages th{border:none}#ngg-listimages .iedit td,#ngg-listimages th{padding:15px 5px}#ngg-listimages th{font-size:12px;font-weight:700}#ngg-listimages .column select{width:100%!important}#ngg-listimages .column-1 input{margin:0 0 0 8px}#ngg-listimages .column-1{width:24px}#ngg-listimages .column-2{width:30px}#ngg-listimages .column-3{min-width:80px;width:15%}#ngg-listimages .column-3 .thumb{max-height:100%;max-width:100%}#ngg-listimages .column-4{width:15%;max-width:220px}#ngg-listimages .column-4{font-size:12px}#ngg-listimages .column-4 .meta,#ngg-listimages .column-4 label{font-size:10px;color:#888}#ngg-listimages .column-4 label input[type=checkbox]{margin:-2px 4px 0 0}#ngg-listimages .column-5 input[type=text],#ngg-listimages .column-5 textarea,#ngg-listimages .column-6 textarea{width:100%;padding:3px 5px;font-size:12px;color:#888;border:1px solid #eee;margin:1px 0;box-shadow:none}#ngg-listimages .column-5 input[type=text]{height:25px}#ngg-listimages .column-5 textarea{height:70px}#ngg-listimages .column-6 textarea{height:97px}#ngg-listimages .column-7 select{font-size:12px;height:25px!important}#ngg-listimages .row-actions{padding:0 0 6px 4px;margin-bottom:-2px;position:relative;bottom:4px;left:0;right:0}#ngg-listimages .row_actions,#ngg-listimages .row_actions td{border-top:none;padding:0!important}#ngg-listimages .row-actions a{font-size:12px}#ngg-listimages ul.imagify-datas-list .big{color:#9fbb1a}#ngg-listimages .imagify-datas-more-action a{background:#9fbb1a;color:#fff}.gallery_page_nggallery-manage-gallery .ui-dialog{border:none;padding:0;width:80%!important;z-index:10000!important;left:10%!important}.gallery_page_nggallery-manage-album .ui-dialog{border:none;padding:0;z-index:10000!important;width:650px!important;max-width:98%!important}.gallery_page_nggallery-manage-album .ui-dialog .button-primary,.gallery_page_nggallery-manage-album .ui-dialog .button-secondary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-primary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-secondary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom button,.gallery_page_nggallery-manage-gallery .ui-dialog .button-primary,.gallery_page_nggallery-manage-gallery .ui-dialog .button-secondary,.gallery_page_nggallery-manage-gallery .ui-dialog button{background-color:#9fbb1a!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 15px!important;line-height:35px;width:auto!important;margin-right:10px}.gallery_page_nggallery-manage-album .ui-dialog .button-primary:hover,.gallery_page_nggallery-manage-album .ui-dialog .button-secondary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-primary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-secondary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom button:hover,.gallery_page_nggallery-manage-gallery .ui-dialog .button-secondary:hover,.gallery_page_nggallery-manage-gallery .ui-dialog button:hover .gallery_page_nggallery-manage-gallery .ui-dialog .button-primary:hover{background-color:#a9c524!important}.gallery_page_nggallery-manage-album .ui-dialog-titlebar,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar{background:#143650;padding:10px}.gallery_page_nggallery-manage-album .ui-dialog-titlebar button,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button{background:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:24px!important;width:24px!important;padding:0!important;line-height:1;float:none;margin-right:0;border-radius:50%;top:17px;right:10px}.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:active,.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:focus,.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:hover,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:active,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:focus,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:hover{background:#fff!important}.gallery_page_nggallery-manage-album .ui-dialog .ngg-overlay-dialog,.gallery_page_nggallery-manage-gallery .ui-dialog .ngg-overlay-dialog{padding:30px 20px;box-sizing:border-box;width:100%!important}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog table{border:none}.gallery_page_nggallery-manage-album .ngg-overlay-dialog #ngg-overlay-dialog-main,.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog #ngg-overlay-dialog-main{width:70%;padding:20px 20px 0}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog td small{margin-left:10px;display:block;text-align:center;width:200px;margin:0 auto 20px}.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom{text-align:center;padding:30px 0 0 0}.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom input[type=button]{float:none;margin-right:0}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog #thumbMsg{color:#693;display:none;font-size:11px;width:100%;display:inline-block;height:35px;line-height:35px;margin:10px 0}.gallery_page_nggallery-manage-gallery .ui-dialog form{margin-top:30px;margin-left:30px}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog input[type=radio]:focus{border:1px solid #b4b9be;box-shadow:none}.gallery_page_nggallery-manage-gallery input[type=checkbox]:checked:before{color:#9fbb1a}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog input[type=radio]:checked:before{background:#9fbb1a;width:14px;height:14px;margin:0}div .progressborder{border:1px solid #ddd;display:block;height:30px;background-color:#464646;width:100%;margin-top:15px;margin-bottom:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar{border:medium none;display:block;height:30px;background-color:#9fbb1a;width:0%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar span{display:inline;position:absolute;color:#fff;font-weight:700;padding:5px 0 0 5px}.show_details{height:16px;line-height:20px;overflow:hidden;min-width:8em;padding:3px;cursor:pointer}.show_details span{border-bottom:1px solid #999;white-space:pre}.show_details:hover{height:auto;overflow:visible;border:1px solid #999}.gallery_page_nggallery-manage-album #ngg_page_content .wrap{background:#f1f1f1}.gallery_page_nggallery-manage-album .wrap>h2:first-child{display:none}.gallery_page_nggallery-manage-album #ngg_page_content div.updated{margin:0 0 15px 0}.gallery_page_nggallery-manage-album #ngg_page_content div.updated#message{margin-bottom:35px}.ngg_manage_albums{color:#777}.ngg_manage_albums .widget{box-sizing:border-box;border:1px solid #eee;padding:10px 10px 20px;background:#f7f8f3;width:32%;margin:0 1% 0 0;float:left}.ngg_manage_albums .target-album{width:39%}.ngg_manage_albums .widget.widget-right{width:29%}.container{margin-top:10px}.ngg_select_album{margin:0 50px 0 2px}.albumnav select[name=act_album]{width:150px}#editalbum select[name=pageid]{width:95%}#ngg_page_content .ngg_manage_albums .widget-top{box-shadow:none;background:0 0;border:none;margin-bottom:5px}div .groupItem{cursor:move;padding:2px;line-height:1.5;width:100%;margin:0;box-sizing:border-box}div .innerhandle{background-color:#fbfbfb}.groupItem .item_top{background-color:#9fbb1a;color:#fff;font-weight:700;line-height:28px;height:28px;padding:0 5px;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;height:40px;padding:0 10px;line-height:40px}#ngg_page_content .groupItem .album_obj{background-color:#38576f}#ngg_page_content .groupItem .item_top a{color:#fff;float:right;text-decoration:none}.groupItem .item_top a:hover{color:#fff}.itemContent{border-color:#dfdfdf;border-style:none solid solid;border-width:0 1px 1px;padding:2px 0 20px 2px}.itemContent p{border:0;margin:0;padding:0}.inlinepicture{float:left;display:inline;margin:0;padding:0 3px 1px}.inlinepicture img{margin:3px;max-height:60px}.sort_placeholder{border:1px dashed #bba!important;margin:5px;background:#f9f9f9}.widget-holder{min-height:400px;padding-top:1px}.target{background-color:transparent}div.widget-top h3{text-align:center;line-height:25px;margin:0;padding:5px 12px;font-size:13px}div.widget-top{text-shadow:0 1px 0 #fff;background-repeat:repeat-x;background-position:0 0;font-size:13px}.ui-autocomplete-start{background-position:99% center}#ngg_page_content .ngg_gallery_sort .tablenav{margin:15px 0}#ngg_page_content .ngg_gallery_sort ul.subsubsub{margin:10px 0 15px}#ngg_page_content .ngg_gallery_sort .imageBox_theImage{width:auto}#sortGallery{position:relative}p#sortButton{margin:0;position:absolute;right:0;top:0}.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left;overflow:hidden;text-overflow:ellipsis;padding:5px}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto;margin-bottom:2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;position:absolute;z-index:10;display:none}.error_inline{background:#ffebe8 none repeat scroll 0;border:1px solid #c00;margin:5px auto;padding:10px}.ngg-list{font-size:11px;margin-left:15px;list-style-position:inside;list-style-type:disc}#ngg-manage-images-items-per-page-label{float:right;line-height:35px;margin-right:5px}#ngg-manage-images-items-per-page{float:right;margin-right:30px}@media (max-width:1200px){div[data-id=details-link] .two-col .col{width:100%;min-width:100%}}@media (max-width:1080px){#ngg-gallery-wizard>span{display:none}}@media (max-width:1024px){.ngg_manage_galleries .search-form{display:none}.ngg_manage_galleries .tablenav.bottom{display:none}.ngg_manage_images #gallery_fields td:nth-of-type(even){margin-bottom:8px}.ngg_manage_images #gallery_fields td:nth-of-type(odd){background:#f7f8f3}.ngg_manage_images #gallery_fields,.ngg_manage_images #gallery_fields tbody,.ngg_manage_images #gallery_fields td,.ngg_manage_images #gallery_fields tr{display:block;width:100%;box-sizing:border-box}.ngg_manage_images #gallery_fields td{padding:10px 5px;border:1px solid #f7f8f3;margin:0}}@media (max-width:900px){.ngg_manage_galleries tfoot{display:none}.ngg_manage_galleries .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){display:table-cell}.ngg_manage_galleries td.author,.ngg_manage_galleries td.id,.ngg_manage_galleries td.page_id,.ngg_manage_galleries th#author,.ngg_manage_galleries th#id,.ngg_manage_galleries th#page_id{display:none!important}#ngg-listimages td.column.column-2,#ngg-listimages td.column.column-6,#ngg-listimages td.column.column-8,#ngg-listimages tfoot,#ngg-listimages thead .column-1,#ngg-listimages thead .column-2,#ngg-listimages thead .column-4,#ngg-listimages thead .column-5,#ngg-listimages thead .column-6,#ngg-listimages thead .column-7,#ngg-listimages thead .column-8{display:none}#ngg-listimages .column-3{min-width:200px}table#ngg-listimages,table#ngg-listimages thead{display:block}#ngg-listimages .iedit td{padding-bottom:30px!important}}@media (max-width:800px){table#ngg-listimages,table#ngg-listimages tbody,table#ngg-listimages td,table#ngg-listimages tr{display:block}table#ngg-listimages tr{padding:10px 5px!important}#ngg-listimages thead,#ngg-listimages thead th{display:block;width:100%;box-sizing:border-box}#ngg-listimages .row_actions td:first-of-type{display:none}#ngg-listimages tfoot{display:none}#ngg-listimages .row_actions{display:none;display:block;clear:both;padding:0 8px 10px!important;border-bottom:1px solid #c1c97c}.ngg-listimages tr.iedit td{display:block!important;float:left;box-sizing:border-box;padding-bottom:10px!important}#ngg-listimages td.column-1,#ngg-listimages td.column-2{width:10%!important;height:150px;float:left;box-sizing:border-box;display:none}#ngg-listimages td.column-3{width:55%;max-width:300px;float:left;box-sizing:border-box;padding-bottom:10px!important}#ngg-listimages td.column-4{width:40%!important;float:left;box-sizing:border-box}#ngg-listimages td.column-5,#ngg-listimages td.column-6,#ngg-listimages td.column-7{padding:0 5px!important}#ngg-listimages td.column-6{margin-top:-5px;margin-bottom:-8px}.ngg-listimages td.column-7{padding-bottom:15px}#ngg-manage-images-items-per-page,#ngg-manage-images-items-per-page-label{display:none}#ngg-listimages .column-6 textarea{height:60px}.ngg_manage_images .tablenav.bottom .displaying-num{display:none}}@media (max-width:782px){#ngg-gallery-wizard{display:none}}@media (max-width:737px){.gallery_page_nggallery-manage-gallery input[type=checkbox]:checked:before{font-size:22px}.ngg-overlay-dialog input[type=radio]{height:16px;width:16px}#ngg-gallery-wizard{display:none}}@media (max-width:640px){.ngg_manage_galleries td.description,.ngg_manage_galleries th#description{display:none!important}.ngg_manage_albums .tablenav .actions{width:100%;float:none}.ngg_manage_albums .tablenav span{display:block}.ngg_manage_albums .target-album,.ngg_manage_albums .widget.widget-right{width:32%;margin:.5%!important;padding:5px 5px 10px}.groupItem .item_top{height:auto!important;line-height:1.5;padding:8px;font-size:12px}#ngg_page_content .groupItem .item_top a{display:none}.ngg_manage_albums div[style="float:right;"]{float:none!important}.gallery_page_nggallery-manage-gallery .ui-dialog{width:95%!important;left:2.5%!important}.gallery_page_nggallery-manage-gallery .ui-dialog .ngg-overlay-dialog{padding:30px 10px}.ngg-overlay-dialog td{display:block;width:100%!important;padding:0!important}.ngg-overlay-dialog input[type=radio]{margin:2px 5px;height:16px;width:16px}} \ No newline at end of file +#iframely h2.title,.gallery_page_nggallery-manage-gallery #ngg_page_content>.wrap>h2{display:none}#gallerydiv span.toggle-indicator:hover,.show_details,div#poststuff #gallerydiv{cursor:pointer}.toplevel_page_nextgen-gallery #ngg_page_content{width:98%}.toplevel_page_nextgen-gallery #ngg_page_content .about-wrap.ngg_overview{width:100%}.toplevel_page_nextgen-gallery #ngg_page_content .ngg_page_content_main{padding-right:40px!important}#newversion{border-color:#CCC;border-style:solid;border-width:1px;margin-right:7px;margin-top:10px;padding:2px}.ngg-dashboard-widget ul.settings span{padding-left:10px;color:#2583AD;font-weight:700}.ngg-overview .postbox .handlediv{float:right;height:24px;width:24px}#ngg_page_content .ngg_overview .ngg_page_content_header h2{padding-top:2px}#ngg_page_content .ngg_overview .ngg_page_content_main h2{text-align:left;font-size:28px;font-weight:500;color:#444;margin:20px 0}#ngg_page_content .ngg_overview .ngg_page_content_main .about-text{font-size:18px;max-width:none;margin:20px 0}#ngg-gallery-wizard{min-height:auto;position:absolute;top:0;right:0;text-align:right;margin:0;line-height:80px;font-size:14px;background:rgba(93,134,167,.18);padding:0 40px;border-left:1px solid #566b7c;color:#a7b8c6}#ngg-gallery-wizard a{font-weight:700;text-decoration:none;margin-left:20px}.warning{color:#9F6000;background-color:#FEEFB3;border:1px solid;margin:5px 0;padding:5px}#donator_message,#wm-preview{border-style:solid;border-width:1px}#donator_message{background-color:#BDE5F8;border-color:#00529B;-moz-border-radius-bottomleft:3px;-moz-border-radius-bottomright:3px;-moz-border-radius-topleft:3px;-moz-border-radius-topright:3px;margin:5px 15px 2px;padding:0 .6em}#wm-preview h3,.wm-table tr{background:0 #F9F9F9}#donator_message p{line-height:1;margin:.5em 0;padding:2px 2px 10px}#donator_message span{padding-top:10px;float:right}#plugin_check img{float:right}#plugin_check p.message{font-size:90%;color:#666}.toplevel_page_nextgen-gallery .feature-video iframe{box-shadow:0 0 50px 25px rgba(0,0,0,.03)}div[data-id=pro-link] .feature-section{position:relative;margin:40px 0;padding-bottom:56.25%}div[data-id=pro-link] .feature-section iframe{max-width:100%;position:absolute;top:0;left:0;width:100%;height:100%}#ngg_page_content .button-primary.ngg-pro-upgrade{text-transform:uppercase;height:50px!important;padding:0 40px!important;line-height:50px;font-weight:600;letter-spacing:.5px}div[data-id=videos-link] .feature-section,div[data-id=videos-link] .feature-section .col,div[data-id=genesis-link] .feature-section,div[data-id=genesis-link] .feature-section .col{padding:0;margin:0}.ngg-admin .ui-dialog{max-width:100%}.ngg-options th{width:22%}a.switch-expert{text-decoration:none}#wm-preview{float:right;font-size:90%;width:35%;border-color:#EBEBEB #ccc #ccc #ebebeb;margin-bottom:10px;margin-left:10px;margin-right:8px;padding:2px}#wm-preview h3{font-size:14px;font-weight:700;margin:0 0 10px;padding:8px 5px}.wm-table td,.wm-table th{border-bottom:8px solid #FFF;padding:10px}#wm-position{width:100%;margin-left:40px}.wm-table{border-collapse:collapse;margin-top:1em;width:60%;clear:none}.wm-table td{line-height:20px;margin-bottom:9px}.wm-table th{text-align:left}.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content .notice,.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.error,.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.updated{margin:-10px 0 40px}.ngg_admin_notice ul{list-style:circle inside;margin:0;padding:0}.gallery_page_nggallery-manage-gallery #ngg_page_content .ngg_page_content_main{padding-top:30px}.ngg-admin.gallery_page_nggallery-manage-gallery #ngg_page_content div.updated#message{margin-bottom:35px}#ngg_page_content .ngg_manage_galleries .tablenav{margin:0 0 30px}#ngg_page_content .ngg_manage_images .handlediv{float:none;width:100%;height:50px}#gallerydiv h3,#gallerydiv span.toggle-indicator{display:inline-block;float:left;line-height:50px}#gallerydiv h3{height:50px;margin:0}#gallerydiv span.toggle-indicator:before{font-size:24px;margin:12px 20px 0 10px}#gallerydiv h3:active,#gallerydiv h3:focus,#gallerydiv span.toggle-indicator:active,#gallerydiv span.toggle-indicator:focus{outline:0;border:none;-moz-outline-style:none}#ngg_page_content .ngg_manage_images .tablenav{margin:50px 0 30px}#ngg_page_content .ngg_manage_galleries .search-box,#ngg_page_content .ngg_manage_galleries .tablenav.top>div,#ngg_page_content .ngg_manage_images .tablenav.top>div{margin-bottom:10px}#ngg_page_content .ngg_manage_galleries .tablenav.bottom{margin:15px 0 0}#ngg_page_content .ngg_manage_images .tablenav.bottom{margin:25px 0 0}.ngg-admin #ngg_page_content .ngg_manage_images td{vertical-align:top}#ngg_page_content .ngg_manage_galleries .tablenav input{height:28px;width:50px;padding:0 3px}#ngg_page_content .ngg_manage_galleries .tablenav input.current-page{width:50px!important}#ngg_page_content .ngg_manage_galleries .tablenav .tablenav-pages a,#ngg_page_content .ngg_manage_images .tablenav .tablenav-pages a{background:#9fbb1a;border:none;color:#fff!important;margin:0 2px}#ngg_page_content .ngg_manage_images .tablenav input,#ngg_page_content .ngg_manage_images .tablenav select{width:auto}#ngg_page_content .ngg_manage_galleries table{box-shadow:none;border:1px solid rgba(159,187,26,.08)!important}#ngg_page_content .ngg_manage_galleries table tfoot,#ngg_page_content .ngg_manage_galleries table thead{background-color:#38576f}#ngg_page_content .ngg_manage_galleries table tfoot td,#ngg_page_content .ngg_manage_galleries table tfoot th,#ngg_page_content .ngg_manage_galleries table thead td,#ngg_page_content .ngg_manage_galleries table thead th{background-color:transparent;border:none}#ngg_page_content .ngg_manage_galleries table td,#ngg_page_content .ngg_manage_galleries table th{padding:12px 10px;font-size:14px}#ngg_page_content .ngg_manage_galleries table th{font-weight:700!important;color:#fff}.ngg_manage_galleries th#id{width:33px}.ngg_manage_galleries th#title{min-width:140px}.ngg_manage_galleries td.title{font-weight:700}.ngg_manage_galleries th#author{min-width:80px}.ngg_manage_galleries th#page_id{min-width:60px}#ngg_page_content .ngg_manage_galleries table tr.alternate{background-color:#f7f8f3}#ngg_page_content .ngg_manage_galleries th a{padding:0!important;color:#fff}div#poststuff{min-width:auto}p#ngg-inlinebutton{float:right;margin:0;position:relative;top:-25pt}#gallery_fields{width:100%}#gallery_fields td{padding:5px;min-width:105px}#gallery_fields tr td:nth-of-type(2){padding-right:60px}#gallery_fields input[type=text],#gallery_fields select,#gallery_fields textarea{min-width:220px;width:99%;color:#888}table#ngg-listimages{border:1px solid #f7f7f7}#ngg-listimages tfoot,#ngg-listimages thead{background:#38576f}#ngg-listimages.widefat thead th,.ngg-admin #ngg_page_content .widefat tfoot th{padding:12px 10px!important}#ngg-listimages tr.alternate{background-color:#f7f8f3}#ngg-listimages td{padding:15px 5px!important}#ngg-listimages .iedit,#ngg-listimages .iedit td,#ngg-listimages th{border:none}#ngg-listimages .iedit td,#ngg-listimages th{padding:15px 5px}#ngg-listimages th{font-size:12px;font-weight:700}#ngg-listimages .column select{width:100%!important}#ngg-listimages .column-1 input{margin:0 0 0 8px}#ngg-listimages .column-1{width:24px}#ngg-listimages .column-2{width:30px}#ngg-listimages .column-3{min-width:80px;width:15%}#ngg-listimages .column-3 .thumb{max-height:100%;max-width:100%}#ngg-listimages .column-4{width:15%;max-width:220px;font-size:12px}#ngg-listimages .column-4 .meta,#ngg-listimages .column-4 label{font-size:10px;color:#888}#ngg-listimages .column-4 label input[type=checkbox]{margin:-2px 4px 0 0}#ngg-listimages .column-5 input[type=text],#ngg-listimages .column-5 textarea,#ngg-listimages .column-6 textarea{width:100%;padding:3px 5px;font-size:12px;color:#888;border:1px solid #eee;margin:1px 0;box-shadow:none}#ngg-listimages .column-5 input[type=text]{height:25px}#ngg-listimages .column-5 textarea{height:70px}#ngg-listimages .column-6 textarea{height:97px}#ngg-listimages .column-7 select{font-size:12px;height:25px!important}#ngg-listimages .row-actions{padding:0 0 6px 4px;margin-bottom:-2px;position:relative;bottom:4px;left:0;right:0}#ngg-listimages .row_actions,#ngg-listimages .row_actions td{border-top:none;padding:0!important}#ngg-listimages .row-actions a{font-size:12px}#ngg-listimages ul.imagify-datas-list .big{color:#9fbb1a}#ngg-listimages .imagify-datas-more-action a{background:#9fbb1a;color:#fff}.gallery_page_nggallery-manage-gallery .ui-dialog{border:none;padding:0;width:80%!important;z-index:10000!important;left:10%!important}.gallery_page_nggallery-manage-album .ui-dialog{border:none;padding:0;z-index:10000!important;width:650px!important;max-width:98%!important}.gallery_page_nggallery-manage-album .ui-dialog .button-primary,.gallery_page_nggallery-manage-album .ui-dialog .button-secondary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-primary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-secondary,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom button,.gallery_page_nggallery-manage-gallery .ui-dialog .button-primary,.gallery_page_nggallery-manage-gallery .ui-dialog .button-secondary,.gallery_page_nggallery-manage-gallery .ui-dialog button{background-color:#9fbb1a!important;color:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:35px!important;padding:0 15px!important;line-height:35px;width:auto!important;margin-right:10px}.gallery_page_nggallery-manage-album .ui-dialog .button-primary:hover,.gallery_page_nggallery-manage-album .ui-dialog .button-secondary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-primary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom .button-secondary:hover,.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom button:hover,.gallery_page_nggallery-manage-gallery .ui-dialog .button-secondary:hover,.gallery_page_nggallery-manage-gallery .ui-dialog button:hover .gallery_page_nggallery-manage-gallery .ui-dialog .button-primary:hover{background-color:#A9C524!important}.gallery_page_nggallery-manage-album .ui-dialog-titlebar,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar{background:#143650;padding:10px}.gallery_page_nggallery-manage-album .ui-dialog-titlebar button,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button{background:#fff!important;border:none!important;box-shadow:none!important;text-shadow:none!important;height:24px!important;width:24px!important;padding:0!important;line-height:1;float:none;margin-right:0;border-radius:50%;top:17px;right:10px}.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:active,.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:focus,.gallery_page_nggallery-manage-album .ui-dialog-titlebar button:hover,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:active,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:focus,.gallery_page_nggallery-manage-gallery .ui-dialog-titlebar button:hover{background:#fff!important}.gallery_page_nggallery-manage-album .ui-dialog .ngg-overlay-dialog,.gallery_page_nggallery-manage-gallery .ui-dialog .ngg-overlay-dialog{padding:30px 20px;box-sizing:border-box;width:100%!important}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog table{border:none}.gallery_page_nggallery-manage-album .ngg-overlay-dialog #ngg-overlay-dialog-main,.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog #ngg-overlay-dialog-main{width:70%;padding:20px 20px 0}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog td small{display:block;text-align:center;width:200px;margin:0 auto 20px}.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom{text-align:center;padding:30px 0 0}.gallery_page_nggallery-manage-gallery #ngg-overlay-dialog-bottom input[type=button]{float:none;margin-right:0}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog #thumbMsg{color:#693;font-size:11px;width:100%;display:inline-block;height:35px;line-height:35px;margin:10px 0}.gallery_page_nggallery-manage-gallery .ui-dialog form{margin-top:30px;margin-left:30px}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog input[type=radio]:focus{border:1px solid #b4b9be;box-shadow:none}.gallery_page_nggallery-manage-gallery input[type=checkbox]:checked:before{color:#9fbb1a}.gallery_page_nggallery-manage-gallery .ngg-overlay-dialog input[type=radio]:checked:before{background:#9fbb1a;width:14px;height:14px;margin:0}div .progressborder{border:1px solid #DDD;display:block;height:30px;background-color:#464646;width:100%;margin-top:15px;margin-bottom:15px;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar{border:none;display:block;height:30px;background-color:#9fbb1a;width:0%;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}div .progressbar span{display:inline;position:absolute;color:#fff;font-weight:700;padding:5px 0 0 5px}.show_details{height:16px;line-height:20px;overflow:hidden;min-width:8em;padding:3px}.show_details span{border-bottom:1px solid #999;white-space:pre}.show_details:hover{height:auto;overflow:visible;border:1px solid #999}.gallery_page_nggallery-manage-album #ngg_page_content .wrap{background:#f1f1f1}.gallery_page_nggallery-manage-album .wrap>h2:first-child{display:none}.gallery_page_nggallery-manage-album #ngg_page_content div.updated{margin:0 0 15px}.gallery_page_nggallery-manage-album #ngg_page_content div.updated#message{margin-bottom:35px}.ngg_manage_albums{color:#777}.ngg_manage_albums .widget{box-sizing:border-box;border:1px solid #eee;padding:10px 10px 20px;background:#f7f8f3;width:32%;margin:0 1% 0 0;float:left}.ngg_manage_albums .target-album{width:39%}.ngg_manage_albums .widget.widget-right{width:29%}.container{margin-top:10px}.ngg_select_album{margin:0 50px 0 2px}.albumnav select[name=act_album]{width:150px}#editalbum select[name=pageid]{width:95%}#ngg_page_content .ngg_manage_albums .widget-top{box-shadow:none;background:0 0;border:none;margin-bottom:5px}div .groupItem{cursor:move;padding:2px;line-height:1.5;width:100%;margin:0;box-sizing:border-box}div .innerhandle{background-color:#FBFBFB}.groupItem .item_top{background-color:#9fbb1a;color:#FFF;font-weight:700;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;height:40px;padding:0 10px;line-height:40px}#ngg_page_content .groupItem .album_obj{background-color:#38576f}#ngg_page_content .groupItem .item_top a{color:#FFF;float:right;text-decoration:none}.groupItem .item_top a:hover{color:#FFF}.itemContent{border-color:#DFDFDF;border-style:none solid solid;border-width:0 1px 1px;padding:2px 0 20px 2px}.itemContent p{border:0;margin:0;padding:0}.inlinepicture{float:left;display:inline;margin:0;padding:0 3px 1px}.inlinepicture img{margin:3px;max-height:60px}.sort_placeholder{border:1px dashed #bba!important;margin:5px;background:#F9F9F9}.widget-holder{min-height:400px;padding-top:1px}.target{background-color:transparent}div.widget-top h3{text-align:center;line-height:25px;margin:0;padding:5px 12px;font-size:13px}div.widget-top{text-shadow:0 1px 0 #FFF;background-repeat:repeat-x;background-position:0 0;font-size:13px}.ui-autocomplete-start{background-position:99% center}#ngg_page_content .ngg_gallery_sort .tablenav{margin:15px 0}#ngg_page_content .ngg_gallery_sort ul.subsubsub{margin:10px 0 15px}#ngg_page_content .ngg_gallery_sort .imageBox_theImage{width:auto}#sortGallery{position:relative}p#sortButton{margin:0;position:absolute;right:0;top:0}.imageBox,.imageBoxHighlighted{width:130px;height:160px;float:left;overflow:hidden;text-overflow:ellipsis;padding:5px}.imageBox_theImage{width:110px;height:125px;background-position:center;background-repeat:no-repeat;margin:0 auto 2px}.imageBox_label{text-align:center;font-family:arial;font-size:11px;padding-top:2px;margin:0 auto}#insertionMarker{height:150px;width:6px;position:absolute}#insertionMarkerLine{width:6px;height:145px}#insertionMarker img{float:left}#dragDropContent{opacity:.4;filter:alpha(opacity=40);position:absolute;z-index:10;display:none}.error_inline{background:0 #FFEBE8;border:1px solid #C00;margin:5px auto;padding:10px}.ngg-list{font-size:11px;margin-left:15px;list-style-position:inside;list-style-type:disc}#ngg-manage-images-items-per-page-label{float:right;line-height:35px;margin-right:5px}#ngg-manage-images-items-per-page{float:right;margin-right:30px}@media (max-width:1200px){div[data-id=details-link] .two-col .col{width:100%;min-width:100%}}@media (max-width:1080px){#ngg-gallery-wizard>span{display:none}}@media (max-width:1024px){.ngg_manage_galleries .search-form,.ngg_manage_galleries .tablenav.bottom{display:none}.ngg_manage_images #gallery_fields td:nth-of-type(even){margin-bottom:8px}.ngg_manage_images #gallery_fields td:nth-of-type(odd){background:#f7f8f3}.ngg_manage_images #gallery_fields,.ngg_manage_images #gallery_fields tbody,.ngg_manage_images #gallery_fields td,.ngg_manage_images #gallery_fields tr{display:block;width:100%;box-sizing:border-box}.ngg_manage_images #gallery_fields td{padding:10px 5px;border:1px solid #f7f8f3;margin:0}}@media (max-width:900px){.ngg_manage_galleries tfoot{display:none}.ngg_manage_galleries .wp-list-table tr:not(.inline-edit-row):not(.no-items) td:not(.check-column){display:table-cell}.ngg_manage_galleries td.author,.ngg_manage_galleries td.id,.ngg_manage_galleries td.page_id,.ngg_manage_galleries th#author,.ngg_manage_galleries th#id,.ngg_manage_galleries th#page_id{display:none!important}#ngg-listimages td.column.column-2,#ngg-listimages td.column.column-6,#ngg-listimages td.column.column-8,#ngg-listimages tfoot,#ngg-listimages thead .column-1,#ngg-listimages thead .column-2,#ngg-listimages thead .column-4,#ngg-listimages thead .column-5,#ngg-listimages thead .column-6,#ngg-listimages thead .column-7,#ngg-listimages thead .column-8{display:none}#ngg-listimages .column-3{min-width:200px}table#ngg-listimages,table#ngg-listimages thead{display:block}#ngg-listimages .iedit td{padding-bottom:30px!important}}@media (max-width:800px){table#ngg-listimages,table#ngg-listimages tbody,table#ngg-listimages td,table#ngg-listimages tr{display:block}table#ngg-listimages tr{padding:10px 5px!important}#ngg-listimages thead,#ngg-listimages thead th{display:block;width:100%;box-sizing:border-box}#ngg-listimages .row_actions td:first-of-type,#ngg-listimages tfoot{display:none}#ngg-listimages .row_actions{display:none;display:block;clear:both;padding:0 8px 10px!important;border-bottom:1px solid #c1c97c}#ngg-listimages td.column-3,.ngg-listimages tr.iedit td{padding-bottom:10px!important;float:left;box-sizing:border-box}.ngg-listimages tr.iedit td{display:block!important}#ngg-manage-images-items-per-page,#ngg-manage-images-items-per-page-label,.ngg_manage_images .tablenav.bottom .displaying-num{display:none}#ngg-listimages td.column-1,#ngg-listimages td.column-2{width:10%!important;height:150px;float:left;box-sizing:border-box;display:none}#ngg-listimages td.column-3{width:55%;max-width:300px}#ngg-listimages td.column-4{width:40%!important;float:left;box-sizing:border-box}#ngg-listimages td.column-5,#ngg-listimages td.column-6,#ngg-listimages td.column-7{padding:0 5px!important}#ngg-listimages td.column-6{margin-top:-5px;margin-bottom:-8px}.ngg-listimages td.column-7{padding-bottom:15px}#ngg-listimages .column-6 textarea{height:60px}}@media (max-width:782px){#ngg-gallery-wizard{display:none}}@media (max-width:737px){.gallery_page_nggallery-manage-gallery input[type=checkbox]:checked:before{font-size:22px}.ngg-overlay-dialog input[type=radio]{height:16px;width:16px}#ngg-gallery-wizard{display:none}}@media (max-width:640px){.ngg_manage_galleries td.description,.ngg_manage_galleries th#description{display:none!important}.ngg_manage_albums .tablenav .actions{width:100%;float:none}.ngg_manage_albums .tablenav span{display:block}.ngg_manage_albums .target-album,.ngg_manage_albums .widget.widget-right{width:32%;margin:.5%!important;padding:5px 5px 10px}.groupItem .item_top{height:auto!important;line-height:1.5;padding:8px;font-size:12px}#ngg_page_content .groupItem .item_top a{display:none}.ngg_manage_albums div[style="float:right;"]{float:none!important}.gallery_page_nggallery-manage-gallery .ui-dialog{width:95%!important;left:2.5%!important}.gallery_page_nggallery-manage-gallery .ui-dialog .ngg-overlay-dialog{padding:30px 10px}.ngg-overlay-dialog td{display:block;width:100%!important;padding:0!important}.ngg-overlay-dialog input[type=radio]{margin:2px 5px;height:16px;width:16px}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/tags-admin.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/tags-admin.min.css index 3abf1da04..d90c2c7e4 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/tags-admin.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/css/tags-admin.min.css @@ -1 +1 @@ -.gallery_page_nggallery-tags #ngg_page_content .wrap{background:#f1f1f1}.gallery_page_nggallery-tags .wrap>h2:first-child{display:none}.gallery_page_nggallery-tags #ngg_page_content div.updated{margin:0 0 15px 0}.gallery_page_nggallery-tags #ngg_page_content div.updated#message{margin-bottom:35px}.ngg_manage_tags,.ngg_manage_tags label{color:#666}.ngg_wrap .auto_list{width:98%;margin:3px 0;padding:3px 5px}.ngg_wrap .list_tags{width:280px;vertical-align:top;padding:20px!important;background:#f7f8f3}.ngg_wrap .list_tags #search{width:200px}.ngg_wrap .list_tags .navigation{margin:25px 0 20px}.ngg_wrap .forms_manage{vertical-align:top;padding-left:30px}.ngg_wrap .forms_manage h3{margin-bottom:5px;margin-top:30px}.ngg_wrap .forms_manage td{padding:0}.ngg_wrap .forms_manage td p{margin-bottom:20px}.ngg_wrap .forms_manage .form-table{margin-top:0}.ngg_wrap .forms_manage .form-table td,.ngg_wrap .forms_manage .form-table th{vertical-align:middle;padding:0}.ngg_wrap .sort_order h3{margin:30px 0 10px}.ngg_wrap #ajax_area_tagslist ul{list-style:square;margin:10px 0 10px 20px;padding:0}.ngg_wrap #ajax_area_tagslist ul li{margin:0;padding:0;line-height:1.4}.ngg_wrap #ajax_area_tagslist ul li span{cursor:pointer}@media (max-width:640px){.ngg_wrap .list_tags{width:100%;display:block;box-sizing:border-box}.ngg_wrap .forms_manage{width:100%;display:block;box-sizing:border-box;padding:20px}.ngg_wrap .list_tags #search{width:200px;width:100%}} \ No newline at end of file +.gallery_page_nggallery-tags #ngg_page_content .wrap{background:#f1f1f1}.gallery_page_nggallery-tags .wrap>h2:first-child{display:none}.gallery_page_nggallery-tags #ngg_page_content div.updated{margin:0 0 15px}.gallery_page_nggallery-tags #ngg_page_content div.updated#message{margin-bottom:35px}.ngg_manage_tags,.ngg_manage_tags label{color:#666}.ngg_wrap .auto_list{width:98%;margin:3px 0;padding:3px 5px}.ngg_wrap .list_tags{width:280px;vertical-align:top;padding:20px!important;background:#f7f8f3}.ngg_wrap .list_tags #search{width:200px}.ngg_wrap .list_tags .navigation{margin:25px 0 20px}.ngg_wrap .forms_manage{vertical-align:top;padding-left:30px}.ngg_wrap .forms_manage h3{margin-bottom:5px;margin-top:30px}.ngg_wrap .forms_manage td{padding:0}.ngg_wrap .forms_manage td p{margin-bottom:20px}.ngg_wrap .forms_manage .form-table{margin-top:0}.ngg_wrap .forms_manage .form-table td,.ngg_wrap .forms_manage .form-table th{vertical-align:middle;padding:0}.ngg_wrap .sort_order h3{margin:30px 0 10px}.ngg_wrap #ajax_area_tagslist ul{list-style:square;margin:10px 0 10px 20px;padding:0}.ngg_wrap #ajax_area_tagslist ul li{margin:0;padding:0;line-height:1.4}.ngg_wrap #ajax_area_tagslist ul li span{cursor:pointer}@media (max-width:640px){.ngg_wrap .forms_manage,.ngg_wrap .list_tags{width:100%;display:block;box-sizing:border-box}.ngg_wrap .forms_manage{padding:20px}.ngg_wrap .list_tags #search{width:200px;width:100%}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php index 412af9c27..1c68b917d 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/functions.php @@ -16,10 +16,10 @@ class nggAdmin{ * create a new gallery & folder * * @class nggAdmin - * @param string $name of the gallery + * @param string $title Name of the gallery * @param string $defaultpath * @param bool $output if the function should show an error messsage or not - * @return + * @return bool|int */ static function create_gallery($title, $defaultpath, $output = true) { @@ -161,7 +161,7 @@ class nggAdmin{ * nggAdmin::createThumbnail() - function to create or recreate a thumbnail * * @class nggAdmin - * @param object | int $image contain all information about the image or the id + * @param object|int $image Contain all information about the image or the id * @return string result code * @since v1.0.0 */ @@ -195,7 +195,7 @@ class nggAdmin{ * nggAdmin::resize_image() - create a new image, based on the height /width * * @class nggAdmin - * @param object | int $image contain all information about the image or the id + * @param object|int $image Contain all information about the image or the id * @param integer $width optional * @param integer $height optional * @return string result code @@ -248,8 +248,8 @@ class nggAdmin{ * Rotated/Flip an image based on the orientation flag or a definded angle * * @param int|object $image - * @param string (optional) $dir, CW (clockwise)or CCW (counter clockwise), if set to false, the exif flag will be used - * @param string (optional) $flip, could be either false | V (flip vertical) | H (flip horizontal) + * @param string|bool $dir (optional) CW (clockwise)or CCW (counter clockwise), if set to false, the exif flag will be used + * @param string|bool $flip (optional) Either false | V (flip vertical) | H (flip horizontal) * @return string result code */ static function rotate_image($image, $dir = false, $flip = false) @@ -330,7 +330,7 @@ class nggAdmin{ * nggAdmin::set_watermark() - set the watermark for the image * * @class nggAdmin - * @param object | int $image contain all information about the image or the id + * @param object|int $image Contain all information about the image or the id * @return string result code */ static function set_watermark($image) { @@ -365,12 +365,11 @@ class nggAdmin{ * * @class nggAdmin * @since 1.5.0 - * @param object | int $image contain all information about the image or the id + * @param object|int $image Contain all information about the image or the id * @return string result code */ - - static function recover_image($image) { - + static function recover_image($image) + { return C_Gallery_Storage::get_instance()->recover_image($image); } @@ -516,7 +515,7 @@ class nggAdmin{ * * @class nggAdmin * @require NextGEN Meta class - * @param int $id image ID + * @param int|object $image_or_id * @return array metadata */ static function get_MetaData($image_or_id) { @@ -545,11 +544,11 @@ class nggAdmin{ * and if based on compat reason (pre V1.4.0) we save then some meta datas to the database * * @since V1.4.0 - * @param int $id - * @return result + * @param int|object $image_or_id + * @return bool */ - function maybe_import_meta( $image_or_id ) { - + function maybe_import_meta( $image_or_id ) + { require_once(NGGALLERY_ABSPATH . '/lib/meta.php'); $id = is_int($image_or_id) ? $image_or_id : $image_or_id->{$image_or_id->id_field}; $meta_obj = new nggMeta( $image_or_id ); @@ -563,7 +562,6 @@ class nggAdmin{ return false; return $result; - } /** @@ -766,7 +764,7 @@ class nggAdmin{ * * @class nggAdmin * @param int $galleryID - * @return arry (JSON) + * @return string|int (JSON) */ static function get_image_ids( $galleryID ) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/js/Jcrop/css/jquery.Jcrop.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/js/Jcrop/css/jquery.Jcrop.min.css index e6fdd89d9..70dd70069 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/js/Jcrop/css/jquery.Jcrop.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/js/Jcrop/css/jquery.Jcrop.min.css @@ -1 +1 @@ -.jcrop-holder{text-align:left}.jcrop-hline,.jcrop-vline{font-size:0;position:absolute;background:#fff url(Jcrop.gif) top left repeat}.jcrop-vline{height:100%;width:1px!important}.jcrop-hline{width:100%;height:1px!important}.jcrop-handle{font-size:1px;width:7px!important;height:7px!important;border:1px #eee solid;background-color:#333}.jcrop-tracker{width:100%;height:100%}.custom .jcrop-hline,.custom .jcrop-vline{background:#ff0}.custom .jcrop-handle{border-color:#000;background-color:#c7bb00;-moz-border-radius:3px;-webkit-border-radius:3px} \ No newline at end of file +.jcrop-holder{text-align:left}.jcrop-hline,.jcrop-vline{font-size:0;position:absolute;background:url(Jcrop.gif) top left #fff}.jcrop-vline{height:100%;width:1px!important}.jcrop-hline{width:100%;height:1px!important}.jcrop-handle{font-size:1px;width:7px!important;height:7px!important;border:1px solid #eee;background-color:#333}.jcrop-tracker{width:100%;height:100%}.custom .jcrop-hline,.custom .jcrop-vline{background:#ff0}.custom .jcrop-handle{border-color:#000;background-color:#C7BB00;-moz-border-radius:3px;-webkit-border-radius:3px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php index 62ef5acbf..e66e5bc98 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage-sort.php @@ -5,6 +5,9 @@ * */ +/** + * @param int $galleryID + */ function nggallery_sortorder($galleryID = 0){ global $wpdb, $ngg, $nggdb; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage.php index 3d7109d74..dd50b2611 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/manage.php @@ -345,30 +345,43 @@ class nggManageGallery { function render_recover_action_link($id, $picture) { - if ( !file_exists( $picture->imagePath . '_backup' )) return FALSE; - - $url = wp_nonce_url("admin.php?page=nggallery-manage-gallery&mode=recoverpic&gid={$picture->galleryid}&pid={$picture->pid}", 'ngg_recoverpicture'); - $title = esc_attr__('Recover image from backup', 'nggallery'); - $label = esc_html__('Recover', 'nggallery'); - $alttext = empty($picture->alttext) ? $picture->filename : $picture->alttext; - $alttext = M_NextGen_Data::strip_html(html_entity_decode($alttext), TRUE); - $confirm = addslashes(__("Recover", 'nggallery'). " \"{$alttext}\"?"); - $onclick = "javascript:if(!confirm(\"{$confirm}\")) return false"; - - return "<a href='{$url}' onclick='{$onclick}' class='confirmrecover' title='{$title}'>{$label}</a>"; + if (!file_exists($picture->imagePath . '_backup')) + return FALSE; + + $url = wp_nonce_url("admin.php?page=nggallery-manage-gallery&mode=recoverpic&gid={$picture->galleryid}&pid={$picture->pid}", 'ngg_recoverpicture'); + $title = esc_attr__('Recover image from backup', 'nggallery'); + $label = esc_html__('Recover', 'nggallery'); + $question = __('Recover', 'nggallery'); + + $alttext = empty($picture->alttext) ? $picture->filename : $picture->alttext; + $alttext = M_NextGen_Data::strip_html(html_entity_decode($alttext), TRUE); + $alttext = htmlentities($alttext, ENT_QUOTES|ENT_HTML401); + + // Event handler is found in nextgen_admin_page.js + return "<a href='{$url}' + class='confirmrecover' + data-question='{$question}' + data-text='{$alttext}' + title='{$title}'>{$label}</a>"; } function render_delete_action_link($id, $picture) { - $url = wp_nonce_url("admin.php?page=nggallery-manage-gallery&mode=delpic&gid={$picture->galleryid}&pid={$picture->pid}", 'ngg_delpicture'); - $title = esc_attr__('Delete image', 'nggallery'); - $label = esc_html__('Delete', 'nggallery'); - $alttext = empty($picture->alttext) ? $picture->filename : $picture->alttext; - $alttext = M_NextGen_Data::strip_html(html_entity_decode($alttext), TRUE); - $confirm = addslashes(__("Delete", 'nggallery'). " \"{$alttext}\"?"); - $onclick = "javascript:if(!confirm(\"{$confirm}\")) return false;"; - - return "<a href='{$url}' onclick='{$onclick}' class='submitdelete delete' title='{$title}'>{$label}</a>"; + $url = wp_nonce_url("admin.php?page=nggallery-manage-gallery&mode=delpic&gid={$picture->galleryid}&pid={$picture->pid}", 'ngg_delpicture'); + $title = esc_attr__('Delete image', 'nggallery'); + $label = esc_html__('Delete', 'nggallery'); + $question = __('Delete', 'nggallery'); + + $alttext = empty($picture->alttext) ? $picture->filename : $picture->alttext; + $alttext = M_NextGen_Data::strip_html(html_entity_decode($alttext), TRUE); + $alttext = htmlentities($alttext, ENT_QUOTES|ENT_HTML401); + + // Event handler is found in nextgen_admin_page.js + return "<a href='{$url}' + class='submitdelete delete' + data-question='{$question}' + data-text='{$alttext}' + title='{$title}'>{$label}</a>"; } function render_image_row_header() @@ -798,14 +811,15 @@ class nggManageGallery { } } - if (isset ($_POST['updatepictures']) ) { - // Update pictures + if (isset($_POST['updatepictures'])) + { + // Update pictures $success = FALSE; - check_admin_referer('ngg_updategallery'); - if ( nggGallery::current_user_can( 'NextGEN Edit gallery options' ) && !isset ($_GET['s']) ) { + if (nggGallery::current_user_can('NextGEN Edit gallery options') && !isset($_GET['s'])) + { $tags = array('<a>', '<abbr>', '<acronym>', '<address>', '<b>', '<base>', '<basefont>', '<big>', '<blockquote>', '<br>', '<br/>', '<caption>', '<center>', '<cite>', '<code>', '<col>', '<colgroup>', '<dd>', '<del>', '<dfn>', '<dir>', '<div>', '<dl>', '<dt>', '<em>', '<fieldset>', '<font>', '<h1>', '<h2>', '<h3>', '<h4>', '<h5>', '<h6>', '<hr>', '<i>', '<img>', '<ins>', '<label>', '<legend>', '<li>', '<menu>', '<noframes>', '<noscript>', '<ol>', '<optgroup>', '<option>', '<p>', '<pre>', '<q>', '<s>', '<samp>', '<select>', '<small>', '<span>', '<strike>', '<strong>', '<sub>', '<sup>', '<table>', '<tbody>', '<td>', '<tfoot>', '<th>', '<thead>', '<tr>', '<tt>', '<u>', '<ul>'); $fields = array('title', 'galdesc'); @@ -821,17 +835,20 @@ class nggManageGallery { $mapper = C_Gallery_Mapper::get_instance(); // Update the gallery - if (!$this->gallery) { + if (!$this->gallery) + { $this->gallery = $mapper->find($this->gid, TRUE); } - if ($this->gallery) { + if ($this->gallery) + { foreach ($_POST as $key => $value) { $this->gallery->$key = $value; } $mapper->save($this->gallery); - if ($this->gallery->is_invalid()) { + if ($this->gallery->is_invalid()) + { foreach ($this->gallery->get_errors() as $property => $errors) { foreach ($errors as $error) { nggGallery::show_error($error); @@ -844,13 +861,11 @@ class nggManageGallery { } } - - if ($success) { - $this->update_pictures(); - - //hook for other plugin to update the fields + $pictures_updated = $this->update_pictures(); + if ($success || $pictures_updated >= 1) + { + // Hook for other plugin to update the fields do_action('ngg_update_gallery', $this->gid, $_POST); - nggGallery::show_message(__('Updated successfully', 'nggallery')); } } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php index f22670c0d..0e5602878 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/media-upload.php @@ -122,7 +122,7 @@ function media_upload_nextgen_form($errors) { // Get the images if ( $galleryID != 0 ) - $picarray = $wpdb->get_col("SELECT pid FROM $wpdb->nggpictures WHERE galleryid = '$galleryID' AND exclude != 1 ORDER BY {$ngg->options['galSort']} {$ngg->options['galSortDir']} LIMIT $start, 10 "); + $picarray = $wpdb->get_col("SELECT DISTINCT pid FROM $wpdb->nggpictures WHERE galleryid = '$galleryID' AND exclude != 1 ORDER BY {$ngg->options['galSort']},`pid` {$ngg->options['galSortDir']} LIMIT $start, 10 "); // WP-Core code for Post-thumbnail $calling_post_id = 0; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/overview.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/overview.php index ca8ddf242..163b54d02 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/overview.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/admin/overview.php @@ -195,7 +195,8 @@ function nggallery_admin_overview() if (!$found) { ?> <a href="javascript:void(0)" data-id="pro-link"><?php _e( 'Upgrade to Pro' ); ?></a> <?php } ?> - <a href="javascript:void(0)" data-id="genesis-link"><?php _e( 'Genesis Themes' ); ?></a> + <a href="javascript:void(0)" data-id="genesis-link"><?php _e( 'Imagely Themes' ); ?></a> + <a href="javascript:void(0)" data-id="ambassador-link"><?php _e( 'Ambassadors' ); ?></a> <?php if (!is_multisite() || is_super_admin()) { ?> <a href="javascript:void(0)" data-id="details-link"><?php _e( 'Site Details' ); ?></a> <?php } ?> @@ -206,63 +207,13 @@ function nggallery_admin_overview() <div data-id="welcome-link"> - <div class="about-text"><strong><?php printf( __( "Congrats! You're now running the most popular WordPress gallery plugin of all time.")) ?></strong><br><?php printf( __( " So far you've added %s images, %s galleries, and %s albums." ), $images, $galleries, $albums); ?> + <div class="about-text"><strong><?php printf( __( "Congrats! You're now running the most popular WordPress gallery plugin of all time.")) ?></strong><br><?php printf( __( "To get started, watch our two minute intro below or click the Gallery Wizard button above.")) ?> </div> <div class="headline-feature feature-video"> <iframe width="1050" height="590" src="https://www.youtube.com/embed/mNEnY23i9DE?rel=0" frameborder="0" allowfullscreen></iframe> </div> - <hr> - - <div class="feature-section three-col"> - <h2><?php _e( 'Meet the Imagely Product Ambassadors', 'nggallery' ); ?></h2> - <p class="about-text"><?php _e( "NextGEN Gallery and other Imagely products are used by some of the best photographers in the world. Meet some of the Imagely Ambassadors who are putting Imagely and NextGEN Gallery to work professionally.", 'nggallery' ); ?> - </p> - <div class="col"> - <a href="https://www.imagely.com/team-member/the-youngrens/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/theyoungrens-ngg.jpg" alt="The Youngrens"/></a> - <h3><?php _e( 'The Youngrens' ); ?></h3> - <p><?php _e( 'Jeff and Erin are a luxury husband and wife photography team who deeply love each other and their photography clients. They shoot weddings and engagements all over the U.S. and beyond. With three photography businesses that serve different clientele, they have unique insights into business strategies and are passionate about improving the day to day lives of other photographers.', 'nggallery' ); ?></p> - </div> - <div class="col"> - <a href="https://www.imagely.com/team-member/tamara-lackey/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/TamaraLackey-ngg.jpg" alt="Tamara Lackey" /></a> - <h3><?php _e( 'Tamara Lackey' ); ?></h3> - <p><?php _e( 'Tamara Lackey is a renowned professional photographer, speaker, and author. Her authentic lifestyle photography, from children’s portraits to celebrity portraits, is praised within her industry and published internationally. She is a Nikon USA Ambassador, the host of The reDefine Show web series, and the co-founder of the non-profit charitable organization, Beautiful Together, in support of children waiting for families.', 'nggallery' ); ?></p> - </div> - <div class="col"> - <a href="https://www.imagely.com/team-member/colby-brown/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/colby-brown-ngg.jpg" alt="Colby Brown" /></a> - <h3><?php _e( 'Colby Brown' ); ?></h3> - <p><?php _e( 'Colby is a photographer, photo educator, and author specializing in landscape, travel and humanitarian photography. With an audience reaching millions, Colby partners on social influencer marketing campaigns with some of the biggest companies and destinations in the world, including Sony, Samsung, Toshiba, Iceland Naturally, Jordan Tourism Board, Australia.com, Visit California and more.', 'nggallery' ); ?></p> - </div> - </div> - - <div class="feature-section three-col"> - <div class="col"> - <a href="https://www.imagely.com/team-member/jared-platt/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/jared-platt-ngg.jpg" alt="Jared Platt" /></a> - <h3><?php _e( 'Jared Platt' ); ?></h3> - <p><?php _e( 'Jared is a professional wedding and lifestyle photographer. He also travels the world giving lectures and workshops on photography, lighting, and post-production efficiency and workflow. His interactive style, and attention to detail and craft make him an entertaining and demanding photography instructor.', 'nggallery' ); ?></p> - </div> - <div class="col"> - <a href="https://www.imagely.com/team-member/brian-matiash/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/brian-matiash-ngg.jpeg" alt="" /></a> - <h3><?php _e( 'Brian Matiash' ); ?></h3> - <p><?php _e( 'Brian is a professional photographer, author, and educator. He fuses landscape & travel photography with experiential storytelling and practical instructing to help others grow creatively. He is also a Sony Artisan of Imagery, a Zeiss Lens Ambassador, a Formatt-Hitech Featured Photographer, and a member of G-Technology’s G-Team.', 'nggallery' ); ?></p> - </div> - <div class="col"> - <a href="https://www.imagely.com/team-member/christine-tremoulet/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/Christine-Tremoulet-ngg.jpg" alt="" /></a> - <h3><?php _e( 'Christine Tremoulet' ); ?></h3> - <p><?php _e( 'Christine famously coined the term WordPress. She is an author, speaker, business coach, and story strategist who specializes in helping creatives celebrate their story online through blogging and social media. When not offering actionable know-how to businesses, she can be found taking long road trips across North America in her Mini Cooper.', 'nggallery' ); ?></p> - </div> - </div> - - <div class="feature-section three-col"> - <div class="col"> - <a href="https://www.imagely.com/team-member/david-beckstead/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/david-beckstead-ngg.jpg" alt="David Beckstead" /></a> - <h3><?php _e( 'David Beckstead' ); ?></h3> - <p><?php _e( 'Named one of the Top 10 Wedding Photographers in the World by American Photo magazine, David is a celebrated photographer and educator. He is also a mountain man with a enviable lifestyle: from his base in rural Washington, he travels all over the world teaching workshops, while sharing lessons with 16,000 photographers in the Abstract Canvas Facebook group.', 'nggallery' ); ?></p> - </div> - </div> - - </div> <div data-id="videos-link" style="display:none;"> @@ -318,7 +269,7 @@ function nggallery_admin_overview() <div data-id="genesis-link"> - <h2><?php _e( 'Genesis Child Themes for Photographers' ); ?></h2> + <h2><?php _e( 'WordPress Themes for Photographers by Imagely' ); ?></h2> <p class="about-text"><?php _e( 'Meet the new series of Genesis child themes by Imagely: gorgeous, responsive image-centric themes for photographers or anyone with visually rich websites.', 'nggallery' ); ?></p> <h3 class="about-text"><?php _e( 'CLICK TO LEARN MORE:', 'nggallery' ); ?></h3> <div class="feature-section two-col"> @@ -372,6 +323,57 @@ function nggallery_admin_overview() </div> + <div data-id="ambassador-link"> + + <div class="feature-section three-col"> + <h2><?php _e( 'Meet the Imagely Product Ambassadors', 'nggallery' ); ?></h2> + <p class="about-text"><?php _e( "NextGEN Gallery and other Imagely products are used by some of the best photographers in the world. Meet some of the Imagely Ambassadors who are putting Imagely and NextGEN Gallery to work professionally.", 'nggallery' ); ?> + </p> + <div class="col"> + <a href="https://www.imagely.com/team-member/the-youngrens/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/theyoungrens-ngg.jpg" alt="The Youngrens"/></a> + <h3><?php _e( 'The Youngrens' ); ?></h3> + <p><?php _e( 'Jeff and Erin are a luxury husband and wife photography team who deeply love each other and their photography clients. They shoot weddings and engagements all over the U.S. and beyond. With three photography businesses that serve different clientele, they have unique insights into business strategies and are passionate about improving the day to day lives of other photographers.', 'nggallery' ); ?></p> + </div> + <div class="col"> + <a href="https://www.imagely.com/team-member/tamara-lackey/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/TamaraLackey-ngg.jpg" alt="Tamara Lackey" /></a> + <h3><?php _e( 'Tamara Lackey' ); ?></h3> + <p><?php _e( 'Tamara Lackey is a renowned professional photographer, speaker, and author. Her authentic lifestyle photography, from children’s portraits to celebrity portraits, is praised within her industry and published internationally. She is a Nikon USA Ambassador, the host of The reDefine Show web series, and the co-founder of the non-profit charitable organization, Beautiful Together, in support of children waiting for families.', 'nggallery' ); ?></p> + </div> + <div class="col"> + <a href="https://www.imagely.com/team-member/colby-brown/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/colby-brown-ngg.jpg" alt="Colby Brown" /></a> + <h3><?php _e( 'Colby Brown' ); ?></h3> + <p><?php _e( 'Colby is a photographer, photo educator, and author specializing in landscape, travel and humanitarian photography. With an audience reaching millions, Colby partners on social influencer marketing campaigns with some of the biggest companies and destinations in the world, including Sony, Samsung, Toshiba, Iceland Naturally, Jordan Tourism Board, Australia.com, Visit California and more.', 'nggallery' ); ?></p> + </div> + </div> + + <div class="feature-section three-col"> + <div class="col"> + <a href="https://www.imagely.com/team-member/jared-platt/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/jared-platt-ngg.jpg" alt="Jared Platt" /></a> + <h3><?php _e( 'Jared Platt' ); ?></h3> + <p><?php _e( 'Jared is a professional wedding and lifestyle photographer. He also travels the world giving lectures and workshops on photography, lighting, and post-production efficiency and workflow. His interactive style, and attention to detail and craft make him an entertaining and demanding photography instructor.', 'nggallery' ); ?></p> + </div> + <div class="col"> + <a href="https://www.imagely.com/team-member/brian-matiash/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/brian-matiash-ngg.jpeg" alt="" /></a> + <h3><?php _e( 'Brian Matiash' ); ?></h3> + <p><?php _e( 'Brian is a professional photographer, author, and educator. He fuses landscape & travel photography with experiential storytelling and practical instructing to help others grow creatively. He is also a Sony Artisan of Imagery, a Zeiss Lens Ambassador, a Formatt-Hitech Featured Photographer, and a member of G-Technology’s G-Team.', 'nggallery' ); ?></p> + </div> + <div class="col"> + <a href="https://www.imagely.com/team-member/christine-tremoulet/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/Christine-Tremoulet-ngg.jpg" alt="" /></a> + <h3><?php _e( 'Christine Tremoulet' ); ?></h3> + <p><?php _e( 'Christine famously coined the term WordPress. She is an author, speaker, business coach, and story strategist who specializes in helping creatives celebrate their story online through blogging and social media. When not offering actionable know-how to businesses, she can be found taking long road trips across North America in her Mini Cooper.', 'nggallery' ); ?></p> + </div> + </div> + + <div class="feature-section three-col"> + <div class="col"> + <a href="https://www.imagely.com/team-member/david-beckstead/?utm_source=ngg&utm_medium=ngguser&utm_campaign=ambassador" target="_blank"><img src="https://f001.backblaze.com/file/nextgen-gallery/david-beckstead-ngg.jpg" alt="David Beckstead" /></a> + <h3><?php _e( 'David Beckstead' ); ?></h3> + <p><?php _e( 'Named one of the Top 10 Wedding Photographers in the World by American Photo magazine, David is a celebrated photographer and educator. He is also a mountain man with a enviable lifestyle: from his base in rural Washington, he travels all over the world teaching workshops, while sharing lessons with 16,000 photographers in the Abstract Canvas Facebook group.', 'nggallery' ); ?></p> + </div> + </div> + + </div> + <?php if (!is_multisite() || is_super_admin()) { ?> <div data-id="details-link"> <h2><?php _e( 'Site Details' ); ?></h2> diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/core.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/core.php index 6db241f4a..15a2e144b 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/core.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/core.php @@ -140,7 +140,7 @@ class nggGallery { /** * nggGallery::graphic_library() - switch between GD and ImageMagick * - * @return path to the selected library + * @return string Path to the selected library */ static function graphic_library() { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/gd.thumbnail.inc.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/gd.thumbnail.inc.php index c5ae2048e..0417caad3 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/gd.thumbnail.inc.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/gd.thumbnail.inc.php @@ -724,13 +724,14 @@ class ngg_Thumbnail { /** * Rotate an image clockwise or counter clockwise * - * @param string $direction could be CW or CCW + * @param string $dir Either CW or CCW */ - function rotateImage( $dir = 'CW' ) { - + function rotateImage($dir = 'CW') + { $angle = ($dir == 'CW') ? 90 : -90; - if ( function_exists('imagerotate') ) { + if (function_exists('imagerotate')) + { $this->workingImage = imagerotate($this->oldImage, 360 - $angle, 0); // imagerotate() rotates CCW $this->currentDimensions['width'] = imagesx($this->workingImage); $this->currentDimensions['height'] = imagesy($this->workingImage); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/imagemagick.inc.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/imagemagick.inc.php index c24091574..ae8eabf5f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/imagemagick.inc.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/imagemagick.inc.php @@ -187,8 +187,8 @@ var $imageMagickBefore; * * @param string $cmd an ImageMagick command (eg. "convert") * @param string $args the arguments which should be passed - * @param bool �passthru(optional) output the result to the webserver instead - * @return string + * @param bool $passthru (optional) Output the result to the webserver instead + * @return array|string */ function execute( $cmd, $args, $passthru = false) { @@ -368,10 +368,10 @@ var $imageMagickBefore; /** * Rotates image either 90 degrees clockwise or counter-clockwise * - * @param string $direction + * @param string $dir */ - function rotateImage($dir = 'CW') { - + function rotateImage($dir = 'CW') + { $angle = ($dir == 'CW') ? 90 : -90; $this->imageMagickExec .= " -rotate $angle "; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php index 59933c93c..ce573b15f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/media-rss.php @@ -43,8 +43,8 @@ class nggMediaRss { /** * Get the XML <rss> node corresponding to the last pictures registered * - * @param page The current page (defaults to 0) - * @param show The number of pictures to include in one field (default 30) + * @param int $page The current page (defaults to 0) + * @param int $show The number of pictures to include in one field (default 30) */ function get_last_pictures_mrss($page = 0, $show = 30) { $images = nggdb::find_last_images($page, $show); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/meta.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/meta.php index 45c5dffda..65b9410ca 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/meta.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/meta.php @@ -26,9 +26,9 @@ class nggMeta{ /** * Parses the nggMeta data only if needed - * @param int $image path to a image - * @param bool $onlyEXIF parse only exif if needed - * @return + * @param object|int $image_or_id An image object or an image ID + * @param bool $onlyEXIF Parse only exif if needed + * @return bool */ function __construct($image_or_id, $onlyEXIF = false) { @@ -108,7 +108,7 @@ class nggMeta{ * nggMeta::get_EXIF() * See also http://trac.wordpress.org/changeset/6313 * - * @return structured EXIF data + * @return bool|array Structured EXIF data */ function get_EXIF($object = false) { @@ -169,7 +169,7 @@ class nggMeta{ if (!empty($exif['Author'])) $meta['author'] = $this->utf8_encode($exif['Author']); if (!empty($exif['Keywords'])) - $meta['tags'] = $this->utf8_encode($exif['Keywords']); + $meta['keywords'] = $this->utf8_encode($exif['Keywords']); if (!empty($exif['Subject'])) $meta['subject'] = $this->utf8_encode($exif['Subject']); if (!empty($exif['Comments'])) @@ -217,16 +217,17 @@ class nggMeta{ /** * nggMeta::readIPTC() - IPTC Data Information for EXIF Display * - * @param mixed $output_tag - * @return IPTC-tags + * @param mixed $object (optional) + * @return null|bool|array */ - function get_IPTC($object = false) { + function get_IPTC($object = false) + { if (!$this->iptc_data) return false; - if (!is_array($this->iptc_array)){ - + if (!is_array($this->iptc_array)) + { // --------- Set up Array Functions --------- // $iptcTags = array ( "2#005" => 'title', @@ -253,9 +254,8 @@ class nggMeta{ $meta = array(); foreach ($iptcTags as $key => $value) { - if (isset ( $this->iptc_data[$key] ) ) + if (isset($this->iptc_data[$key])) $meta[$value] = trim($this->utf8_encode(implode(", ", $this->iptc_data[$key]))); - } $this->iptc_array = $meta; } @@ -277,7 +277,7 @@ class nggMeta{ * code by Pekka Saarinen http://photography-on-the.net * * @param mixed $filename - * @return XML data + * @return bool|string XML data */ function extract_XMP( $filename ) { @@ -305,7 +305,7 @@ class nggMeta{ * * @package Taken from http://php.net/manual/en/function.xml-parse-into-struct.php * @author Alf Marius Foss Olsen & Alex Rabe - * @return XML Array or object + * @return bool|array|object XML Array or object * */ function get_XMP($object = false) { @@ -453,7 +453,7 @@ class nggMeta{ * nggMeta::i8n_name() - localize the tag name * * @param mixed $key - * @return translated $key + * @return string Translated $key */ function i18n_name($key) { @@ -505,7 +505,7 @@ class nggMeta{ /** * Return the Timestamp from the image , if possible it's read from exif data - * @return int + * @return string */ function get_date_time() { @@ -531,7 +531,7 @@ class nggMeta{ * Reason : GD manipulation removes that options * * @since V1.4.0 - * @return array + * @return bool|array */ function get_common_meta() { global $wpdb; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php index 96dd2bc17..d479056af 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/multisite.php @@ -29,13 +29,16 @@ class nggWPMU{ /** * Check for site admin * - * @return + * @return bool */ function wpmu_site_admin() { - - if ( function_exists('is_super_admin') ) - if ( is_super_admin() ) - return true; + if (function_exists('is_super_admin')) + { + if (is_super_admin()) + { + return true; + } + } return false; } @@ -44,7 +47,7 @@ class nggWPMU{ * Check for site wide options * * @param string $value - * @return value + * @return string|bool */ function wpmu_enable_function($value) { if (is_multisite()) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php index 9a3aecfb5..eb25605a4 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/ngg-db.php @@ -73,7 +73,7 @@ class nggdb * * * @param int|string $id or $slug - * @return A nggGallery object (null if not found) + * @return object nggGallery object (null if not found) * @deprecated Use the C_Gallery_Mapper class instead */ static function find_gallery( $id ) @@ -121,7 +121,7 @@ class nggdb * * @deprecated * @param string $filename - * @param int (optional) $galleryID + * @param int|bool $galleryID (optional) * @return Array Result of the request */ function search_for_file($filename, $galleryID = false) @@ -143,9 +143,9 @@ class nggdb * Get random images from one or more gallery * * @deprecated - * @param integer $number of images - * @param integer $galleryID optional a Gallery - * @return A nggImage object representing the image (null if not found) + * @param int $number Number of images + * @param int $gallery_id (optional) Gallery ID + * @return array Array holding C_Image_Wrapper objects */ function get_random_images($number = 1, $gallery_id = 0) { @@ -174,7 +174,7 @@ class nggdb * @param int $limit number of paged galleries, 0 shows all galleries * @param int $start the start index for paged galleries * @param bool $json remove the key for associative array in json request - * @return An array containing the nggImage objects representing the images in the gallery. + * @return array An array containing the C_Image_Wrapper objects representing the images in the gallery. */ static function get_gallery($id, $order_by = 'sortorder', $order_dir = 'ASC', $exclude = true, $limit = 0, $start = 0, $json = false) { @@ -203,13 +203,14 @@ class nggdb /** * This function return all information about the gallery and the images inside * - * @param int|string $id or $name - * @param string $orderby - * @param string $order (ASC |DESC) + * @param int|string $id Or $name + * @param string $order_by + * @param string $order_dir (ASC|DESC) * @param bool $exclude - * @return An array containing the nggImage objects representing the images in the gallery. + * @return array An array containing the nggImage objects representing the images in the gallery. */ - static function get_ids_from_gallery($id, $order_by = 'sortorder', $order_dir = 'ASC', $exclude = true) { + static function get_ids_from_gallery($id, $order_by = 'sortorder', $order_dir = 'ASC', $exclude = true) + { global $wpdb; @@ -247,7 +248,7 @@ class nggdb * Get an album given its ID * * @id The album ID or name - * @return A nggGallery object (false if not found) + * @return object|bool A nggGallery object (false if not found) */ function find_album( $id ) { global $wpdb; @@ -306,7 +307,7 @@ class nggdb /** * Insert an image in the database * - * @return the ID of the inserted image + * @return int ID of the inserted image */ function insert_image($gid, $filename, $alttext, $desc, $exclude) { global $wpdb; @@ -323,14 +324,14 @@ class nggdb /** * nggdb::update_image() - Update an image in the database * - * @param int $pid id of the image - * @param (optional) string|int $galleryid - * @param (optional) string $filename - * @param (optional) string $description - * @param (optional) string $alttext - * @param (optional) int $exclude (0 or 1) - * @param (optional) int $sortorder - * @return bool result of update query + * @param int $pid ID of the image + * @param string|int $galleryid (optional) + * @param string $filename (optional) + * @param string $description (optional) + * @param string $alttext (optional) + * @param int $exclude (0 or 1) (optional) + * @param int $sortorder (optional) + * @return null|bool Result of update query */ function update_image($pid, $galleryid = false, $filename = false, $description = false, $alttext = false, $exclude = false, $sortorder = false) { @@ -368,17 +369,18 @@ class nggdb } /** - * nggdb::update_gallery() - Update an gallery in the database - * - * @since V1.7.0 - * @param int $id id of the gallery - * @param (optional) string $title or name of the gallery - * @param (optional) string $path - * @param (optional) string $description - * @param (optional) int $pageid - * @param (optional) int $previewpic - * @param (optional) int $author - * @return bool result of update query + * nggdb::update_gallery() - Update an gallery in the database + * + * @since V1.7.0 + * @param int $id ID of the gallery + * @param string|bool $name (optional) Name or title of the gallery + * @param string|bool $path (optional) + * @param string|bool $title (optional) + * @param string|bool $description (optional) + * @param int|bool $pageid (optional) + * @param int|bool $previewpic (optional) + * @param int|bool $author (optional) + * @return null|bool Result of update query */ function update_gallery($id, $name = false, $path = false, $title = false, $description = false, $pageid = false, $previewpic = false, $author = false) { @@ -420,13 +422,13 @@ class nggdb * nggdb::update_album() - Update an album in the database * * @since V1.7.0 - * @param int $ id id of the album - * @param (optional) string $title - * @param (optional) int $previewpic - * @param (optional) string $description - * @param (optional) serialized array $sortorder - * @param (optional) int $pageid - * @return bool result of update query + * @param int $id ID of the album + * @param string $title (optional) + * @param int $previewpic (optional) + * @param string $description (optional) + * @param array $sortorder (optional) + * @param int $pageid (optional) + * @return null|bool result of update query */ function update_album($id, $name = false, $previewpic = false, $description = false, $sortorder = false, $pageid = false ) { @@ -465,10 +467,11 @@ class nggdb /** * Get an image given its ID * - * @param int|string The image ID or Slug - * @return object A nggImage object representing the image (false if not found) + * @param int|string $id The image ID or Slug + * @return bool|object A nggImage object representing the image (false if not found) */ - static function find_image( $id ) { + static function find_image($id) + { global $wpdb; if( is_numeric($id) ) { @@ -493,7 +496,7 @@ class nggdb * Get images given a list of IDs * * @param $pids array of picture_ids - * @return An array of nggImage objects representing the images + * @return array An array of nggImage objects representing the images */ static function find_images_in_list( $pids, $exclude = false, $order = 'ASC' ) { global $wpdb; @@ -525,19 +528,19 @@ class nggdb * Add an image to the database * * @since V1.4.0 - * @param int $pid id of the gallery - * @param (optional) string|int $galleryid - * @param (optional) string $filename - * @param (optional) string $description - * @param (optional) string $alttext - * @param (optional) array $meta data - * @param (optional) int $post_id (required for sync with WP media lib) - * @param (optional) string $imagedate - * @param (optional) int $exclude (0 or 1) - * @param (optional) int $sortorder - * @return bool result of the ID of the inserted image + * @param int $id ID of the gallery + * @param string $filename (optional) + * @param string $description (optional) + * @param string $alttext (optional) + * @param array $meta data (optional) + * @param int $post_id (required for sync with WP media lib) (optional) + * @param string $imagedate (optional) + * @param int $exclude (0 or 1) (optional) + * @param int $sortorder (optional) + * @return int Result of the ID of the inserted image */ - function add_image( $id = false, $filename = false, $description = '', $alttext = '', $meta_data = false, $post_id = 0, $imagedate = '0000-00-00 00:00:00', $exclude = 0, $sortorder = 0 ) { + function add_image( $id = false, $filename = false, $description = '', $alttext = '', $meta_data = false, $post_id = 0, $imagedate = '0000-00-00 00:00:00', $exclude = 0, $sortorder = 0) + { global $wpdb; if ( is_array($meta_data) ) @@ -565,14 +568,14 @@ class nggdb * Add an album to the database * * @since V1.7.0 - * @param (optional) string $title - * @param (optional) int $previewpic - * @param (optional) string $description - * @param (optional) serialized array $sortorder - * @param (optional) int $pageid - * @return bool result of the ID of the inserted album + * @param string|bool $name (optional) + * @param int $previewpic (optional) + * @param string $description (optional) + * @param string $sortorder Must be in the form of a serialized array (optional) + * @param int $pageid (optional) + * @return int Result of the ID of the inserted album */ - function add_album( $name = false, $previewpic = 0, $description = '', $sortorder = 0, $pageid = 0 ) { + function add_album( $name = false, $previewpic = 0, $description = '', $sortorder = '', $pageid = 0 ) { global $wpdb; // name must be unique, we use the title for that @@ -594,13 +597,13 @@ class nggdb * Add an gallery to the database * * @since V1.7.0 - * @param (optional) string $title or name of the gallery - * @param (optional) string $path - * @param (optional) string $description - * @param (optional) int $pageid - * @param (optional) int $previewpic - * @param (optional) int $author - * @return bool result of the ID of the inserted gallery + * @param string $title or name of the gallery (optional) + * @param string $path (optional) + * @param string $description (optional) + * @param int $pageid (optional) + * @param int $previewpic (optional) + * @param int $author (optional) + * @return int result of the ID of the inserted gallery */ static function add_gallery( $title = '', $path = '', $description = '', $pageid = 0, $previewpic = 0, $author = 0 ) { global $wpdb; @@ -642,7 +645,7 @@ class nggdb * @param int $galleryId Only look for images with this gallery id, or in all galleries if id is 0 * @param string $orderby is one of "id" (default, order by pid), "date" (order by exif date), sort (order by user sort order) * @deprecated - * @return + * @return bool|array */ static function find_last_images($page = 0, $limit = 30, $exclude = true, $galleryId = 0, $orderby = "pid") { // Determine ordering @@ -689,7 +692,7 @@ class nggdb * @param string $order_by * @param string $order_dir * @param bool $exclude - * @return An array containing the nggImage objects representing the images in the album. + * @return null|array An array containing the nggImage objects representing the images in the album. */ function find_images_in_album($album, $order_by = 'galleryid', $order_dir = 'ASC', $exclude = true) { // TODO: This method is only used by the JSON API. Once it's removed, this method can be removed @@ -726,7 +729,7 @@ class nggdb * @since 1.3.0 * @param string $request * @param int $limit number of results, 0 shows all results - * @return Array Result of the request + * @return array|bool|null Result of the request */ function search_for_images( $request, $limit = 0 ) { global $wpdb; @@ -758,8 +761,9 @@ class nggdb $search = " AND ({$search}) "; $limit_by = ( $limit > 0 ) ? 'LIMIT ' . intval($limit) : ''; - } else + } else { return false; + } // build the final query $query = "SELECT `tt`.`pid` FROM `{$wpdb->nggallery}` AS `t` INNER JOIN `{$wpdb->nggpictures}` AS `tt` ON `t`.`gid` = `tt`.`galleryid` WHERE 1=1 {$search} ORDER BY `tt`.`pid` ASC {$limit_by}"; @@ -794,7 +798,7 @@ class nggdb * @since 1.7.0 * @param string $request * @param int $limit number of results, 0 shows all results - * @return Array Result of the request + * @return bool|array Result of the request */ function search_for_galleries( $request, $limit = 0 ) { global $wpdb; @@ -826,8 +830,9 @@ class nggdb $search = " AND ({$search}) "; $limit = ( $limit > 0 ) ? 'LIMIT ' . intval($limit) : ''; - } else + } else { return false; + } // build the final query $query = "SELECT * FROM $wpdb->nggallery WHERE 1=1 $search ORDER BY title ASC $limit"; @@ -842,7 +847,7 @@ class nggdb * @since 1.7.0 * @param string $request * @param int $limit number of results, 0 shows all results - * @return Array Result of the request + * @return bool|array Result of the request */ function search_for_albums( $request, $limit = 0 ) { global $wpdb; @@ -874,8 +879,9 @@ class nggdb $search = " AND ({$search}) "; $limit = ( $limit > 0 ) ? 'LIMIT ' . intval($limit) : ''; - } else + } else { return false; + } // build the final query $query = "SELECT * FROM $wpdb->nggalbum WHERE 1=1 $search ORDER BY name ASC $limit"; @@ -890,10 +896,11 @@ class nggdb * * @since 1.4.0 * @param int $id The image ID - * @param array $values An array with existing or new values + * @param array $new_values An array with existing or new values * @return bool result of query */ - static function update_image_meta( $id, $new_values ) { + static function update_image_meta($id, $new_values) + { global $wpdb; // XXX nggdb is used statically, cannot inherit from Ngg_Serializable @@ -920,7 +927,7 @@ class nggdb * @since 1.7.0 * @param string $slug the desired slug (post_name) * @param string $type ('image', 'album' or 'gallery') - * @param int (optional) $id of the object, so that it's not checked against itself + * @param int $id ID of the object, so that it's not checked against itself (optional) * @return string unique slug for the object, based on $slug (with a -1, -2, etc. suffix) */ static function get_unique_slug( $slug, $type, $id = 0 ) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php index 93402d131..0de477582 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/rewrite.php @@ -243,14 +243,14 @@ class nggRewrite { * See : http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html * * @deprecated - * @return string $meta + * @return void */ function add_canonical_meta() { - // create the meta link - $meta = "\n<link rel='canonical' href='" . get_permalink() ."' />"; - // add a filter for SEO plugins, so they can remove it - echo apply_filters('ngg_add_canonical_meta', $meta); + // create the meta link + $meta = "\n<link rel='canonical' href='" . get_permalink() ."' />"; + // add a filter for SEO plugins, so they can remove it + echo apply_filters('ngg_add_canonical_meta', $meta); return; } diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php index a07b9146c..7082b35b2 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/sitemap.php @@ -21,7 +21,7 @@ class nggSitemaps { * * @since Version 1.8.0 * @param array $images - * @param int $post ID + * @param int $post_id * @return array $image list of all founded images */ function add_wpseo_xml_sitemap_images( $images, $post_id ) { @@ -53,20 +53,23 @@ class nggSitemaps { /** * Parse the gallery/imagebrowser/slideshow shortcode and return all images into an array * + * @TODO: replace or remove this function, it's return value isn't even linked to the queries it performs * @param string $atts - * @return + * @return string */ function add_gallery( $atts ) { global $wpdb; - extract(shortcode_atts(array( - 'id' => 0 - ), $atts )); + $tmp = shortcode_atts(array( + 'id' => 0 + ), $atts); + extract($tmp); $gallery_mapper = C_Gallery_Mapper::get_instance(); if (!is_numeric($id)) { - if (($gallery = array_shift($gallery_mapper->select()->where(array('name = %s', $id))->limit(1)->run_query()))) { + $tmp = $gallery_mapper->select()->where(array('name = %s', $id))->limit(1)->run_query(); + if (($gallery = array_shift($tmp))) { $id = $gallery->{$gallery->id_field}; } else $id = NULL; @@ -95,9 +98,8 @@ class nggSitemaps { */ function add_images( $atts ) { - extract(shortcode_atts(array( - 'id' => 0 - ), $atts )); + $tmp = shortcode_atts(array('id' => 0), $atts ); + extract($tmp); // make an array out of the ids (for thumbs shortcode)) $pids = explode( ',', $id ); diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/tags.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/tags.php index 7e5404f15..f5eadd317 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/tags.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/lib/tags.php @@ -385,7 +385,7 @@ class nggTags { * trim and remove empty element * * @param string $element - * @return string + * @return null|string */ if (!function_exists('nggtags_delete_empty_element')) { function nggtags_delete_empty_element( &$element ) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php index 23b497740..4e18173b4 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/module.ngglegacy.php @@ -23,7 +23,7 @@ class M_NggLegacy extends C_Base_Module 'photocrati-nextgen-legacy', 'NextGEN Legacy', 'Embeds the original version of NextGEN 1.9.3 by Alex Rabe', - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/Black_Minimalism.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/Black_Minimalism.min.css index adc535cf4..e045db2b9 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/Black_Minimalism.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/Black_Minimalism.min.css @@ -1 +1 @@ -.ngg-thumbnail{margin:0!important;margin-right:12px!important}.ngg-gallery-thumbnail-box{width:20%}.ngg-gallery-thumbnail{background:url(shadowAlpha.png) no-repeat bottom right!important;background:url(shadow.gif) no-repeat bottom right;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{border:1px solid #600;padding:3px 7px}.ngg-related-gallery img{margin:0 2px} \ No newline at end of file +.ngg-thumbnail{margin:0 12px 0 0!important}.ngg-gallery-thumbnail-box{width:20%}.ngg-gallery-thumbnail{background:url(shadowAlpha.png) bottom right no-repeat!important;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{border:1px solid #600;padding:3px 7px}.ngg-related-gallery img{margin:0 2px} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/default.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/default.min.css index b5700d378..18f55b568 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/default.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/default.min.css @@ -1 +1 @@ -.ngg-related-gallery{background:#f9f9f9;border:1px solid #e0e0e0;overflow:hidden;margin-bottom:1em;margin-top:1em;padding:5px}.ngg-related-gallery img{border:1px solid #ddd;float:left;margin:0 3px;padding:2px;height:50px;width:50px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file +.ngg-related-gallery{background:#F9F9F9;border:1px solid #E0E0E0;overflow:hidden;margin-bottom:1em;margin-top:1em;padding:5px}.ngg-related-gallery img{border:1px solid #DDD;float:left;margin:0 3px;padding:2px;height:50px;width:50px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/hovereffect.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/hovereffect.min.css index 6fb7d300f..addb2da7d 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/hovereffect.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/hovereffect.min.css @@ -1 +1 @@ -.ngg-albumtitle{border-bottom:1px dashed #aaa;padding-bottom:3px}.ngg-thumbnail{background:#eee none repeat scroll 0 50%;border-color:#ddd #bbb #aaa #ccc;border-style:solid;border-width:1px;color:inherit;margin-right:5px;padding:5px}.ngg-thumbnail img{-moz-opacity:.99;opacity:.99;background:#fff none repeat scroll 0;border-color:#aaa #ccc #ddd #bbb;border-style:solid;border-width:1px;color:inherit;padding:2px;vertical-align:top}.ngg-thumbnail img:hover{-moz-opacity:.9;opacity:.9;border-color:#000}.ngg-galleryoverview{overflow:hidden;margin-top:10px;width:100%;clear:both;display:block!important}.ngg-gallery-thumbnail-box{background:#eee none repeat scroll 0 50%;border-color:#ddd #bbb #aaa #ccc;border-style:solid;border-width:1px;color:inherit;display:inline;margin:3px;padding:5px;position:relative}.ngg-gallery-thumbnail img{-moz-opacity:.99;opacity:.99;background:#fff none repeat scroll 0;border-color:#aaa #ccc #ddd #bbb;border-style:solid;border-width:1px;color:inherit;padding:2px;vertical-align:top}.ngg-gallery-thumbnail img:hover{-moz-opacity:.9;opacity:.9;border-color:#000}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-imagebrowser h3{text-align:center;padding-bottom:10px}.ngg-imagebrowser .pic{background:#eee none repeat scroll 0 50%;border-color:#ddd #bbb #aaa #ccc;border-style:solid;border-width:1px;color:inherit;display:block;padding:10px}.ngg-imagebrowser img{margin:-3px;background:#fff none repeat scroll 0;border-color:#aaa #ccc #ddd #bbb;border-style:solid;border-width:1px;color:inherit;padding:2px;vertical-align:top}.ngg-imagebrowser-nav{padding:10px}.ngg-imagebrowser-nav .back:hover,.ngg-imagebrowser-nav .next:hover{border:1px solid #000}.ngg-imagebrowser-nav .back a:hover,.ngg-imagebrowser-nav .next a:hover{text-decoration:none!important} \ No newline at end of file +.ngg-albumtitle{border-bottom:1px dashed #AAA;padding-bottom:3px}.ngg-gallery-thumbnail img,.ngg-gallery-thumbnail-box,.ngg-imagebrowser .pic,.ngg-imagebrowser img,.ngg-thumbnail,.ngg-thumbnail img{border-style:solid;border-width:1px;color:inherit}.ngg-thumbnail{background:0 50% #EEE;border-color:#DDD #bbb #aaa #ccc;margin-right:5px;padding:5px}.ngg-thumbnail img{filter:alpha(opacity=100);-moz-opacity:.99;opacity:.99;background:0 #FFF;border-color:#AAA #ccc #ddd #bbb;padding:2px;vertical-align:top}.ngg-thumbnail img:hover{filter:alpha(opacity=90);-moz-opacity:.9;opacity:.9;border-color:#000}.ngg-galleryoverview{overflow:hidden;margin-top:10px;width:100%;clear:both;display:block!important}.ngg-gallery-thumbnail-box{background:0 50% #EEE;border-color:#DDD #bbb #aaa #ccc;display:inline;margin:3px;padding:5px;position:relative}.ngg-gallery-thumbnail img{filter:alpha(opacity=100);-moz-opacity:.99;opacity:.99;background:0 #FFF;border-color:#AAA #ccc #ddd #bbb;padding:2px;vertical-align:top}.ngg-gallery-thumbnail img:hover{filter:alpha(opacity=90);-moz-opacity:.9;opacity:.9;border-color:#000}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-imagebrowser h3{text-align:center;padding-bottom:10px}.ngg-imagebrowser .pic{background:0 50% #EEE;border-color:#DDD #bbb #aaa #ccc;display:block;padding:10px}.ngg-imagebrowser img{margin:-3px;background:0 #FFF;border-color:#AAA #ccc #ddd #bbb;padding:2px;vertical-align:top}.ngg-imagebrowser-nav{padding:10px}.ngg-imagebrowser-nav .back:hover,.ngg-imagebrowser-nav .next:hover{border:1px solid #000}.ngg-imagebrowser-nav .back a:hover,.ngg-imagebrowser-nav .next a:hover{text-decoration:none!important} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_dkret3.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_dkret3.min.css index 0fa393016..26f822f97 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_dkret3.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_dkret3.min.css @@ -1 +1 @@ -.ngg-gallery-thumbnail{background:url(shadowAlpha.png) no-repeat bottom right!important;background:url(shadow.gif) no-repeat bottom right;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{display:none}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-widget,.ngg-widget-slideshow{text-align:center} \ No newline at end of file +.ngg-gallery-thumbnail{background:url(shadowAlpha.png) bottom right no-repeat!important;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{display:none}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-widget,.ngg-widget-slideshow{text-align:center} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_k2.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_k2.min.css index f6c726d51..ca2f30b2f 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_k2.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_k2.min.css @@ -1 +1 @@ -.ngg-albumoverview{margin:10px 0 0 0!important}.ngg-album{margin:0 0 5px!important}.ngg-albumtitle{margin:0 0 10px 0!important}.ngg-albumcontent{margin:0!important}.ngg-thumbnail{float:left;margin:0 12px 0 0!important}.ngg-thumbnail img{margin:4px 0 4px 5px!important}.ngg-album-link{margin:0!important}.ngg-album-compact h4{margin-bottom:0!important;margin-top:0!important;padding:0!important}.ngg-gallery-thumbnail-box{margin:0!important}.ngg-gallery-thumbnail{background:url(shadowAlpha.png) no-repeat bottom right!important;background:url(shadow.gif) no-repeat bottom right;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px!important}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-related-gallery img{margin:0 2px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file +.ngg-albumoverview{margin:10px 0 0!important}.ngg-album{margin:0 0 5px!important}.ngg-albumtitle{margin:0 0 10px!important}.ngg-albumcontent{margin:0!important}.ngg-thumbnail{float:left;margin:0 12px 0 0!important}.ngg-thumbnail img{margin:4px 0 4px 5px!important}.ngg-album-link,.ngg-gallery-thumbnail-box{margin:0!important}.ngg-album-compact h4{margin-bottom:0!important;margin-top:0!important;padding:0!important}.ngg-gallery-thumbnail{background:url(shadowAlpha.png) bottom right no-repeat!important;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px!important}.ngg-navigation a.next,.ngg-navigation a.page-numbers,.ngg-navigation a.prev,.ngg-navigation span.next,.ngg-navigation span.page-numbers,.ngg-navigation span.prev{padding:3px 7px}.ngg-related-gallery img{margin:0 2px}.ngg-related-gallery img:hover{border:1px solid #000} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow.min.css index 0c9f90db7..2893db927 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow.min.css @@ -1 +1 @@ -.ngg-gallery-thumbnail{background:url(shadowAlpha.png) no-repeat bottom right!important;background:url(shadow.gif) no-repeat bottom right;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{display:none} \ No newline at end of file +.ngg-gallery-thumbnail{background:url(shadowAlpha.png) bottom right no-repeat!important;margin:10px 0 0 10px!important}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{display:none} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow2.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow2.min.css index 6c4167cd4..ab87df0d7 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow2.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/ngg_shadow2.min.css @@ -1 +1 @@ -.ngg-gallery-thumbnail{background:url(shadowAlpha.png) no-repeat bottom right!important;background:url(shadow.gif) no-repeat bottom right;margin:10px 0 0 10px!important;padding:10px 15px 10px 15px;border-color:#eee;border-style:solid none none solid;border-width:1px medium medium 1px}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{margin:-6px 6px 6px -6px;text-align:center;color:grey} \ No newline at end of file +.ngg-gallery-thumbnail{background:url(shadowAlpha.png) bottom right no-repeat!important;margin:10px 0 0 10px!important;padding:10px 15px;border-color:#EEE;border-style:solid none none solid;border-width:1px medium medium 1px}.ngg-gallery-thumbnail img{margin:-6px 6px 6px -6px}.ngg-gallery-thumbnail span{margin:-6px 6px 6px -6px;text-align:center;color:grey} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/overview.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/overview.min.css index 9e0239fac..74ab3df06 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/overview.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/ngglegacy/static/overview.min.css @@ -1 +1 @@ -.toplevel_page_nextgen-gallery .wp-badge{border:none;background:url(https://www.imagely.com/wp-content/uploads/2016/06/on-white-icon.png) no-repeat;background-size:140px 140px;box-shadow:none}.ngg-tab{display:none}.ngg-tab.active{display:block}#ngg-server-settings{float:left}#ngg-server-settings p{margin:0 0 .5em 0}#ngg-server-settings:nth-of-type(2){margin-left:20px}.about-text.centered{text-align:center;margin:1em}.feature-video embed,.feature-video iframe,.feature-video object{position:absolute;top:0;left:0;width:100%;height:100%}.ngg-theme-image{box-shadow:0 0 8px #888}@media only screen and (max-width:700px){#ngg-server-settings:nth-of-type(2){margin-left:0}} \ No newline at end of file +.toplevel_page_nextgen-gallery .wp-badge{border:none;background:url(https://www.imagely.com/wp-content/uploads/2016/06/on-white-icon.png) no-repeat;background-size:140px 140px;box-shadow:none}.ngg-tab{display:none}.ngg-tab.active{display:block}#ngg-server-settings{float:left}#ngg-server-settings p{margin:0 0 .5em}#ngg-server-settings:nth-of-type(2){margin-left:20px}.about-text.centered{text-align:center;margin:1em}.feature-video embed,.feature-video iframe,.feature-video object{position:absolute;top:0;left:0;width:100%;height:100%}.ngg-theme-image{box-shadow:0 0 8px #888}@media only screen and (max-width:700px){#ngg-server-settings:nth-of-type(2){margin-left:0}} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/router/package.module.router.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/router/package.module.router.php index d00ba12b2..dd5656808 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/router/package.module.router.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/router/package.module.router.php @@ -18,7 +18,12 @@ class A_Routing_App_Factory extends Mixin */ class C_Http_Response_Controller extends C_Component { + /** @var C_Http_Response_Controller */ static $_instance = NULL; + /** + * @param bool|string $context + * @return C_Http_Response_Controller + */ static function get_instance($context = FALSE) { if (!isset(self::$_instance)) { @@ -103,7 +108,9 @@ class Mixin_Router extends Mixin } /** * Gets url for the router - * @param string $uri + * @param string $uri (optional) Default = / + * @param bool $with_qs (optional) Default = true + * @param bool $site_url * @return string */ function get_url($uri = '/', $with_qs = TRUE, $site_url = FALSE) @@ -137,7 +144,7 @@ class Mixin_Router extends Mixin /** * Returns a static url * @param string $path - * @param string $module + * @param string|false $module (optional) * @return string */ function get_static_url($path, $module = FALSE) @@ -152,7 +159,7 @@ class Mixin_Router extends Mixin } /** * Gets the routed url - * @returns string + * @return string */ function get_routed_url() { @@ -183,8 +190,6 @@ class Mixin_Router extends Mixin } /** * Serve request using defined Routing Apps - * - * @param string|FALSE $request_uri */ function serve_request() { @@ -199,7 +204,7 @@ class Mixin_Router extends Mixin } /** * Gets the querystring of the current request - * @return string + * @return null|bool */ function get_querystring() { @@ -211,6 +216,7 @@ class Mixin_Router extends Mixin } /** * Gets the request for the router + * @param bool $with_params (optional) Default = true * @return string */ function get_request_uri($with_params = TRUE) @@ -266,8 +272,8 @@ class Mixin_Router extends Mixin /** * Sorts apps.This is needed because we want the most specific app to be * executed first - * @param C_Routed_App $a - * @param C_Routed_App $b + * @param C_Routing_App $a + * @param C_Routing_App $b * @return int */ function _sort_apps($a, $b) @@ -301,6 +307,10 @@ class C_Router extends C_Component parent::initialize(); $this->_request_method = !empty($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : null; } + /** + * @param string|false $context (optional) + * @return self + */ static function &get_instance($context = False) { if (!isset(self::$_instances[$context])) { @@ -342,6 +352,7 @@ class Mixin_Routing_App extends Mixin * @param string $src Original URL * @param string $dst Destination URL * @param bool $redirect FALSE for internal handling, otherwise the HTTP code to send + * @param bool $stop */ function rewrite($src, $dst, $redirect = FALSE, $stop = FALSE) { @@ -371,7 +382,7 @@ class Mixin_Routing_App extends Mixin } /** * Gets an instance of the router - * @return type + * @return C_Router */ function get_router() { @@ -409,7 +420,7 @@ class Mixin_Routing_App extends Mixin } /** * Sets the application request uri - * @param type $uri + * @param string $uri */ function set_app_request_uri($uri) { @@ -646,7 +657,7 @@ class Mixin_Routing_App extends Mixin /** * Adds a placeholder parameter * @param string $name - * @param stirng $value + * @param string $value * @param string $source */ function add_placeholder_param($name, $value, $source = NULL) @@ -808,7 +819,10 @@ class Mixin_Routing_App extends Mixin * Sets the value of a particular parameter * @param string $key * @param mixed $value - * @param mixed $id + * @param mixed $id (optional) + * @param bool $use_prefix (optional) + * @param bool|string $url (optional) + * @return string */ function set_parameter_value($key, $value, $id = NULL, $use_prefix = FALSE, $url = FALSE) { @@ -849,7 +863,7 @@ class Mixin_Routing_App extends Mixin * and returns the full application URL * @param string $key * @param mixed $id - * @return string + * @return string|array|float|int */ function remove_parameter($key, $id = NULL, $url = FALSE) { @@ -893,7 +907,9 @@ class Mixin_Routing_App extends Mixin * Adds a parameter to the application's request URI * @param string $key * @param mixed $value - * @param mixed $id + * @param mixed $id (optional) + * @param bool|string $use_prefix (optional) + * @return string */ function add_parameter_to_app_request_uri($key, $value, $id = NULL, $use_prefix = FALSE) { @@ -937,7 +953,10 @@ class Mixin_Routing_App extends Mixin * Alias for set_parameter_value * @param string $key * @param mixed $value - * @param mixed $id + * @param mixed $id (optional) + * @param bool $use_prefix (optional) + * @param bool|string $url (optional) + * @return string */ function set_parameter($key, $value, $id = NULL, $use_prefix = FALSE, $url = FALSE) { @@ -947,7 +966,10 @@ class Mixin_Routing_App extends Mixin * Alias for set_parameter_value * @param string $key * @param mixed $value - * @param mixed $id + * @param mixed $id (optional) + * @param bool $use_prefix (optional) + * @param bool|string $url (optional) + * @return string */ function set_param($key, $value, $id = NULL, $use_prefix = FALSE, $url = FALSE) { @@ -968,7 +990,7 @@ class Mixin_Routing_App extends Mixin * Gets a parameter's matching URI segment * @param string $key * @param mixed $id - * @param mixed $default + * @param mixed $url * @return mixed */ function get_parameter_segment($key, $id = NULL, $url = FALSE) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/security/package.module.security.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/security/package.module.security.php index 3fdb34fa9..e5424ff68 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/security/package.module.security.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/security/package.module.security.php @@ -179,6 +179,10 @@ class C_Security_Manager extends C_Component $this->add_mixin('Mixin_Security_Manager'); $this->add_mixin('Mixin_Security_Manager_Request'); } + /** + * @param bool|string $context + * @return C_Security_Manager + */ static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { @@ -421,6 +425,10 @@ class C_WordPress_Security_Manager extends C_Security_Manager $this->add_mixin('Mixin_WordPress_Security_Manager'); $this->add_mixin('Mixin_WordPress_Security_Manager_Request'); } + /** + * @param bool|string $context + * @return C_WordPress_Security_Manager + */ static function get_instance($context = False) { if (!isset(self::$_instances[$context])) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php index ce79b9697..d7a221326 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/third_party_compat/module.third_party_compat.php @@ -16,7 +16,7 @@ class M_Third_Party_Compat extends C_Base_Module 'photocrati-third_party_compat', 'Third Party Compatibility', "Adds Third party compatibility hacks, adjustments, and modifications", - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' @@ -108,8 +108,9 @@ class M_Third_Party_Compat extends C_Base_Module add_action('admin_init', array($this, 'excellent_themes_admin'), -10); - add_action('plugins_loaded', array(&$this, 'wpml'), PHP_INT_MAX); - add_action('plugins_loaded', array(&$this, 'wpml_translation_management'), PHP_INT_MAX); + add_action('plugins_loaded', array($this, 'wpml'), PHP_INT_MAX); + add_action('plugins_loaded', array($this, 'wpml_translation_management'), PHP_INT_MAX); + add_filter('wpml_is_redirected', array($this, 'wpml_is_redirected'), -10, 3); add_filter('headway_gzip', array(&$this, 'headway_gzip'), (PHP_INT_MAX - 1)); add_filter('ckeditor_external_plugins', array(&$this, 'ckeditor_plugins'), 11); @@ -137,6 +138,10 @@ class M_Third_Party_Compat extends C_Base_Module // TODO: Only needed for NGG Pro 1.0.10 and lower add_action('the_post', array(&$this, 'add_ngg_pro_page_parameter')); + // Because WPEngine converts "ORDER BY RAND()" to "ORDER BY 1" + if (function_exists('is_wpe') && is_wpe() && !defined('NGG_DISABLE_ORDER_BY_RAND')) { + define('ngg_disable_order_by_rand', 'true'); + } } function is_ngg_page() @@ -153,7 +158,7 @@ class M_Third_Party_Compat extends C_Base_Module * Filter support for WordPress SEO * * @param array $images Provided by WPSEO Filter - * @param int $post ID Provided by WPSEO Filter + * @param int $post_id ID Provided by WPSEO Filter * @return array $image List of a displayed galleries entities */ function add_wpseo_xml_sitemap_images($images, $post_id) @@ -165,6 +170,7 @@ class M_Third_Party_Compat extends C_Base_Module // Assign our own shortcode handler; ngglegacy and ATP do this same routine for their own // legacy and preview image placeholders. remove_all_shortcodes(); + C_NextGen_Shortcode_Manager::add('ngg', array($this, 'wpseo_shortcode_handler')); C_NextGen_Shortcode_Manager::add('ngg_images', array($this, 'wpseo_shortcode_handler')); do_shortcode($post->post_content); @@ -316,6 +322,23 @@ class M_Third_Party_Compat extends C_Base_Module return $term_id; } + /** + * Prevent WPML's parse_query() from conflicting with NGG's pagination & router module controlled endpoints + * + * @param string $redirect What WPML is send to wp_safe_redirect() + * @param int $post_id + * @param WP_Query $q + * @return bool|string FALSE prevents a redirect from occurring + */ + public function wpml_is_redirected($redirect, $post_id, $q) + { + $router = C_Router::get_instance(); + if (!$router->serve_request() && $router->has_parameter_segments()) + return false; + else + return $redirect; + } + /** * CKEditor features a custom NextGEN shortcode generator that unfortunately relies on parts of the NextGEN * 1.9x API that has been deprecated in NextGEN 2.0 @@ -358,8 +381,8 @@ class M_Third_Party_Compat extends C_Base_Module * filters to apply. This checks for WeaverII and enables all NextGEN shortcodes that would otherwise be left * disabled by our shortcode manager. See https://core.trac.wordpress.org/ticket/17817 for more. * - * @param $content - * @return $content + * @param string $content + * @return string $content */ function check_weaverii($content) { diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/validation/package.module.validation.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/validation/package.module.validation.php index f42b65b36..7eb85b0a1 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/validation/package.module.validation.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/validation/package.module.validation.php @@ -26,8 +26,8 @@ class Mixin_Validation extends Mixin } /** * Adds an error for a particular property of the object - * @param string $property * @param string $msg + * @param string $property */ function add_error($msg, $property = '*') { @@ -78,7 +78,7 @@ class Mixin_Validation extends Mixin } /** * Gets all of the errors for the object - * @return type + * @return array */ function get_errors($property = FALSE) { @@ -92,7 +92,7 @@ class Mixin_Validation extends Mixin * Determines if an object, or a particular field for that object, has * errors * @param string $property - * @return boolean + * @return bool */ function is_valid($property = FALSE) { @@ -109,8 +109,8 @@ class Mixin_Validation extends Mixin } /** * Determines if the object, or a particular field on the object, has errors - * @param type $property - * @return type + * @param string $property + * @return bool */ function is_invalid($property = FALSE) { @@ -147,9 +147,9 @@ class Mixin_Validation extends Mixin } /** * Validates the length of a property's value - * @param type $property - * @param type $length - * @param type $msg + * @param string $property + * @param int $length + * @param string $msg */ function validates_length_of($property, $length, $comparison_operator = '=', $msg = FALSE) { @@ -201,9 +201,9 @@ class Mixin_Validation extends Mixin * Validates that a property contains a numeric value. May optionally be tested against * other numbers. * @param string $property - * @param decimal $comparison + * @param int|float $comparison * @param string $comparison_operator - * @param type $msg + * @param string $msg */ function validates_numericality_of($property, $comparison = FALSE, $comparison_operator = FALSE, $int_only = FALSE, $msg = FALSE) { @@ -389,7 +389,8 @@ class Mixin_Validation extends Mixin } /** * Validates the presence of a value for a particular field - * @param string $property + * @param string|array $properties + * @param array $with * @param string $msg */ function validates_presence_of($properties, $with = array(), $msg = FALSE) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/package.module.widget.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/package.module.widget.php index cd7e84799..deba8f41a 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/package.module.widget.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/package.module.widget.php @@ -13,6 +13,10 @@ class C_Widget extends C_MVC_Controller $this->add_mixin('Mixin_Widget'); $this->implement('I_Widget'); } + /** + * @param bool|string $context + * @return C_Widget + */ public static function get_instance($context = FALSE) { if (!isset(self::$_instances[$context])) { @@ -26,7 +30,7 @@ class Mixin_Widget extends Mixin /** * Function for templates without widget support * - * @return echo the widget content + * @return C_Widget_Gallery */ function echo_widget_random($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail') { @@ -38,7 +42,7 @@ class Mixin_Widget extends Mixin /** * Function for templates without widget support * - * @return echo the widget content + * @return C_Widget_Gallery */ function echo_widget_recent($number, $width = '75', $height = '50', $exclude = 'all', $list = '', $show = 'thumbnail') { @@ -53,7 +57,7 @@ class Mixin_Widget extends Mixin * @param integer $galleryID * @param string $width * @param string $height - * @return echo the widget content + * @return C_Widget_Slideshow */ function echo_widget_slideshow($galleryID, $width = '', $height = '') { @@ -75,7 +79,7 @@ class C_Widget_Gallery extends WP_Widget $parent = C_Widget::get_instance(); // defaults $instance = wp_parse_args((array) $instance, array('exclude' => 'all', 'height' => '75', 'items' => '4', 'list' => '', 'show' => 'thumbnail', 'title' => 'Gallery', 'type' => 'recent', 'webslice' => TRUE, 'width' => '100')); - $parent->render_partial('photocrati-widget#form_gallery', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'items' => intval($instance['items']), 'height' => esc_attr($instance['height']), 'width' => esc_attr($instance['width']))); + return $parent->render_partial('photocrati-widget#form_gallery', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'items' => intval($instance['items']), 'height' => esc_attr($instance['height']), 'width' => esc_attr($instance['width']))); } function update($new_instance, $old_instance) { @@ -118,8 +122,8 @@ class C_Widget_Gallery extends WP_Widget function widget($args, $instance) { $router = C_Router::get_instance(); - wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_style('nextgen_basic_thumbnails_style', $router->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'), array(), NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_thumbnails_style', $router->get_static_url('photocrati-nextgen_basic_gallery#thumbnails/nextgen_basic_thumbnails.css'), array(), NGG_SCRIPT_VERSION); // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist $before_widget = NULL; $before_title = NULL; @@ -175,7 +179,7 @@ class C_Widget_MediaRSS extends WP_Widget $parent = C_Widget::get_instance(); // defaults $instance = wp_parse_args((array) $instance, array('mrss_text' => __('Media RSS', 'nggallery'), 'mrss_title' => __('Link to the main image feed', 'nggallery'), 'show_global_mrss' => TRUE, 'show_icon' => TRUE, 'title' => 'Media RSS')); - $parent->render_partial('photocrati-widget#form_mediarss', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'mrss_text' => esc_attr($instance['mrss_text']), 'mrss_title' => esc_attr($instance['mrss_title']))); + return $parent->render_partial('photocrati-widget#form_mediarss', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'mrss_text' => esc_attr($instance['mrss_text']), 'mrss_title' => esc_attr($instance['mrss_title']))); } function update($new_instance, $old_instance) { @@ -232,7 +236,7 @@ class C_Widget_Slideshow extends WP_Widget $parent = C_Widget::get_instance(); // defaults $instance = wp_parse_args((array) $instance, array('galleryid' => '0', 'height' => '120', 'title' => 'Slideshow', 'width' => '160', 'limit' => '10')); - $parent->render_partial('photocrati-widget#form_slideshow', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'height' => esc_attr($instance['height']), 'width' => esc_attr($instance['width']), 'limit' => esc_attr($instance['limit']), 'tables' => $wpdb->get_results("SELECT * FROM {$wpdb->nggallery} ORDER BY 'name' ASC"))); + return $parent->render_partial('photocrati-widget#form_slideshow', array('self' => $this, 'instance' => $instance, 'title' => esc_attr($instance['title']), 'height' => esc_attr($instance['height']), 'width' => esc_attr($instance['width']), 'limit' => esc_attr($instance['limit']), 'tables' => $wpdb->get_results("SELECT * FROM {$wpdb->nggallery} ORDER BY 'name' ASC"))); } function update($new_instance, $old_instance) { @@ -258,8 +262,8 @@ class C_Widget_Slideshow extends WP_Widget function widget($args, $instance) { $router = C_Router::get_instance(); - wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'), FALSE, NGG_SCRIPT_VERSION); - wp_enqueue_style('nextgen_basic_slideshow_style', $router->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'), FALSE, NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_widgets_style', $router->get_static_url('photocrati-widget#widgets.css'), array(), NGG_SCRIPT_VERSION); + wp_enqueue_style('nextgen_basic_slideshow_style', $router->get_static_url('photocrati-nextgen_basic_gallery#slideshow/nextgen_basic_slideshow.css'), array(), NGG_SCRIPT_VERSION); // these are handled by extract() but I want to silence my IDE warnings that these vars don't exist $before_widget = NULL; $before_title = NULL; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/static/widgets.min.css b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/static/widgets.min.css index a25d3062a..c2e4fd238 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/static/widgets.min.css +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/widget/static/widgets.min.css @@ -1 +1 @@ -.ngg-widget,.ngg-widget-slideshow{overflow:hidden;margin:0;padding:5px 0 0 0;text-align:left}.ngg-widget img{border:2px solid #a9a9a9;margin:0 2px 2px 0;padding:1px;height:auto;float:left} \ No newline at end of file +.ngg-widget,.ngg-widget-slideshow{overflow:hidden;margin:0;padding:5px 0 0;text-align:left}.ngg-widget img{border:2px solid #A9A9A9;margin:0 2px 2px 0;padding:1px;height:auto;float:left} \ No newline at end of file diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php index 842bc1214..d23b01cc4 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/module.wordpress_routing.php @@ -18,7 +18,7 @@ class M_WordPress_Routing extends C_Base_Module 'photocrati-wordpress_routing', 'WordPress Routing', "Integrates the MVC module's routing implementation with WordPress", - '3.0.0', + '3.1.0', 'https://www.imagely.com/wordpress-gallery-plugin/nextgen-gallery/', 'Imagely', 'https://www.imagely.com' diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php index de9a52fb2..66381380e 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wordpress_routing/package.module.wordpress_routing.php @@ -206,6 +206,13 @@ class A_WordPress_Routing_App extends Mixin $base_parts = parse_url($router->get_base_url('root')); $new_request_uri = $router->join_paths(!empty($base_parts['path']) ? $base_parts['path'] : '', $this->object->strip_param_segments($router->get_request_uri())); $new_request_uri = str_replace('index.php/index.php', 'index.php', $new_request_uri); + // Handle possible incompatibility with 3rd party plugins manipulating the query as well: WPML in particular + // can lead to our $new_request_uri here becoming index.php/en/index.php: remove this double index.php + $uri_array = explode('/', $new_request_uri); + if (!empty($uri_array) && count($uri_array) >= 2 && reset($uri_array) == 'index.php' && end($uri_array) == 'index.php') { + array_shift($uri_array); + $new_request_uri = implode('/', $uri_array); + } $_SERVER['UNENCODED_URL'] = $_SERVER['HTTP_X_ORIGINAL_URL'] = $_SERVER['REQUEST_URI'] = '/' . trailingslashit($new_request_uri); if (isset($_SERVER['PATH_INFO'])) { $_SERVER['ORIG_PATH_INFO'] = $_SERVER['PATH_INFO']; diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wpcli/module.wpcli.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wpcli/module.wpcli.php index 2dda3d223..a3ce415e2 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wpcli/module.wpcli.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/wpcli/module.wpcli.php @@ -43,6 +43,8 @@ if (defined('WP_CLI') && WP_CLI && class_exists('WP_CLI_Command', FALSE)) { { /** * Flushes NextGen Gallery caches + * @param array $args + * @param array $assoc_args */ function flush_cache($args, $assoc_args) { @@ -52,7 +54,8 @@ if (defined('WP_CLI') && WP_CLI && class_exists('WP_CLI_Command', FALSE)) { /** * Create a new gallery - * + * @param array $args + * @param array $assoc_args * @synopsis <gallery-name> --author=<user_login> */ function create_gallery($args, $assoc_args) @@ -75,7 +78,8 @@ if (defined('WP_CLI') && WP_CLI && class_exists('WP_CLI_Command', FALSE)) { /** * Import an image from the filesystem into NextGen - * + * @param array $args + * @param array $assoc_args * @synopsis --filename=<absolute-path> --gallery=<gallery-id> */ function import_image($args, $assoc_args) @@ -105,7 +109,8 @@ if (defined('WP_CLI') && WP_CLI && class_exists('WP_CLI_Command', FALSE)) { /** * Clear all dismissed notifications handled by C_Admin_Notification_Manager - * + * @param array $args + * @param array $assoc_args * @synopsis */ function clear_dismissed_notifications($args, $assoc_args) diff --git a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/product.photocrati_nextgen.php b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/product.photocrati_nextgen.php index 7c0032149..8f4c40bba 100644 --- a/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/product.photocrati_nextgen.php +++ b/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/product.photocrati_nextgen.php @@ -24,6 +24,7 @@ class P_Photocrati_NextGen extends C_Base_Product 'photocrati-nextgen-legacy' => 'always', 'photocrati-simple_html_dom' => 'always', 'photocrati-nextgen-data' => 'always', + 'photocrati-nextgen_block' => 'always', // We should look at how to make the modules below only // require loading in wp-admin diff --git a/wp-content/plugins/nextgen-gallery/readme.txt b/wp-content/plugins/nextgen-gallery/readme.txt index 0f2063890..1b17880a8 100644 --- a/wp-content/plugins/nextgen-gallery/readme.txt +++ b/wp-content/plugins/nextgen-gallery/readme.txt @@ -2,11 +2,11 @@ Contributors: photocrati, imagely Tags: wordpress gallery plugin, gallery, nextgen, nextgen gallery, photo gallery, image gallery, photography, slideshow, images, photo, photo album, watermark Requires at least: 4.0.0 -Stable tag: 3.0.8 -Tested up to: 4.9.8 +Stable tag: 3.1.1 +Tested up to: 5.0.0 License: GPLv2 -The most popular WordPress gallery plugin and one of the most popular plugins of all time with over 22 million downloads. +The most popular WordPress gallery plugin and one of the most popular plugins of all time with over 23 million downloads. == Description == @@ -183,6 +183,52 @@ For more information, feel free to visit the official website for the NextGEN Ga == Changelog == += V3.1.1 - 11.29.2018 = +* Fixed: Don't enqueue block editor assets on frontend. +* Fixed: Broken styling for column blocks + += V3.1.0 - 11.28.2018 = +* NEW: Gutengerg block for NextGEN Gallery +* Secured: Other options page +* Updated: Freemius SDK +* Fixed: Getting started wizard compatible with Gutenberg +* Fixed: WPML redirects +* Fixed: Missing descriptions and tags when re-importing image metadata + += V3.0.16 - 10.24.2018 = +* Fixed Fontawesome 4 compatibility + += v3.0.15 - 10.23.2018 = +* NEW: Added requirements notification manager +* Changed: Basic Thumbnails default setting from "[Show slideshow]" to "Show slideshow" +* Changed: Fixed order_by=rand and 'variations' system not working by storing random results in a transient for 24h +* Changed: How gallery directories are removed +* Changed: Improved memory use during thumbnail generation +* Changed: Manage Albums page now uses GET for editing navigation +* Changed: Upgrading FontAwesome to 5.0.13 +* Fixed: Attribute 'target=_blank' not working in lightbox effects +* Fixed: Conflict with WP Social Widget +* Fixed: Corrected numerous phpdoc problems found by Phan +* Fixed: Editing of image attributes from search-galleries page +* Fixed: Gritter messages with long texts overlapped their close-notification icon +* Fixed: IGW gallery selections not persisting between edits +* Fixed: Orphaned entries being created and/or left in wp_postmeta +* Fixed: Repeated and missing images in featured images list + += V3.0.13 - 10.11.2018 = +* Changed: Added settings for basic slideshow + += V3.0.9 - 09.25.2018 = +* NEW: Added 2.0 template mechanism for basic galleries +* NEW: Simple Lightbox is the new default Lightbox +* Changed: Changed Javascript library and styling for basic slideshow +* Changed: New default template and styling for thumbnail galleries +* Changed: New default template and styling for imagebrowser galleries +* Changed: New default template and styling for compact albums +* Changed: New default template and styling for extended albums +* Changed: Changed implementation of "Number of Columns" setting +* Changed: Significantly simplified NextGEN default shortcodes + = V3.0.8 - 09.05.2018 = * Fixed: IGW broken with Chrome 69+ -- GitLab