WP Product Review Lite - Version 3.5.0

Version Description

  • 2019-02-11
Download this release

Release Info

Developer codeinwp
Plugin Icon WP Product Review Lite
Version 3.5.0
Comparing to
See all releases

Code changes from version 3.4.10 to 3.5.0

Files changed (118) hide show
  1. CHANGELOG.md +10 -0
  2. CONTRIBUTING.md +133 -0
  3. assets/css/circle.css +0 -3
  4. assets/css/comments.css +10 -2
  5. assets/css/cwppos-widget-style1.css +1 -2
  6. assets/css/dashboard_styles.css +0 -23
  7. assets/css/default.css +1 -2
  8. assets/css/lightbox.css +0 -3
  9. assets/css/style1.css +7 -8
  10. assets/css/style2.css +2 -3
  11. assets/css/upsell.css +0 -2
  12. assets/js/admin.js +17 -0
  13. assets/js/main.js +9 -3
  14. assets/js/widget-admin.js +46 -0
  15. class-wppr-autoloader.php +29 -2
  16. class-wppr-recursive-filter.php +55 -0
  17. docker-compose.yml +30 -0
  18. includes/admin/class-wppr-admin.php +94 -0
  19. includes/admin/class-wppr-editor.php +8 -1
  20. includes/admin/class-wppr-global-settings.php +11 -0
  21. includes/admin/controllers/class-wppr-admin-render-controller.php +3 -0
  22. includes/admin/helpers/class-wppr-html-fields.php +22 -0
  23. includes/admin/layouts/editor-default-tpl.php +2 -2
  24. includes/admin/layouts/widget-admin-tpl.php +57 -8
  25. includes/admin/models/class-wppr-query-model.php +53 -0
  26. includes/admin/widgets/abstract/class-wppr-widget-abstract.php +19 -7
  27. includes/admin/widgets/class-wppr-latest-products-widget.php +3 -3
  28. includes/admin/widgets/class-wppr-top-products-widget.php +2 -2
  29. includes/admin/widgets/class-wppr-top-reviews-widget.php +196 -0
  30. includes/class-wppr.php +34 -2
  31. includes/functions.php +256 -35
  32. includes/gutenberg/class-wppr-gutenberg.php +37 -3
  33. includes/gutenberg/dist/block.css +1 -0
  34. includes/gutenberg/dist/{block.js → sidebar.js} +11 -5
  35. includes/gutenberg/package.json +1 -3
  36. includes/gutenberg/src/radio-image-control/index.js +49 -0
  37. includes/gutenberg/src/radio-image-control/style.scss +89 -0
  38. includes/gutenberg/src/{block.js → sidebar.js} +148 -39
  39. includes/gutenberg/src/utils.js +14 -1
  40. includes/gutenberg/webpack.config.js +1 -1
  41. includes/public/class-wppr-public.php +1 -1
  42. includes/public/layouts/default.php +12 -112
  43. includes/public/layouts/style1.php +14 -108
  44. includes/public/layouts/style2.php +15 -116
  45. includes/public/layouts/widget/default.php +2 -16
  46. includes/public/layouts/widget/style 1.php +2 -20
  47. languages/wp-product-review.pot +623 -133
  48. package-lock.json +369 -596
  49. readme.md +15 -0
  50. readme.txt +18 -0
  51. themeisle-hash.json +1 -1
  52. vendor/autoload.php +1 -1
  53. vendor/autoload_52.php +1 -1
  54. vendor/codeinwp/themeisle-sdk/CHANGELOG.md +35 -0
  55. vendor/codeinwp/themeisle-sdk/Gruntfile.js +27 -0
  56. vendor/codeinwp/themeisle-sdk/README.md +32 -0
  57. vendor/codeinwp/themeisle-sdk/bin/install-wp-tests.sh +130 -0
  58. vendor/codeinwp/themeisle-sdk/bin/run-unit-tests.sh +7 -0
  59. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-endpoints.php +0 -312
  60. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php +0 -556
  61. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-factory.php +0 -50
  62. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-review.php +0 -209
  63. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-translate.php +0 -983
  64. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback.php +0 -90
  65. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-licenser.php +0 -686
  66. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-loader.php +0 -96
  67. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php +0 -227
  68. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-notification-manager.php +0 -105
  69. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php +0 -635
  70. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-rollback.php +0 -223
  71. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php +0 -412
  72. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget.php +0 -50
  73. vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widgets-factory.php +0 -37
  74. vendor/codeinwp/themeisle-sdk/composer.json +11 -5
  75. vendor/codeinwp/themeisle-sdk/composer.lock +180 -0
  76. vendor/codeinwp/themeisle-sdk/docker-compose.local.yml +27 -0
  77. vendor/codeinwp/themeisle-sdk/index.php +2 -4
  78. vendor/codeinwp/themeisle-sdk/load.php +17 -3
  79. vendor/codeinwp/themeisle-sdk/package-lock.json +7312 -0
  80. vendor/codeinwp/themeisle-sdk/package.json +15 -0
  81. vendor/codeinwp/themeisle-sdk/phpcs.xml +50 -0
  82. vendor/codeinwp/themeisle-sdk/phpunit.xml +20 -0
  83. vendor/codeinwp/themeisle-sdk/src/Common/Abstract_module.php +66 -0
  84. vendor/codeinwp/themeisle-sdk/src/Common/Module_factory.php +108 -0
  85. vendor/codeinwp/themeisle-sdk/src/Loader.php +117 -0
  86. vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php +453 -0
  87. vendor/codeinwp/themeisle-sdk/src/Modules/Endpoint.php +358 -0
  88. vendor/codeinwp/themeisle-sdk/src/Modules/Licenser.php +719 -0
  89. vendor/codeinwp/themeisle-sdk/src/Modules/Logger.php +176 -0
  90. vendor/codeinwp/themeisle-sdk/src/Modules/Notification.php +456 -0
  91. vendor/codeinwp/themeisle-sdk/src/Modules/Review.php +117 -0
  92. vendor/codeinwp/themeisle-sdk/src/Modules/Rollback.php +376 -0
  93. vendor/codeinwp/themeisle-sdk/src/Modules/Translate.php +918 -0
  94. vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php +728 -0
  95. vendor/codeinwp/themeisle-sdk/src/Product.php +383 -0
  96. vendor/codeinwp/themeisle-sdk/start.php +31 -21
  97. vendor/codeinwp/themeisle-sdk/tests/bootstrap.php +33 -0
  98. vendor/codeinwp/themeisle-sdk/tests/dashboard-widget-test.php +59 -0
  99. vendor/codeinwp/themeisle-sdk/tests/endpoint-test.php +79 -0
  100. vendor/codeinwp/themeisle-sdk/tests/licenser-test.php +79 -0
  101. vendor/codeinwp/themeisle-sdk/tests/loader-test.php +47 -0
  102. vendor/codeinwp/themeisle-sdk/tests/loading-test.php +52 -0
  103. vendor/codeinwp/themeisle-sdk/tests/logger-test.php +67 -0
  104. vendor/codeinwp/themeisle-sdk/tests/notification-test.php +111 -0
  105. vendor/codeinwp/themeisle-sdk/tests/old/loading-test.php +19 -0
  106. vendor/codeinwp/themeisle-sdk/tests/product-test.php +49 -0
  107. vendor/codeinwp/themeisle-sdk/tests/review-test.php +67 -0
  108. vendor/codeinwp/themeisle-sdk/tests/rollback-test.php +114 -0
  109. vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_plugin/plugin_file.php +13 -0
  110. vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_theme/style.css +10 -0
  111. vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_theme_external/style.css +10 -0
  112. vendor/codeinwp/themeisle-sdk/tests/translate-test.php +83 -0
  113. vendor/codeinwp/themeisle-sdk/tests/uninstall-feedback-test.php +130 -0
  114. vendor/composer/autoload_files.php +0 -1
  115. vendor/composer/autoload_real.php +5 -5
  116. vendor/composer/autoload_real_52.php +3 -4
  117. vendor/composer/installed.json +11 -11
  118. wp-product-review.php +2 -2
CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
 
 
 
 
 
 
 
 
 
 
 
2
  ### v3.4.10 - 2018-12-06
3
  **Changes:**
4
  * Add filter to change schema information
1
 
2
+ ### v3.5.0 - 2019-02-11
3
+ **Changes:**
4
+ * Fix issue with Gutenberg
5
+ * Outgoing Links should have “noopener”
6
+ * Fix RTL support for review comments slider
7
+ * Fix default template showing empty image tag
8
+ * Add ability to recalculate comment ratings
9
+ * Add widget for Top rated products by tag or custom taxonomy
10
+ * Fix user rating in comment for small screens
11
+
12
  ### v3.4.10 - 2018-12-06
13
  **Changes:**
14
  * Add filter to change schema information
CONTRIBUTING.md ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Contributing
2
+
3
+ Thank you for thinking about contributing to WP Product Review! All sorts of contributions are welcomed.
4
+
5
+ ## License
6
+
7
+ WP Product Review is [licensed under the GPLv2+](LICENSE.txt), and all contributions to WP Product Review will be released under the GPLv2+ license. By contributing to this repository, you agree to release your contribution under the GPLv2+ license.
8
+
9
+ ## Setting Up Local Environment
10
+
11
+ You need a WordPress Environment to run the plugin on. This project needs a lot of different packages to be installed before you can start coding, but we've made the process easier with Docker.
12
+
13
+ ### Getting Started with Docker
14
+
15
+ The quickest way to get up and running is to use the provided [Docker](https://www.docker.com/) setup which takes care of setting up the environment for you within seconds. Install docker and docker-compose by following the most recent instructions on the Docker site.
16
+
17
+ Once Docker is installed, fork WP Product Review repository. Clone your fork of this project and enter the working directory:
18
+
19
+ ```
20
+ git clone http://github.com/YOUR-USERNAME/wp-product-review/
21
+ cd wp-product-review
22
+ ```
23
+
24
+ Once inside the folder, you can run the following command to start your Docker container:
25
+
26
+ ```
27
+ docker-compose up -d
28
+ ```
29
+
30
+ This will make your WordPress instance up and running at http://localhost:8888
31
+
32
+ - If you want to use a different port for your environment, then you can change it from [docker-compose.yml](docker-compose.yml) file.
33
+
34
+ - If you're developing themes, or core WordPress functionality alongside WP Product Review, you can make the WordPress files accessible in `/wp-product-review/wordpress/` folder in your home directory.
35
+
36
+ - If you want bash access to your environment, you can use the following command to find the ID of your Docker container:
37
+
38
+ ```
39
+ docker ps
40
+ ```
41
+
42
+ And then you can get bash access with the following command:
43
+
44
+ ```
45
+ docker exec -it <ID OF YOUR CONTAINER> bash
46
+ ```
47
+
48
+ If you want to stop your Docker container, for the time being, you can use the following command:
49
+
50
+ ```
51
+ docker-compose stop
52
+ ```
53
+
54
+ Moreover, if you want to delete your Docker instance, you can use:
55
+
56
+ ```
57
+ docker-compose down
58
+ ```
59
+
60
+ ### Installing Dependencies
61
+
62
+ Once you've bash access of your WordPress container, you need to enter your WP Product Review directory with:
63
+
64
+ ```
65
+ cd /var/www/html/wp-content/plugins/wp-product-review/
66
+ ```
67
+
68
+ Now, we need to install `npm` and `composer` dependencies with the following commands:
69
+
70
+ ```
71
+ npm install
72
+ composer install
73
+ ```
74
+
75
+ Now you can start making your changes to the plugin.
76
+
77
+ ### Running Grunt Tasks
78
+
79
+ We use [Grunt](https://gruntjs.com/) for automating many tasks, such as compiling Sass to CSS, PHP Code Sniffer, and more.
80
+
81
+ Once you have made your changes, you can run Grunt tasks by running:
82
+
83
+ ```
84
+ grunt local
85
+ ```
86
+
87
+ It will take some time to finish all the tasks. If there are any issues found in PHP or JavaScript, it gives you a detailed log inside `/logs/` folder of the plugin. Fix those issues and run `grunt local` again until it finishes without an error.
88
+
89
+ ### PHP Unit Testing
90
+
91
+ Tests for PHP use PHPUnit as the testing framework, which is run with:
92
+
93
+ ```
94
+ phpunit
95
+ ```
96
+
97
+ ## Sending a Pull Request
98
+
99
+ A good workflow for pull requests to follow is listed below:
100
+
101
+ - Fork WP Product Review repository
102
+ - Clone forked repository
103
+ - Use **development** branch for your changes, or create a new branch from **development** branch.
104
+ - Setup environment
105
+ - Make code changes
106
+ - Run Grunt tasks and PHPUnit tests.
107
+ - Push branch to forked repository
108
+ - Submit Pull Request
109
+
110
+ ## Reporting Security Issues
111
+
112
+ ThemeIsle team takes security bugs very seriously. Do not report potential security vulnerabilities here. Email them privately to our team at friends@themeisle.com
113
+
114
+ ## Reporting a Bug
115
+
116
+ We use [GitHub issues](https://github.com/Codeinwp/wp-product-review/issues) for tracking bugs. When filing an issue, make sure to answer these questions:
117
+
118
+ - What version of WP Product Review are you using?
119
+ - What version of WordPress are you using are you using?
120
+ - What did you do?
121
+ - What did you expect to see?
122
+ - What did you see instead?
123
+
124
+ Explain the problem and include additional details to help maintainers reproduce the problem:
125
+
126
+ - Use a clear and descriptive title for the issue to identify the problem.
127
+ - Describe the exact steps which reproduce the problem in as many details as possible, including screenshots if needed.
128
+
129
+ ## Localizing WP Product Review Plugin
130
+
131
+ You don't need to be a developer to contribute to WP Product Review. You can also contribute to the project by translating it to your language. You can find your [locale here](https://translate.wordpress.org/projects/wp-plugins/wp-product-review).
132
+
133
+ Language packs are automatically generated once 95% of the plugin's strings are translated and approved for a locale.
assets/css/circle.css CHANGED
@@ -74,11 +74,8 @@
74
  line-height: 120px;
75
  text-align: center;
76
  white-space: nowrap;
77
- -webkit-transition-timing-function: ease-out;
78
  transition-timing-function: ease-out;
79
- -webkit-transition-duration: 0.2s;
80
  transition-duration: 0.2s;
81
- -webkit-transition-property: all;
82
  transition-property: all;
83
  }
84
 
74
  line-height: 120px;
75
  text-align: center;
76
  white-space: nowrap;
 
77
  transition-timing-function: ease-out;
 
78
  transition-duration: 0.2s;
 
79
  transition-property: all;
80
  }
81
 
assets/css/comments.css CHANGED
@@ -64,8 +64,7 @@
64
  .user-comments-grades {
65
  float: right;
66
  width: 200px;
67
- margin-top: 25px;
68
- margin-left: 15px;
69
  padding: 10px;
70
  border: 1px solid #ddd;
71
  border-radius: 5px;
@@ -140,3 +139,12 @@
140
  background: #ebedef;
141
  box-shadow: none;
142
  }
 
 
 
 
 
 
 
 
 
64
  .user-comments-grades {
65
  float: right;
66
  width: 200px;
67
+ margin: 0 0 20px 15px;
 
68
  padding: 10px;
69
  border: 1px solid #ddd;
70
  border-radius: 5px;
139
  background: #ebedef;
140
  box-shadow: none;
141
  }
142
+
143
+ /*Responsiveness in comments area*/
144
+ @media (max-width: 767px) {
145
+ .user-comments-grades {
146
+ float: none;
147
+ width: 100%;
148
+ margin: 0 0 20px 0;
149
+ }
150
+ }
assets/css/cwppos-widget-style1.css CHANGED
@@ -64,7 +64,6 @@
64
  white-space: nowrap;
65
  text-decoration: none;
66
  text-transform: uppercase;
67
- -webkit-transition: all 0.5s ease;
68
  transition: all 0.5s ease;
69
  }
70
 
@@ -73,10 +72,10 @@
73
  }
74
 
75
  .wppr-prodlist .wppr-prodrow .wppr-prodrowright .wppr-review-stars.rtl .wppr-review-stars-grade i.fa-star-half-o {
 
76
  transform: rotateY(180deg);
77
  }
78
 
79
  .wppr-prodlist .wppr-prodrow .wppr-prodrowright .wppr-review-stars .wppr-review-stars-grade {
80
  color: #ff7e00;
81
  }
82
-
64
  white-space: nowrap;
65
  text-decoration: none;
66
  text-transform: uppercase;
 
67
  transition: all 0.5s ease;
68
  }
69
 
72
  }
73
 
74
  .wppr-prodlist .wppr-prodrow .wppr-prodrowright .wppr-review-stars.rtl .wppr-review-stars-grade i.fa-star-half-o {
75
+ -webkit-transform: rotateY(180deg);
76
  transform: rotateY(180deg);
77
  }
78
 
79
  .wppr-prodlist .wppr-prodrow .wppr-prodrowright .wppr-review-stars .wppr-review-stars-grade {
80
  color: #ff7e00;
81
  }
 
assets/css/dashboard_styles.css CHANGED
@@ -231,11 +231,6 @@ img.theme_options_logo {
231
  border-radius: 3px;
232
  color: #fff;
233
  background-color: #7fbf4d;
234
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #7fbf4d), color-stop(100%, #63a62f));
235
- background-image: -webkit-linear-gradient(top, #7fbf4d, #63a62f);
236
- background-image: -webkit-gradient(linear, left top, left bottom, from(#7fbf4d), to(#63a62f));
237
- background-image: -webkit-gradient( linear, left bottom, left top, from(#7fbf4d), to(#63a62f));
238
- background-image: -webkit-linear-gradient( bottom, #7fbf4d, #63a62f);
239
  background-image: linear-gradient( to top, #7fbf4d, #63a62f);
240
  box-shadow: inset 0 1px 0 0 #96ca6d;
241
  text-shadow: 0 -1px 0 #4c9021;
@@ -245,11 +240,6 @@ img.theme_options_logo {
245
 
246
  .preload_result .preload_list .cwp_preloaded_item header button.preload:hover {
247
  background-color: #76b347;
248
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #76b347), color-stop(100%, #5e9e2e));
249
- background-image: -webkit-linear-gradient(top, #76b347, #5e9e2e);
250
- background-image: -webkit-gradient(linear, left top, left bottom, from(#76b347), to(#5e9e2e));
251
- background-image: -webkit-gradient( linear, left bottom, left top, from(#76b347), to(#5e9e2e));
252
- background-image: -webkit-linear-gradient( bottom, #76b347, #5e9e2e);
253
  background-image: linear-gradient( to top, #76b347, #5e9e2e);
254
  box-shadow: inset 0 1px 0 0 #8dbf67;
255
  cursor: pointer;
@@ -277,7 +267,6 @@ img.theme_options_logo {
277
  border: 1px solid #f1f1f1;
278
  border-bottom: none;
279
  font-size: 10px;
280
- -webkit-transition: all 0.2s ease-in-out;
281
  transition: all 0.2s ease-in-out;
282
  }
283
 
@@ -314,12 +303,6 @@ a.preload_info_upsell {
314
  border-radius: 3px;
315
  color: #fff;
316
  background-color: #7fbf4d;
317
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #7fbf4d), color-stop(100%, #63a62f));
318
- background-image: -webkit-linear-gradient(to top, #7fbf4d, #63a62f);
319
- background-image: -webkit-gradient(linear, left top, left bottom, from(#7fbf4d), to(#63a62f));
320
- background-image: -webkit-linear-gradient(top, #7fbf4d, #63a62f);
321
- background-image: -webkit-gradient(linear, left bottom, left top, from(#7fbf4d), to(#63a62f));
322
- background-image: -webkit-linear-gradient(bottom, #7fbf4d, #63a62f);
323
  background-image: linear-gradient(to top, #7fbf4d, #63a62f);
324
  box-shadow: inset 0 1px 0 0 #96ca6d;
325
  text-shadow: 0 -1px 0 #4c9021;
@@ -331,12 +314,6 @@ a.preload_info_upsell {
331
  a.preload_info:hover,
332
  a.preload_info_upsell:hover {
333
  background-color: #76b347;
334
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #76b347), color-stop(100%, #5e9e2e));
335
- background-image: -webkit-linear-gradient(to top, #76b347, #5e9e2e);
336
- background-image: -webkit-gradient(linear, left top, left bottom, from(#76b347), to(#5e9e2e));
337
- background-image: -webkit-linear-gradient(top, #76b347, #5e9e2e);
338
- background-image: -webkit-gradient(linear, left bottom, left top, from(#76b347), to(#5e9e2e));
339
- background-image: -webkit-linear-gradient(bottom, #76b347, #5e9e2e);
340
  background-image: linear-gradient(to top, #76b347, #5e9e2e);
341
  box-shadow: inset 0 1px 0 0 #8dbf67;
342
  cursor: pointer;
231
  border-radius: 3px;
232
  color: #fff;
233
  background-color: #7fbf4d;
 
 
 
 
 
234
  background-image: linear-gradient( to top, #7fbf4d, #63a62f);
235
  box-shadow: inset 0 1px 0 0 #96ca6d;
236
  text-shadow: 0 -1px 0 #4c9021;
240
 
241
  .preload_result .preload_list .cwp_preloaded_item header button.preload:hover {
242
  background-color: #76b347;
 
 
 
 
 
243
  background-image: linear-gradient( to top, #76b347, #5e9e2e);
244
  box-shadow: inset 0 1px 0 0 #8dbf67;
245
  cursor: pointer;
267
  border: 1px solid #f1f1f1;
268
  border-bottom: none;
269
  font-size: 10px;
 
270
  transition: all 0.2s ease-in-out;
271
  }
272
 
303
  border-radius: 3px;
304
  color: #fff;
305
  background-color: #7fbf4d;
 
 
 
 
 
 
306
  background-image: linear-gradient(to top, #7fbf4d, #63a62f);
307
  box-shadow: inset 0 1px 0 0 #96ca6d;
308
  text-shadow: 0 -1px 0 #4c9021;
314
  a.preload_info:hover,
315
  a.preload_info_upsell:hover {
316
  background-color: #76b347;
 
 
 
 
 
 
317
  background-image: linear-gradient(to top, #76b347, #5e9e2e);
318
  box-shadow: inset 0 1px 0 0 #8dbf67;
319
  cursor: pointer;
assets/css/default.css CHANGED
@@ -415,12 +415,11 @@
415
 
416
  .wppr-template-default.rtl .affiliate-button a span {
417
  margin-right: -10px;
418
- padding-right: 20px;
419
  margin-left: auto;
 
420
  padding-left: auto;
421
  }
422
 
423
-
424
  @media (max-width: 440px) {
425
  #review-statistics .review-wrap-up .review-wu-left {
426
  width: 100%;
415
 
416
  .wppr-template-default.rtl .affiliate-button a span {
417
  margin-right: -10px;
 
418
  margin-left: auto;
419
+ padding-right: 20px;
420
  padding-left: auto;
421
  }
422
 
 
423
  @media (max-width: 440px) {
424
  #review-statistics .review-wrap-up .review-wu-left {
425
  width: 100%;
assets/css/lightbox.css CHANGED
@@ -107,7 +107,6 @@ body:after {
107
  width: 34%;
108
  opacity: 0;
109
  background: url(../img/prev.png) left 48% no-repeat;
110
- -webkit-transition: opacity 0.6s;
111
  transition: opacity 0.6s;
112
 
113
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
@@ -125,7 +124,6 @@ body:after {
125
  width: 64%;
126
  opacity: 0;
127
  background: url(../img/next.png) right 48% no-repeat;
128
- -webkit-transition: opacity 0.6s;
129
  transition: opacity 0.6s;
130
 
131
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
@@ -188,7 +186,6 @@ body:after {
188
  opacity: 0.7;
189
  background: url(../img/close.png) top right no-repeat;
190
  text-align: right;
191
- -webkit-transition: opacity 0.2s;
192
  transition: opacity 0.2s;
193
 
194
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
107
  width: 34%;
108
  opacity: 0;
109
  background: url(../img/prev.png) left 48% no-repeat;
 
110
  transition: opacity 0.6s;
111
 
112
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
124
  width: 64%;
125
  opacity: 0;
126
  background: url(../img/next.png) right 48% no-repeat;
 
127
  transition: opacity 0.6s;
128
 
129
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0);
186
  opacity: 0.7;
187
  background: url(../img/close.png) top right no-repeat;
188
  text-align: right;
 
189
  transition: opacity 0.2s;
190
 
191
  filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=70);
assets/css/style1.css CHANGED
@@ -34,10 +34,10 @@ Template 1
34
  }
35
 
36
  .wppr-template-1 .wppr-review-stars.rtl .wppr-review-stars-grade i.fa-star-half-o {
 
37
  transform: rotateY(180deg);
38
  }
39
 
40
-
41
  .wppr-template-1 .wppr-review-stars-author {
42
  display: table-cell;
43
  width: 100%;
@@ -47,8 +47,8 @@ Template 1
47
  }
48
 
49
  .wppr-template-1.rtl .wppr-review-stars-author {
50
- padding-left: 0px;
51
  padding-right: 15px;
 
52
  }
53
 
54
  .wppr-template-1 .wppr-review-grade-number,
@@ -82,10 +82,9 @@ Template 1
82
 
83
  .wppr-template-1 .wppr-review-grade-options.rtl {
84
  padding-right: 45px;
85
- padding-left: 0px;
86
  }
87
 
88
-
89
  .wppr-template-1 .wppr-review-grade-option-header span:last-of-type {
90
  font-weight: 700;
91
  text-align: right;
@@ -100,6 +99,7 @@ Template 1
100
  font-weight: 700;
101
  text-align: left;
102
  }
 
103
  .wppr-template-1.rtl .wppr-review-grade-option-header span:first-of-type {
104
  text-align: right;
105
  }
@@ -160,8 +160,8 @@ Template 1
160
 
161
  .wppr-template-1.rtl .affiliate-button a span {
162
  margin-right: -10px;
163
- padding-right: 20px;
164
  margin-left: auto;
 
165
  padding-left: auto;
166
  }
167
 
@@ -251,8 +251,8 @@ Template 1
251
  .wppr-template-1 .wppr-review-grade-number {
252
  display: block;
253
  width: 100%;
254
- text-align: center;
255
  padding: 0;
 
256
  }
257
 
258
  .wppr-template-1 .wppr-review-stars .wppr-review-stars-grade,
@@ -269,11 +269,10 @@ Template 1
269
  }
270
 
271
  .wppr-template-1 .wppr-review-product-image {
 
272
  float: none;
273
  margin: auto;
274
- display: block;
275
  }
276
-
277
  }
278
 
279
  @-webkit-keyframes animFiller {
34
  }
35
 
36
  .wppr-template-1 .wppr-review-stars.rtl .wppr-review-stars-grade i.fa-star-half-o {
37
+ -webkit-transform: rotateY(180deg);
38
  transform: rotateY(180deg);
39
  }
40
 
 
41
  .wppr-template-1 .wppr-review-stars-author {
42
  display: table-cell;
43
  width: 100%;
47
  }
48
 
49
  .wppr-template-1.rtl .wppr-review-stars-author {
 
50
  padding-right: 15px;
51
+ padding-left: 0;
52
  }
53
 
54
  .wppr-template-1 .wppr-review-grade-number,
82
 
83
  .wppr-template-1 .wppr-review-grade-options.rtl {
84
  padding-right: 45px;
85
+ padding-left: 0;
86
  }
87
 
 
88
  .wppr-template-1 .wppr-review-grade-option-header span:last-of-type {
89
  font-weight: 700;
90
  text-align: right;
99
  font-weight: 700;
100
  text-align: left;
101
  }
102
+
103
  .wppr-template-1.rtl .wppr-review-grade-option-header span:first-of-type {
104
  text-align: right;
105
  }
160
 
161
  .wppr-template-1.rtl .affiliate-button a span {
162
  margin-right: -10px;
 
163
  margin-left: auto;
164
+ padding-right: 20px;
165
  padding-left: auto;
166
  }
167
 
251
  .wppr-template-1 .wppr-review-grade-number {
252
  display: block;
253
  width: 100%;
 
254
  padding: 0;
255
+ text-align: center;
256
  }
257
 
258
  .wppr-template-1 .wppr-review-stars .wppr-review-stars-grade,
269
  }
270
 
271
  .wppr-template-1 .wppr-review-product-image {
272
+ display: block;
273
  float: none;
274
  margin: auto;
 
275
  }
 
276
  }
277
 
278
  @-webkit-keyframes animFiller {
assets/css/style2.css CHANGED
@@ -43,8 +43,8 @@ Template 2
43
  }
44
 
45
  .wppr-template-2 .wppr-review-head.wppr-review-with-pros-cons .wppr-review-rating.rtl {
 
46
  padding-left: 30px;
47
- padding-right: 0px;
48
  }
49
 
50
  .wppr-template-2 .wppr-review-head.wppr-review-with-pros-cons .wppr-review-rating-grade,
@@ -57,7 +57,6 @@ Template 2
57
  float: right;
58
  }
59
 
60
-
61
  .wppr-template-2 .wppr-review-pros,
62
  .wppr-template-2 .wppr-review-cons {
63
  width: 50%;
@@ -203,8 +202,8 @@ Template 2
203
 
204
  .wppr-template-2.rtl .affiliate-button a span {
205
  margin-right: -10px;
206
- padding-right: 20px;
207
  margin-left: auto;
 
208
  padding-left: auto;
209
  }
210
 
43
  }
44
 
45
  .wppr-template-2 .wppr-review-head.wppr-review-with-pros-cons .wppr-review-rating.rtl {
46
+ padding-right: 0;
47
  padding-left: 30px;
 
48
  }
49
 
50
  .wppr-template-2 .wppr-review-head.wppr-review-with-pros-cons .wppr-review-rating-grade,
57
  float: right;
58
  }
59
 
 
60
  .wppr-template-2 .wppr-review-pros,
61
  .wppr-template-2 .wppr-review-cons {
62
  width: 50%;
202
 
203
  .wppr-template-2.rtl .affiliate-button a span {
204
  margin-right: -10px;
 
205
  margin-left: auto;
206
+ padding-right: 20px;
207
  padding-left: auto;
208
  }
209
 
assets/css/upsell.css CHANGED
@@ -32,7 +32,6 @@
32
  font-weight: 600;
33
  font-style: italic;
34
  text-decoration: none;
35
- -webkit-transition: all 0.250s ease-in-out;
36
  transition: all 0.250s ease-in-out;
37
  }
38
 
@@ -65,7 +64,6 @@
65
  font-weight: bold;
66
  text-decoration: none;
67
  text-transform: uppercase;
68
- -webkit-transition: all 0.250s ease-in-out;
69
  transition: all 0.250s ease-in-out;
70
  }
71
 
32
  font-weight: 600;
33
  font-style: italic;
34
  text-decoration: none;
 
35
  transition: all 0.250s ease-in-out;
36
  }
37
 
64
  font-weight: bold;
65
  text-decoration: none;
66
  text-transform: uppercase;
 
67
  transition: all 0.250s ease-in-out;
68
  }
69
 
assets/js/admin.js CHANGED
@@ -40,4 +40,21 @@ jQuery("document").ready(function () {
40
  $btn.removeClass('disabled');
41
  });
42
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  });
40
  $btn.removeClass('disabled');
41
  });
42
  });
43
+
44
+ jQuery('.wppr_reset_comment_ratings').on('click', function(e) {
45
+ e.preventDefault();
46
+ var $btn = jQuery(this);
47
+ $btn.parent().append('<span class="spinner is-active"></span>');
48
+ $btn.addClass('disabled');
49
+ var form_data = jQuery('#wppr-settings').serializeArray()
50
+ var data = {
51
+ 'action': 'reset_comment_ratings',
52
+ 'cwppos_options': form_data
53
+ };
54
+ // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
55
+ jQuery.post(ajaxurl, data, function (response) {
56
+ $btn.parent().find('.spinner').remove();
57
+ $btn.removeClass('disabled');
58
+ });
59
+ });
60
  });
assets/js/main.js CHANGED
@@ -5,13 +5,19 @@
5
  jQuery(document).ready(function ($) {
6
 
7
  $(".wppr-comment-meta-slider").each(function () {
 
 
 
 
 
 
8
  var comm_meta_input = $(this).parent(".wppr-comment-form-meta").children("input");
9
  $(this).slider({
10
- min: 0,
11
- max: 100,
12
  value: 0,
13
  slide: function (event, ui) {
14
- $(comm_meta_input).val(ui.value / 10);
15
  }
16
  });
17
  });
5
  jQuery(document).ready(function ($) {
6
 
7
  $(".wppr-comment-meta-slider").each(function () {
8
+ var min = 0;
9
+ var max = 100;
10
+ if($(this).parent(".wppr-comment-form-meta").hasClass('rtl')){
11
+ min = -100;
12
+ max = 0;
13
+ }
14
  var comm_meta_input = $(this).parent(".wppr-comment-form-meta").children("input");
15
  $(this).slider({
16
+ min: min,
17
+ max: max,
18
  value: 0,
19
  slide: function (event, ui) {
20
+ $(comm_meta_input).val(Math.abs(ui.value) / 10);
21
  }
22
  });
23
  });
assets/js/widget-admin.js CHANGED
@@ -54,6 +54,9 @@
54
  widget.find('.wppr-post-types').on('change', function(evt, params) {
55
  get_categories(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
56
  });
 
 
 
57
  }else{
58
  $('select.wppr-chosen').chosen({
59
  width : '100%',
@@ -62,8 +65,51 @@
62
  $('.wppr-post-types').on('change', function(evt, params) {
63
  get_categories(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
64
  });
 
 
 
65
  }
66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
 
69
  function get_categories(params, types, categories){
54
  widget.find('.wppr-post-types').on('change', function(evt, params) {
55
  get_categories(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
56
  });
57
+ widget.find('.wppr-post-type').on('change', function(evt, params) {
58
+ get_taxonomies(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
59
+ });
60
  }else{
61
  $('select.wppr-chosen').chosen({
62
  width : '100%',
65
  $('.wppr-post-types').on('change', function(evt, params) {
66
  get_categories(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
67
  });
68
+ $('.wppr-post-type').on('change', function(evt, params) {
69
+ get_taxonomies(params, $(this), $('#' + $(this).attr('data-wppr-cat-combo')));
70
+ });
71
  }
72
 
73
+ $('.wppr-datepicker').each(function(){
74
+ $(this).datepicker({
75
+ dateFormat: "yy-mm-dd",
76
+ changeYear: true,
77
+ changeMonth: true
78
+ });
79
+ });
80
+
81
+
82
+ }
83
+
84
+ function get_taxonomies(params, types, categories){
85
+ if(params.selected){
86
+ $('.wppr-cat-spinner').css('visibility', 'visible').show();
87
+ $.ajax({
88
+ url : ajaxurl,
89
+ method : 'post',
90
+ data : {
91
+ action : 'get_taxonomies',
92
+ nonce : w.ajax.nonce,
93
+ type : params.selected
94
+ },
95
+ success : function(data){
96
+ if(data.data.categories){
97
+ var $all = '';
98
+ $.each(data.data.categories, function(tax, arr){
99
+ var $group = '<optgroup label="' + tax + '">';
100
+ $.each(arr, function(slug, name){
101
+ $group += '<option value="' + slug + '">' + name + '</option>';
102
+ });
103
+ $group += '</optgroup>';
104
+ $all += $group;
105
+ });
106
+ categories.empty().append($all);
107
+ categories.trigger("chosen:updated");
108
+ }
109
+ $('.wppr-cat-spinner').css('visibility', 'hidden').hide();
110
+ }
111
+ });
112
+ }
113
  }
114
 
115
  function get_categories(params, types, categories){
class-wppr-autoloader.php CHANGED
@@ -58,7 +58,7 @@ class WPPR_Autoloader {
58
  * @access protected
59
  * @var array $excluded_files The excluded files list.
60
  */
61
- protected static $excluded_files = array();
62
 
63
  /**
64
  * A placeholder to hold the file iterator so that directory traversal is only
@@ -93,15 +93,25 @@ class WPPR_Autoloader {
93
  }
94
 
95
  $directory = new RecursiveDirectoryIterator( static::$path_top . DIRECTORY_SEPARATOR . 'includes', RecursiveDirectoryIterator::SKIP_DOTS );
 
96
 
97
  if ( is_null( static::$file_iterator ) ) {
98
- $Iterator = new RecursiveIteratorIterator( $directory );
 
 
 
 
 
 
 
 
99
  $Regex = new RegexIterator( $Iterator, '/^.+\.php$/i', RecursiveRegexIterator::MATCH );
100
  static::$file_iterator = iterator_to_array( $Regex, false );
101
  }
102
 
103
  $filename = 'class-' . str_replace( '_', '-', strtolower( $class_name ) ) . static::$file_ext;
104
  foreach ( static::$file_iterator as $file ) {
 
105
  if ( strtolower( $file->getFileName() ) === strtolower( $filename ) && is_readable( $file->getPathName() ) ) {
106
  require( $file->getPathName() );
107
 
@@ -192,4 +202,21 @@ class WPPR_Autoloader {
192
  public static function define_namespaces( $namespaces = array() ) {
193
  static::$namespaces = $namespaces;
194
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
  }
58
  * @access protected
59
  * @var array $excluded_files The excluded files list.
60
  */
61
+ protected static $excluded_files = array( 'node_modules' );
62
 
63
  /**
64
  * A placeholder to hold the file iterator so that directory traversal is only
93
  }
94
 
95
  $directory = new RecursiveDirectoryIterator( static::$path_top . DIRECTORY_SEPARATOR . 'includes', RecursiveDirectoryIterator::SKIP_DOTS );
96
+ require_once 'class-wppr-recursive-filter.php';
97
 
98
  if ( is_null( static::$file_iterator ) ) {
99
+ $Iterator = new RecursiveIteratorIterator(
100
+ new Wppr_Recursive_Filter(
101
+ $directory,
102
+ array(
103
+ 'WPPR_Autoloader',
104
+ 'filter_excluded_files',
105
+ )
106
+ )
107
+ );
108
  $Regex = new RegexIterator( $Iterator, '/^.+\.php$/i', RecursiveRegexIterator::MATCH );
109
  static::$file_iterator = iterator_to_array( $Regex, false );
110
  }
111
 
112
  $filename = 'class-' . str_replace( '_', '-', strtolower( $class_name ) ) . static::$file_ext;
113
  foreach ( static::$file_iterator as $file ) {
114
+
115
  if ( strtolower( $file->getFileName() ) === strtolower( $filename ) && is_readable( $file->getPathName() ) ) {
116
  require( $file->getPathName() );
117
 
202
  public static function define_namespaces( $namespaces = array() ) {
203
  static::$namespaces = $namespaces;
204
  }
205
+
206
+ /**
207
+ * Utility to filter out the excluded directories.
208
+ *
209
+ * @param \SplFileInfo $file The file info array.
210
+ * @param string $key File key.
211
+ * @param \RecursiveDirectoryIterator $iterator The recursive directory iterator.
212
+ *
213
+ * @return bool
214
+ */
215
+ public static function filter_excluded_files( \SplFileInfo $file, $key, \RecursiveDirectoryIterator $iterator ) {
216
+ if ( ! in_array( $file->getFilename(), static::$excluded_files ) ) {
217
+ return true;
218
+ }
219
+
220
+ return false;
221
+ }
222
  }
class-wppr-recursive-filter.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Used for filtering autoloader files. Compatible with PHP 5.3 and 5.2
4
+ *
5
+ * Author: Andrei Baicus <andrei@themeisle.com>
6
+ * Created on: 18/07/2018
7
+ *
8
+ * @soundtrack D.O.A. (Death of Auto-Tune) - JAY-Z
9
+ * @package Hestia
10
+ */
11
+
12
+ /**
13
+ * Class Wppr_Recursive_Filter
14
+ */
15
+ class Wppr_Recursive_Filter extends RecursiveFilterIterator {
16
+
17
+ /**
18
+ * Callback function.
19
+ *
20
+ * @var string
21
+ */
22
+ public $callback;
23
+
24
+ /**
25
+ * Hestia_Recursive_Filter constructor.
26
+ *
27
+ * @param RecursiveIterator $iterator file iterator.
28
+ * @param callable $callback callback function.
29
+ */
30
+ public function __construct( RecursiveIterator $iterator, $callback ) {
31
+ $this->callback = $callback;
32
+ parent::__construct( $iterator );
33
+ }
34
+
35
+ /**
36
+ * Run the filter.
37
+ *
38
+ * @return bool
39
+ */
40
+ public function accept() {
41
+ $callback = $this->callback;
42
+
43
+ return call_user_func_array( $callback, array( parent::current(), parent::key(), parent::getInnerIterator() ) );
44
+ }
45
+
46
+ /**
47
+ * Get the children from iterator.
48
+ *
49
+ * @return Wppr_Recursive_Filter|RecursiveFilterIterator
50
+ */
51
+ public function getChildren() {
52
+ return new self( $this->getInnerIterator()->getChildren(), $this->callback );
53
+ }
54
+ }
55
+
docker-compose.yml ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.3'
2
+
3
+ services:
4
+ mysql:
5
+ image: mysql:5.7
6
+ volumes:
7
+ - ~/wp-product-review/db_data:/var/lib/mysql
8
+ restart: always
9
+ environment:
10
+ MYSQL_ROOT_PASSWORD: wordpress
11
+ MYSQL_DATABASE: wordpress
12
+ MYSQL_USER: wordpress
13
+ MYSQL_PASSWORD: wordpress
14
+
15
+ wordpress:
16
+ depends_on:
17
+ - mysql
18
+ image: hardeepasrani/pirate-brewery
19
+ ports:
20
+ - 8888:80
21
+ volumes:
22
+ - ~/wp-product-review/wordpress:/var/www/html/
23
+ - .:/var/www/html/wp-content/plugins/wp-product-review/
24
+ restart: always
25
+ environment:
26
+ WORDPRESS_DB_NAME: wordpress
27
+ WORDPRESS_DB_USER: wordpress
28
+ WORDPRESS_DB_PASSWORD: wordpress
29
+ WORDPRESS_DB_ROOT_PASSWORD: wordpress
30
+ WORDPRESS_DEBUG: 1
includes/admin/class-wppr-admin.php CHANGED
@@ -181,6 +181,43 @@ class WPPR_Admin {
181
  $render->retrive_template( 'upsell' );
182
  }
183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  /**
185
  * Method called from AJAX request to update options.
186
  *
@@ -208,6 +245,21 @@ class WPPR_Admin {
208
  die();
209
  }
210
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  /**
212
  * Method called from AJAX request to populate categories of specified post types.
213
  *
@@ -223,6 +275,48 @@ class WPPR_Admin {
223
  wp_die();
224
  }
225
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  /**
227
  * Method that returns the categories of specified post types.
228
  *
181
  $render->retrive_template( 'upsell' );
182
  }
183
 
184
+ /**
185
+ * Method called from AJAX request to reset comment ratings.
186
+ *
187
+ * @since ?
188
+ * @access public
189
+ */
190
+ public function reset_comment_ratings() {
191
+ $data = $_POST['cwppos_options'];
192
+
193
+ $nonce = $data[ count( $data ) - 1 ];
194
+ if ( ! isset( $nonce['name'] ) ) {
195
+ die( 'invalid nonce field' );
196
+ }
197
+ if ( $nonce['name'] != 'wppr_nonce_settings' ) {
198
+ die( 'invalid nonce name' );
199
+ }
200
+ if ( wp_verify_nonce( $nonce['value'], 'wppr_save_global_settings' ) != 1 ) {
201
+ die( 'invalid nonce value' );
202
+ }
203
+
204
+ $model = new WPPR_Query_Model();
205
+
206
+ $comment_influence = intval( $model->wppr_get_option( 'cwppos_infl_userreview' ) );
207
+
208
+ if ( 0 === $comment_influence ) {
209
+ die();
210
+ }
211
+
212
+ $ids = $model->find_all_reviews();
213
+ foreach ( $ids as $id ) {
214
+ $review = new WPPR_Review_Model( $id );
215
+ $review->update_comments_rating();
216
+ }
217
+
218
+ die();
219
+ }
220
+
221
  /**
222
  * Method called from AJAX request to update options.
223
  *
245
  die();
246
  }
247
 
248
+ /**
249
+ * Method called from AJAX request to populate taxonoy and terms of the specified post type.
250
+ *
251
+ * @since ?
252
+ * @access public
253
+ */
254
+ public function get_taxonomies() {
255
+ check_ajax_referer( WPPR_SLUG, 'nonce' );
256
+
257
+ if ( isset( $_POST['type'] ) ) {
258
+ echo wp_send_json_success( array( 'categories' => self::get_taxonomy_and_terms_for_post_type( $_POST['type'] ) ) );
259
+ }
260
+ wp_die();
261
+ }
262
+
263
  /**
264
  * Method called from AJAX request to populate categories of specified post types.
265
  *
275
  wp_die();
276
  }
277
 
278
+ /**
279
+ * Method that returns the taxonomy and terms of specified post type.
280
+ *
281
+ * @since ?
282
+ * @access public
283
+ */
284
+ public static function get_taxonomy_and_terms_for_post_type( $post_type ) {
285
+ $tax_terms = array();
286
+ if ( $post_type ) {
287
+ $categories = get_taxonomies(
288
+ array( 'object_type' => array( $post_type ), 'hierarchical' => true ),
289
+ 'objects'
290
+ );
291
+ $tags = get_taxonomies(
292
+ array( 'object_type' => array( $post_type ), 'hierarchical' => false ),
293
+ 'objects'
294
+ );
295
+ $taxonomies = array_merge( $categories, $tags );
296
+ if ( $taxonomies ) {
297
+ foreach ( $taxonomies as $tax ) {
298
+ $terms = get_terms(
299
+ $tax->name,
300
+ array(
301
+ 'hide_empty' => false,
302
+ )
303
+ );
304
+ if ( empty( $terms ) ) {
305
+ continue;
306
+ }
307
+ $categories = array();
308
+ foreach ( $terms as $term ) {
309
+ // we will prefix the slug with the name of the taxonomy so that we can use it in the query.
310
+ $categories[ $term->taxonomy . ':' . $term->slug ] = $term->name;
311
+ }
312
+ $tax_terms[ $tax->label ] = $categories;
313
+ }
314
+ }
315
+ }
316
+
317
+ return $tax_terms;
318
+ }
319
+
320
  /**
321
  * Method that returns the categories of specified post types.
322
  *
includes/admin/class-wppr-editor.php CHANGED
@@ -54,13 +54,20 @@ class WPPR_Editor {
54
  * @access public
55
  */
56
  public function set_editor() {
 
 
 
 
 
 
57
  add_meta_box(
58
  'wppr_editor_metabox',
59
  __( 'Product Review Extra Settings', 'wp-product-review' ),
60
  array(
61
  $this,
62
  'render_metabox',
63
- )
 
64
  );
65
  }
66
 
54
  * @access public
55
  */
56
  public function set_editor() {
57
+ $back_compat_meta_box = '';
58
+ if ( function_exists( 'register_block_type' ) ) {
59
+ $back_compat_meta_box = array(
60
+ '__back_compat_meta_box' => true,
61
+ );
62
+ }
63
  add_meta_box(
64
  'wppr_editor_metabox',
65
  __( 'Product Review Extra Settings', 'wp-product-review' ),
66
  array(
67
  $this,
68
  'render_metabox',
69
+ ),
70
+ $back_compat_meta_box
71
  );
72
  }
73
 
includes/admin/class-wppr-global-settings.php CHANGED
@@ -63,6 +63,7 @@ class WPPR_Global_Settings {
63
  'rating' => __( 'Rating colors', 'wp-product-review' ),
64
  'typography' => __( 'Typography', 'wp-product-review' ),
65
  'buy' => __( 'Buy button', 'wp-product-review' ),
 
66
  )
67
  );
68
  self::$instance->fields = apply_filters(
@@ -344,6 +345,16 @@ class WPPR_Global_Settings {
344
  'default' => '#FFFFFF',
345
  ),
346
  ),
 
 
 
 
 
 
 
 
 
 
347
  )
348
  );
349
 
63
  'rating' => __( 'Rating colors', 'wp-product-review' ),
64
  'typography' => __( 'Typography', 'wp-product-review' ),
65
  'buy' => __( 'Buy button', 'wp-product-review' ),
66
+ 'reset' => __( 'Reset Statistics', 'wp-product-review' ),
67
  )
68
  );
69
  self::$instance->fields = apply_filters(
345
  'default' => '#FFFFFF',
346
  ),
347
  ),
348
+ 'reset' => array(
349
+ 'cwppos_reset_comment_ratings' => array(
350
+ 'type' => 'button',
351
+ 'placeholder' => __( 'Recalculate', 'wp-product-review' ),
352
+ 'class' => 'wppr_reset_comment_ratings',
353
+ 'name' => __( 'Recalculate comment ratings', 'wp-product-review' ),
354
+ 'description' => __( 'Use this if the comment rating influence is being incorrectly determined and it needs to be recalculated. Use this only if \'Visitor Review Influence\' is enabled.', 'wp-product-review' ),
355
+ 'id' => 'reset_comment_ratings',
356
+ ),
357
+ ),
358
  )
359
  );
360
 
includes/admin/controllers/class-wppr-admin-render-controller.php CHANGED
@@ -132,6 +132,9 @@ class WPPR_Admin_Render_Controller {
132
  case 'icon_font':
133
  $output .= $this->html_helper->icon_font( $field );
134
  break;
 
 
 
135
  }
136
 
137
  $output .= '<p class="field_description">' . $field['description'] . '</p></div></div><hr/>';
132
  case 'icon_font':
133
  $output .= $this->html_helper->icon_font( $field );
134
  break;
135
+ case 'button':
136
+ $output .= $this->html_helper->button( $field );
137
+ break;
138
  }
139
 
140
  $output .= '<p class="field_description">' . $field['description'] . '</p></div></div><hr/>';
includes/admin/helpers/class-wppr-html-fields.php CHANGED
@@ -256,4 +256,26 @@ class WPPR_Html_Fields {
256
  $output = '<' . $type . ' class="' . $class . '">' . $args['placeholder'] . '</' . $type . '>';
257
  return apply_filters( 'wppr_field', $output, $args );
258
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  }
256
  $output = '<' . $type . ' class="' . $class . '">' . $args['placeholder'] . '</' . $type . '>';
257
  return apply_filters( 'wppr_field', $output, $args );
258
  }
259
+
260
+ /**
261
+ * Render a button.
262
+ *
263
+ * @since ?
264
+ * @access public
265
+ * @param array $args The settings of the input.
266
+ * @return mixed
267
+ */
268
+ public function button( $args ) {
269
+ $defaults = $this->define_defaults(
270
+ array(
271
+ 'class' => 'cwp_button',
272
+ 'type' => 'input',
273
+ 'subtype' => 'submit',
274
+ )
275
+ );
276
+ $args = wp_parse_args( $args, $defaults );
277
+ $class = $this->validate_class( $args['class'] );
278
+ $output = '<' . $args['type'] . ' type="' . esc_attr( $args['subtype'] ) . '" class="' . $class . '" name="' . esc_attr( $args['name'] ) . '" value="' . esc_attr( $args['placeholder'] ) . '">' . $args['placeholder'] . '</' . $args['type'] . '>';
279
+ return apply_filters( 'wppr_field', $output, $args );
280
+ }
281
  }
includes/admin/layouts/editor-default-tpl.php CHANGED
@@ -220,8 +220,8 @@ $check = $review->is_active() ? 'yes' : 'no';
220
  ?>
221
  </li>
222
  <?php
223
- }
224
- ?>
225
  <?php
226
  if ( ! empty( $links ) ) {
227
  if ( count( $links ) > 1 ) {
220
  ?>
221
  </li>
222
  <?php
223
+ }
224
+ ?>
225
  <?php
226
  if ( ! empty( $links ) ) {
227
  if ( count( $links ) > 1 ) {
includes/admin/layouts/widget-admin-tpl.php CHANGED
@@ -19,24 +19,56 @@
19
  <label for="<?php echo $this->get_field_id( 'no_items' ); ?>"><?php _e( 'Number of posts to show:', 'wp-product-review' ); ?></label>
20
  <input id="<?php echo $this->get_field_id( 'no_items' ); ?>" name="<?php echo $this->get_field_name( 'no_items' ); ?>" size="3" type="text" value="<?php echo esc_attr( $instance['no_items'] ); ?>" />
21
  </p>
 
 
 
 
22
  <p>
23
- <label for="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>"><?php _e( 'Post Types:', 'wp-product-review' ); ?></label>
24
- <select id="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>" name="<?php echo $this->get_field_name( 'cwp_tp_post_types' ); ?>[]" class="wppr-chosen wppr-post-types" data-wppr-cat-combo="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>" multiple>
25
- <?php
26
- foreach( get_post_types( '', 'objects' ) as $post_type ) {
27
  ?>
28
  <option value="<?php echo $post_type->name;?>" <?php echo in_array($post_type->name, $instance['cwp_tp_post_types']) ? 'selected' : '';?>><?php echo $post_type->label;?></option>
29
  <?php
30
- }
 
 
 
 
 
 
 
 
 
 
 
31
  ?>
32
- </select>
 
 
 
 
33
  </p>
 
 
 
 
 
 
 
34
 
35
  <p>
36
  <?php $all_cats = isset( $instance['cwp_tp_all_categories'] ) ? $instance['cwp_tp_all_categories'] : ''; ?>
37
- <label for="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>"><?php _e( 'Category:', 'wp-product-review' ); ?></label>
38
  <select id="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>" name="<?php echo $this->get_field_name( 'cwp_tp_category' ); ?>" class="wppr-chosen wppr-cats">
39
- <option>All</option>
 
 
 
 
 
 
40
  <?php
41
  if ( $all_cats ) {
42
  foreach ( $all_cats as $post_type => $cats ) {
@@ -57,6 +89,23 @@
57
  </select>
58
  <div class="spinner wppr-cat-spinner"></div>
59
  </p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  <?php
61
  if ( 'cwp_top_products_widget' === $this->id_base ) {
62
  $timespan = $instance['cwp_timespan'];
19
  <label for="<?php echo $this->get_field_id( 'no_items' ); ?>"><?php _e( 'Number of posts to show:', 'wp-product-review' ); ?></label>
20
  <input id="<?php echo $this->get_field_id( 'no_items' ); ?>" name="<?php echo $this->get_field_name( 'no_items' ); ?>" size="3" type="text" value="<?php echo esc_attr( $instance['no_items'] ); ?>" />
21
  </p>
22
+
23
+ <?php
24
+ if ( 'wppr_top_reviews_widget' === $this->id_base ) {
25
+ ?>
26
  <p>
27
+ <label for="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>"><?php _e( 'Post Type:', 'wp-product-review' ); ?></label>
28
+ <select id="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>" name="<?php echo $this->get_field_name( 'cwp_tp_post_types' ); ?>[]" class="wppr-chosen wppr-post-type" data-wppr-cat-combo="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>" >
29
+ <?php
30
+ foreach( get_post_types( '', 'objects' ) as $post_type ) {
31
  ?>
32
  <option value="<?php echo $post_type->name;?>" <?php echo in_array($post_type->name, $instance['cwp_tp_post_types']) ? 'selected' : '';?>><?php echo $post_type->label;?></option>
33
  <?php
34
+ }
35
+ ?>
36
+ </select>
37
+ </p>
38
+ <?php
39
+ } else {
40
+ ?>
41
+ <p>
42
+ <label for="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>"><?php _e( 'Post Types:', 'wp-product-review' ); ?></label>
43
+ <select id="<?php echo $this->get_field_id( 'cwp_tp_post_types' ); ?>" name="<?php echo $this->get_field_name( 'cwp_tp_post_types' ); ?>[]" class="wppr-chosen wppr-post-types" data-wppr-cat-combo="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>" multiple>
44
+ <?php
45
+ foreach( get_post_types( '', 'objects' ) as $post_type ) {
46
  ?>
47
+ <option value="<?php echo $post_type->name;?>" <?php echo in_array($post_type->name, $instance['cwp_tp_post_types']) ? 'selected' : '';?>><?php echo $post_type->label;?></option>
48
+ <?php
49
+ }
50
+ ?>
51
+ </select>
52
  </p>
53
+ <?php
54
+ }
55
+ ?>
56
+
57
+ <?php
58
+ $category_heading = 'wppr_top_reviews_widget' === $this->id_base ? __( 'Taxonomy:', 'wp-product-review' ) : __( 'Category:', 'wp-product-review' ) ;
59
+ ?>
60
 
61
  <p>
62
  <?php $all_cats = isset( $instance['cwp_tp_all_categories'] ) ? $instance['cwp_tp_all_categories'] : ''; ?>
63
+ <label for="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>"><?php echo $category_heading; ?></label>
64
  <select id="<?php echo $this->get_field_id( 'cwp_tp_category' ); ?>" name="<?php echo $this->get_field_name( 'cwp_tp_category' ); ?>" class="wppr-chosen wppr-cats">
65
+ <?php
66
+ if ( 'wppr_top_reviews_widget' !== $this->id_base ) {
67
+ ?>
68
+ <option>All</option>
69
+ <?php
70
+ }
71
+ ?>
72
  <?php
73
  if ( $all_cats ) {
74
  foreach ( $all_cats as $post_type => $cats ) {
89
  </select>
90
  <div class="spinner wppr-cat-spinner"></div>
91
  </p>
92
+
93
+ <?php
94
+ if ( 'wppr_top_reviews_widget' === $this->id_base ) {
95
+ $from = $instance['cwp_timespan_from'];
96
+ $to = $instance['cwp_timespan_to'];
97
+ ?>
98
+ <p>
99
+ <label for="<?php echo $this->get_field_id( 'cwp_timespan_from' ); ?>"><?php _e( 'Posts published between:', 'wp-product-review' ); ?></label>
100
+ <br/>
101
+ <input type="text" id="<?php echo $this->get_field_id( 'cwp_timespan_from' ); ?>" class="wppr-datepicker" name="<?php echo $this->get_field_name( 'cwp_timespan_from' ); ?>" value="<?php echo $from; ?>" size="10">
102
+ <input type="text" id="<?php echo $this->get_field_id( 'cwp_timespan_to' ); ?>" class="wppr-datepicker" name="<?php echo $this->get_field_name( 'cwp_timespan_to' ); ?>" value="<?php echo $to; ?>" size="10">
103
+ <br/>
104
+ </p>
105
+ <?php
106
+ }
107
+ ?>
108
+
109
  <?php
110
  if ( 'cwp_top_products_widget' === $this->id_base ) {
111
  $timespan = $instance['cwp_timespan'];
includes/admin/models/class-wppr-query-model.php CHANGED
@@ -198,6 +198,9 @@ class WPPR_Query_Model extends WPPR_Model_Abstract {
198
  }
199
 
200
  $category = 'yes' === $this->wppr_get_option( 'wppr_cpt' ) ? 'wppr_category' : 'category';
 
 
 
201
  $sub_selection_query = "INNER JOIN {$this->db->term_relationships } wtr ON wtr.object_id = p.ID
202
  INNER JOIN {$this->db->term_taxonomy} wtt on wtt.term_taxonomy_id = wtr.term_taxonomy_id AND wtt.taxonomy = '$category'
203
  INNER JOIN {$this->db->terms} wt
@@ -299,6 +302,17 @@ class WPPR_Query_Model extends WPPR_Model_Abstract {
299
  $sub_query_conditions .= $this->db->prepare( ' AND p.post_date >= DATE_ADD(now(), INTERVAL %d WEEK) AND p.post_date <= DATE_ADD(now(), INTERVAL %d WEEK) ', $min, $max );
300
  }
301
 
 
 
 
 
 
 
 
 
 
 
 
302
  $sub_query_conditions .= apply_filters( 'wppr_where_sub_clause', '', $post );
303
 
304
  return $sub_query_conditions;
@@ -390,4 +404,43 @@ class WPPR_Query_Model extends WPPR_Model_Abstract {
390
  )
391
  );
392
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
393
  }
198
  }
199
 
200
  $category = 'yes' === $this->wppr_get_option( 'wppr_cpt' ) ? 'wppr_category' : 'category';
201
+ if ( isset( $post['taxonomy_name'] ) ) {
202
+ $category = $post['taxonomy_name'];
203
+ }
204
  $sub_selection_query = "INNER JOIN {$this->db->term_relationships } wtr ON wtr.object_id = p.ID
205
  INNER JOIN {$this->db->term_taxonomy} wtt on wtt.term_taxonomy_id = wtr.term_taxonomy_id AND wtt.taxonomy = '$category'
206
  INNER JOIN {$this->db->terms} wt
302
  $sub_query_conditions .= $this->db->prepare( ' AND p.post_date >= DATE_ADD(now(), INTERVAL %d WEEK) AND p.post_date <= DATE_ADD(now(), INTERVAL %d WEEK) ', $min, $max );
303
  }
304
 
305
+ if ( isset( $post['post_date_range'] ) && ! is_bool( $post['post_date_range'] ) && is_array( $post['post_date_range'] ) ) {
306
+ $min = reset( $post['post_date_range'] );
307
+ $max = end( $post['post_date_range'] );
308
+ if ( ! empty( $min ) ) {
309
+ $sub_query_conditions .= $this->db->prepare( ' AND p.post_date >= %s ', $min );
310
+ }
311
+ if ( ! empty( $max ) ) {
312
+ $sub_query_conditions .= $this->db->prepare( ' AND p.post_date <= %s ', $max );
313
+ }
314
+ }
315
+
316
  $sub_query_conditions .= apply_filters( 'wppr_where_sub_clause', '', $post );
317
 
318
  return $sub_query_conditions;
404
  )
405
  );
406
  }
407
+
408
+ /**
409
+ * Utility method to find all reviews.
410
+ *
411
+ * @since ?
412
+ * @access public
413
+ *
414
+ * @return array
415
+ */
416
+ public function find_all_reviews() {
417
+ $type = apply_filters( 'wppr_find_all_reviews_post_types', ( 'yes' === $this->wppr_get_option( 'wppr_cpt' ) ? array( 'wppr_review' ) : array( 'post', 'page' ) ) );
418
+ $query = new WP_Query(
419
+ apply_filters(
420
+ 'wppr_find_all_reviews', array(
421
+ 'post_type' => $type,
422
+ 'post_status' => 'publish',
423
+ 'fields' => 'ids',
424
+ 'nopaging' => true,
425
+ 'posts_per_page' => 300,
426
+ 'meta_query' => array(
427
+ array(
428
+ 'key' => 'cwp_meta_box_check',
429
+ 'value' => 'Yes',
430
+ ),
431
+ ),
432
+ )
433
+ )
434
+ );
435
+
436
+ $reviews = array();
437
+ if ( $query->have_posts() ) {
438
+ while ( $query->have_posts() ) {
439
+ $query->the_post();
440
+ $reviews[] = $query->post;
441
+ }
442
+ wp_reset_postdata();
443
+ }
444
+ return $reviews;
445
+ }
446
  }
includes/admin/widgets/abstract/class-wppr-widget-abstract.php CHANGED
@@ -59,7 +59,11 @@ abstract class WPPR_Widget_Abstract extends WP_Widget {
59
  $instance['no_items'] = apply_filters( 'widget_content', $instance['no_items'] );
60
 
61
  if ( ! isset( $instance['cwp_tp_post_types'] ) || empty( $instance['cwp_tp_post_types'] ) ) {
62
- $instance['cwp_tp_post_types'] = array( 'post', 'page' );
 
 
 
 
63
  }
64
 
65
  $instance['cwp_tp_post_types'] = apply_filters( 'widget_content', $instance['cwp_tp_post_types'] );
@@ -161,16 +165,24 @@ abstract class WPPR_Widget_Abstract extends WP_Widget {
161
 
162
  if ( ! isset( $instance['cwp_tp_post_types'] ) || empty( $instance['cwp_tp_post_types'] ) ) {
163
  // backward compatibility with previous versions where you could not select post types
164
- $instance['cwp_tp_post_types'] = array( 'post', 'page' );
 
 
 
 
165
  }
166
 
167
  if ( isset( $instance['cwp_tp_post_types'] ) && ! empty( $instance['cwp_tp_post_types'] ) ) {
168
  $categories = array();
169
  foreach ( $instance['cwp_tp_post_types'] as $type ) {
170
- $post_type = get_post_type_object( $type );
171
- $cats = WPPR_Admin::get_category_for_post_type( $type );
172
- if ( $cats ) {
173
- $categories[ $post_type->label ] = $cats;
 
 
 
 
174
  }
175
  }
176
  $instance['cwp_tp_all_categories'] = $categories;
@@ -233,7 +245,7 @@ abstract class WPPR_Widget_Abstract extends WP_Widget {
233
  WPPR_SLUG . '-widget-script',
234
  'wppr_widget',
235
  array(
236
- 'names' => array( 'cwp_top_products_widget', 'cwp_latest_products_widget' ),
237
  'ajax' => array(
238
  'nonce' => wp_create_nonce( WPPR_SLUG ),
239
  ),
59
  $instance['no_items'] = apply_filters( 'widget_content', $instance['no_items'] );
60
 
61
  if ( ! isset( $instance['cwp_tp_post_types'] ) || empty( $instance['cwp_tp_post_types'] ) ) {
62
+ $types = array( 'post', 'page' );
63
+ if ( 'wppr_top_reviews_widget' === $this->id_base ) {
64
+ $types = array( 'post' );
65
+ }
66
+ $instance['cwp_tp_post_types'] = $types;
67
  }
68
 
69
  $instance['cwp_tp_post_types'] = apply_filters( 'widget_content', $instance['cwp_tp_post_types'] );
165
 
166
  if ( ! isset( $instance['cwp_tp_post_types'] ) || empty( $instance['cwp_tp_post_types'] ) ) {
167
  // backward compatibility with previous versions where you could not select post types
168
+ $types = array( 'post', 'page' );
169
+ if ( 'wppr_top_reviews_widget' === $this->id_base ) {
170
+ $types = array( 'post' );
171
+ }
172
+ $instance['cwp_tp_post_types'] = $types;
173
  }
174
 
175
  if ( isset( $instance['cwp_tp_post_types'] ) && ! empty( $instance['cwp_tp_post_types'] ) ) {
176
  $categories = array();
177
  foreach ( $instance['cwp_tp_post_types'] as $type ) {
178
+ if ( 'wppr_top_reviews_widget' === $this->id_base ) {
179
+ $categories = WPPR_Admin::get_taxonomy_and_terms_for_post_type( $type );
180
+ } else {
181
+ $post_type = get_post_type_object( $type );
182
+ $cats = WPPR_Admin::get_category_for_post_type( $type );
183
+ if ( $cats ) {
184
+ $categories[ $post_type->label ] = $cats;
185
+ }
186
  }
187
  }
188
  $instance['cwp_tp_all_categories'] = $categories;
245
  WPPR_SLUG . '-widget-script',
246
  'wppr_widget',
247
  array(
248
+ 'names' => array( 'cwp_top_products_widget', 'cwp_latest_products_widget', 'wppr_top_reviews_widget' ),
249
  'ajax' => array(
250
  'nonce' => wp_create_nonce( WPPR_SLUG ),
251
  ),
includes/admin/widgets/class-wppr-latest-products-widget.php CHANGED
@@ -23,9 +23,9 @@ class WPPR_Latest_Products_Widget extends WPPR_Widget_Abstract {
23
  public function __construct() {
24
  parent::__construct(
25
  'cwp_latest_products_widget',
26
- __( 'Latest Products Widget', 'wp-product-review' ),
27
  array(
28
- 'description' => __( 'This widget displays the latest products based on their rating.', 'wp-product-review' ),
29
  )
30
  );
31
  }
@@ -104,7 +104,7 @@ class WPPR_Latest_Products_Widget extends WPPR_Widget_Abstract {
104
  public function form( $instance ) {
105
  $this->adminAssets();
106
  if ( ! isset( $instance['title'] ) ) {
107
- $instance['title'] = __( 'Latest Products', 'wp-product-review' );
108
  }
109
 
110
  $instance = parent::form( $instance );
23
  public function __construct() {
24
  parent::__construct(
25
  'cwp_latest_products_widget',
26
+ __( 'Latest Reviews Widget', 'wp-product-review' ),
27
  array(
28
+ 'description' => __( 'This widget displays the latest reviews based on their rating.', 'wp-product-review' ),
29
  )
30
  );
31
  }
104
  public function form( $instance ) {
105
  $this->adminAssets();
106
  if ( ! isset( $instance['title'] ) ) {
107
+ $instance['title'] = __( 'Latest Review', 'wp-product-review' );
108
  }
109
 
110
  $instance = parent::form( $instance );
includes/admin/widgets/class-wppr-top-products-widget.php CHANGED
@@ -23,9 +23,9 @@ class WPPR_Top_Products_Widget extends WPPR_Widget_Abstract {
23
  public function __construct() {
24
  parent::__construct(
25
  'cwp_top_products_widget',
26
- __( 'Top Products Widget', 'wp-product-review' ),
27
  array(
28
- 'description' => __( 'This widget displays the top products based on their rating.', 'wp-product-review' ),
29
  )
30
  );
31
  }
23
  public function __construct() {
24
  parent::__construct(
25
  'cwp_top_products_widget',
26
+ __( 'Top Products Widget (Deprecated)', 'wp-product-review' ),
27
  array(
28
+ 'description' => __( 'This widget displays the top products based on their rating. This widget is deprecated and will be removed in a future release.', 'wp-product-review' ),
29
  )
30
  );
31
  }
includes/admin/widgets/class-wppr-top-reviews-widget.php ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The WPPR Top Reviews Widget Class.
4
+ *
5
+ * @package WPPR
6
+ * @subpackage Widget
7
+ * @copyright Copyright (c) 2017, Bogdan Preda
8
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9
+ * @since 3.1.1
10
+ */
11
+
12
+ /**
13
+ * Class WPPR_Top_Reviews_Widget
14
+ */
15
+ class WPPR_Top_Reviews_Widget extends WPPR_Widget_Abstract {
16
+
17
+ /**
18
+ * WPPR_Top_Reviews_Widget constructor.
19
+ *
20
+ * @since 3.0.0
21
+ * @access public
22
+ */
23
+ public function __construct() {
24
+ parent::__construct(
25
+ 'wppr_top_reviews_widget',
26
+ __( 'Top Review Widget', 'wp-product-review' ),
27
+ array(
28
+ 'description' => __( 'This widget displays the top reviews based on the rating.', 'wp-product-review' ),
29
+ )
30
+ );
31
+ }
32
+
33
+ /**
34
+ * Method to register the widget.
35
+ *
36
+ * @since 3.0.0
37
+ * @access public
38
+ */
39
+ public function register() {
40
+ register_widget( 'WPPR_Top_Reviews_Widget' );
41
+ }
42
+
43
+ /**
44
+ * Method to filter posts order.
45
+ *
46
+ * @since 3.0.0
47
+ * @access public
48
+ *
49
+ * @param string $orderby The condition string for ordering.
50
+ *
51
+ * @return string
52
+ */
53
+ public function custom_order_by( $orderby ) {
54
+ return 'mt1.meta_value DESC, mt2.meta_value+0 DESC';
55
+ }
56
+
57
+ /**
58
+ * Method for displaying the widget on the front end.
59
+ *
60
+ * @since 3.0.0
61
+ * @access public
62
+ *
63
+ * @param array $args Arguments for this method.
64
+ * @param array $instance Instance array for the widget.
65
+ *
66
+ * @return mixed
67
+ */
68
+ public function widget( $args, $instance ) {
69
+
70
+ $instance = parent::widget( $args, $instance );
71
+
72
+ $reviews = new WPPR_Query_Model();
73
+ $post = array();
74
+ if ( isset( $instance['cwp_tp_category'] ) && trim( $instance['cwp_tp_category'] ) != '' ) {
75
+ $array = explode( ':', $instance['cwp_tp_category'] );
76
+ $post['category_name'] = $array[1];
77
+ $post['taxonomy_name'] = $array[0];
78
+ }
79
+
80
+ $dates = array('', '');
81
+ if ( isset( $instance['cwp_timespan_from'] ) && ! empty( $instance['cwp_timespan_from'] ) ) {
82
+ $dates[0] = $instance['cwp_timespan_from'];
83
+ }
84
+ if ( isset( $instance['cwp_timespan_to'] ) && ! empty( $instance['cwp_timespan_to'] ) ) {
85
+ $dates[1] = $instance['cwp_timespan_to'];
86
+ }
87
+ $post['post_date_range'] = $dates;
88
+
89
+ if ( isset( $instance['cwp_tp_post_types'] ) && ! empty( $instance['cwp_tp_post_types'] ) ) {
90
+ $post['post_type'] = $instance['cwp_tp_post_types'];
91
+ }
92
+ $order = array();
93
+ $order['rating'] = 'DESC';
94
+
95
+ $results = $reviews->find( $post, $instance['no_items'], array(), $order );
96
+ if ( ! empty( $results ) ) {
97
+ $first = reset( $results );
98
+ $first = isset( $first['ID'] ) ? $first['ID'] : 0;
99
+ $review = new WPPR_Review_Model( $first );
100
+
101
+ $this->assets( $review );
102
+ }
103
+ // before and after widget arguments are defined by themes
104
+ echo $args['before_widget'];
105
+
106
+ if ( ! empty( $instance['title'] ) ) {
107
+ echo $args['before_title'] . $instance['title'] . $args['after_title'];
108
+ }
109
+ $template = new WPPR_Template();
110
+ $template->render(
111
+ 'widget/' . $instance['cwp_tp_layout'],
112
+ array(
113
+ 'results' => $results,
114
+ 'title_length' => self::RESTRICT_TITLE_CHARS,
115
+ 'instance' => $instance,
116
+ )
117
+ );
118
+ echo $args['after_widget'];
119
+ }
120
+
121
+ /**
122
+ * The admin widget form method.
123
+ *
124
+ * @since 3.0.0
125
+ * @access public
126
+ *
127
+ * @param array $instance The instance array for this widget.
128
+ *
129
+ * @return mixed
130
+ */
131
+ public function form( $instance ) {
132
+ $this->adminAssets();
133
+ if ( ! isset( $instance['title'] ) ) {
134
+ $instance['title'] = __( 'Top Reviews', 'wp-product-review' );
135
+ }
136
+
137
+ if ( ! isset( $instance['cwp_timespan_from'] ) || empty( $instance['cwp_timespan_from'] ) ) {
138
+ $instance['cwp_timespan_from'] = '';
139
+ }
140
+
141
+ if ( ! isset( $instance['cwp_timespan_to'] ) || empty( $instance['cwp_timespan_to'] ) ) {
142
+ $instance['cwp_timespan_to'] = '';
143
+ }
144
+
145
+ $instance = parent::form( $instance );
146
+
147
+ include( WPPR_PATH . '/includes/admin/layouts/widget-admin-tpl.php' );
148
+ }
149
+
150
+ /**
151
+ * Load public assets specific to this widget.
152
+ *
153
+ * @since 3.0.0
154
+ * @access public
155
+ */
156
+ public function load_assets() {
157
+ // empty.
158
+ }
159
+
160
+ /**
161
+ * Load admin assets specific to this widget.
162
+ *
163
+ * @since 3.0.0
164
+ * @access public
165
+ */
166
+ public function load_admin_assets() {
167
+ wp_enqueue_script( 'jquery-ui-slider' );
168
+ wp_enqueue_script( 'jquery-ui-datepicker' );
169
+ wp_enqueue_style( WPPR_SLUG . '-jqueryui', WPPR_URL . '/assets/css/jquery-ui.css', array(), WPPR_LITE_VERSION );
170
+
171
+ $deps = array();
172
+ $deps['js'] = array( 'jquery-ui-slider', 'jquery-ui-datepicker' );
173
+ $deps['css'] = array( WPPR_SLUG . '-jqueryui' );
174
+ return $deps;
175
+ }
176
+
177
+ /**
178
+ * Method to update widget data.
179
+ *
180
+ * @since 3.0.0
181
+ * @access public
182
+ *
183
+ * @param array $new_instance The new instance array for the widget.
184
+ * @param array $old_instance The old instance array of the widget.
185
+ *
186
+ * @return array
187
+ */
188
+ public function update( $new_instance, $old_instance ) {
189
+ $instance = parent::update( $new_instance, $old_instance );
190
+
191
+ $instance['cwp_timespan_from'] = ( ! empty( $new_instance['cwp_timespan_from'] ) ) ? strip_tags( $new_instance['cwp_timespan_from'] ) : '';
192
+ $instance['cwp_timespan_to'] = ( ! empty( $new_instance['cwp_timespan_to'] ) ) ? strip_tags( $new_instance['cwp_timespan_to'] ) : '';
193
+ return $instance;
194
+ }
195
+
196
+ }
includes/class-wppr.php CHANGED
@@ -67,7 +67,7 @@ class WPPR {
67
  */
68
  public function __construct() {
69
  $this->plugin_name = 'wppr';
70
- $this->version = '3.4.10';
71
 
72
  $this->load_dependencies();
73
  $this->set_locale();
@@ -133,6 +133,9 @@ class WPPR {
133
  $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
134
  $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
135
  $this->loader->add_action( 'wp_ajax_update_options', $plugin_admin, 'update_options' );
 
 
 
136
  $this->loader->add_action( 'load-edit.php', $plugin_admin, 'get_additional_fields' );
137
  $this->loader->add_action( 'wppr_settings_section_upsell', $plugin_admin, 'settings_section_upsell', 10, 1 );
138
  $this->loader->add_action( 'after_setup_theme', $plugin_admin, 'add_image_size' );
@@ -146,8 +149,12 @@ class WPPR {
146
  $plugin_widget_latest = new WPPR_Latest_Products_Widget();
147
  $this->loader->add_action( 'widgets_init', $plugin_widget_latest, 'register' );
148
 
149
- $plugin_widget_top = new WPPR_Top_Products_Widget();
 
 
 
150
  $this->loader->add_action( 'widgets_init', $plugin_widget_top, 'register' );
 
151
  }
152
 
153
  /**
@@ -292,6 +299,31 @@ class WPPR {
292
  )
293
  );
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  flush_rewrite_rules();
296
 
297
  }
67
  */
68
  public function __construct() {
69
  $this->plugin_name = 'wppr';
70
+ $this->version = '3.5.0';
71
 
72
  $this->load_dependencies();
73
  $this->set_locale();
133
  $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
134
  $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
135
  $this->loader->add_action( 'wp_ajax_update_options', $plugin_admin, 'update_options' );
136
+ $this->loader->add_action( 'wp_ajax_get_taxonomies', $plugin_admin, 'get_taxonomies' );
137
+ $this->loader->add_action( 'wp_ajax_get_categories', $plugin_admin, 'get_categories' );
138
+ $this->loader->add_action( 'wp_ajax_reset_comment_ratings', $plugin_admin, 'reset_comment_ratings' );
139
  $this->loader->add_action( 'load-edit.php', $plugin_admin, 'get_additional_fields' );
140
  $this->loader->add_action( 'wppr_settings_section_upsell', $plugin_admin, 'settings_section_upsell', 10, 1 );
141
  $this->loader->add_action( 'after_setup_theme', $plugin_admin, 'add_image_size' );
149
  $plugin_widget_latest = new WPPR_Latest_Products_Widget();
150
  $this->loader->add_action( 'widgets_init', $plugin_widget_latest, 'register' );
151
 
152
+ $plugin_widget_old_top = new WPPR_Top_Products_Widget();
153
+ $this->loader->add_action( 'widgets_init', $plugin_widget_old_top, 'register' );
154
+
155
+ $plugin_widget_top = new WPPR_Top_Reviews_Widget();
156
  $this->loader->add_action( 'widgets_init', $plugin_widget_top, 'register' );
157
+
158
  }
159
 
160
  /**
299
  )
300
  );
301
 
302
+ register_taxonomy(
303
+ 'wppr_tag',
304
+ 'wppr_review',
305
+ array(
306
+ 'hierarchical' => false,
307
+ 'labels' => array(
308
+ 'name' => __( 'Review Tag', 'wp-product-review' ),
309
+ 'singular_name' => __( 'Review Tag', 'wp-product-review' ),
310
+ 'search_items' => __( 'Search Review Tags', 'wp-product-review' ),
311
+ 'all_items' => __( 'All Review Tags', 'wp-product-review' ),
312
+ 'parent_item' => __( 'Parent Review Tag', 'wp-product-review' ),
313
+ 'parent_item_colon' => __( 'Parent Review Tag', 'wp-product-review' ) . ':',
314
+ 'edit_item' => __( 'Edit Review Tag', 'wp-product-review' ),
315
+ 'update_item' => __( 'Update Review Tag', 'wp-product-review' ),
316
+ 'add_new_item' => __( 'Add New Review Tag', 'wp-product-review' ),
317
+ 'new_item_name' => __( 'New Review Tag', 'wp-product-review' ),
318
+ 'menu_name' => __( 'Review Tags', 'wp-product-review' ),
319
+ ),
320
+ 'show_admin_column' => true,
321
+ 'public' => true,
322
+ 'show_in_menu' => true,
323
+ 'rewrite' => array( 'slug' => 'wpprtag', 'with_front' => true ),
324
+ )
325
+ );
326
+
327
  flush_rewrite_rules();
328
 
329
  }
includes/functions.php CHANGED
@@ -83,7 +83,6 @@ if ( ! function_exists( 'wppr_display_rating_custom_icon' ) ) {
83
  * Display the custom icon rating.
84
  */
85
  function wppr_display_rating_custom_icon( $template, $review_object ) {
86
- $review_rating = $review_object->get_rating();
87
  ?>
88
  <div id="review-statistics">
89
  <div class="review-wu-bars">
@@ -102,46 +101,21 @@ if ( ! function_exists( 'wppr_display_rating_custom_icon' ) ) {
102
  }
103
  }
104
 
105
-
106
- if ( ! function_exists( 'wppr_default_get_image' ) ) {
107
-
108
- /**
109
- * Display the imaage for the default template.
110
- */
111
- function wppr_default_get_image( $review_object ) {
112
- $links = $review_object->get_links();
113
- $links = array_filter( $links );
114
- $image_link = reset( $links );
115
- $lightbox = '';
116
- if ( $review_object->get_click() == 'image' ) {
117
- $lightbox = 'data-lightbox="' . esc_url( $review_object->get_small_thumbnail() ) . '"';
118
- $image_link = $review_object->get_image();
119
- }
120
- ?>
121
- <div class="rev-wu-image">
122
- <a class="wppr-default-img" href="<?php echo esc_url( $image_link ); ?>" <?php echo $lightbox; ?> rel="nofollow" target="_blank">
123
- <img
124
- src="<?php echo esc_attr( $review_object->get_small_thumbnail() ); ?>"
125
- alt="<?php echo esc_attr( $review_object->get_name() ); ?>"
126
- class="photo photo-wrapup wppr-product-image"/>
127
- </a>
128
- </div><!-- end .rev-wu-image -->
129
- <?php
130
- }
131
- }
132
-
133
- if ( ! function_exists( 'wppr_default_get_rating' ) ) {
134
 
135
  /**
136
- * Display the rating for the default template.
137
  */
138
- function wppr_default_get_rating( $review_object ) {
139
  $rating = round( $review_object->get_rating() );
140
  $rating_10 = round( $review_object->get_rating(), 0 ) / 10;
 
 
 
141
  ?>
142
- <div class="review-wu-grade">
143
  <div class="review-wu-grade-content">
144
- <div class="wppr-c100 wppr-p<?php echo esc_attr( $rating ) . ' ' . $review_object->get_rating_class(); ?>">
145
  <span><?php echo esc_html( $rating_10 ); ?></span>
146
  <div class="wppr-slice">
147
  <div class="wppr-bar" style="<?php echo apply_filters( 'wppr_rating_circle_bar_styles', '', $rating ); ?>"></div>
@@ -150,11 +124,258 @@ if ( ! function_exists( 'wppr_default_get_rating' ) ) {
150
  <div class="wppr-slice-center"></div>
151
  </div>
152
  </div>
153
- </div><!-- end .review-wu-grade -->
 
 
 
 
 
 
 
 
 
 
154
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  }
156
  }
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  if ( function_exists( 'register_block_type' ) ) {
159
  WPPR_Gutenberg::get_instance();
160
  }
83
  * Display the custom icon rating.
84
  */
85
  function wppr_display_rating_custom_icon( $template, $review_object ) {
 
86
  ?>
87
  <div id="review-statistics">
88
  <div class="review-wu-bars">
101
  }
102
  }
103
 
104
+ if ( ! function_exists( 'wppr_layout_get_rating' ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
  /**
107
+ * Display the rating of the given type.
108
  */
109
+ function wppr_layout_get_rating( $review_object, $type, $template, $div_class = '', $include_author = false ) {
110
  $rating = round( $review_object->get_rating() );
111
  $rating_10 = round( $review_object->get_rating(), 0 ) / 10;
112
+
113
+ switch ( $type ) {
114
+ case 'donut':
115
  ?>
116
+ <div class="<?php echo $div_class; ?>">
117
  <div class="review-wu-grade-content">
118
+ <div class="wppr-c100 wppr-p<?php echo esc_attr( $rating ) . ' ' . esc_attr( $review_object->get_rating_class() ); ?>">
119
  <span><?php echo esc_html( $rating_10 ); ?></span>
120
  <div class="wppr-slice">
121
  <div class="wppr-bar" style="<?php echo apply_filters( 'wppr_rating_circle_bar_styles', '', $rating ); ?>"></div>
124
  <div class="wppr-slice-center"></div>
125
  </div>
126
  </div>
127
+ </div>
128
+ <?php
129
+ break;
130
+
131
+ case 'number':
132
+ ?>
133
+ <span class="wppr-review-rating-grade wppr-p<?php echo esc_attr( $rating ) . ' ' . $review_object->get_rating_class(); ?>">
134
+ <?php
135
+ echo esc_html( $rating_10 );
136
+ ?>
137
+ </span>
138
  <?php
139
+ break;
140
+
141
+ case 'stars':
142
+ wppr_display_rating_stars( $template, $review_object, $include_author );
143
+ break;
144
+ }
145
+ }
146
+ }
147
+
148
+
149
+ if ( ! function_exists( 'wppr_layout_get_image' ) ) {
150
+ /**
151
+ * Display the image for the review.
152
+ */
153
+ function wppr_layout_get_image( $review_object, $class_a = '', $class_img = '' ) {
154
+ $src = $review_object->get_small_thumbnail();
155
+ if ( empty( $src ) ) {
156
+ return;
157
+ }
158
+
159
+ $links = $review_object->get_links();
160
+ $links = array_filter( $links );
161
+ $image_link = reset( $links );
162
+ $lightbox = '';
163
+ if ( $review_object->get_click() == 'image' ) {
164
+ $lightbox = 'data-lightbox="' . esc_url( $src ) . '"';
165
+ $image_link = $review_object->get_image();
166
+ }
167
+ ?>
168
+ <a title="<?php echo $review_object->get_name(); ?>" class="<?php echo $class_a; ?>" href="<?php echo esc_url( $image_link ); ?>" <?php echo $lightbox; ?> rel="nofollow" target="_blank">
169
+ <img
170
+ src="<?php echo esc_attr( $src ); ?>"
171
+ alt="<?php echo esc_attr( $review_object->get_image_alt() ); ?>"
172
+ class="<?php echo $class_img; ?>"/>
173
+ </a>
174
+ <?php
175
+ }
176
+ }
177
+
178
+ if ( ! function_exists( 'wppr_layout_get_pros' ) ) {
179
+ /**
180
+ * Display the pros for the review.
181
+ */
182
+ function wppr_layout_get_pros( $review_object, $class_div = '', $heading_type, $class_heading = '' ) {
183
+ $pros = $review_object->get_pros();
184
+ wppr_layout_get_proscons( $review_object, $pros, 'pro', $class_div, $heading_type, $class_heading );
185
+ }
186
+ }
187
+
188
+ if ( ! function_exists( 'wppr_layout_get_cons' ) ) {
189
+ /**
190
+ * Display the cons for the review.
191
+ */
192
+ function wppr_layout_get_cons( $review_object, $class_div = '', $heading_type, $class_heading = '' ) {
193
+ $cons = $review_object->get_cons();
194
+ wppr_layout_get_proscons( $review_object, $cons, 'con', $class_div, $heading_type, $class_heading );
195
+ }
196
+ }
197
+
198
+ if ( ! function_exists( 'wppr_layout_get_proscons' ) ) {
199
+ /**
200
+ * Display the pros/cons for the review.
201
+ */
202
+ function wppr_layout_get_proscons( $review_object, $pro_cons, $type, $class_div, $heading_type, $class_heading = '' ) {
203
+ if ( empty( $pro_cons ) ) {
204
+ return;
205
+ }
206
+ ?>
207
+ <div class="<?php echo $class_div; ?> <?php echo $type; ?>s">
208
+ <<?php echo $heading_type; ?> class="<?php echo $class_heading; ?>">
209
+ <?php echo esc_html( apply_filters( "wppr_review_{$type}s_text", $review_object->wppr_get_option( "cwppos_{$type}s_text" ) ) ); ?>
210
+ </<?php echo $heading_type; ?>>
211
+ <ul>
212
+ <?php
213
+ foreach ( $pro_cons as $text ) {
214
+ ?>
215
+ <li><?php echo esc_html( $text ); ?></li>
216
+ <?php
217
+ }
218
+ ?>
219
+ </ul>
220
+ </div>
221
+ <?php
222
+ }
223
+ }
224
+
225
+ if ( ! function_exists( 'wppr_layout_get_user_rating' ) ) {
226
+ /**
227
+ * Display the user rating/score/votes.
228
+ */
229
+ function wppr_layout_get_user_rating( $review_object ) {
230
+ if ( $review_object->wppr_get_option( 'cwppos_show_userreview' ) !== 'yes' ) {
231
+ return;
232
+ }
233
+ $comments_rating = $review_object->get_comments_rating();
234
+ $number_comments = count( $review_object->get_comments_options() );
235
+ ?>
236
+ <span class="wppr-review-rating-users wppr-p<?php echo esc_attr( round( $comments_rating ) ) . ' ' . $review_object->get_rating_class( $comments_rating ); ?>">
237
+ <span dir="<?php echo is_rtl() ? 'rtl' : ''; ?>">
238
+ <?php echo sprintf( __( 'Users score: %1$d with %2$d votes', 'wp-product-review' ), $comments_rating, $number_comments ); ?>
239
+ </span>
240
+ </span>
241
+ <?php
242
  }
243
  }
244
 
245
+ if ( ! function_exists( 'wppr_layout_get_options_ratings' ) ) {
246
+ /**
247
+ * Display the option ratings.
248
+ */
249
+ function wppr_layout_get_options_ratings( $review_object, $type ) {
250
+ switch ( $type ) {
251
+ case 'dashes':
252
+ ?>
253
+ <div class="review-wu-bars">
254
+ <?php
255
+ foreach ( $review_object->get_options() as $option ) {
256
+ $class_ul = $review_object->get_rating_class( $option['value'] ) . apply_filters( 'wppr_option_custom_icon', '' );
257
+ ?>
258
+ <div class="rev-option" data-value="<?php echo $option['value']; ?>">
259
+ <div class="cwpr_clearfix">
260
+ <span>
261
+ <h3><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></h3>
262
+ </span>
263
+ <span><?php echo esc_html( number_format( ( $option['value'] / 10 ), 1 ) ); ?>/10</span>
264
+ </div>
265
+ <ul class="cwpr_clearfix <?php echo $class_ul; ?>">
266
+ <?php
267
+ $rating = round( $option['value'] / 10 );
268
+ $start_from = is_rtl() ? ( 11 - $rating ) : 1;
269
+ $stop_at = is_rtl() ? 10 : $rating;
270
+ for ( $i = 1; $i <= 10; $i ++ ) {
271
+ ?>
272
+ <li <?php echo $i >= $start_from && $i <= $stop_at ? ' class="colored"' : ''; ?>></li>
273
+ <?php
274
+ }
275
+ ?>
276
+ </ul>
277
+ </div>
278
+ <?php
279
+ }
280
+ ?>
281
+ </div>
282
+ <?php
283
+ break;
284
+ case 'bars':
285
+ ?>
286
+ <div class="wppr-review-grade-options <?php echo is_rtl() ? 'rtl' : ''; ?>">
287
+ <?php
288
+ foreach ( $review_object->get_options() as $option ) {
289
+ $review_option_rating = $option['value'];
290
+ ?>
291
+ <div class="wppr-review-grade-option">
292
+ <div class="wppr-review-grade-option-header">
293
+ <span><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></span>
294
+ <span><?php echo esc_html( number_format( ( $review_option_rating / 10 ), 1 ) ); ?></span>
295
+ </div>
296
+ <div class="wppr-review-grade-option-rating wppr-default <?php echo $review_object->get_rating_class( $review_option_rating ); ?> <?php echo is_rtl() ? 'rtl' : ''; ?>">
297
+ <span class="<?php echo $review_object->get_rating_class( $review_option_rating ); ?>" style="
298
+ <?php
299
+ /**
300
+ * Adds min-width for amp support.
301
+ */
302
+ echo 'width:' . esc_attr( is_rtl() ? ( 100 - $review_option_rating ) : $review_option_rating ) . '%; ';
303
+ echo esc_attr( apply_filters( 'wppr_review_option_rating_css', '', $review_option_rating ) );
304
+ ?>
305
+ "></span>
306
+ </div>
307
+ </div><!-- end .wppr-review-grade-option -->
308
+ <?php
309
+ }
310
+ ?>
311
+ </div><!-- end .wppr-review-grade-options -->
312
+ <?php
313
+ break;
314
+ case 'stars':
315
+ ?>
316
+ <div class="wppr-review-options">
317
+ <?php
318
+ foreach ( $review_object->get_options() as $option ) {
319
+ $review_option_rating = $option['value'];
320
+ ?>
321
+ <div class="wppr-review-option">
322
+ <div class="wppr-review-option-header">
323
+ <span><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></span>
324
+ </div>
325
+ <ul class="wppr-review-option-rating <?php echo apply_filters( 'wppr_option_custom_icon', '' ); ?>">
326
+ <?php
327
+ $rating = round( $option['value'] / 10 );
328
+ $start_from = is_rtl() ? ( 11 - $rating ) : 1;
329
+ $stop_at = is_rtl() ? 10 : $rating;
330
+ for ( $i = 1; $i <= 10; $i ++ ) {
331
+ ?>
332
+ <li class="<?php echo $i >= $start_from && $i <= $stop_at ? $review_object->get_rating_class( $option['value'] ) : ' wppr-default'; ?>"></li>
333
+ <?php
334
+ }
335
+ ?>
336
+ </ul>
337
+ </div><!-- end .wppr-review-option -->
338
+ <?php
339
+ }
340
+ ?>
341
+ </div><!-- end .wppr-review-options -->
342
+ <?php
343
+ break;
344
+ }
345
+ }
346
+ }
347
+
348
+ if ( ! function_exists( 'wppr_layout_get_affiliate_buttons' ) ) {
349
+ /**
350
+ * Display the affiliate buttons.
351
+ */
352
+ function wppr_layout_get_affiliate_buttons( $review_object ) {
353
+ $links = $review_object->get_links();
354
+ $links = array_filter( $links );
355
+
356
+ $multiple_affiliates_class = 'affiliate-button';
357
+
358
+ if ( count( $links ) > 1 ) {
359
+ $multiple_affiliates_class = 'affiliate-button2 affiliate-button';
360
+ }
361
+
362
+ foreach ( $links as $title => $link ) {
363
+ if ( empty( $title ) || empty( $link ) ) {
364
+ continue;
365
+ }
366
+ ?>
367
+ <div class="<?php echo esc_attr( $multiple_affiliates_class ); ?>">
368
+ <a href="<?php echo esc_url( $link ); ?>" rel="nofollow" target="_blank">
369
+ <span><?php echo esc_html( $title ); ?></span>
370
+ </a>
371
+ </div><!-- end .affiliate-button -->
372
+ <?php
373
+ }
374
+ }
375
+ }
376
+
377
+
378
+
379
  if ( function_exists( 'register_block_type' ) ) {
380
  WPPR_Gutenberg::get_instance();
381
  }
includes/gutenberg/class-wppr-gutenberg.php CHANGED
@@ -45,6 +45,9 @@ class WPPR_Gutenberg {
45
  add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_gutenberg_scripts' ) );
46
  add_action( 'init', array( $this, 'register_endpoints' ) );
47
  add_action( 'rest_api_init', array( $this, 'update_posts_endpoints' ) );
 
 
 
48
  }
49
 
50
  /**
@@ -52,16 +55,35 @@ class WPPR_Gutenberg {
52
  */
53
  public function enqueue_gutenberg_scripts() {
54
  if ( WPPR_CACHE_DISABLED ) {
55
- $version = filemtime( WPPR_URL . '/includes/gutenberg/dist/block.js' );
56
  } else {
57
  $version = $this->version;
58
  }
59
 
 
 
 
 
 
 
 
 
 
60
  // Enqueue the bundled block JS file
61
- wp_enqueue_script( 'wppr-gutenberg-block-js', WPPR_URL . '/includes/gutenberg/dist/block.js', array( 'wp-i18n', 'wp-edit-post', 'wp-element', 'wp-editor', 'wp-components', 'wp-data', 'wp-plugins', 'wp-edit-post', 'wp-api' ), $version );
 
 
 
 
 
 
 
 
 
 
62
 
63
  // Enqueue editor block styles
64
- wp_enqueue_style( 'wppr-gutenberg-block-css', WPPR_URL . '/includes/gutenberg/dist/block.css', '', $version );
65
  }
66
 
67
  /**
@@ -172,4 +194,16 @@ class WPPR_Gutenberg {
172
  return $data;
173
  }
174
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  }
45
  add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_gutenberg_scripts' ) );
46
  add_action( 'init', array( $this, 'register_endpoints' ) );
47
  add_action( 'rest_api_init', array( $this, 'update_posts_endpoints' ) );
48
+ add_filter( 'rest_post_query', array( $this, 'post_meta_request_params' ), 99, 2 );
49
+ add_filter( 'rest_page_query', array( $this, 'post_meta_request_params' ), 99, 2 );
50
+ add_filter( 'rest_wppr_review_query', array( $this, 'post_meta_request_params' ), 99, 2 );
51
  }
52
 
53
  /**
55
  */
56
  public function enqueue_gutenberg_scripts() {
57
  if ( WPPR_CACHE_DISABLED ) {
58
+ $version = filemtime( WPPR_URL . '/includes/gutenberg/dist/sidebar.js' );
59
  } else {
60
  $version = $this->version;
61
  }
62
 
63
+ if ( defined( 'WPPR_PRO_VERSION' ) ) {
64
+ $isPro = true;
65
+ } else {
66
+ $isPro = false;
67
+ }
68
+
69
+ $model = new WPPR_Query_Model();
70
+ $length = $model->wppr_get_option( 'cwppos_option_nr' );
71
+
72
  // Enqueue the bundled block JS file
73
+ wp_enqueue_script( 'wppr-gutenberg-block-js', WPPR_URL . '/includes/gutenberg/dist/sidebar.js', array( 'wp-i18n', 'wp-edit-post', 'wp-element', 'wp-editor', 'wp-components', 'wp-compose', 'wp-data', 'wp-plugins', 'wp-edit-post', 'wp-api' ), $version );
74
+
75
+ wp_localize_script(
76
+ 'wppr-gutenberg-block-js',
77
+ 'wpprguten',
78
+ array(
79
+ 'isPro' => $isPro,
80
+ 'path' => WPPR_URL,
81
+ 'length' => $length,
82
+ )
83
+ );
84
 
85
  // Enqueue editor block styles
86
+ wp_enqueue_style( 'wppr-gutenberg-block-css', WPPR_URL . '/includes/gutenberg/dist/sidebar.css', '', $version );
87
  }
88
 
89
  /**
194
  return $data;
195
  }
196
 
197
+ /**
198
+ * Allow querying posts by meta in REST API
199
+ */
200
+ public function post_meta_request_params( $args, $request ) {
201
+ $args += array(
202
+ 'meta_key' => $request['meta_key'],
203
+ 'meta_value' => $request['meta_value'],
204
+ 'meta_query' => $request['meta_query'],
205
+ );
206
+ return $args;
207
+ }
208
+
209
  }
includes/gutenberg/dist/block.css CHANGED
@@ -1 +1,2 @@
1
  .wp-product-review-product-details .wp-product-review-sidebar-base-control{padding-bottom:10px}.wp-product-review-product-details .wp-product-review-sidebar-base-control label{padding-bottom:10px}.wp-product-review-product-details .wp-product-review-sidebar-base-control .wppr_image_upload{display:block;margin-bottom:10px}.wp-product-review-product-details .wppr-review-links-list button{margin-bottom:10px}.wp-product-review-product-options .wppr-review-options-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-text{width:60%;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-text input{height:30px}.wp-product-review-product-options .wppr-review-options-list .wppr-option-number{width:25%;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-option-number input{height:30px}.wp-product-review-product-pros .wppr-review-pro-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-pros .wppr-review-pro-list .wppr-text{width:85%;display:inline-block}.wp-product-review-product-pros .wppr-review-pro-list .wppr-text input{height:30px;margin-top:0}.wp-product-review-product-cons .wppr-review-con-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-cons .wppr-review-con-list .wppr-text{width:85%;display:inline-block}.wp-product-review-product-cons .wppr-review-con-list .wppr-text input{height:30px;margin-top:0}
 
1
  .wp-product-review-product-details .wp-product-review-sidebar-base-control{padding-bottom:10px}.wp-product-review-product-details .wp-product-review-sidebar-base-control label{padding-bottom:10px}.wp-product-review-product-details .wp-product-review-sidebar-base-control .wppr_image_upload{display:block;margin-bottom:10px}.wp-product-review-product-details .wppr-review-links-list button{margin-bottom:10px}.wp-product-review-product-options .wppr-review-options-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-text{width:60%;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-text input{height:30px}.wp-product-review-product-options .wppr-review-options-list .wppr-option-number{width:25%;display:inline-block}.wp-product-review-product-options .wppr-review-options-list .wppr-option-number input{height:30px}.wp-product-review-product-pros .wppr-review-pro-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-pros .wppr-review-pro-list .wppr-text{width:85%;display:inline-block}.wp-product-review-product-pros .wppr-review-pro-list .wppr-text input{height:30px;margin-top:0}.wp-product-review-product-cons .wppr-review-con-list label{width:15%;margin-right:-4px;border-radius:3px 0 0 3px;background:#ddd;line-height:30px;text-align:center;vertical-align:top;display:inline-block}.wp-product-review-product-cons .wppr-review-con-list .wppr-text{width:85%;display:inline-block}.wp-product-review-product-cons .wppr-review-con-list .wppr-text input{height:30px;margin-top:0}
2
+ .components-radio-image-control__container{display:block}.components-radio-image-control__option{display:inline-block;padding:5px}.components-radio-image-control label{display:inline-block;position:relative}.components-radio-image-control label img{border:1px solid transparent;max-width:250px !important}.components-radio-image-control input{display:none}.components-radio-image-control input+label .image-clickable{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.components-radio-image-control input:checked+label img{border:1px solid #3498DB;box-shadow:0 0 5px 2px rgba(0,0,0,0.25)}.wppr-review-import-review-button{text-align:center;margin:20px 0}.wppr-review-import-modal{width:100%;height:auto}.wppr-review-import-modal .components-modal__content{max-height:100vh;overflow-y:scroll}.wppr-review-import-modal .components-modal__content .cwp_pitem_info{display:inline-block;width:100%;margin-top:5px}.wppr-review-import-modal .components-modal__content .cwp_pitem_info ul{float:left;width:30.66%;border:1px solid #f1f1f1}.wppr-review-import-modal .components-modal__content .cwp_pitem_info ul h4{margin:0;padding:3px 0;border-radius:3px 3px 0 0;background:#f1f1f1;text-align:center}.wppr-review-import-modal .components-modal__content .cwp_pitem_info ul li{padding:2px 5px;margin:0;border-top:1px solid #f1f1f1;font-size:10px;transition:all 0.2s ease-in-out}
includes/gutenberg/dist/{block.js → sidebar.js} RENAMED
@@ -67,7 +67,7 @@
67
  /* 0 */
68
  /***/ (function(module, exports) {
69
 
70
- eval("var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcz8xNWUwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjUuNycgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n");
71
 
72
  /***/ }),
73
  /* 1 */
@@ -328,7 +328,7 @@ eval("var pIE = __webpack_require__(17);\nvar createDesc = __webpack_require__(1
328
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
329
 
330
  "use strict";
331
- eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(44);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__ = __webpack_require__(51);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of__ = __webpack_require__(56);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__ = __webpack_require__(59);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__ = __webpack_require__(60);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(64);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits__ = __webpack_require__(86);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__style_scss__ = __webpack_require__(94);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__style_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7__style_scss__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_rename_key__ = __webpack_require__(95);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_rename_key___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_rename_key__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__utils__ = __webpack_require__(96);\n\n\n\n\n\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\n/**\n * WordPress dependencies\n */\nvar __ = wp.i18n.__;\nvar registerPlugin = wp.plugins.registerPlugin;\nvar MediaUpload = wp.editor.MediaUpload;\nvar _wp$data = wp.data,\n withSelect = _wp$data.withSelect,\n withDispatch = _wp$data.withDispatch;\nvar _wp$editPost = wp.editPost,\n PluginPostStatusInfo = _wp$editPost.PluginPostStatusInfo,\n PluginSidebarMoreMenuItem = _wp$editPost.PluginSidebarMoreMenuItem,\n PluginSidebar = _wp$editPost.PluginSidebar;\nvar _wp$element = wp.element,\n Component = _wp$element.Component,\n Fragment = _wp$element.Fragment,\n compose = _wp$element.compose;\nvar _wp$components = wp.components,\n PanelBody = _wp$components.PanelBody,\n TextControl = _wp$components.TextControl,\n FormToggle = _wp$components.FormToggle,\n Button = _wp$components.Button,\n SelectControl = _wp$components.SelectControl,\n withAPIData = _wp$components.withAPIData;\n\nvar WP_Product_Review = function (_Component) {\n\t__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits___default()(WP_Product_Review, _Component);\n\n\tfunction WP_Product_Review() {\n\t\t__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default()(this, WP_Product_Review);\n\n\t\tvar _this = __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default()(this, (WP_Product_Review.__proto__ || __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of___default()(WP_Product_Review)).apply(this, arguments));\n\n\t\t_this.toggleReviewStatus = _this.toggleReviewStatus.bind(_this);\n\t\t_this.onChangeReviewTitle = _this.onChangeReviewTitle.bind(_this);\n\t\t_this.onChangeReviewImage = _this.onChangeReviewImage.bind(_this);\n\t\t_this.onChangeImageLink = _this.onChangeImageLink.bind(_this);\n\t\t_this.onChangeReviewAffiliateTitle = _this.onChangeReviewAffiliateTitle.bind(_this);\n\t\t_this.onChangeReviewAffiliateLink = _this.onChangeReviewAffiliateLink.bind(_this);\n\t\t_this.addButton = _this.addButton.bind(_this);\n\t\t_this.onChangeReviewPrice = _this.onChangeReviewPrice.bind(_this);\n\t\t_this.onChangeOptionText = _this.onChangeOptionText.bind(_this);\n\t\t_this.onChangeOptionNumber = _this.onChangeOptionNumber.bind(_this);\n\t\t_this.addOption = _this.addOption.bind(_this);\n\t\t_this.onChangeProText = _this.onChangeProText.bind(_this);\n\t\t_this.addPro = _this.addPro.bind(_this);\n\t\t_this.onChangeConText = _this.onChangeConText.bind(_this);\n\t\t_this.addCon = _this.addCon.bind(_this);\n\n\t\t_this.state = {\n\t\t\tcwp_meta_box_check: 'No',\n\t\t\tcwp_rev_product_name: '',\n\t\t\t_wppr_review_template: 'default',\n\t\t\tcwp_rev_product_image: '',\n\t\t\tcwp_image_link: 'image',\n\t\t\twppr_links: {\n\t\t\t\t'': ''\n\t\t\t},\n\t\t\tcwp_rev_price: '',\n\t\t\twppr_options: {\n\t\t\t\t1: {\n\t\t\t\t\tname: '',\n\t\t\t\t\tvalue: 0\n\t\t\t\t}\n\t\t\t},\n\t\t\twppr_pros: {\n\t\t\t\t0: ''\n\t\t\t},\n\t\t\twppr_cons: {\n\t\t\t\t0: ''\n\t\t\t}\n\t\t};\n\t\treturn _this;\n\t}\n\n\t__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default()(WP_Product_Review, [{\n\t\tkey: 'componentWillReceiveProps',\n\t\tvalue: function componentWillReceiveProps(nextProps) {\n\t\t\tif (this.props.review !== nextProps.review) {\n\t\t\t\tif (nextProps.review.isLoading !== true) {\n\t\t\t\t\tthis.setState(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, nextProps.review.data.wppr_data));\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (nextProps.isPublishing || nextProps.isSaving) {\n\t\t\t\twp.apiRequest({ path: '/wp-product-review/update-review?id=' + nextProps.postId + '&postType=' + nextProps.postType, method: 'POST', data: this.state }).then(function (data) {\n\t\t\t\t\treturn data;\n\t\t\t\t}, function (err) {\n\t\t\t\t\treturn err;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'componentDidUpdate',\n\t\tvalue: function componentDidUpdate(prevState) {\n\t\t\tif (this.state.cwp_meta_box_check !== prevState.cwp_meta_box_check && this.state.cwp_meta_box_check === 'Yes') {\n\t\t\t\tthis.props.openReviewSidebar();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'toggleReviewStatus',\n\t\tvalue: function toggleReviewStatus() {\n\t\t\tthis.setState({ cwp_meta_box_check: this.state.cwp_meta_box_check === 'Yes' ? 'No' : 'Yes' });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewTitle',\n\t\tvalue: function onChangeReviewTitle(value) {\n\t\t\tthis.setState({ cwp_rev_product_name: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewImage',\n\t\tvalue: function onChangeReviewImage(value) {\n\t\t\tif (value.url !== undefined && value.url !== '') {\n\t\t\t\tthis.setState({ cwp_rev_product_image: value.url });\n\t\t\t} else if (value.id !== undefined) {\n\t\t\t\tthis.setState({ cwp_rev_product_image: value.id });\n\t\t\t}\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeImageLink',\n\t\tvalue: function onChangeImageLink(value) {\n\t\t\tthis.setState({ cwp_image_link: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewAffiliateTitle',\n\t\tvalue: function onChangeReviewAffiliateTitle(e, key) {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\tif (__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).length === 2) {\n\t\t\t\tif (e === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[0] || e === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[1]) {\n\t\t\t\t\te = e + ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[0] === key) {\n\t\t\t\t__WEBPACK_IMPORTED_MODULE_8_rename_key___default()(wppr_links, key, e);\n\t\t\t\twppr_links = Object(__WEBPACK_IMPORTED_MODULE_9__utils__[\"a\" /* reverseObject */])(wppr_links);\n\t\t\t} else {\n\t\t\t\t__WEBPACK_IMPORTED_MODULE_8_rename_key___default()(wppr_links, key, e);\n\t\t\t}\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewAffiliateLink',\n\t\tvalue: function onChangeReviewAffiliateLink(e, key) {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\twppr_links[key] = e;\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addButton',\n\t\tvalue: function addButton() {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\twppr_links['Buy Now'] = '';\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewPrice',\n\t\tvalue: function onChangeReviewPrice(value) {\n\t\t\tthis.setState({ cwp_rev_price: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeOptionText',\n\t\tvalue: function onChangeOptionText(e, key) {\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\twppr_options[key]['name'] = e;\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeOptionNumber',\n\t\tvalue: function onChangeOptionNumber(e, key) {\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\tif (e === '') e = 0;\n\t\t\twppr_options[key]['value'] = e;\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addOption',\n\t\tvalue: function addOption() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).length + 1;\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\twppr_options[key] = {\n\t\t\t\tname: '',\n\t\t\t\tvalue: 0\n\t\t\t};\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeProText',\n\t\tvalue: function onChangeProText(e, key) {\n\t\t\tvar wppr_pros = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_pros);\n\t\t\twppr_pros[key] = e;\n\t\t\tthis.setState({ wppr_pros: wppr_pros });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addPro',\n\t\tvalue: function addPro() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).length;\n\t\t\tvar wppr_pros = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_pros);\n\t\t\twppr_pros[key] = '';\n\t\t\tthis.setState({ wppr_pros: wppr_pros });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeConText',\n\t\tvalue: function onChangeConText(e, key) {\n\t\t\tvar wppr_cons = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_cons);\n\t\t\twppr_cons[key] = e;\n\t\t\tthis.setState({ wppr_cons: wppr_cons });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addCon',\n\t\tvalue: function addCon() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).length;\n\t\t\tvar wppr_cons = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_cons);\n\t\t\twppr_cons[key] = '';\n\t\t\tthis.setState({ wppr_cons: wppr_cons });\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\tvar _this2 = this;\n\n\t\t\treturn wp.element.createElement(\n\t\t\t\tFragment,\n\t\t\t\tnull,\n\t\t\t\twp.element.createElement(\n\t\t\t\t\tPluginPostStatusInfo,\n\t\t\t\t\tnull,\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t'label',\n\t\t\t\t\t\t{ htmlFor: 'is-this-a-review' },\n\t\t\t\t\t\t__('Is this post a review?')\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(FormToggle, {\n\t\t\t\t\t\tchecked: this.state.cwp_meta_box_check === 'Yes' ? true : false,\n\t\t\t\t\t\tonChange: this.toggleReviewStatus,\n\t\t\t\t\t\tid: 'is-this-a-review'\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tthis.state.cwp_meta_box_check === 'Yes' && [wp.element.createElement(\n\t\t\t\t\tPluginSidebarMoreMenuItem,\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: 'wp-product-review'\n\t\t\t\t\t},\n\t\t\t\t\t__('WP Product Review')\n\t\t\t\t), wp.element.createElement(\n\t\t\t\t\tPluginSidebar,\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'wp-product-review',\n\t\t\t\t\t\ttitle: __('WP Product Review')\n\t\t\t\t\t},\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Product Details'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-details',\n\t\t\t\t\t\t\tinitialOpen: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthis.props.postType !== 'wppr_review' && [wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\tlabel: __('Product Name'),\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tvalue: this.state.cwp_rev_product_name,\n\t\t\t\t\t\t\tonChange: this.onChangeReviewTitle\n\t\t\t\t\t\t})],\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wp-product-review-sidebar-base-control' },\n\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t{ className: 'blocks-base-control__label', 'for': 'inspector-media-upload' },\n\t\t\t\t\t\t\t\t__('Product Image')\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\twp.element.createElement(MediaUpload, {\n\t\t\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\t\t\tid: 'inspector-media-upload',\n\t\t\t\t\t\t\t\tvalue: this.state.cwp_rev_product_image,\n\t\t\t\t\t\t\t\tonSelect: this.onChangeReviewImage,\n\t\t\t\t\t\t\t\trender: function render(_ref) {\n\t\t\t\t\t\t\t\t\tvar open = _ref.open;\n\t\t\t\t\t\t\t\t\treturn [_this2.state.cwp_rev_product_image !== '' && [wp.element.createElement('img', {\n\t\t\t\t\t\t\t\t\t\tonClick: open,\n\t\t\t\t\t\t\t\t\t\tsrc: _this2.state.cwp_rev_product_image,\n\t\t\t\t\t\t\t\t\t\talt: __('Review image')\n\t\t\t\t\t\t\t\t\t}), wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\t\t\treturn _this2.setState({ cwp_rev_product_image: '' });\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tstyle: { marginTop: '10px' }\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t__('Remove Image')\n\t\t\t\t\t\t\t\t\t)], wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\t\t\tonClick: open,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { marginTop: '10px' },\n\t\t\t\t\t\t\t\t\t\t\tclassName: _this2.state.cwp_rev_product_image === '' && 'wppr_image_upload'\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t__('Choose or Upload an Image')\n\t\t\t\t\t\t\t\t\t)];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\twp.element.createElement(SelectControl, {\n\t\t\t\t\t\t\tlabel: __('Product Image Click'),\n\t\t\t\t\t\t\tvalue: this.state.cwp_image_link,\n\t\t\t\t\t\t\toptions: [{\n\t\t\t\t\t\t\t\tlabel: __('Show Whole Image'),\n\t\t\t\t\t\t\t\tvalue: 'image'\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tlabel: __('Open Affiliate Link'),\n\t\t\t\t\t\t\t\tvalue: 'link'\n\t\t\t\t\t\t\t}],\n\t\t\t\t\t\t\tonChange: this.onChangeImageLink\n\t\t\t\t\t\t}),\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-links-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).map(function (key) {\n\t\t\t\t\t\t\t\treturn [wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\tlabel: __('Affiliate Button Text'),\n\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeReviewAffiliateTitle(e, key);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}), wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\tlabel: __('Affiliate Button Link'),\n\t\t\t\t\t\t\t\t\ttype: 'url',\n\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_links[key],\n\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeReviewAffiliateLink(e, key);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).length < 2 && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addButton\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another button')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t),\n\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\tlabel: __('Product Price'),\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tvalue: this.state.cwp_rev_price,\n\t\t\t\t\t\t\tonChange: this.onChangeReviewPrice\n\t\t\t\t\t\t})\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Product Options'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-options',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-options-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-options-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-option-item-' + key },\n\t\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-option-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_options[key].name,\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeOptionText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text wppr-option-number',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('0'),\n\t\t\t\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t\t\t\t\tmax: 100,\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_options[key].value,\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeOptionNumber(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).length < 5 && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addOption\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Pro Features'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-pros',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-pro-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-pro-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-pro-item-' + key },\n\t\t\t\t\t\t\t\t\t\tparseInt(key) + 1\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-pro-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_pros[key],\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeProText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).length < 5 && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addPro\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Con Features'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-cons',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-con-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-con-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-con-item-' + key },\n\t\t\t\t\t\t\t\t\t\tparseInt(key) + 1\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-con-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_cons[key],\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeConText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).length < 5 && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addCon\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)]\n\t\t\t);\n\t\t}\n\t}]);\n\n\treturn WP_Product_Review;\n}(Component);\n\nvar WPPR = compose([withSelect(function (select, _ref2) {\n\tvar forceIsSaving = _ref2.forceIsSaving;\n\n\tvar _select = select('core/editor'),\n\t getCurrentPostId = _select.getCurrentPostId,\n\t isSavingPost = _select.isSavingPost,\n\t isPublishingPost = _select.isPublishingPost,\n\t getCurrentPostType = _select.getCurrentPostType;\n\n\treturn {\n\t\tpostId: getCurrentPostId(),\n\t\tpostType: getCurrentPostType(),\n\t\tisSaving: forceIsSaving || isSavingPost(),\n\t\tisPublishing: isPublishingPost()\n\t};\n}), withDispatch(function (dispatch) {\n\treturn {\n\t\topenReviewSidebar: function openReviewSidebar() {\n\t\t\treturn dispatch('core/edit-post').openGeneralSidebar('wp-product-review/wp-product-review');\n\t\t},\n\t\teditPostStatus: dispatch('core/editor').editPost\n\t};\n}), withAPIData(function (props) {\n\treturn {\n\t\treview: '/wp/v2/' + (props.postType === 'wppr_review' ? props.postType : 'posts') + '/' + props.postId\n\t};\n})])(WP_Product_Review);\n\nregisterPlugin('wp-product-review', {\n\ticon: 'star-empty',\n\trender: WPPR\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvYmxvY2suanM/MzUyNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX09iamVjdCRrZXlzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3Qva2V5cyc7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnO1xuaW1wb3J0IF9PYmplY3QkZ2V0UHJvdG90eXBlT2YgZnJvbSAnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9nZXQtcHJvdG90eXBlLW9mJztcbmltcG9ydCBfY2xhc3NDYWxsQ2hlY2sgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzJztcbmltcG9ydCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybic7XG5pbXBvcnQgX2luaGVyaXRzIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cyc7XG4vKipcbiAqIEludGVybmFsIGRlcGVuZGVuY2llc1xuICovXG5pbXBvcnQgJy4vc3R5bGUuc2Nzcyc7XG5pbXBvcnQgcmVuYW1lS2V5IGZyb20gJ3JlbmFtZS1rZXknO1xuaW1wb3J0IHsgcmV2ZXJzZU9iamVjdCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xudmFyIF9fID0gd3AuaTE4bi5fXztcbnZhciByZWdpc3RlclBsdWdpbiA9IHdwLnBsdWdpbnMucmVnaXN0ZXJQbHVnaW47XG52YXIgTWVkaWFVcGxvYWQgPSB3cC5lZGl0b3IuTWVkaWFVcGxvYWQ7XG52YXIgX3dwJGRhdGEgPSB3cC5kYXRhLFxuICAgIHdpdGhTZWxlY3QgPSBfd3AkZGF0YS53aXRoU2VsZWN0LFxuICAgIHdpdGhEaXNwYXRjaCA9IF93cCRkYXRhLndpdGhEaXNwYXRjaDtcbnZhciBfd3AkZWRpdFBvc3QgPSB3cC5lZGl0UG9zdCxcbiAgICBQbHVnaW5Qb3N0U3RhdHVzSW5mbyA9IF93cCRlZGl0UG9zdC5QbHVnaW5Qb3N0U3RhdHVzSW5mbyxcbiAgICBQbHVnaW5TaWRlYmFyTW9yZU1lbnVJdGVtID0gX3dwJGVkaXRQb3N0LlBsdWdpblNpZGViYXJNb3JlTWVudUl0ZW0sXG4gICAgUGx1Z2luU2lkZWJhciA9IF93cCRlZGl0UG9zdC5QbHVnaW5TaWRlYmFyO1xudmFyIF93cCRlbGVtZW50ID0gd3AuZWxlbWVudCxcbiAgICBDb21wb25lbnQgPSBfd3AkZWxlbWVudC5Db21wb25lbnQsXG4gICAgRnJhZ21lbnQgPSBfd3AkZWxlbWVudC5GcmFnbWVudCxcbiAgICBjb21wb3NlID0gX3dwJGVsZW1lbnQuY29tcG9zZTtcbnZhciBfd3AkY29tcG9uZW50cyA9IHdwLmNvbXBvbmVudHMsXG4gICAgUGFuZWxCb2R5ID0gX3dwJGNvbXBvbmVudHMuUGFuZWxCb2R5LFxuICAgIFRleHRDb250cm9sID0gX3dwJGNvbXBvbmVudHMuVGV4dENvbnRyb2wsXG4gICAgRm9ybVRvZ2dsZSA9IF93cCRjb21wb25lbnRzLkZvcm1Ub2dnbGUsXG4gICAgQnV0dG9uID0gX3dwJGNvbXBvbmVudHMuQnV0dG9uLFxuICAgIFNlbGVjdENvbnRyb2wgPSBfd3AkY29tcG9uZW50cy5TZWxlY3RDb250cm9sLFxuICAgIHdpdGhBUElEYXRhID0gX3dwJGNvbXBvbmVudHMud2l0aEFQSURhdGE7XG5cbnZhciBXUF9Qcm9kdWN0X1JldmlldyA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG5cdF9pbmhlcml0cyhXUF9Qcm9kdWN0X1JldmlldywgX0NvbXBvbmVudCk7XG5cblx0ZnVuY3Rpb24gV1BfUHJvZHVjdF9SZXZpZXcoKSB7XG5cdFx0X2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdQX1Byb2R1Y3RfUmV2aWV3KTtcblxuXHRcdHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChXUF9Qcm9kdWN0X1Jldmlldy5fX3Byb3RvX18gfHwgX09iamVjdCRnZXRQcm90b3R5cGVPZihXUF9Qcm9kdWN0X1JldmlldykpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuXG5cdFx0X3RoaXMudG9nZ2xlUmV2aWV3U3RhdHVzID0gX3RoaXMudG9nZ2xlUmV2aWV3U3RhdHVzLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlUmV2aWV3VGl0bGUgPSBfdGhpcy5vbkNoYW5nZVJldmlld1RpdGxlLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlUmV2aWV3SW1hZ2UgPSBfdGhpcy5vbkNoYW5nZVJldmlld0ltYWdlLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlSW1hZ2VMaW5rID0gX3RoaXMub25DaGFuZ2VJbWFnZUxpbmsuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVUaXRsZSA9IF90aGlzLm9uQ2hhbmdlUmV2aWV3QWZmaWxpYXRlVGl0bGUuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVMaW5rID0gX3RoaXMub25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVMaW5rLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLmFkZEJ1dHRvbiA9IF90aGlzLmFkZEJ1dHRvbi5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZVJldmlld1ByaWNlID0gX3RoaXMub25DaGFuZ2VSZXZpZXdQcmljZS5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZU9wdGlvblRleHQgPSBfdGhpcy5vbkNoYW5nZU9wdGlvblRleHQuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VPcHRpb25OdW1iZXIgPSBfdGhpcy5vbkNoYW5nZU9wdGlvbk51bWJlci5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5hZGRPcHRpb24gPSBfdGhpcy5hZGRPcHRpb24uYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VQcm9UZXh0ID0gX3RoaXMub25DaGFuZ2VQcm9UZXh0LmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLmFkZFBybyA9IF90aGlzLmFkZFByby5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZUNvblRleHQgPSBfdGhpcy5vbkNoYW5nZUNvblRleHQuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMuYWRkQ29uID0gX3RoaXMuYWRkQ29uLmJpbmQoX3RoaXMpO1xuXG5cdFx0X3RoaXMuc3RhdGUgPSB7XG5cdFx0XHRjd3BfbWV0YV9ib3hfY2hlY2s6ICdObycsXG5cdFx0XHRjd3BfcmV2X3Byb2R1Y3RfbmFtZTogJycsXG5cdFx0XHRfd3Bwcl9yZXZpZXdfdGVtcGxhdGU6ICdkZWZhdWx0Jyxcblx0XHRcdGN3cF9yZXZfcHJvZHVjdF9pbWFnZTogJycsXG5cdFx0XHRjd3BfaW1hZ2VfbGluazogJ2ltYWdlJyxcblx0XHRcdHdwcHJfbGlua3M6IHtcblx0XHRcdFx0Jyc6ICcnXG5cdFx0XHR9LFxuXHRcdFx0Y3dwX3Jldl9wcmljZTogJycsXG5cdFx0XHR3cHByX29wdGlvbnM6IHtcblx0XHRcdFx0MToge1xuXHRcdFx0XHRcdG5hbWU6ICcnLFxuXHRcdFx0XHRcdHZhbHVlOiAwXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR3cHByX3Byb3M6IHtcblx0XHRcdFx0MDogJydcblx0XHRcdH0sXG5cdFx0XHR3cHByX2NvbnM6IHtcblx0XHRcdFx0MDogJydcblx0XHRcdH1cblx0XHR9O1xuXHRcdHJldHVybiBfdGhpcztcblx0fVxuXG5cdF9jcmVhdGVDbGFzcyhXUF9Qcm9kdWN0X1JldmlldywgW3tcblx0XHRrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcblx0XHRcdGlmICh0aGlzLnByb3BzLnJldmlldyAhPT0gbmV4dFByb3BzLnJldmlldykge1xuXHRcdFx0XHRpZiAobmV4dFByb3BzLnJldmlldy5pc0xvYWRpbmcgIT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLnNldFN0YXRlKF9leHRlbmRzKHt9LCBuZXh0UHJvcHMucmV2aWV3LmRhdGEud3Bwcl9kYXRhKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChuZXh0UHJvcHMuaXNQdWJsaXNoaW5nIHx8IG5leHRQcm9wcy5pc1NhdmluZykge1xuXHRcdFx0XHR3cC5hcGlSZXF1ZXN0KHsgcGF0aDogJy93cC1wcm9kdWN0LXJldmlldy91cGRhdGUtcmV2aWV3P2lkPScgKyBuZXh0UHJvcHMucG9zdElkICsgJyZwb3N0VHlwZT0nICsgbmV4dFByb3BzLnBvc3RUeXBlLCBtZXRob2Q6ICdQT1NUJywgZGF0YTogdGhpcy5zdGF0ZSB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZXJyO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlN0YXRlKSB7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5jd3BfbWV0YV9ib3hfY2hlY2sgIT09IHByZXZTdGF0ZS5jd3BfbWV0YV9ib3hfY2hlY2sgJiYgdGhpcy5zdGF0ZS5jd3BfbWV0YV9ib3hfY2hlY2sgPT09ICdZZXMnKSB7XG5cdFx0XHRcdHRoaXMucHJvcHMub3BlblJldmlld1NpZGViYXIoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICd0b2dnbGVSZXZpZXdTdGF0dXMnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiB0b2dnbGVSZXZpZXdTdGF0dXMoKSB7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgY3dwX21ldGFfYm94X2NoZWNrOiB0aGlzLnN0YXRlLmN3cF9tZXRhX2JveF9jaGVjayA9PT0gJ1llcycgPyAnTm8nIDogJ1llcycgfSk7XG5cdFx0XHR0aGlzLnByb3BzLmVkaXRQb3N0U3RhdHVzKHsgZWRpdGVkOiB0cnVlIH0pO1xuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ29uQ2hhbmdlUmV2aWV3VGl0bGUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZVJldmlld1RpdGxlKHZhbHVlKSB7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgY3dwX3Jldl9wcm9kdWN0X25hbWU6IHZhbHVlIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVJldmlld0ltYWdlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VSZXZpZXdJbWFnZSh2YWx1ZSkge1xuXHRcdFx0aWYgKHZhbHVlLnVybCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnVybCAhPT0gJycpIHtcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGN3cF9yZXZfcHJvZHVjdF9pbWFnZTogdmFsdWUudXJsIH0pO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZS5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBjd3BfcmV2X3Byb2R1Y3RfaW1hZ2U6IHZhbHVlLmlkIH0pO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZUltYWdlTGluaycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlSW1hZ2VMaW5rKHZhbHVlKSB7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgY3dwX2ltYWdlX2xpbms6IHZhbHVlIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVJldmlld0FmZmlsaWF0ZVRpdGxlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVUaXRsZShlLCBrZXkpIHtcblx0XHRcdHZhciB3cHByX2xpbmtzID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUud3Bwcl9saW5rcyk7XG5cdFx0XHRpZiAoX09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9saW5rcykubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdGlmIChlID09PSBfT2JqZWN0JGtleXMod3Bwcl9saW5rcylbMF0gfHwgZSA9PT0gX09iamVjdCRrZXlzKHdwcHJfbGlua3MpWzFdKSB7XG5cdFx0XHRcdFx0ZSA9IGUgKyAnICc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChfT2JqZWN0JGtleXMod3Bwcl9saW5rcylbMF0gPT09IGtleSkge1xuXHRcdFx0XHRyZW5hbWVLZXkod3Bwcl9saW5rcywga2V5LCBlKTtcblx0XHRcdFx0d3Bwcl9saW5rcyA9IHJldmVyc2VPYmplY3Qod3Bwcl9saW5rcyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW5hbWVLZXkod3Bwcl9saW5rcywga2V5LCBlKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX2xpbmtzOiB3cHByX2xpbmtzIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVJldmlld0FmZmlsaWF0ZUxpbmsnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZVJldmlld0FmZmlsaWF0ZUxpbmsoZSwga2V5KSB7XG5cdFx0XHR2YXIgd3Bwcl9saW5rcyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfbGlua3MpO1xuXHRcdFx0d3Bwcl9saW5rc1trZXldID0gZTtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX2xpbmtzOiB3cHByX2xpbmtzIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdhZGRCdXR0b24nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRCdXR0b24oKSB7XG5cdFx0XHR2YXIgd3Bwcl9saW5rcyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfbGlua3MpO1xuXHRcdFx0d3Bwcl9saW5rc1snQnV5IE5vdyddID0gJyc7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9saW5rczogd3Bwcl9saW5rcyB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVJldmlld1ByaWNlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VSZXZpZXdQcmljZSh2YWx1ZSkge1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGN3cF9yZXZfcHJpY2U6IHZhbHVlIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZU9wdGlvblRleHQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZU9wdGlvblRleHQoZSwga2V5KSB7XG5cdFx0XHR2YXIgd3Bwcl9vcHRpb25zID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUud3Bwcl9vcHRpb25zKTtcblx0XHRcdHdwcHJfb3B0aW9uc1trZXldWyduYW1lJ10gPSBlO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfb3B0aW9uczogd3Bwcl9vcHRpb25zIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZU9wdGlvbk51bWJlcicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlT3B0aW9uTnVtYmVyKGUsIGtleSkge1xuXHRcdFx0dmFyIHdwcHJfb3B0aW9ucyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfb3B0aW9ucyk7XG5cdFx0XHRpZiAoZSA9PT0gJycpIGUgPSAwO1xuXHRcdFx0d3Bwcl9vcHRpb25zW2tleV1bJ3ZhbHVlJ10gPSBlO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfb3B0aW9uczogd3Bwcl9vcHRpb25zIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdhZGRPcHRpb24nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRPcHRpb24oKSB7XG5cdFx0XHR2YXIga2V5ID0gX09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9vcHRpb25zKS5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIHdwcHJfb3B0aW9ucyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfb3B0aW9ucyk7XG5cdFx0XHR3cHByX29wdGlvbnNba2V5XSA9IHtcblx0XHRcdFx0bmFtZTogJycsXG5cdFx0XHRcdHZhbHVlOiAwXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfb3B0aW9uczogd3Bwcl9vcHRpb25zIH0pO1xuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ29uQ2hhbmdlUHJvVGV4dCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlUHJvVGV4dChlLCBrZXkpIHtcblx0XHRcdHZhciB3cHByX3Byb3MgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX3Byb3MpO1xuXHRcdFx0d3Bwcl9wcm9zW2tleV0gPSBlO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfcHJvczogd3Bwcl9wcm9zIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdhZGRQcm8nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRQcm8oKSB7XG5cdFx0XHR2YXIga2V5ID0gX09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9wcm9zKS5sZW5ndGg7XG5cdFx0XHR2YXIgd3Bwcl9wcm9zID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUud3Bwcl9wcm9zKTtcblx0XHRcdHdwcHJfcHJvc1trZXldID0gJyc7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9wcm9zOiB3cHByX3Byb3MgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VDb25UZXh0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VDb25UZXh0KGUsIGtleSkge1xuXHRcdFx0dmFyIHdwcHJfY29ucyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfY29ucyk7XG5cdFx0XHR3cHByX2NvbnNba2V5XSA9IGU7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9jb25zOiB3cHByX2NvbnMgfSk7XG5cdFx0XHR0aGlzLnByb3BzLmVkaXRQb3N0U3RhdHVzKHsgZWRpdGVkOiB0cnVlIH0pO1xuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ2FkZENvbicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIGFkZENvbigpIHtcblx0XHRcdHZhciBrZXkgPSBfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX2NvbnMpLmxlbmd0aDtcblx0XHRcdHZhciB3cHByX2NvbnMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX2NvbnMpO1xuXHRcdFx0d3Bwcl9jb25zW2tleV0gPSAnJztcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX2NvbnM6IHdwcHJfY29ucyB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdyZW5kZXInLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdFx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0RnJhZ21lbnQsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRQbHVnaW5Qb3N0U3RhdHVzSW5mbyxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdCdsYWJlbCcsXG5cdFx0XHRcdFx0XHR7IGh0bWxGb3I6ICdpcy10aGlzLWEtcmV2aWV3JyB9LFxuXHRcdFx0XHRcdFx0X18oJ0lzIHRoaXMgcG9zdCBhIHJldmlldz8nKVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KEZvcm1Ub2dnbGUsIHtcblx0XHRcdFx0XHRcdGNoZWNrZWQ6IHRoaXMuc3RhdGUuY3dwX21ldGFfYm94X2NoZWNrID09PSAnWWVzJyA/IHRydWUgOiBmYWxzZSxcblx0XHRcdFx0XHRcdG9uQ2hhbmdlOiB0aGlzLnRvZ2dsZVJldmlld1N0YXR1cyxcblx0XHRcdFx0XHRcdGlkOiAnaXMtdGhpcy1hLXJldmlldydcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpLFxuXHRcdFx0XHR0aGlzLnN0YXRlLmN3cF9tZXRhX2JveF9jaGVjayA9PT0gJ1llcycgJiYgW3dwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRQbHVnaW5TaWRlYmFyTW9yZU1lbnVJdGVtLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHRhcmdldDogJ3dwLXByb2R1Y3QtcmV2aWV3J1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0X18oJ1dQIFByb2R1Y3QgUmV2aWV3Jylcblx0XHRcdFx0KSwgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFBsdWdpblNpZGViYXIsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3Jyxcblx0XHRcdFx0XHRcdHRpdGxlOiBfXygnV1AgUHJvZHVjdCBSZXZpZXcnKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0UGFuZWxCb2R5LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogX18oJ1Byb2R1Y3QgRGV0YWlscycpLFxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cC1wcm9kdWN0LXJldmlldy1wcm9kdWN0LWRldGFpbHMnLFxuXHRcdFx0XHRcdFx0XHRpbml0aWFsT3BlbjogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMucHJvcHMucG9zdFR5cGUgIT09ICd3cHByX3JldmlldycgJiYgW3dwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogX18oJ1Byb2R1Y3QgTmFtZScpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9uYW1lLFxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVJldmlld1RpdGxlXG5cdFx0XHRcdFx0XHR9KV0sXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3LXNpZGViYXItYmFzZS1jb250cm9sJyB9LFxuXHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0J2xhYmVsJyxcblx0XHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ2Jsb2Nrcy1iYXNlLWNvbnRyb2xfX2xhYmVsJywgJ2Zvcic6ICdpbnNwZWN0b3ItbWVkaWEtdXBsb2FkJyB9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdQcm9kdWN0IEltYWdlJylcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KE1lZGlhVXBsb2FkLCB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2ltYWdlJyxcblx0XHRcdFx0XHRcdFx0XHRpZDogJ2luc3BlY3Rvci1tZWRpYS11cGxvYWQnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSxcblx0XHRcdFx0XHRcdFx0XHRvblNlbGVjdDogdGhpcy5vbkNoYW5nZVJldmlld0ltYWdlLFxuXHRcdFx0XHRcdFx0XHRcdHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF9yZWYpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBvcGVuID0gX3JlZi5vcGVuO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFtfdGhpczIuc3RhdGUuY3dwX3Jldl9wcm9kdWN0X2ltYWdlICE9PSAnJyAmJiBbd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KCdpbWcnLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s6IG9wZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNyYzogX3RoaXMyLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWx0OiBfXygnUmV2aWV3IGltYWdlJylcblx0XHRcdFx0XHRcdFx0XHRcdH0pLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIuc2V0U3RhdGUoeyBjd3BfcmV2X3Byb2R1Y3RfaW1hZ2U6ICcnIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU6IHsgbWFyZ2luVG9wOiAnMTBweCcgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnUmVtb3ZlIEltYWdlJylcblx0XHRcdFx0XHRcdFx0XHRcdCldLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogb3Blbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZTogeyBtYXJnaW5Ub3A6ICcxMHB4JyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogX3RoaXMyLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSA9PT0gJycgJiYgJ3dwcHJfaW1hZ2VfdXBsb2FkJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnQ2hvb3NlIG9yIFVwbG9hZCBhbiBJbWFnZScpXG5cdFx0XHRcdFx0XHRcdFx0XHQpXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFNlbGVjdENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdQcm9kdWN0IEltYWdlIENsaWNrJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9pbWFnZV9saW5rLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiBbe1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnU2hvdyBXaG9sZSBJbWFnZScpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnaW1hZ2UnXG5cdFx0XHRcdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogX18oJ09wZW4gQWZmaWxpYXRlIExpbmsnKSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2xpbmsnXG5cdFx0XHRcdFx0XHRcdH1dLFxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZUltYWdlTGlua1xuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwcHItcmV2aWV3LWxpbmtzLWxpc3QnIH0sXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfbGlua3MpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFt3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnQWZmaWxpYXRlIEJ1dHRvbiBUZXh0JyksXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZToga2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIF90aGlzMi5vbkNoYW5nZVJldmlld0FmZmlsaWF0ZVRpdGxlKGUsIGtleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSksIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdBZmZpbGlhdGUgQnV0dG9uIExpbmsnKSxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd1cmwnLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IF90aGlzMi5zdGF0ZS53cHByX2xpbmtzW2tleV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlUmV2aWV3QWZmaWxpYXRlTGluayhlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXTtcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfbGlua3MpLmxlbmd0aCA8IDIgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0xhcmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogdGhpcy5hZGRCdXR0b25cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdBZGQgYW5vdGhlciBidXR0b24nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnUHJvZHVjdCBQcmljZScpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJpY2UsXG5cdFx0XHRcdFx0XHRcdG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlUmV2aWV3UHJpY2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRQYW5lbEJvZHksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBfXygnUHJvZHVjdCBPcHRpb25zJyksXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3LXByb2R1Y3Qtb3B0aW9ucycsXG5cdFx0XHRcdFx0XHRcdGluaXRpYWxPcGVuOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0J2RpdicsXG5cdFx0XHRcdFx0XHRcdHsgY2xhc3NOYW1lOiAnd3Bwci1yZXZpZXctb3B0aW9ucy1saXN0JyB9LFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX29wdGlvbnMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1vcHRpb25zLWl0ZW0nIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdsYWJlbCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2Zvcic6ICd3cHByLW9wdGlvbi1pdGVtLScgKyBrZXkgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0a2V5XG5cdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ6ICd3cHByLW9wdGlvbi1pdGVtLScgKyBrZXksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ3dwcHItdGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyOiBfXygnT3B0aW9uJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBfdGhpczIuc3RhdGUud3Bwcl9vcHRpb25zW2tleV0ubmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlT3B0aW9uVGV4dChlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnbnVtYmVyJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3Bwci10ZXh0IHdwcHItb3B0aW9uLW51bWJlcicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyOiBfXygnMCcpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtaW46IDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1heDogMTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogX3RoaXMyLnN0YXRlLndwcHJfb3B0aW9uc1trZXldLnZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIub25DaGFuZ2VPcHRpb25OdW1iZXIoZSwga2V5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0X09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9vcHRpb25zKS5sZW5ndGggPCA1ICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRCdXR0b24sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNMYXJnZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s6IHRoaXMuYWRkT3B0aW9uXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRfXygnQWRkIGFub3RoZXIgb3B0aW9uJylcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0UGFuZWxCb2R5LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogX18oJ1BybyBGZWF0dXJlcycpLFxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cC1wcm9kdWN0LXJldmlldy1wcm9kdWN0LXByb3MnLFxuXHRcdFx0XHRcdFx0XHRpbml0aWFsT3BlbjogZmFsc2Vcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwcHItcmV2aWV3LXByby1saXN0JyB9LFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX3Byb3MpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1wcm8taXRlbScgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0J2xhYmVsJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAnZm9yJzogJ3dwcHItcHJvLWl0ZW0tJyArIGtleSB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJzZUludChrZXkpICsgMVxuXHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlkOiAnd3Bwci1wcm8taXRlbS0nICsga2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cHByLXRleHQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlcjogX18oJ09wdGlvbicpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogX3RoaXMyLnN0YXRlLndwcHJfcHJvc1trZXldLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIub25DaGFuZ2VQcm9UZXh0KGUsIGtleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfcHJvcykubGVuZ3RoIDwgNSAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0QnV0dG9uLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrOiB0aGlzLmFkZFByb1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0X18oJ0FkZCBhbm90aGVyIG9wdGlvbicpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFBhbmVsQm9keSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IF9fKCdDb24gRmVhdHVyZXMnKSxcblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3AtcHJvZHVjdC1yZXZpZXctcHJvZHVjdC1jb25zJyxcblx0XHRcdFx0XHRcdFx0aW5pdGlhbE9wZW46IGZhbHNlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHQnZGl2Jyxcblx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1jb24tbGlzdCcgfSxcblx0XHRcdFx0XHRcdFx0X09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9jb25zKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHQnZGl2Jyxcblx0XHRcdFx0XHRcdFx0XHRcdHsgY2xhc3NOYW1lOiAnd3Bwci1yZXZpZXctY29uLWl0ZW0nIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdsYWJlbCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2Zvcic6ICd3cHByLWNvbi1pdGVtLScgKyBrZXkgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2VJbnQoa2V5KSArIDFcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3RleHQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZDogJ3dwcHItY29uLWl0ZW0tJyArIGtleSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3Bwci10ZXh0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI6IF9fKCdPcHRpb24nKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IF90aGlzMi5zdGF0ZS53cHByX2NvbnNba2V5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlQ29uVGV4dChlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX2NvbnMpLmxlbmd0aCA8IDUgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0xhcmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogdGhpcy5hZGRDb25cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdBZGQgYW5vdGhlciBvcHRpb24nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXVxuXHRcdFx0KTtcblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gV1BfUHJvZHVjdF9SZXZpZXc7XG59KENvbXBvbmVudCk7XG5cbnZhciBXUFBSID0gY29tcG9zZShbd2l0aFNlbGVjdChmdW5jdGlvbiAoc2VsZWN0LCBfcmVmMikge1xuXHR2YXIgZm9yY2VJc1NhdmluZyA9IF9yZWYyLmZvcmNlSXNTYXZpbmc7XG5cblx0dmFyIF9zZWxlY3QgPSBzZWxlY3QoJ2NvcmUvZWRpdG9yJyksXG5cdCAgICBnZXRDdXJyZW50UG9zdElkID0gX3NlbGVjdC5nZXRDdXJyZW50UG9zdElkLFxuXHQgICAgaXNTYXZpbmdQb3N0ID0gX3NlbGVjdC5pc1NhdmluZ1Bvc3QsXG5cdCAgICBpc1B1Ymxpc2hpbmdQb3N0ID0gX3NlbGVjdC5pc1B1Ymxpc2hpbmdQb3N0LFxuXHQgICAgZ2V0Q3VycmVudFBvc3RUeXBlID0gX3NlbGVjdC5nZXRDdXJyZW50UG9zdFR5cGU7XG5cblx0cmV0dXJuIHtcblx0XHRwb3N0SWQ6IGdldEN1cnJlbnRQb3N0SWQoKSxcblx0XHRwb3N0VHlwZTogZ2V0Q3VycmVudFBvc3RUeXBlKCksXG5cdFx0aXNTYXZpbmc6IGZvcmNlSXNTYXZpbmcgfHwgaXNTYXZpbmdQb3N0KCksXG5cdFx0aXNQdWJsaXNoaW5nOiBpc1B1Ymxpc2hpbmdQb3N0KClcblx0fTtcbn0pLCB3aXRoRGlzcGF0Y2goZnVuY3Rpb24gKGRpc3BhdGNoKSB7XG5cdHJldHVybiB7XG5cdFx0b3BlblJldmlld1NpZGViYXI6IGZ1bmN0aW9uIG9wZW5SZXZpZXdTaWRlYmFyKCkge1xuXHRcdFx0cmV0dXJuIGRpc3BhdGNoKCdjb3JlL2VkaXQtcG9zdCcpLm9wZW5HZW5lcmFsU2lkZWJhcignd3AtcHJvZHVjdC1yZXZpZXcvd3AtcHJvZHVjdC1yZXZpZXcnKTtcblx0XHR9LFxuXHRcdGVkaXRQb3N0U3RhdHVzOiBkaXNwYXRjaCgnY29yZS9lZGl0b3InKS5lZGl0UG9zdFxuXHR9O1xufSksIHdpdGhBUElEYXRhKGZ1bmN0aW9uIChwcm9wcykge1xuXHRyZXR1cm4ge1xuXHRcdHJldmlldzogJy93cC92Mi8nICsgKHByb3BzLnBvc3RUeXBlID09PSAnd3Bwcl9yZXZpZXcnID8gcHJvcHMucG9zdFR5cGUgOiAncG9zdHMnKSArICcvJyArIHByb3BzLnBvc3RJZFxuXHR9O1xufSldKShXUF9Qcm9kdWN0X1Jldmlldyk7XG5cbnJlZ2lzdGVyUGx1Z2luKCd3cC1wcm9kdWN0LXJldmlldycsIHtcblx0aWNvbjogJ3N0YXItZW1wdHknLFxuXHRyZW5kZXI6IFdQUFJcbn0pO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2Jsb2NrLmpzXG4vLyBtb2R1bGUgaWQgPSA0M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///43\n");
332
 
333
  /***/ }),
334
  /* 44 */
@@ -648,17 +648,23 @@ eval("// removed by extract-text-webpack-plugin//# sourceURL=[module]\n//# sourc
648
 
649
  /***/ }),
650
  /* 95 */
651
- /***/ (function(module, exports, __webpack_require__) {
652
 
653
  "use strict";
654
- eval("/* jslint node: true */\n\n\nmodule.exports = function( obj, oldName, newName ) {\n\tif (typeof obj === 'string') {\n\t\tnewName = oldName;\n\t\toldName = obj;\n\t\tobj = this;\n\t}\n\n\tif (obj.hasOwnProperty(oldName)) {\n\t\tobj[newName] = obj[oldName];\n\t\tdelete obj[oldName];\n\t}\n\n\treturn obj;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVuYW1lLWtleS9pbmRleC5qcz9hZGQ1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGpzbGludCBub2RlOiB0cnVlICovXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oIG9iaiwgb2xkTmFtZSwgbmV3TmFtZSApIHtcblx0aWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0bmV3TmFtZSA9IG9sZE5hbWU7XG5cdFx0b2xkTmFtZSA9IG9iajtcblx0XHRvYmogPSB0aGlzO1xuXHR9XG5cblx0aWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvbGROYW1lKSkge1xuXHRcdG9ialtuZXdOYW1lXSA9IG9ialtvbGROYW1lXTtcblx0XHRkZWxldGUgb2JqW29sZE5hbWVdO1xuXHR9XG5cblx0cmV0dXJuIG9iajtcbn07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvcmVuYW1lLWtleS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95\n");
655
 
656
  /***/ }),
657
  /* 96 */
658
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
659
 
660
  "use strict";
661
- eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return reverseObject; });\nvar reverseObject = function reverseObject(object) {\n\tvar newObject = {};\n\tvar keys = [];\n\tfor (var key in object) {\n\t\tkeys.push(key);\n\t}\n\tfor (var i = keys.length - 1; i >= 0; i--) {\n\t\tvar value = object[keys[i]];\n\t\tnewObject[keys[i]] = value;\n\t}\n\treturn newObject;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMuanM/ZTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIHJldmVyc2VPYmplY3QgPSBmdW5jdGlvbiByZXZlcnNlT2JqZWN0KG9iamVjdCkge1xuXHR2YXIgbmV3T2JqZWN0ID0ge307XG5cdHZhciBrZXlzID0gW107XG5cdGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcblx0XHRrZXlzLnB1c2goa2V5KTtcblx0fVxuXHRmb3IgKHZhciBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdHZhciB2YWx1ZSA9IG9iamVjdFtrZXlzW2ldXTtcblx0XHRuZXdPYmplY3Rba2V5c1tpXV0gPSB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gbmV3T2JqZWN0O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy91dGlscy5qc1xuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96\n");
 
 
 
 
 
 
662
 
663
  /***/ })
664
  /******/ ]);
67
  /* 0 */
68
  /***/ (function(module, exports) {
69
 
70
+ eval("var core = module.exports = { version: '2.6.0' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcz8xNWUwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjYuMCcgfTtcbmlmICh0eXBlb2YgX19lID09ICdudW1iZXInKSBfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n");
71
 
72
  /***/ }),
73
  /* 1 */
328
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
329
 
330
  "use strict";
331
+ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__ = __webpack_require__(44);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__ = __webpack_require__(51);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of__ = __webpack_require__(56);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__ = __webpack_require__(59);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__ = __webpack_require__(60);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(64);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits__ = __webpack_require__(86);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__style_scss__ = __webpack_require__(94);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__style_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7__style_scss__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__utils__ = __webpack_require__(95);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__radio_image_control___ = __webpack_require__(96);\n\n\n\n\n\n\n\n/**\n * Internal dependencies\n */\n\n\n\n\n/**\n * WordPress dependencies\n */\nvar __ = wp.i18n.__;\nvar _lodash = lodash,\n isUndefined = _lodash.isUndefined,\n pickBy = _lodash.pickBy;\nvar registerPlugin = wp.plugins.registerPlugin;\nvar MediaUpload = wp.editor.MediaUpload;\nvar _wp$data = wp.data,\n withSelect = _wp$data.withSelect,\n withDispatch = _wp$data.withDispatch;\nvar _wp$editPost = wp.editPost,\n PluginPostStatusInfo = _wp$editPost.PluginPostStatusInfo,\n PluginSidebarMoreMenuItem = _wp$editPost.PluginSidebarMoreMenuItem,\n PluginSidebar = _wp$editPost.PluginSidebar;\nvar _wp$element = wp.element,\n Component = _wp$element.Component,\n Fragment = _wp$element.Fragment;\nvar _wp$compose = wp.compose,\n withState = _wp$compose.withState,\n compose = _wp$compose.compose;\nvar _wp$components = wp.components,\n Button = _wp$components.Button,\n FormToggle = _wp$components.FormToggle,\n Modal = _wp$components.Modal,\n PanelBody = _wp$components.PanelBody,\n SelectControl = _wp$components.SelectControl,\n TextControl = _wp$components.TextControl;\n\nvar WP_Product_Review = function (_Component) {\n\t__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_inherits___default()(WP_Product_Review, _Component);\n\n\tfunction WP_Product_Review() {\n\t\t__WEBPACK_IMPORTED_MODULE_3_babel_runtime_helpers_classCallCheck___default()(this, WP_Product_Review);\n\n\t\tvar _this = __WEBPACK_IMPORTED_MODULE_5_babel_runtime_helpers_possibleConstructorReturn___default()(this, (WP_Product_Review.__proto__ || __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_object_get_prototype_of___default()(WP_Product_Review)).apply(this, arguments));\n\n\t\t_this.toggleReviewStatus = _this.toggleReviewStatus.bind(_this);\n\t\t_this.onChangeTemplate = _this.onChangeTemplate.bind(_this);\n\t\t_this.onChangeReviewTitle = _this.onChangeReviewTitle.bind(_this);\n\t\t_this.onChangeReviewImage = _this.onChangeReviewImage.bind(_this);\n\t\t_this.onChangeImageLink = _this.onChangeImageLink.bind(_this);\n\t\t_this.onChangeReviewAffiliateTitle = _this.onChangeReviewAffiliateTitle.bind(_this);\n\t\t_this.onChangeReviewAffiliateLink = _this.onChangeReviewAffiliateLink.bind(_this);\n\t\t_this.addButton = _this.addButton.bind(_this);\n\t\t_this.onChangeReviewPrice = _this.onChangeReviewPrice.bind(_this);\n\t\t_this.onChangeOptionText = _this.onChangeOptionText.bind(_this);\n\t\t_this.onChangeOptionNumber = _this.onChangeOptionNumber.bind(_this);\n\t\t_this.addOption = _this.addOption.bind(_this);\n\t\t_this.onChangeProText = _this.onChangeProText.bind(_this);\n\t\t_this.addPro = _this.addPro.bind(_this);\n\t\t_this.onChangeConText = _this.onChangeConText.bind(_this);\n\t\t_this.addCon = _this.addCon.bind(_this);\n\t\t_this.importReview = _this.importReview.bind(_this);\n\n\t\t_this.state = {\n\t\t\tcwp_meta_box_check: 'No',\n\t\t\tcwp_rev_product_name: '',\n\t\t\t_wppr_review_template: 'default',\n\t\t\tcwp_rev_product_image: '',\n\t\t\tcwp_image_link: 'image',\n\t\t\twppr_links: {\n\t\t\t\t'': ''\n\t\t\t},\n\t\t\tcwp_rev_price: '',\n\t\t\twppr_options: {\n\t\t\t\t1: {\n\t\t\t\t\tname: '',\n\t\t\t\t\tvalue: 0\n\t\t\t\t}\n\t\t\t},\n\t\t\twppr_pros: {\n\t\t\t\t0: ''\n\t\t\t},\n\t\t\twppr_cons: {\n\t\t\t\t0: ''\n\t\t\t}\n\t\t};\n\t\treturn _this;\n\t}\n\n\t__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_createClass___default()(WP_Product_Review, [{\n\t\tkey: 'componentDidUpdate',\n\t\tvalue: function componentDidUpdate(prevProps, prevState) {\n\t\t\tif (undefined !== this.props.post) {\n\t\t\t\tif (prevProps.post.wppr_data !== this.props.post.wppr_data) {\n\t\t\t\t\tthis.setState(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.props.post.wppr_data));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.state.cwp_meta_box_check !== prevState.cwp_meta_box_check && this.state.cwp_meta_box_check === 'Yes') {\n\t\t\t\tthis.props.openReviewSidebar();\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'toggleReviewStatus',\n\t\tvalue: function toggleReviewStatus() {\n\t\t\tthis.setState({ cwp_meta_box_check: this.state.cwp_meta_box_check === 'Yes' ? 'No' : 'Yes' });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeTemplate',\n\t\tvalue: function onChangeTemplate(value) {\n\t\t\tthis.setState({ _wppr_review_template: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewTitle',\n\t\tvalue: function onChangeReviewTitle(value) {\n\t\t\tthis.setState({ cwp_rev_product_name: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewImage',\n\t\tvalue: function onChangeReviewImage(value) {\n\t\t\tif (value.url !== undefined && value.url !== '') {\n\t\t\t\tthis.setState({ cwp_rev_product_image: value.url });\n\t\t\t} else if (value.id !== undefined) {\n\t\t\t\tthis.setState({ cwp_rev_product_image: value.id });\n\t\t\t}\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeImageLink',\n\t\tvalue: function onChangeImageLink(value) {\n\t\t\tthis.setState({ cwp_image_link: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewAffiliateTitle',\n\t\tvalue: function onChangeReviewAffiliateTitle(e, key) {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\tif (__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).length === 2) {\n\t\t\t\tif (e === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[0] || e === __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[1]) {\n\t\t\t\t\te = e + ' ';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(wppr_links)[0] === key) {\n\t\t\t\tObject(__WEBPACK_IMPORTED_MODULE_8__utils__[\"a\" /* renameKey */])(wppr_links, key, e);\n\t\t\t\twppr_links = Object(__WEBPACK_IMPORTED_MODULE_8__utils__[\"b\" /* reverseObject */])(wppr_links);\n\t\t\t} else {\n\t\t\t\tObject(__WEBPACK_IMPORTED_MODULE_8__utils__[\"a\" /* renameKey */])(wppr_links, key, e);\n\t\t\t}\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewAffiliateLink',\n\t\tvalue: function onChangeReviewAffiliateLink(e, key) {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\twppr_links[key] = e;\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addButton',\n\t\tvalue: function addButton() {\n\t\t\tvar wppr_links = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_links);\n\t\t\twppr_links['Buy Now'] = '';\n\t\t\tthis.setState({ wppr_links: wppr_links });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeReviewPrice',\n\t\tvalue: function onChangeReviewPrice(value) {\n\t\t\tthis.setState({ cwp_rev_price: value });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeOptionText',\n\t\tvalue: function onChangeOptionText(e, key) {\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\twppr_options[key]['name'] = e;\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeOptionNumber',\n\t\tvalue: function onChangeOptionNumber(e, key) {\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\tif (e === '') e = 0;\n\t\t\twppr_options[key]['value'] = e;\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addOption',\n\t\tvalue: function addOption() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).length + 1;\n\t\t\tvar wppr_options = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_options);\n\t\t\twppr_options[key] = {\n\t\t\t\tname: '',\n\t\t\t\tvalue: 0\n\t\t\t};\n\t\t\tthis.setState({ wppr_options: wppr_options });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeProText',\n\t\tvalue: function onChangeProText(e, key) {\n\t\t\tvar wppr_pros = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_pros);\n\t\t\twppr_pros[key] = e;\n\t\t\tthis.setState({ wppr_pros: wppr_pros });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addPro',\n\t\tvalue: function addPro() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).length;\n\t\t\tvar wppr_pros = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_pros);\n\t\t\twppr_pros[key] = '';\n\t\t\tthis.setState({ wppr_pros: wppr_pros });\n\t\t}\n\t}, {\n\t\tkey: 'onChangeConText',\n\t\tvalue: function onChangeConText(e, key) {\n\t\t\tvar wppr_cons = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_cons);\n\t\t\twppr_cons[key] = e;\n\t\t\tthis.setState({ wppr_cons: wppr_cons });\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t}\n\t}, {\n\t\tkey: 'addCon',\n\t\tvalue: function addCon() {\n\t\t\tvar key = __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).length;\n\t\t\tvar wppr_cons = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_helpers_extends___default()({}, this.state.wppr_cons);\n\t\t\twppr_cons[key] = '';\n\t\t\tthis.setState({ wppr_cons: wppr_cons });\n\t\t}\n\t}, {\n\t\tkey: 'importReview',\n\t\tvalue: function importReview(key) {\n\t\t\tthis.setState({\n\t\t\t\twppr_options: this.props.posts[key].wppr_data.wppr_options,\n\t\t\t\twppr_pros: this.props.posts[key].wppr_data.wppr_pros,\n\t\t\t\twppr_cons: this.props.posts[key].wppr_data.wppr_cons\n\t\t\t});\n\t\t\tthis.props.editPostStatus({ edited: true });\n\t\t\tthis.props.setState({ isOpen: false });\n\t\t}\n\t}, {\n\t\tkey: 'render',\n\t\tvalue: function render() {\n\t\t\tvar _this2 = this;\n\n\t\t\treturn wp.element.createElement(\n\t\t\t\tFragment,\n\t\t\t\tnull,\n\t\t\t\twp.element.createElement(\n\t\t\t\t\tPluginPostStatusInfo,\n\t\t\t\t\tnull,\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t'label',\n\t\t\t\t\t\t{ htmlFor: 'is-this-a-review' },\n\t\t\t\t\t\t__('Is this post a review?')\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(FormToggle, {\n\t\t\t\t\t\tchecked: this.state.cwp_meta_box_check === 'Yes' ? true : false,\n\t\t\t\t\t\tonChange: this.toggleReviewStatus,\n\t\t\t\t\t\tid: 'is-this-a-review'\n\t\t\t\t\t})\n\t\t\t\t),\n\t\t\t\tthis.state.cwp_meta_box_check === 'Yes' && [wp.element.createElement(\n\t\t\t\t\tPluginSidebarMoreMenuItem,\n\t\t\t\t\t{\n\t\t\t\t\t\ttarget: 'wp-product-review'\n\t\t\t\t\t},\n\t\t\t\t\t__('WP Product Review')\n\t\t\t\t), wp.element.createElement(\n\t\t\t\t\tPluginSidebar,\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'wp-product-review',\n\t\t\t\t\t\ttitle: __('WP Product Review')\n\t\t\t\t\t},\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Product Details'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-details',\n\t\t\t\t\t\t\tinitialOpen: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\twpprguten.isPro && wp.element.createElement(__WEBPACK_IMPORTED_MODULE_9__radio_image_control___[\"a\" /* default */], {\n\t\t\t\t\t\t\tlabel: __('Review Template'),\n\t\t\t\t\t\t\tselected: this.state._wppr_review_template,\n\t\t\t\t\t\t\toptions: [{\n\t\t\t\t\t\t\t\tlabel: __('Default'),\n\t\t\t\t\t\t\t\tsrc: wpprguten.path + '/assets/img/templates/default.png',\n\t\t\t\t\t\t\t\tvalue: 'default'\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tlabel: __('Style 1'),\n\t\t\t\t\t\t\t\tsrc: wpprguten.path + '/assets/img/templates/style1.png',\n\t\t\t\t\t\t\t\tvalue: 'style1'\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tlabel: __('Style 2'),\n\t\t\t\t\t\t\t\tsrc: wpprguten.path + '/assets/img/templates/style2.png',\n\t\t\t\t\t\t\t\tvalue: 'style2'\n\t\t\t\t\t\t\t}],\n\t\t\t\t\t\t\tonChange: this.onChangeTemplate\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tthis.props.postType !== 'wppr_review' && [wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\tlabel: __('Product Name'),\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tvalue: this.state.cwp_rev_product_name,\n\t\t\t\t\t\t\tonChange: this.onChangeReviewTitle\n\t\t\t\t\t\t})],\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wp-product-review-sidebar-base-control' },\n\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t{ className: 'blocks-base-control__label', 'for': 'inspector-media-upload' },\n\t\t\t\t\t\t\t\t__('Product Image')\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\twp.element.createElement(MediaUpload, {\n\t\t\t\t\t\t\t\ttype: 'image',\n\t\t\t\t\t\t\t\tid: 'inspector-media-upload',\n\t\t\t\t\t\t\t\tvalue: this.state.cwp_rev_product_image,\n\t\t\t\t\t\t\t\tonSelect: this.onChangeReviewImage,\n\t\t\t\t\t\t\t\trender: function render(_ref) {\n\t\t\t\t\t\t\t\t\tvar open = _ref.open;\n\t\t\t\t\t\t\t\t\treturn [_this2.state.cwp_rev_product_image !== '' && [wp.element.createElement('img', {\n\t\t\t\t\t\t\t\t\t\tonClick: open,\n\t\t\t\t\t\t\t\t\t\tsrc: _this2.state.cwp_rev_product_image,\n\t\t\t\t\t\t\t\t\t\talt: __('Review image')\n\t\t\t\t\t\t\t\t\t}), wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\t\t\treturn _this2.setState({ cwp_rev_product_image: '' });\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tstyle: { marginTop: '10px' }\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t__('Remove Image')\n\t\t\t\t\t\t\t\t\t)], wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\t\t\tonClick: open,\n\t\t\t\t\t\t\t\t\t\t\tstyle: { marginTop: '10px' },\n\t\t\t\t\t\t\t\t\t\t\tclassName: _this2.state.cwp_rev_product_image === '' && 'wppr_image_upload'\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t__('Choose or Upload an Image')\n\t\t\t\t\t\t\t\t\t)];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\twp.element.createElement(SelectControl, {\n\t\t\t\t\t\t\tlabel: __('Product Image Click'),\n\t\t\t\t\t\t\tvalue: this.state.cwp_image_link,\n\t\t\t\t\t\t\toptions: [{\n\t\t\t\t\t\t\t\tlabel: __('Show Whole Image'),\n\t\t\t\t\t\t\t\tvalue: 'image'\n\t\t\t\t\t\t\t}, {\n\t\t\t\t\t\t\t\tlabel: __('Open Affiliate Link'),\n\t\t\t\t\t\t\t\tvalue: 'link'\n\t\t\t\t\t\t\t}],\n\t\t\t\t\t\t\tonChange: this.onChangeImageLink\n\t\t\t\t\t\t}),\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-links-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).map(function (key) {\n\t\t\t\t\t\t\t\treturn [wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\tlabel: __('Affiliate Button Text'),\n\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\tvalue: key,\n\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeReviewAffiliateTitle(e, key);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}), wp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\tlabel: __('Affiliate Button Link'),\n\t\t\t\t\t\t\t\t\ttype: 'url',\n\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_links[key],\n\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeReviewAffiliateLink(e, key);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_links).length < 2 && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addButton\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another button')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t),\n\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\tlabel: __('Product Price'),\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tvalue: this.state.cwp_rev_price,\n\t\t\t\t\t\t\tonChange: this.onChangeReviewPrice\n\t\t\t\t\t\t})\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Product Options'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-options',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-options-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-options-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-option-item-' + key },\n\t\t\t\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-option-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_options[key].name,\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeOptionText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'number',\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text wppr-option-number',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('0'),\n\t\t\t\t\t\t\t\t\t\tmin: 0,\n\t\t\t\t\t\t\t\t\t\tmax: 100,\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_options[key].value,\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeOptionNumber(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_options).length < wpprguten.length && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addOption\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Pro Features'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-pros',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-pro-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-pro-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-pro-item-' + key },\n\t\t\t\t\t\t\t\t\t\tparseInt(key) + 1\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-pro-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_pros[key],\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeProText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_pros).length < wpprguten.length && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addPro\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttitle: __('Con Features'),\n\t\t\t\t\t\t\tclassName: 'wp-product-review-product-cons',\n\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t},\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ className: 'wppr-review-con-list' },\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t{ className: 'wppr-review-con-item' },\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'label',\n\t\t\t\t\t\t\t\t\t\t{ 'for': 'wppr-con-item-' + key },\n\t\t\t\t\t\t\t\t\t\tparseInt(key) + 1\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\twp.element.createElement(TextControl, {\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\t\tid: 'wppr-con-item-' + key,\n\t\t\t\t\t\t\t\t\t\tclassName: 'wppr-text',\n\t\t\t\t\t\t\t\t\t\tplaceholder: __('Option'),\n\t\t\t\t\t\t\t\t\t\tvalue: _this2.state.wppr_cons[key],\n\t\t\t\t\t\t\t\t\t\tonChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t\t\treturn _this2.onChangeConText(e, key);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.state.wppr_cons).length < wpprguten.length && wp.element.createElement(\n\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\tonClick: this.addCon\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t__('Add another option')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\twpprguten.isPro && wp.element.createElement(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ className: 'wppr-review-import-review-button' },\n\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\tisPrimary: true,\n\t\t\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.setState({ isOpen: true });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t__('Import Review')\n\t\t\t\t\t\t),\n\t\t\t\t\t\tthis.props.isOpen ? wp.element.createElement(\n\t\t\t\t\t\t\tModal,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttitle: __('Import Review'),\n\t\t\t\t\t\t\t\tclassName: 'wppr-review-import-modal',\n\t\t\t\t\t\t\t\tonRequestClose: function onRequestClose() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.setState({ isOpen: false });\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\tthis.props.posts && __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(this.props.posts).map(function (key) {\n\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\tPanelBody,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\ttitle: _this2.props.posts[key].title.raw,\n\t\t\t\t\t\t\t\t\t\tinitialOpen: false\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t\t\t{ className: 'cwp_pitem_info' },\n\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t\t{ 'class': 'cwp_pitem_options_content' },\n\t\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t__('Options')\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(_this2.props.posts[key].wppr_data.wppr_options).map(function (i) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.props.posts[key].wppr_data.wppr_options[i].name\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t\t{ 'class': 'cwp_pitem_options_pros' },\n\t\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t__('Pros')\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(_this2.props.posts[key].wppr_data.wppr_pros).map(function (i) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.props.posts[key].wppr_data.wppr_pros[i]\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t'ul',\n\t\t\t\t\t\t\t\t\t\t\t{ 'class': 'cwp_pitem_options_cons' },\n\t\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t'h4',\n\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t__('Cons')\n\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_object_keys___default()(_this2.props.posts[key].wppr_data.wppr_cons).map(function (i) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'li',\n\t\t\t\t\t\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.props.posts[key].wppr_data.wppr_cons[i]\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\t\t\t\t\tButton,\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tisLarge: true,\n\t\t\t\t\t\t\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn _this2.importReview(key);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t__('Import Review')\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t) : null\n\t\t\t\t\t)\n\t\t\t\t)]\n\t\t\t);\n\t\t}\n\t}], [{\n\t\tkey: 'getDerivedStateFromProps',\n\t\tvalue: function getDerivedStateFromProps(nextProps, state) {\n\t\t\tif ((nextProps.isPublishing || nextProps.isSaving) && !nextProps.isAutoSaving) {\n\t\t\t\twp.apiRequest({ path: '/wp-product-review/update-review?id=' + nextProps.postId + '&postType=' + nextProps.postType, method: 'POST', data: state }).then(function (data) {\n\t\t\t\t\treturn data;\n\t\t\t\t}, function (err) {\n\t\t\t\t\treturn err;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}]);\n\n\treturn WP_Product_Review;\n}(Component);\n\nvar WPPR = compose([withSelect(function (select, _ref2) {\n\tvar forceIsSaving = _ref2.forceIsSaving;\n\n\tvar _select = select('core/editor'),\n\t getCurrentPostId = _select.getCurrentPostId,\n\t isSavingPost = _select.isSavingPost,\n\t isPublishingPost = _select.isPublishingPost,\n\t isAutosavingPost = _select.isAutosavingPost,\n\t getCurrentPostType = _select.getCurrentPostType;\n\n\tvar latestPostsQuery = pickBy({\n\t\tper_page: 100,\n\t\tmeta_key: 'cwp_meta_box_check',\n\t\tmeta_value: 'Yes'\n\t}, function (value) {\n\t\treturn !isUndefined(value);\n\t});\n\treturn {\n\t\tpostId: getCurrentPostId(),\n\t\tpostType: getCurrentPostType(),\n\t\tposts: select('core').getEntityRecords('postType', 'post', latestPostsQuery),\n\t\tpost: select('core').getEntityRecord('postType', getCurrentPostType(), getCurrentPostId()),\n\t\tisSaving: forceIsSaving || isSavingPost(),\n\t\tisAutoSaving: isAutosavingPost(),\n\t\tisPublishing: isPublishingPost()\n\t};\n}), withState({\n\tisOpen: false\n}), withDispatch(function (dispatch) {\n\treturn {\n\t\topenReviewSidebar: function openReviewSidebar() {\n\t\t\treturn dispatch('core/edit-post').openGeneralSidebar('wp-product-review/wp-product-review');\n\t\t},\n\t\teditPostStatus: dispatch('core/editor').editPost\n\t};\n})])(WP_Product_Review);\n\nregisterPlugin('wp-product-review', {\n\ticon: 'star-empty',\n\trender: WPPR\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvc2lkZWJhci5qcz8yNWQ1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfT2JqZWN0JGtleXMgZnJvbSAnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9rZXlzJztcbmltcG9ydCBfZXh0ZW5kcyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcyc7XG5pbXBvcnQgX09iamVjdCRnZXRQcm90b3R5cGVPZiBmcm9tICdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1wcm90b3R5cGUtb2YnO1xuaW1wb3J0IF9jbGFzc0NhbGxDaGVjayBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tICdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MnO1xuaW1wb3J0IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIGZyb20gJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJztcbmltcG9ydCBfaW5oZXJpdHMgZnJvbSAnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJztcbi8qKlxuICogSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCAnLi9zdHlsZS5zY3NzJztcbmltcG9ydCB7IHJldmVyc2VPYmplY3QsIHJlbmFtZUtleSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IFJhZGlvSW1hZ2VDb250cm9sIGZyb20gJy4vcmFkaW8taW1hZ2UtY29udHJvbC8nO1xuXG4vKipcbiAqIFdvcmRQcmVzcyBkZXBlbmRlbmNpZXNcbiAqL1xudmFyIF9fID0gd3AuaTE4bi5fXztcbnZhciBfbG9kYXNoID0gbG9kYXNoLFxuICAgIGlzVW5kZWZpbmVkID0gX2xvZGFzaC5pc1VuZGVmaW5lZCxcbiAgICBwaWNrQnkgPSBfbG9kYXNoLnBpY2tCeTtcbnZhciByZWdpc3RlclBsdWdpbiA9IHdwLnBsdWdpbnMucmVnaXN0ZXJQbHVnaW47XG52YXIgTWVkaWFVcGxvYWQgPSB3cC5lZGl0b3IuTWVkaWFVcGxvYWQ7XG52YXIgX3dwJGRhdGEgPSB3cC5kYXRhLFxuICAgIHdpdGhTZWxlY3QgPSBfd3AkZGF0YS53aXRoU2VsZWN0LFxuICAgIHdpdGhEaXNwYXRjaCA9IF93cCRkYXRhLndpdGhEaXNwYXRjaDtcbnZhciBfd3AkZWRpdFBvc3QgPSB3cC5lZGl0UG9zdCxcbiAgICBQbHVnaW5Qb3N0U3RhdHVzSW5mbyA9IF93cCRlZGl0UG9zdC5QbHVnaW5Qb3N0U3RhdHVzSW5mbyxcbiAgICBQbHVnaW5TaWRlYmFyTW9yZU1lbnVJdGVtID0gX3dwJGVkaXRQb3N0LlBsdWdpblNpZGViYXJNb3JlTWVudUl0ZW0sXG4gICAgUGx1Z2luU2lkZWJhciA9IF93cCRlZGl0UG9zdC5QbHVnaW5TaWRlYmFyO1xudmFyIF93cCRlbGVtZW50ID0gd3AuZWxlbWVudCxcbiAgICBDb21wb25lbnQgPSBfd3AkZWxlbWVudC5Db21wb25lbnQsXG4gICAgRnJhZ21lbnQgPSBfd3AkZWxlbWVudC5GcmFnbWVudDtcbnZhciBfd3AkY29tcG9zZSA9IHdwLmNvbXBvc2UsXG4gICAgd2l0aFN0YXRlID0gX3dwJGNvbXBvc2Uud2l0aFN0YXRlLFxuICAgIGNvbXBvc2UgPSBfd3AkY29tcG9zZS5jb21wb3NlO1xudmFyIF93cCRjb21wb25lbnRzID0gd3AuY29tcG9uZW50cyxcbiAgICBCdXR0b24gPSBfd3AkY29tcG9uZW50cy5CdXR0b24sXG4gICAgRm9ybVRvZ2dsZSA9IF93cCRjb21wb25lbnRzLkZvcm1Ub2dnbGUsXG4gICAgTW9kYWwgPSBfd3AkY29tcG9uZW50cy5Nb2RhbCxcbiAgICBQYW5lbEJvZHkgPSBfd3AkY29tcG9uZW50cy5QYW5lbEJvZHksXG4gICAgU2VsZWN0Q29udHJvbCA9IF93cCRjb21wb25lbnRzLlNlbGVjdENvbnRyb2wsXG4gICAgVGV4dENvbnRyb2wgPSBfd3AkY29tcG9uZW50cy5UZXh0Q29udHJvbDtcblxudmFyIFdQX1Byb2R1Y3RfUmV2aWV3ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcblx0X2luaGVyaXRzKFdQX1Byb2R1Y3RfUmV2aWV3LCBfQ29tcG9uZW50KTtcblxuXHRmdW5jdGlvbiBXUF9Qcm9kdWN0X1JldmlldygpIHtcblx0XHRfY2xhc3NDYWxsQ2hlY2sodGhpcywgV1BfUHJvZHVjdF9SZXZpZXcpO1xuXG5cdFx0dmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFdQX1Byb2R1Y3RfUmV2aWV3Ll9fcHJvdG9fXyB8fCBfT2JqZWN0JGdldFByb3RvdHlwZU9mKFdQX1Byb2R1Y3RfUmV2aWV3KSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG5cblx0XHRfdGhpcy50b2dnbGVSZXZpZXdTdGF0dXMgPSBfdGhpcy50b2dnbGVSZXZpZXdTdGF0dXMuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VUZW1wbGF0ZSA9IF90aGlzLm9uQ2hhbmdlVGVtcGxhdGUuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VSZXZpZXdUaXRsZSA9IF90aGlzLm9uQ2hhbmdlUmV2aWV3VGl0bGUuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VSZXZpZXdJbWFnZSA9IF90aGlzLm9uQ2hhbmdlUmV2aWV3SW1hZ2UuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMub25DaGFuZ2VJbWFnZUxpbmsgPSBfdGhpcy5vbkNoYW5nZUltYWdlTGluay5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZVJldmlld0FmZmlsaWF0ZVRpdGxlID0gX3RoaXMub25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVUaXRsZS5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZVJldmlld0FmZmlsaWF0ZUxpbmsgPSBfdGhpcy5vbkNoYW5nZVJldmlld0FmZmlsaWF0ZUxpbmsuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMuYWRkQnV0dG9uID0gX3RoaXMuYWRkQnV0dG9uLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlUmV2aWV3UHJpY2UgPSBfdGhpcy5vbkNoYW5nZVJldmlld1ByaWNlLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlT3B0aW9uVGV4dCA9IF90aGlzLm9uQ2hhbmdlT3B0aW9uVGV4dC5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZU9wdGlvbk51bWJlciA9IF90aGlzLm9uQ2hhbmdlT3B0aW9uTnVtYmVyLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLmFkZE9wdGlvbiA9IF90aGlzLmFkZE9wdGlvbi5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5vbkNoYW5nZVByb1RleHQgPSBfdGhpcy5vbkNoYW5nZVByb1RleHQuYmluZChfdGhpcyk7XG5cdFx0X3RoaXMuYWRkUHJvID0gX3RoaXMuYWRkUHJvLmJpbmQoX3RoaXMpO1xuXHRcdF90aGlzLm9uQ2hhbmdlQ29uVGV4dCA9IF90aGlzLm9uQ2hhbmdlQ29uVGV4dC5iaW5kKF90aGlzKTtcblx0XHRfdGhpcy5hZGRDb24gPSBfdGhpcy5hZGRDb24uYmluZChfdGhpcyk7XG5cdFx0X3RoaXMuaW1wb3J0UmV2aWV3ID0gX3RoaXMuaW1wb3J0UmV2aWV3LmJpbmQoX3RoaXMpO1xuXG5cdFx0X3RoaXMuc3RhdGUgPSB7XG5cdFx0XHRjd3BfbWV0YV9ib3hfY2hlY2s6ICdObycsXG5cdFx0XHRjd3BfcmV2X3Byb2R1Y3RfbmFtZTogJycsXG5cdFx0XHRfd3Bwcl9yZXZpZXdfdGVtcGxhdGU6ICdkZWZhdWx0Jyxcblx0XHRcdGN3cF9yZXZfcHJvZHVjdF9pbWFnZTogJycsXG5cdFx0XHRjd3BfaW1hZ2VfbGluazogJ2ltYWdlJyxcblx0XHRcdHdwcHJfbGlua3M6IHtcblx0XHRcdFx0Jyc6ICcnXG5cdFx0XHR9LFxuXHRcdFx0Y3dwX3Jldl9wcmljZTogJycsXG5cdFx0XHR3cHByX29wdGlvbnM6IHtcblx0XHRcdFx0MToge1xuXHRcdFx0XHRcdG5hbWU6ICcnLFxuXHRcdFx0XHRcdHZhbHVlOiAwXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR3cHByX3Byb3M6IHtcblx0XHRcdFx0MDogJydcblx0XHRcdH0sXG5cdFx0XHR3cHByX2NvbnM6IHtcblx0XHRcdFx0MDogJydcblx0XHRcdH1cblx0XHR9O1xuXHRcdHJldHVybiBfdGhpcztcblx0fVxuXG5cdF9jcmVhdGVDbGFzcyhXUF9Qcm9kdWN0X1JldmlldywgW3tcblx0XHRrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcblx0XHRcdGlmICh1bmRlZmluZWQgIT09IHRoaXMucHJvcHMucG9zdCkge1xuXHRcdFx0XHRpZiAocHJldlByb3BzLnBvc3Qud3Bwcl9kYXRhICE9PSB0aGlzLnByb3BzLnBvc3Qud3Bwcl9kYXRhKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRTdGF0ZShfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcy5wb3N0LndwcHJfZGF0YSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnN0YXRlLmN3cF9tZXRhX2JveF9jaGVjayAhPT0gcHJldlN0YXRlLmN3cF9tZXRhX2JveF9jaGVjayAmJiB0aGlzLnN0YXRlLmN3cF9tZXRhX2JveF9jaGVjayA9PT0gJ1llcycpIHtcblx0XHRcdFx0dGhpcy5wcm9wcy5vcGVuUmV2aWV3U2lkZWJhcigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ3RvZ2dsZVJldmlld1N0YXR1cycsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHRvZ2dsZVJldmlld1N0YXR1cygpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyBjd3BfbWV0YV9ib3hfY2hlY2s6IHRoaXMuc3RhdGUuY3dwX21ldGFfYm94X2NoZWNrID09PSAnWWVzJyA/ICdObycgOiAnWWVzJyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VUZW1wbGF0ZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlVGVtcGxhdGUodmFsdWUpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyBfd3Bwcl9yZXZpZXdfdGVtcGxhdGU6IHZhbHVlIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVJldmlld1RpdGxlJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VSZXZpZXdUaXRsZSh2YWx1ZSkge1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGN3cF9yZXZfcHJvZHVjdF9uYW1lOiB2YWx1ZSB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VSZXZpZXdJbWFnZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlUmV2aWV3SW1hZ2UodmFsdWUpIHtcblx0XHRcdGlmICh2YWx1ZS51cmwgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS51cmwgIT09ICcnKSB7XG5cdFx0XHRcdHRoaXMuc2V0U3RhdGUoeyBjd3BfcmV2X3Byb2R1Y3RfaW1hZ2U6IHZhbHVlLnVybCB9KTtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWUuaWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLnNldFN0YXRlKHsgY3dwX3Jldl9wcm9kdWN0X2ltYWdlOiB2YWx1ZS5pZCB9KTtcblx0XHRcdH1cblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VJbWFnZUxpbmsnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZUltYWdlTGluayh2YWx1ZSkge1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGN3cF9pbWFnZV9saW5rOiB2YWx1ZSB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVUaXRsZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlUmV2aWV3QWZmaWxpYXRlVGl0bGUoZSwga2V5KSB7XG5cdFx0XHR2YXIgd3Bwcl9saW5rcyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfbGlua3MpO1xuXHRcdFx0aWYgKF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfbGlua3MpLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRpZiAoZSA9PT0gX09iamVjdCRrZXlzKHdwcHJfbGlua3MpWzBdIHx8IGUgPT09IF9PYmplY3Qka2V5cyh3cHByX2xpbmtzKVsxXSkge1xuXHRcdFx0XHRcdGUgPSBlICsgJyAnO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoX09iamVjdCRrZXlzKHdwcHJfbGlua3MpWzBdID09PSBrZXkpIHtcblx0XHRcdFx0cmVuYW1lS2V5KHdwcHJfbGlua3MsIGtleSwgZSk7XG5cdFx0XHRcdHdwcHJfbGlua3MgPSByZXZlcnNlT2JqZWN0KHdwcHJfbGlua3MpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVuYW1lS2V5KHdwcHJfbGlua3MsIGtleSwgZSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9saW5rczogd3Bwcl9saW5rcyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVMaW5rJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VSZXZpZXdBZmZpbGlhdGVMaW5rKGUsIGtleSkge1xuXHRcdFx0dmFyIHdwcHJfbGlua3MgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX2xpbmtzKTtcblx0XHRcdHdwcHJfbGlua3Nba2V5XSA9IGU7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9saW5rczogd3Bwcl9saW5rcyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnYWRkQnV0dG9uJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYWRkQnV0dG9uKCkge1xuXHRcdFx0dmFyIHdwcHJfbGlua3MgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX2xpbmtzKTtcblx0XHRcdHdwcHJfbGlua3NbJ0J1eSBOb3cnXSA9ICcnO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfbGlua3M6IHdwcHJfbGlua3MgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VSZXZpZXdQcmljZScsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlUmV2aWV3UHJpY2UodmFsdWUpIHtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyBjd3BfcmV2X3ByaWNlOiB2YWx1ZSB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VPcHRpb25UZXh0Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gb25DaGFuZ2VPcHRpb25UZXh0KGUsIGtleSkge1xuXHRcdFx0dmFyIHdwcHJfb3B0aW9ucyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfb3B0aW9ucyk7XG5cdFx0XHR3cHByX29wdGlvbnNba2V5XVsnbmFtZSddID0gZTtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX29wdGlvbnM6IHdwcHJfb3B0aW9ucyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnb25DaGFuZ2VPcHRpb25OdW1iZXInLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZU9wdGlvbk51bWJlcihlLCBrZXkpIHtcblx0XHRcdHZhciB3cHByX29wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX29wdGlvbnMpO1xuXHRcdFx0aWYgKGUgPT09ICcnKSBlID0gMDtcblx0XHRcdHdwcHJfb3B0aW9uc1trZXldWyd2YWx1ZSddID0gZTtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX29wdGlvbnM6IHdwcHJfb3B0aW9ucyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnYWRkT3B0aW9uJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYWRkT3B0aW9uKCkge1xuXHRcdFx0dmFyIGtleSA9IF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfb3B0aW9ucykubGVuZ3RoICsgMTtcblx0XHRcdHZhciB3cHByX29wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX29wdGlvbnMpO1xuXHRcdFx0d3Bwcl9vcHRpb25zW2tleV0gPSB7XG5cdFx0XHRcdG5hbWU6ICcnLFxuXHRcdFx0XHR2YWx1ZTogMFxuXHRcdFx0fTtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX29wdGlvbnM6IHdwcHJfb3B0aW9ucyB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdvbkNoYW5nZVByb1RleHQnLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZVByb1RleHQoZSwga2V5KSB7XG5cdFx0XHR2YXIgd3Bwcl9wcm9zID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUud3Bwcl9wcm9zKTtcblx0XHRcdHdwcHJfcHJvc1trZXldID0gZTtcblx0XHRcdHRoaXMuc2V0U3RhdGUoeyB3cHByX3Byb3M6IHdwcHJfcHJvcyB9KTtcblx0XHRcdHRoaXMucHJvcHMuZWRpdFBvc3RTdGF0dXMoeyBlZGl0ZWQ6IHRydWUgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnYWRkUHJvJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gYWRkUHJvKCkge1xuXHRcdFx0dmFyIGtleSA9IF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfcHJvcykubGVuZ3RoO1xuXHRcdFx0dmFyIHdwcHJfcHJvcyA9IF9leHRlbmRzKHt9LCB0aGlzLnN0YXRlLndwcHJfcHJvcyk7XG5cdFx0XHR3cHByX3Byb3Nba2V5XSA9ICcnO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfcHJvczogd3Bwcl9wcm9zIH0pO1xuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ29uQ2hhbmdlQ29uVGV4dCcsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIG9uQ2hhbmdlQ29uVGV4dChlLCBrZXkpIHtcblx0XHRcdHZhciB3cHByX2NvbnMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5zdGF0ZS53cHByX2NvbnMpO1xuXHRcdFx0d3Bwcl9jb25zW2tleV0gPSBlO1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IHdwcHJfY29uczogd3Bwcl9jb25zIH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHR9XG5cdH0sIHtcblx0XHRrZXk6ICdhZGRDb24nLFxuXHRcdHZhbHVlOiBmdW5jdGlvbiBhZGRDb24oKSB7XG5cdFx0XHR2YXIga2V5ID0gX09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9jb25zKS5sZW5ndGg7XG5cdFx0XHR2YXIgd3Bwcl9jb25zID0gX2V4dGVuZHMoe30sIHRoaXMuc3RhdGUud3Bwcl9jb25zKTtcblx0XHRcdHdwcHJfY29uc1trZXldID0gJyc7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHsgd3Bwcl9jb25zOiB3cHByX2NvbnMgfSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0a2V5OiAnaW1wb3J0UmV2aWV3Jyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gaW1wb3J0UmV2aWV3KGtleSkge1xuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7XG5cdFx0XHRcdHdwcHJfb3B0aW9uczogdGhpcy5wcm9wcy5wb3N0c1trZXldLndwcHJfZGF0YS53cHByX29wdGlvbnMsXG5cdFx0XHRcdHdwcHJfcHJvczogdGhpcy5wcm9wcy5wb3N0c1trZXldLndwcHJfZGF0YS53cHByX3Byb3MsXG5cdFx0XHRcdHdwcHJfY29uczogdGhpcy5wcm9wcy5wb3N0c1trZXldLndwcHJfZGF0YS53cHByX2NvbnNcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5wcm9wcy5lZGl0UG9zdFN0YXR1cyh7IGVkaXRlZDogdHJ1ZSB9KTtcblx0XHRcdHRoaXMucHJvcHMuc2V0U3RhdGUoeyBpc09wZW46IGZhbHNlIH0pO1xuXHRcdH1cblx0fSwge1xuXHRcdGtleTogJ3JlbmRlcicsXG5cdFx0dmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0XHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXG5cdFx0XHRyZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRGcmFnbWVudCxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFBsdWdpblBvc3RTdGF0dXNJbmZvLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0J2xhYmVsJyxcblx0XHRcdFx0XHRcdHsgaHRtbEZvcjogJ2lzLXRoaXMtYS1yZXZpZXcnIH0sXG5cdFx0XHRcdFx0XHRfXygnSXMgdGhpcyBwb3N0IGEgcmV2aWV3PycpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoRm9ybVRvZ2dsZSwge1xuXHRcdFx0XHRcdFx0Y2hlY2tlZDogdGhpcy5zdGF0ZS5jd3BfbWV0YV9ib3hfY2hlY2sgPT09ICdZZXMnID8gdHJ1ZSA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0b25DaGFuZ2U6IHRoaXMudG9nZ2xlUmV2aWV3U3RhdHVzLFxuXHRcdFx0XHRcdFx0aWQ6ICdpcy10aGlzLWEtcmV2aWV3J1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRoaXMuc3RhdGUuY3dwX21ldGFfYm94X2NoZWNrID09PSAnWWVzJyAmJiBbd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFBsdWdpblNpZGViYXJNb3JlTWVudUl0ZW0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dGFyZ2V0OiAnd3AtcHJvZHVjdC1yZXZpZXcnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRfXygnV1AgUHJvZHVjdCBSZXZpZXcnKVxuXHRcdFx0XHQpLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0UGx1Z2luU2lkZWJhcixcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiAnd3AtcHJvZHVjdC1yZXZpZXcnLFxuXHRcdFx0XHRcdFx0dGl0bGU6IF9fKCdXUCBQcm9kdWN0IFJldmlldycpXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRQYW5lbEJvZHksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBfXygnUHJvZHVjdCBEZXRhaWxzJyksXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3LXByb2R1Y3QtZGV0YWlscycsXG5cdFx0XHRcdFx0XHRcdGluaXRpYWxPcGVuOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0d3Bwcmd1dGVuLmlzUHJvICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChSYWRpb0ltYWdlQ29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogX18oJ1JldmlldyBUZW1wbGF0ZScpLFxuXHRcdFx0XHRcdFx0XHRzZWxlY3RlZDogdGhpcy5zdGF0ZS5fd3Bwcl9yZXZpZXdfdGVtcGxhdGUsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IFt7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdEZWZhdWx0JyksXG5cdFx0XHRcdFx0XHRcdFx0c3JjOiB3cHByZ3V0ZW4ucGF0aCArICcvYXNzZXRzL2ltZy90ZW1wbGF0ZXMvZGVmYXVsdC5wbmcnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnZGVmYXVsdCdcblx0XHRcdFx0XHRcdFx0fSwge1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnU3R5bGUgMScpLFxuXHRcdFx0XHRcdFx0XHRcdHNyYzogd3Bwcmd1dGVuLnBhdGggKyAnL2Fzc2V0cy9pbWcvdGVtcGxhdGVzL3N0eWxlMS5wbmcnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnc3R5bGUxJ1xuXHRcdFx0XHRcdFx0XHR9LCB7XG5cdFx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdTdHlsZSAyJyksXG5cdFx0XHRcdFx0XHRcdFx0c3JjOiB3cHByZ3V0ZW4ucGF0aCArICcvYXNzZXRzL2ltZy90ZW1wbGF0ZXMvc3R5bGUyLnBuZycsXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6ICdzdHlsZTInXG5cdFx0XHRcdFx0XHRcdH1dLFxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVRlbXBsYXRlXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdHRoaXMucHJvcHMucG9zdFR5cGUgIT09ICd3cHByX3JldmlldycgJiYgW3dwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogX18oJ1Byb2R1Y3QgTmFtZScpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9uYW1lLFxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZVJldmlld1RpdGxlXG5cdFx0XHRcdFx0XHR9KV0sXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3LXNpZGViYXItYmFzZS1jb250cm9sJyB9LFxuXHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0J2xhYmVsJyxcblx0XHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ2Jsb2Nrcy1iYXNlLWNvbnRyb2xfX2xhYmVsJywgJ2Zvcic6ICdpbnNwZWN0b3ItbWVkaWEtdXBsb2FkJyB9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdQcm9kdWN0IEltYWdlJylcblx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KE1lZGlhVXBsb2FkLCB7XG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2ltYWdlJyxcblx0XHRcdFx0XHRcdFx0XHRpZDogJ2luc3BlY3Rvci1tZWRpYS11cGxvYWQnLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSxcblx0XHRcdFx0XHRcdFx0XHRvblNlbGVjdDogdGhpcy5vbkNoYW5nZVJldmlld0ltYWdlLFxuXHRcdFx0XHRcdFx0XHRcdHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKF9yZWYpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBvcGVuID0gX3JlZi5vcGVuO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFtfdGhpczIuc3RhdGUuY3dwX3Jldl9wcm9kdWN0X2ltYWdlICE9PSAnJyAmJiBbd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KCdpbWcnLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s6IG9wZW4sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNyYzogX3RoaXMyLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0YWx0OiBfXygnUmV2aWV3IGltYWdlJylcblx0XHRcdFx0XHRcdFx0XHRcdH0pLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogZnVuY3Rpb24gb25DbGljaygpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIuc2V0U3RhdGUoeyBjd3BfcmV2X3Byb2R1Y3RfaW1hZ2U6ICcnIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3R5bGU6IHsgbWFyZ2luVG9wOiAnMTBweCcgfVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnUmVtb3ZlIEltYWdlJylcblx0XHRcdFx0XHRcdFx0XHRcdCldLCB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogb3Blbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdHlsZTogeyBtYXJnaW5Ub3A6ICcxMHB4JyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogX3RoaXMyLnN0YXRlLmN3cF9yZXZfcHJvZHVjdF9pbWFnZSA9PT0gJycgJiYgJ3dwcHJfaW1hZ2VfdXBsb2FkJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnQ2hvb3NlIG9yIFVwbG9hZCBhbiBJbWFnZScpXG5cdFx0XHRcdFx0XHRcdFx0XHQpXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFNlbGVjdENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdQcm9kdWN0IEltYWdlIENsaWNrJyksXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9pbWFnZV9saW5rLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiBbe1xuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnU2hvdyBXaG9sZSBJbWFnZScpLFxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiAnaW1hZ2UnXG5cdFx0XHRcdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogX18oJ09wZW4gQWZmaWxpYXRlIExpbmsnKSxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogJ2xpbmsnXG5cdFx0XHRcdFx0XHRcdH1dLFxuXHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZUltYWdlTGlua1xuXHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwcHItcmV2aWV3LWxpbmtzLWxpc3QnIH0sXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfbGlua3MpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFt3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnQWZmaWxpYXRlIEJ1dHRvbiBUZXh0JyksXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZToga2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIF90aGlzMi5vbkNoYW5nZVJldmlld0FmZmlsaWF0ZVRpdGxlKGUsIGtleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSksIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGFiZWw6IF9fKCdBZmZpbGlhdGUgQnV0dG9uIExpbmsnKSxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd1cmwnLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IF90aGlzMi5zdGF0ZS53cHByX2xpbmtzW2tleV0sXG5cdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlUmV2aWV3QWZmaWxpYXRlTGluayhlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0pXTtcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfbGlua3MpLmxlbmd0aCA8IDIgJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0xhcmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogdGhpcy5hZGRCdXR0b25cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdBZGQgYW5vdGhlciBidXR0b24nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBfXygnUHJvZHVjdCBQcmljZScpLFxuXHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiB0aGlzLnN0YXRlLmN3cF9yZXZfcHJpY2UsXG5cdFx0XHRcdFx0XHRcdG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlUmV2aWV3UHJpY2Vcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRQYW5lbEJvZHksXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBfXygnUHJvZHVjdCBPcHRpb25zJyksXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ3dwLXByb2R1Y3QtcmV2aWV3LXByb2R1Y3Qtb3B0aW9ucycsXG5cdFx0XHRcdFx0XHRcdGluaXRpYWxPcGVuOiBmYWxzZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0J2RpdicsXG5cdFx0XHRcdFx0XHRcdHsgY2xhc3NOYW1lOiAnd3Bwci1yZXZpZXctb3B0aW9ucy1saXN0JyB9LFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX29wdGlvbnMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1vcHRpb25zLWl0ZW0nIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdsYWJlbCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2Zvcic6ICd3cHByLW9wdGlvbi1pdGVtLScgKyBrZXkgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0a2V5XG5cdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFRleHRDb250cm9sLCB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICd0ZXh0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWQ6ICd3cHByLW9wdGlvbi1pdGVtLScgKyBrZXksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNsYXNzTmFtZTogJ3dwcHItdGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyOiBfXygnT3B0aW9uJyksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBfdGhpczIuc3RhdGUud3Bwcl9vcHRpb25zW2tleV0ubmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlT3B0aW9uVGV4dChlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnbnVtYmVyJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3Bwci10ZXh0IHdwcHItb3B0aW9uLW51bWJlcicsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyOiBfXygnMCcpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtaW46IDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1heDogMTAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogX3RoaXMyLnN0YXRlLndwcHJfb3B0aW9uc1trZXldLnZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIub25DaGFuZ2VPcHRpb25OdW1iZXIoZSwga2V5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0X09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9vcHRpb25zKS5sZW5ndGggPCB3cHByZ3V0ZW4ubGVuZ3RoICYmIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRCdXR0b24sXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0aXNMYXJnZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s6IHRoaXMuYWRkT3B0aW9uXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRfXygnQWRkIGFub3RoZXIgb3B0aW9uJylcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0UGFuZWxCb2R5LFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogX18oJ1BybyBGZWF0dXJlcycpLFxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cC1wcm9kdWN0LXJldmlldy1wcm9kdWN0LXByb3MnLFxuXHRcdFx0XHRcdFx0XHRpbml0aWFsT3BlbjogZmFsc2Vcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwcHItcmV2aWV3LXByby1saXN0JyB9LFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX3Byb3MpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1wcm8taXRlbScgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0J2xhYmVsJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eyAnZm9yJzogJ3dwcHItcHJvLWl0ZW0tJyArIGtleSB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXJzZUludChrZXkpICsgMVxuXHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChUZXh0Q29udHJvbCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAndGV4dCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlkOiAnd3Bwci1wcm8taXRlbS0nICsga2V5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cHByLXRleHQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwbGFjZWhvbGRlcjogX18oJ09wdGlvbicpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogX3RoaXMyLnN0YXRlLndwcHJfcHJvc1trZXldLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIub25DaGFuZ2VQcm9UZXh0KGUsIGtleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdF9PYmplY3Qka2V5cyh0aGlzLnN0YXRlLndwcHJfcHJvcykubGVuZ3RoIDwgd3Bwcmd1dGVuLmxlbmd0aCAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0QnV0dG9uLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdGlzTGFyZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrOiB0aGlzLmFkZFByb1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0X18oJ0FkZCBhbm90aGVyIG9wdGlvbicpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFBhbmVsQm9keSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGl0bGU6IF9fKCdDb24gRmVhdHVyZXMnKSxcblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3AtcHJvZHVjdC1yZXZpZXctcHJvZHVjdC1jb25zJyxcblx0XHRcdFx0XHRcdFx0aW5pdGlhbE9wZW46IGZhbHNlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHQnZGl2Jyxcblx0XHRcdFx0XHRcdFx0eyBjbGFzc05hbWU6ICd3cHByLXJldmlldy1jb24tbGlzdCcgfSxcblx0XHRcdFx0XHRcdFx0X09iamVjdCRrZXlzKHRoaXMuc3RhdGUud3Bwcl9jb25zKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHQnZGl2Jyxcblx0XHRcdFx0XHRcdFx0XHRcdHsgY2xhc3NOYW1lOiAnd3Bwci1yZXZpZXctY29uLWl0ZW0nIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdsYWJlbCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2Zvcic6ICd3cHByLWNvbi1pdGVtLScgKyBrZXkgfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGFyc2VJbnQoa2V5KSArIDFcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoVGV4dENvbnRyb2wsIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ3RleHQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZDogJ3dwcHItY29uLWl0ZW0tJyArIGtleSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiAnd3Bwci10ZXh0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXI6IF9fKCdPcHRpb24nKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IF90aGlzMi5zdGF0ZS53cHByX2NvbnNba2V5XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b25DaGFuZ2U6IGZ1bmN0aW9uIG9uQ2hhbmdlKGUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gX3RoaXMyLm9uQ2hhbmdlQ29uVGV4dChlLCBrZXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXModGhpcy5zdGF0ZS53cHByX2NvbnMpLmxlbmd0aCA8IHdwcHJndXRlbi5sZW5ndGggJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdEJ1dHRvbixcblx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRpc0xhcmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0b25DbGljazogdGhpcy5hZGRDb25cblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdF9fKCdBZGQgYW5vdGhlciBvcHRpb24nKVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR3cHByZ3V0ZW4uaXNQcm8gJiYgd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0J2RpdicsXG5cdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ3dwcHItcmV2aWV3LWltcG9ydC1yZXZpZXctYnV0dG9uJyB9LFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRCdXR0b24sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpc0xhcmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGlzUHJpbWFyeTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIF90aGlzMi5wcm9wcy5zZXRTdGF0ZSh7IGlzT3BlbjogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdF9fKCdJbXBvcnQgUmV2aWV3Jylcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHR0aGlzLnByb3BzLmlzT3BlbiA/IHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0TW9kYWwsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogX18oJ0ltcG9ydCBSZXZpZXcnKSxcblx0XHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICd3cHByLXJldmlldy1pbXBvcnQtbW9kYWwnLFxuXHRcdFx0XHRcdFx0XHRcdG9uUmVxdWVzdENsb3NlOiBmdW5jdGlvbiBvblJlcXVlc3RDbG9zZSgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIucHJvcHMuc2V0U3RhdGUoeyBpc09wZW46IGZhbHNlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdH0gfSxcblx0XHRcdFx0XHRcdFx0dGhpcy5wcm9wcy5wb3N0cyAmJiBfT2JqZWN0JGtleXModGhpcy5wcm9wcy5wb3N0cykubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0UGFuZWxCb2R5LFxuXHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogX3RoaXMyLnByb3BzLnBvc3RzW2tleV0udGl0bGUucmF3LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpbml0aWFsT3BlbjogZmFsc2Vcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdkaXYnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGNsYXNzTmFtZTogJ2N3cF9waXRlbV9pbmZvJyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0J3VsJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7ICdjbGFzcyc6ICdjd3BfcGl0ZW1fb3B0aW9uc19jb250ZW50JyB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCdoNCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0X18oJ09wdGlvbnMnKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X09iamVjdCRrZXlzKF90aGlzMi5wcm9wcy5wb3N0c1trZXldLndwcHJfZGF0YS53cHByX29wdGlvbnMpLm1hcChmdW5jdGlvbiAoaSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2xpJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0X3RoaXMyLnByb3BzLnBvc3RzW2tleV0ud3Bwcl9kYXRhLndwcHJfb3B0aW9uc1tpXS5uYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndWwnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2NsYXNzJzogJ2N3cF9waXRlbV9vcHRpb25zX3Byb3MnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2g0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnUHJvcycpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXMoX3RoaXMyLnByb3BzLnBvc3RzW2tleV0ud3Bwcl9kYXRhLndwcHJfcHJvcykubWFwKGZ1bmN0aW9uIChpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnbGknLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfdGhpczIucHJvcHMucG9zdHNba2V5XS53cHByX2RhdGEud3Bwcl9wcm9zW2ldXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQndWwnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsgJ2NsYXNzJzogJ2N3cF9waXRlbV9vcHRpb25zX2NvbnMnIH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0J2g0Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnQ29ucycpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfT2JqZWN0JGtleXMoX3RoaXMyLnByb3BzLnBvc3RzW2tleV0ud3Bwcl9kYXRhLndwcHJfY29ucykubWFwKGZ1bmN0aW9uIChpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gd3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQnbGknLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfdGhpczIucHJvcHMucG9zdHNba2V5XS53cHByX2RhdGEud3Bwcl9jb25zW2ldXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdwLmVsZW1lbnQuY3JlYXRlRWxlbWVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRCdXR0b24sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXNMYXJnZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBfdGhpczIuaW1wb3J0UmV2aWV3KGtleSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfXygnSW1wb3J0IFJldmlldycpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KSA6IG51bGxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCldXG5cdFx0XHQpO1xuXHRcdH1cblx0fV0sIFt7XG5cdFx0a2V5OiAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJyxcblx0XHR2YWx1ZTogZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgc3RhdGUpIHtcblx0XHRcdGlmICgobmV4dFByb3BzLmlzUHVibGlzaGluZyB8fCBuZXh0UHJvcHMuaXNTYXZpbmcpICYmICFuZXh0UHJvcHMuaXNBdXRvU2F2aW5nKSB7XG5cdFx0XHRcdHdwLmFwaVJlcXVlc3QoeyBwYXRoOiAnL3dwLXByb2R1Y3QtcmV2aWV3L3VwZGF0ZS1yZXZpZXc/aWQ9JyArIG5leHRQcm9wcy5wb3N0SWQgKyAnJnBvc3RUeXBlPScgKyBuZXh0UHJvcHMucG9zdFR5cGUsIG1ldGhvZDogJ1BPU1QnLCBkYXRhOiBzdGF0ZSB9KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH0sIGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdFx0XHRyZXR1cm4gZXJyO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1dKTtcblxuXHRyZXR1cm4gV1BfUHJvZHVjdF9SZXZpZXc7XG59KENvbXBvbmVudCk7XG5cbnZhciBXUFBSID0gY29tcG9zZShbd2l0aFNlbGVjdChmdW5jdGlvbiAoc2VsZWN0LCBfcmVmMikge1xuXHR2YXIgZm9yY2VJc1NhdmluZyA9IF9yZWYyLmZvcmNlSXNTYXZpbmc7XG5cblx0dmFyIF9zZWxlY3QgPSBzZWxlY3QoJ2NvcmUvZWRpdG9yJyksXG5cdCAgICBnZXRDdXJyZW50UG9zdElkID0gX3NlbGVjdC5nZXRDdXJyZW50UG9zdElkLFxuXHQgICAgaXNTYXZpbmdQb3N0ID0gX3NlbGVjdC5pc1NhdmluZ1Bvc3QsXG5cdCAgICBpc1B1Ymxpc2hpbmdQb3N0ID0gX3NlbGVjdC5pc1B1Ymxpc2hpbmdQb3N0LFxuXHQgICAgaXNBdXRvc2F2aW5nUG9zdCA9IF9zZWxlY3QuaXNBdXRvc2F2aW5nUG9zdCxcblx0ICAgIGdldEN1cnJlbnRQb3N0VHlwZSA9IF9zZWxlY3QuZ2V0Q3VycmVudFBvc3RUeXBlO1xuXG5cdHZhciBsYXRlc3RQb3N0c1F1ZXJ5ID0gcGlja0J5KHtcblx0XHRwZXJfcGFnZTogMTAwLFxuXHRcdG1ldGFfa2V5OiAnY3dwX21ldGFfYm94X2NoZWNrJyxcblx0XHRtZXRhX3ZhbHVlOiAnWWVzJ1xuXHR9LCBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRyZXR1cm4gIWlzVW5kZWZpbmVkKHZhbHVlKTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cG9zdElkOiBnZXRDdXJyZW50UG9zdElkKCksXG5cdFx0cG9zdFR5cGU6IGdldEN1cnJlbnRQb3N0VHlwZSgpLFxuXHRcdHBvc3RzOiBzZWxlY3QoJ2NvcmUnKS5nZXRFbnRpdHlSZWNvcmRzKCdwb3N0VHlwZScsICdwb3N0JywgbGF0ZXN0UG9zdHNRdWVyeSksXG5cdFx0cG9zdDogc2VsZWN0KCdjb3JlJykuZ2V0RW50aXR5UmVjb3JkKCdwb3N0VHlwZScsIGdldEN1cnJlbnRQb3N0VHlwZSgpLCBnZXRDdXJyZW50UG9zdElkKCkpLFxuXHRcdGlzU2F2aW5nOiBmb3JjZUlzU2F2aW5nIHx8IGlzU2F2aW5nUG9zdCgpLFxuXHRcdGlzQXV0b1NhdmluZzogaXNBdXRvc2F2aW5nUG9zdCgpLFxuXHRcdGlzUHVibGlzaGluZzogaXNQdWJsaXNoaW5nUG9zdCgpXG5cdH07XG59KSwgd2l0aFN0YXRlKHtcblx0aXNPcGVuOiBmYWxzZVxufSksIHdpdGhEaXNwYXRjaChmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcblx0cmV0dXJuIHtcblx0XHRvcGVuUmV2aWV3U2lkZWJhcjogZnVuY3Rpb24gb3BlblJldmlld1NpZGViYXIoKSB7XG5cdFx0XHRyZXR1cm4gZGlzcGF0Y2goJ2NvcmUvZWRpdC1wb3N0Jykub3BlbkdlbmVyYWxTaWRlYmFyKCd3cC1wcm9kdWN0LXJldmlldy93cC1wcm9kdWN0LXJldmlldycpO1xuXHRcdH0sXG5cdFx0ZWRpdFBvc3RTdGF0dXM6IGRpc3BhdGNoKCdjb3JlL2VkaXRvcicpLmVkaXRQb3N0XG5cdH07XG59KV0pKFdQX1Byb2R1Y3RfUmV2aWV3KTtcblxucmVnaXN0ZXJQbHVnaW4oJ3dwLXByb2R1Y3QtcmV2aWV3Jywge1xuXHRpY29uOiAnc3Rhci1lbXB0eScsXG5cdHJlbmRlcjogV1BQUlxufSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvc2lkZWJhci5qc1xuLy8gbW9kdWxlIGlkID0gNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n");
332
 
333
  /***/ }),
334
  /* 44 */
648
 
649
  /***/ }),
650
  /* 95 */
651
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
652
 
653
  "use strict";
654
+ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return reverseObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return renameKey; });\nvar _this = this;\n\nvar reverseObject = function reverseObject(object) {\n\tvar newObject = {};\n\tvar keys = [];\n\tfor (var key in object) {\n\t\tkeys.push(key);\n\t}\n\tfor (var i = keys.length - 1; i >= 0; i--) {\n\t\tvar value = object[keys[i]];\n\t\tnewObject[keys[i]] = value;\n\t}\n\treturn newObject;\n};\n\nvar renameKey = function renameKey(obj, oldName, newName) {\n\tif (typeof obj === 'string') {\n\t\tnewName = oldName;\n\t\toldName = obj;\n\t\tobj = _this;\n\t}\n\tif (obj.hasOwnProperty(oldName)) {\n\t\tobj[newName] = obj[oldName];\n\t\tdelete obj[oldName];\n\t}\n\treturn obj;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMuanM/ZTNjZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX3RoaXMgPSB0aGlzO1xuXG5leHBvcnQgdmFyIHJldmVyc2VPYmplY3QgPSBmdW5jdGlvbiByZXZlcnNlT2JqZWN0KG9iamVjdCkge1xuXHR2YXIgbmV3T2JqZWN0ID0ge307XG5cdHZhciBrZXlzID0gW107XG5cdGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcblx0XHRrZXlzLnB1c2goa2V5KTtcblx0fVxuXHRmb3IgKHZhciBpID0ga2V5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdHZhciB2YWx1ZSA9IG9iamVjdFtrZXlzW2ldXTtcblx0XHRuZXdPYmplY3Rba2V5c1tpXV0gPSB2YWx1ZTtcblx0fVxuXHRyZXR1cm4gbmV3T2JqZWN0O1xufTtcblxuZXhwb3J0IHZhciByZW5hbWVLZXkgPSBmdW5jdGlvbiByZW5hbWVLZXkob2JqLCBvbGROYW1lLCBuZXdOYW1lKSB7XG5cdGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdG5ld05hbWUgPSBvbGROYW1lO1xuXHRcdG9sZE5hbWUgPSBvYmo7XG5cdFx0b2JqID0gX3RoaXM7XG5cdH1cblx0aWYgKG9iai5oYXNPd25Qcm9wZXJ0eShvbGROYW1lKSkge1xuXHRcdG9ialtuZXdOYW1lXSA9IG9ialtvbGROYW1lXTtcblx0XHRkZWxldGUgb2JqW29sZE5hbWVdO1xuXHR9XG5cdHJldHVybiBvYmo7XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSA5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///95\n");
655
 
656
  /***/ }),
657
  /* 96 */
658
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
659
 
660
  "use strict";
661
+ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__style_scss__ = __webpack_require__(97);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__style_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__style_scss__);\n/**\n * Block dependencies\n */\n\n\n/**\n * Internal dependencies\n */\nvar _lodash = lodash,\n isEmpty = _lodash.isEmpty;\nvar BaseControl = wp.components.BaseControl;\nvar withInstanceId = wp.compose.withInstanceId;\n\n\nfunction RadioImageControl(_ref) {\n\tvar label = _ref.label,\n\t selected = _ref.selected,\n\t help = _ref.help,\n\t instanceId = _ref.instanceId,\n\t onChange = _ref.onChange,\n\t disabled = _ref.disabled,\n\t _ref$options = _ref.options,\n\t options = _ref$options === undefined ? [] : _ref$options;\n\n\tvar id = \"inspector-radio-image-control-\" + instanceId;\n\tvar onChangeValue = function onChangeValue(event) {\n\t\treturn onChange(event.target.value);\n\t};\n\n\treturn !isEmpty(options) && wp.element.createElement(\n\t\tBaseControl,\n\t\t{ label: label, id: id, help: help, className: \"components-radio-image-control\" },\n\t\twp.element.createElement(\n\t\t\t\"div\",\n\t\t\t{ className: \"components-radio-image-control__container\" },\n\t\t\toptions.map(function (option, index) {\n\t\t\t\treturn wp.element.createElement(\n\t\t\t\t\t\"div\",\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: id + \"-\" + index,\n\t\t\t\t\t\tclassName: \"components-radio-image-control__option\"\n\t\t\t\t\t},\n\t\t\t\t\twp.element.createElement(\"input\", {\n\t\t\t\t\t\tid: id + \"-\" + index,\n\t\t\t\t\t\tclassName: \"components-radio-image-control__input\",\n\t\t\t\t\t\ttype: \"radio\",\n\t\t\t\t\t\tname: id,\n\t\t\t\t\t\tvalue: option.value,\n\t\t\t\t\t\tonChange: onChangeValue,\n\t\t\t\t\t\tchecked: option.value === selected,\n\t\t\t\t\t\t\"aria-describedby\": !!help ? id + \"__help\" : undefined,\n\t\t\t\t\t\tdisabled: disabled\n\t\t\t\t\t}),\n\t\t\t\t\twp.element.createElement(\n\t\t\t\t\t\t\"label\",\n\t\t\t\t\t\t{ htmlFor: id + \"-\" + index, title: option.label },\n\t\t\t\t\t\twp.element.createElement(\"img\", { src: option.src }),\n\t\t\t\t\t\twp.element.createElement(\"span\", { \"class\": \"image-clickable\" })\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t})\n\t\t)\n\t);\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (withInstanceId(RadioImageControl));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcmFkaW8taW1hZ2UtY29udHJvbC9pbmRleC5qcz8wMjk1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmxvY2sgZGVwZW5kZW5jaWVzXG4gKi9cbmltcG9ydCAnLi9zdHlsZS5zY3NzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqL1xudmFyIF9sb2Rhc2ggPSBsb2Rhc2gsXG4gICAgaXNFbXB0eSA9IF9sb2Rhc2guaXNFbXB0eTtcbnZhciBCYXNlQ29udHJvbCA9IHdwLmNvbXBvbmVudHMuQmFzZUNvbnRyb2w7XG52YXIgd2l0aEluc3RhbmNlSWQgPSB3cC5jb21wb3NlLndpdGhJbnN0YW5jZUlkO1xuXG5cbmZ1bmN0aW9uIFJhZGlvSW1hZ2VDb250cm9sKF9yZWYpIHtcblx0dmFyIGxhYmVsID0gX3JlZi5sYWJlbCxcblx0ICAgIHNlbGVjdGVkID0gX3JlZi5zZWxlY3RlZCxcblx0ICAgIGhlbHAgPSBfcmVmLmhlbHAsXG5cdCAgICBpbnN0YW5jZUlkID0gX3JlZi5pbnN0YW5jZUlkLFxuXHQgICAgb25DaGFuZ2UgPSBfcmVmLm9uQ2hhbmdlLFxuXHQgICAgZGlzYWJsZWQgPSBfcmVmLmRpc2FibGVkLFxuXHQgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuXHQgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gW10gOiBfcmVmJG9wdGlvbnM7XG5cblx0dmFyIGlkID0gXCJpbnNwZWN0b3ItcmFkaW8taW1hZ2UtY29udHJvbC1cIiArIGluc3RhbmNlSWQ7XG5cdHZhciBvbkNoYW5nZVZhbHVlID0gZnVuY3Rpb24gb25DaGFuZ2VWYWx1ZShldmVudCkge1xuXHRcdHJldHVybiBvbkNoYW5nZShldmVudC50YXJnZXQudmFsdWUpO1xuXHR9O1xuXG5cdHJldHVybiAhaXNFbXB0eShvcHRpb25zKSAmJiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0QmFzZUNvbnRyb2wsXG5cdFx0eyBsYWJlbDogbGFiZWwsIGlkOiBpZCwgaGVscDogaGVscCwgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtcmFkaW8taW1hZ2UtY29udHJvbFwiIH0sXG5cdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFxuXHRcdFx0XCJkaXZcIixcblx0XHRcdHsgY2xhc3NOYW1lOiBcImNvbXBvbmVudHMtcmFkaW8taW1hZ2UtY29udHJvbF9fY29udGFpbmVyXCIgfSxcblx0XHRcdG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24sIGluZGV4KSB7XG5cdFx0XHRcdHJldHVybiB3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XCJkaXZcIixcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IGlkICsgXCItXCIgKyBpbmRleCxcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogXCJjb21wb25lbnRzLXJhZGlvLWltYWdlLWNvbnRyb2xfX29wdGlvblwiXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7XG5cdFx0XHRcdFx0XHRpZDogaWQgKyBcIi1cIiArIGluZGV4LFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiBcImNvbXBvbmVudHMtcmFkaW8taW1hZ2UtY29udHJvbF9faW5wdXRcIixcblx0XHRcdFx0XHRcdHR5cGU6IFwicmFkaW9cIixcblx0XHRcdFx0XHRcdG5hbWU6IGlkLFxuXHRcdFx0XHRcdFx0dmFsdWU6IG9wdGlvbi52YWx1ZSxcblx0XHRcdFx0XHRcdG9uQ2hhbmdlOiBvbkNoYW5nZVZhbHVlLFxuXHRcdFx0XHRcdFx0Y2hlY2tlZDogb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZCxcblx0XHRcdFx0XHRcdFwiYXJpYS1kZXNjcmliZWRieVwiOiAhIWhlbHAgPyBpZCArIFwiX19oZWxwXCIgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRkaXNhYmxlZDogZGlzYWJsZWRcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHR3cC5lbGVtZW50LmNyZWF0ZUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRcImxhYmVsXCIsXG5cdFx0XHRcdFx0XHR7IGh0bWxGb3I6IGlkICsgXCItXCIgKyBpbmRleCwgdGl0bGU6IG9wdGlvbi5sYWJlbCB9LFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIsIHsgc3JjOiBvcHRpb24uc3JjIH0pLFxuXHRcdFx0XHRcdFx0d3AuZWxlbWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IFwiY2xhc3NcIjogXCJpbWFnZS1jbGlja2FibGVcIiB9KVxuXHRcdFx0XHRcdClcblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0KVxuXHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoSW5zdGFuY2VJZChSYWRpb0ltYWdlQ29udHJvbCk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvcmFkaW8taW1hZ2UtY29udHJvbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///96\n");
662
+
663
+ /***/ }),
664
+ /* 97 */
665
+ /***/ (function(module, exports) {
666
+
667
+ eval("// removed by extract-text-webpack-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcmFkaW8taW1hZ2UtY29udHJvbC9zdHlsZS5zY3NzPzY2ODMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9yYWRpby1pbWFnZS1jb250cm9sL3N0eWxlLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IDk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///97\n");
668
 
669
  /***/ })
670
  /******/ ]);
includes/gutenberg/package.json CHANGED
@@ -4,7 +4,7 @@
4
  "dev": "cross-env BABEL_ENV=default webpack --watch",
5
  "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack"
6
  },
7
- "main": "src/block.js",
8
  "devDependencies": {
9
  "babel-core": "^6.25.0",
10
  "babel-eslint": "^8.1.2",
@@ -15,7 +15,6 @@
15
  "babel-preset-env": "^1.6.1",
16
  "browser-sync": "^2.18.13",
17
  "browser-sync-webpack-plugin": "^1.2.0",
18
- "classnames": "^2.2.5",
19
  "cross-env": "^5.1.1",
20
  "css-loader": "^0.28.7",
21
  "eslint": "^4.14.0",
@@ -26,7 +25,6 @@
26
  "node-sass": "^4.7.2",
27
  "postcss-loader": "^2.0.9",
28
  "raw-loader": "^0.5.1",
29
- "rename-key": "^1.1.1",
30
  "sass-loader": "^6.0.6",
31
  "style-loader": "^0.19.1",
32
  "webpack": "^3.10.0"
4
  "dev": "cross-env BABEL_ENV=default webpack --watch",
5
  "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack"
6
  },
7
+ "main": "src/sidebar.js",
8
  "devDependencies": {
9
  "babel-core": "^6.25.0",
10
  "babel-eslint": "^8.1.2",
15
  "babel-preset-env": "^1.6.1",
16
  "browser-sync": "^2.18.13",
17
  "browser-sync-webpack-plugin": "^1.2.0",
 
18
  "cross-env": "^5.1.1",
19
  "css-loader": "^0.28.7",
20
  "eslint": "^4.14.0",
25
  "node-sass": "^4.7.2",
26
  "postcss-loader": "^2.0.9",
27
  "raw-loader": "^0.5.1",
 
28
  "sass-loader": "^6.0.6",
29
  "style-loader": "^0.19.1",
30
  "webpack": "^3.10.0"
includes/gutenberg/src/radio-image-control/index.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Block dependencies
3
+ */
4
+ import './style.scss';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ const { isEmpty } = lodash;
10
+
11
+ const { BaseControl } = wp.components;
12
+
13
+ const { withInstanceId } = wp.compose;
14
+
15
+ function RadioImageControl( { label, selected, help, instanceId, onChange, disabled, options = [] } ) {
16
+ const id = `inspector-radio-image-control-${ instanceId }`;
17
+ const onChangeValue = ( event ) => onChange( event.target.value );
18
+
19
+ return ! isEmpty( options ) && (
20
+ <BaseControl label={ label } id={ id } help={ help } className="components-radio-image-control">
21
+ <div className="components-radio-image-control__container">
22
+ { options.map( ( option, index ) =>
23
+ <div
24
+ key={ `${ id }-${ index }` }
25
+ className="components-radio-image-control__option"
26
+ >
27
+ <input
28
+ id={ `${ id }-${ index }` }
29
+ className="components-radio-image-control__input"
30
+ type="radio"
31
+ name={ id }
32
+ value={ option.value }
33
+ onChange={ onChangeValue }
34
+ checked={ option.value === selected }
35
+ aria-describedby={ !! help ? `${ id }__help` : undefined }
36
+ disabled={ disabled }
37
+ />
38
+ <label htmlFor={ `${ id }-${ index }` } title={ option.label }>
39
+ <img src={ option.src } />
40
+ <span class="image-clickable"></span>
41
+ </label>
42
+ </div>
43
+ ) }
44
+ </div>
45
+ </BaseControl>
46
+ );
47
+ }
48
+
49
+ export default withInstanceId( RadioImageControl );
includes/gutenberg/src/radio-image-control/style.scss ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .components-radio-image-control__container {
2
+ display: block;
3
+ }
4
+
5
+ .components-radio-image-control__option {
6
+ display: inline-block;
7
+ padding: 5px;
8
+ }
9
+
10
+ .components-radio-image-control {
11
+
12
+ label {
13
+ display: inline-block;
14
+ position: relative;
15
+
16
+ img {
17
+ border: 1px solid transparent;
18
+ max-width: 250px !important;
19
+ }
20
+ }
21
+
22
+ input {
23
+ display: none;
24
+ }
25
+
26
+ input + label {
27
+ .image-clickable {
28
+ bottom: 0;
29
+ height: 100%;
30
+ left: 0;
31
+ position: absolute;
32
+ right: 0;
33
+ top: 0;
34
+ width: 100%;
35
+ }
36
+ }
37
+
38
+ input:checked + label {
39
+ img {
40
+ border: 1px solid #3498DB;
41
+ -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.25);
42
+ box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.25);
43
+ }
44
+ }
45
+ }
46
+
47
+ .wppr-review-import-review-button {
48
+ text-align: center;
49
+ margin: 20px 0;
50
+ }
51
+
52
+ .wppr-review-import-modal {
53
+ width: 100%;
54
+ height: auto;
55
+
56
+ .components-modal__content {
57
+ max-height: 100vh;
58
+ overflow-y: scroll;
59
+
60
+ .cwp_pitem_info {
61
+ display: inline-block;
62
+ width: 100%;
63
+ margin-top: 5px;
64
+
65
+ ul {
66
+ float: left;
67
+ width: 30.66%;
68
+ border: 1px solid #f1f1f1;
69
+
70
+ h4 {
71
+ margin: 0;
72
+ padding: 3px 0;
73
+ border-radius: 3px 3px 0 0;
74
+ background: #f1f1f1;
75
+ text-align: center;
76
+ }
77
+
78
+ li {
79
+ padding: 2px 5px;
80
+ margin: 0;
81
+ border-top: 1px solid #f1f1f1;
82
+ font-size: 10px;
83
+ -webkit-transition: all 0.2s ease-in-out;
84
+ transition: all 0.2s ease-in-out;
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
includes/gutenberg/src/{block.js → sidebar.js} RENAMED
@@ -2,16 +2,17 @@
2
  * Internal dependencies
3
  */
4
  import './style.scss';
5
- import renameKey from 'rename-key';
6
- import { reverseObject } from './utils';
7
 
8
  /**
9
  * WordPress dependencies
10
  */
11
  const { __ } = wp.i18n;
12
 
13
- const { registerPlugin } = wp.plugins;
14
 
 
15
 
16
  const { MediaUpload } = wp.editor;
17
 
@@ -29,16 +30,20 @@ const {
29
  const {
30
  Component,
31
  Fragment,
32
- compose,
33
  } = wp.element;
34
 
35
  const {
36
- PanelBody,
37
- TextControl,
38
- FormToggle,
 
 
39
  Button,
 
 
 
40
  SelectControl,
41
- withAPIData,
42
  } = wp.components;
43
 
44
  class WP_Product_Review extends Component {
@@ -46,6 +51,7 @@ class WP_Product_Review extends Component {
46
  super( ...arguments );
47
 
48
  this.toggleReviewStatus = this.toggleReviewStatus.bind( this );
 
49
  this.onChangeReviewTitle = this.onChangeReviewTitle.bind( this );
50
  this.onChangeReviewImage = this.onChangeReviewImage.bind( this );
51
  this.onChangeImageLink = this.onChangeImageLink.bind( this );
@@ -60,6 +66,7 @@ class WP_Product_Review extends Component {
60
  this.addPro = this.addPro.bind( this );
61
  this.onChangeConText = this.onChangeConText.bind( this );
62
  this.addCon = this.addCon.bind( this );
 
63
 
64
  this.state = {
65
  cwp_meta_box_check: 'No',
@@ -86,14 +93,9 @@ class WP_Product_Review extends Component {
86
  };
87
  }
88
 
89
- componentWillReceiveProps( nextProps ) {
90
- if ( this.props.review !== nextProps.review ) {
91
- if ( nextProps.review.isLoading !== true ) {
92
- this.setState( { ...nextProps.review.data.wppr_data } );
93
- }
94
- }
95
- if ( nextProps.isPublishing || nextProps.isSaving ) {
96
- wp.apiRequest( { path: `/wp-product-review/update-review?id=${nextProps.postId}&postType=${nextProps.postType}`, method: 'POST', data: this.state } ).then(
97
  ( data ) => {
98
  return data;
99
  },
@@ -104,7 +106,13 @@ class WP_Product_Review extends Component {
104
  }
105
  }
106
 
107
- componentDidUpdate( prevState ) {
 
 
 
 
 
 
108
  if ( this.state.cwp_meta_box_check !== prevState.cwp_meta_box_check && this.state.cwp_meta_box_check === 'Yes' ) {
109
  this.props.openReviewSidebar();
110
  }
@@ -115,6 +123,11 @@ class WP_Product_Review extends Component {
115
  this.props.editPostStatus( { edited: true } );
116
  }
117
 
 
 
 
 
 
118
  onChangeReviewTitle( value ) {
119
  this.setState( { cwp_rev_product_name: value } );
120
  this.props.editPostStatus( { edited: true } );
@@ -222,6 +235,16 @@ class WP_Product_Review extends Component {
222
  this.setState( { wppr_cons } );
223
  };
224
 
 
 
 
 
 
 
 
 
 
 
225
  render() {
226
  return (
227
  <Fragment>
@@ -247,7 +270,31 @@ class WP_Product_Review extends Component {
247
  title={ __( 'Product Details' ) }
248
  className="wp-product-review-product-details"
249
  initialOpen={ true }
250
- >
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  { ( this.props.postType !== 'wppr_review' ) && [
252
  <TextControl
253
  label={ __( 'Product Name' ) }
@@ -363,7 +410,7 @@ class WP_Product_Review extends Component {
363
  />
364
  </div>
365
  ) ) }
366
- { ( Object.keys( this.state.wppr_options ).length < 5 ) && (
367
  <Button
368
  isLarge
369
  onClick={ this.addOption }
@@ -392,7 +439,7 @@ class WP_Product_Review extends Component {
392
  />
393
  </div>
394
  ) ) }
395
- { ( Object.keys( this.state.wppr_pros ).length < 5 ) && (
396
  <Button
397
  isLarge
398
  onClick={ this.addPro }
@@ -408,20 +455,20 @@ class WP_Product_Review extends Component {
408
  initialOpen={ false }
409
  >
410
  <div className="wppr-review-con-list">
411
- { Object.keys( this.state.wppr_cons ).map( ( key ) => (
412
- <div className="wppr-review-con-item">
413
- <label for={`wppr-con-item-${key}`}>{ parseInt( key ) + 1 }</label>
414
- <TextControl
415
- type="text"
416
- id={`wppr-con-item-${key}`}
417
- className="wppr-text"
418
- placeholder={ __( 'Option' ) }
419
- value={ this.state.wppr_cons[key] }
420
- onChange={ ( e ) => this.onChangeConText( e, key ) }
421
- />
422
- </div>
423
  ) ) }
424
- { ( Object.keys( this.state.wppr_cons ).length < 5 ) && (
425
  <Button
426
  isLarge
427
  onClick={ this.addCon }
@@ -431,6 +478,61 @@ class WP_Product_Review extends Component {
431
  ) }
432
  </div>
433
  </PanelBody>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
434
  </PluginSidebar>
435
  ] }
436
  </Fragment>
@@ -444,26 +546,33 @@ const WPPR = compose( [
444
  getCurrentPostId,
445
  isSavingPost,
446
  isPublishingPost,
 
447
  getCurrentPostType,
448
  } = select( 'core/editor' );
 
 
 
 
 
449
  return {
450
  postId: getCurrentPostId(),
451
  postType: getCurrentPostType(),
 
 
452
  isSaving: forceIsSaving || isSavingPost(),
 
453
  isPublishing: isPublishingPost(),
454
  };
455
  } ),
456
 
 
 
 
 
457
  withDispatch( ( dispatch ) => ( {
458
  openReviewSidebar: () => dispatch( 'core/edit-post' ).openGeneralSidebar( 'wp-product-review/wp-product-review' ),
459
  editPostStatus: dispatch( 'core/editor' ).editPost,
460
  } ) ),
461
-
462
- withAPIData( ( props ) => {
463
- return {
464
- review: `/wp/v2/${ ( props.postType === 'wppr_review' ? props.postType : 'posts' ) }/${props.postId}`,
465
- };
466
- } ),
467
  ] )( WP_Product_Review );
468
 
469
  registerPlugin( 'wp-product-review', {
2
  * Internal dependencies
3
  */
4
  import './style.scss';
5
+ import { reverseObject, renameKey } from './utils';
6
+ import RadioImageControl from './radio-image-control/';
7
 
8
  /**
9
  * WordPress dependencies
10
  */
11
  const { __ } = wp.i18n;
12
 
13
+ const { isUndefined, pickBy } = lodash;
14
 
15
+ const { registerPlugin } = wp.plugins;
16
 
17
  const { MediaUpload } = wp.editor;
18
 
30
  const {
31
  Component,
32
  Fragment,
 
33
  } = wp.element;
34
 
35
  const {
36
+ withState,
37
+ compose,
38
+ } = wp.compose;
39
+
40
+ const {
41
  Button,
42
+ FormToggle,
43
+ Modal,
44
+ PanelBody,
45
  SelectControl,
46
+ TextControl,
47
  } = wp.components;
48
 
49
  class WP_Product_Review extends Component {
51
  super( ...arguments );
52
 
53
  this.toggleReviewStatus = this.toggleReviewStatus.bind( this );
54
+ this.onChangeTemplate = this.onChangeTemplate.bind( this );
55
  this.onChangeReviewTitle = this.onChangeReviewTitle.bind( this );
56
  this.onChangeReviewImage = this.onChangeReviewImage.bind( this );
57
  this.onChangeImageLink = this.onChangeImageLink.bind( this );
66
  this.addPro = this.addPro.bind( this );
67
  this.onChangeConText = this.onChangeConText.bind( this );
68
  this.addCon = this.addCon.bind( this );
69
+ this.importReview = this.importReview.bind( this );
70
 
71
  this.state = {
72
  cwp_meta_box_check: 'No',
93
  };
94
  }
95
 
96
+ static getDerivedStateFromProps( nextProps, state ) {
97
+ if ( ( nextProps.isPublishing || nextProps.isSaving ) && !nextProps.isAutoSaving ) {
98
+ wp.apiRequest( { path: `/wp-product-review/update-review?id=${nextProps.postId}&postType=${nextProps.postType}`, method: 'POST', data: state } ).then(
 
 
 
 
 
99
  ( data ) => {
100
  return data;
101
  },
106
  }
107
  }
108
 
109
+ componentDidUpdate( prevProps, prevState ) {
110
+ if ( undefined !== this.props.post ) {
111
+ if ( prevProps.post.wppr_data !== this.props.post.wppr_data ) {
112
+ this.setState( { ...this.props.post.wppr_data } );
113
+ }
114
+ }
115
+
116
  if ( this.state.cwp_meta_box_check !== prevState.cwp_meta_box_check && this.state.cwp_meta_box_check === 'Yes' ) {
117
  this.props.openReviewSidebar();
118
  }
123
  this.props.editPostStatus( { edited: true } );
124
  }
125
 
126
+ onChangeTemplate( value ) {
127
+ this.setState( { _wppr_review_template: value } );
128
+ this.props.editPostStatus( { edited: true } );
129
+ }
130
+
131
  onChangeReviewTitle( value ) {
132
  this.setState( { cwp_rev_product_name: value } );
133
  this.props.editPostStatus( { edited: true } );
235
  this.setState( { wppr_cons } );
236
  };
237
 
238
+ importReview( key ) {
239
+ this.setState( {
240
+ wppr_options: this.props.posts[key].wppr_data.wppr_options,
241
+ wppr_pros: this.props.posts[key].wppr_data.wppr_pros,
242
+ wppr_cons: this.props.posts[key].wppr_data.wppr_cons
243
+ } );
244
+ this.props.editPostStatus( { edited: true } );
245
+ this.props.setState( { isOpen: false } );
246
+ };
247
+
248
  render() {
249
  return (
250
  <Fragment>
270
  title={ __( 'Product Details' ) }
271
  className="wp-product-review-product-details"
272
  initialOpen={ true }
273
+ >
274
+ { ( wpprguten.isPro ) && (
275
+ <RadioImageControl
276
+ label={ __( 'Review Template' ) }
277
+ selected={ this.state._wppr_review_template }
278
+ options={ [
279
+ {
280
+ label: __( 'Default' ),
281
+ src: wpprguten.path + '/assets/img/templates/default.png',
282
+ value: 'default',
283
+ },
284
+ {
285
+ label: __( 'Style 1' ),
286
+ src: wpprguten.path + '/assets/img/templates/style1.png',
287
+ value: 'style1',
288
+ },
289
+ {
290
+ label: __( 'Style 2' ),
291
+ src: wpprguten.path + '/assets/img/templates/style2.png',
292
+ value: 'style2',
293
+ },
294
+ ] }
295
+ onChange={ this.onChangeTemplate }
296
+ />
297
+ ) }
298
  { ( this.props.postType !== 'wppr_review' ) && [
299
  <TextControl
300
  label={ __( 'Product Name' ) }
410
  />
411
  </div>
412
  ) ) }
413
+ { ( Object.keys( this.state.wppr_options ).length < wpprguten.length ) && (
414
  <Button
415
  isLarge
416
  onClick={ this.addOption }
439
  />
440
  </div>
441
  ) ) }
442
+ { ( Object.keys( this.state.wppr_pros ).length < wpprguten.length ) && (
443
  <Button
444
  isLarge
445
  onClick={ this.addPro }
455
  initialOpen={ false }
456
  >
457
  <div className="wppr-review-con-list">
458
+ { Object.keys( this.state.wppr_cons ).map( ( key ) => (
459
+ <div className="wppr-review-con-item">
460
+ <label for={`wppr-con-item-${key}`}>{ parseInt( key ) + 1 }</label>
461
+ <TextControl
462
+ type="text"
463
+ id={`wppr-con-item-${key}`}
464
+ className="wppr-text"
465
+ placeholder={ __( 'Option' ) }
466
+ value={ this.state.wppr_cons[key] }
467
+ onChange={ ( e ) => this.onChangeConText( e, key ) }
468
+ />
469
+ </div>
470
  ) ) }
471
+ { ( Object.keys( this.state.wppr_cons ).length < wpprguten.length ) && (
472
  <Button
473
  isLarge
474
  onClick={ this.addCon }
478
  ) }
479
  </div>
480
  </PanelBody>
481
+ { ( wpprguten.isPro ) && (
482
+ <div className="wppr-review-import-review-button">
483
+ <Button
484
+ isLarge
485
+ isPrimary
486
+ onClick={ () => this.props.setState( { isOpen: true } ) }
487
+ >
488
+ { __( 'Import Review' ) }
489
+ </Button>
490
+ { this.props.isOpen ?
491
+ <Modal
492
+ title={ __( 'Import Review' ) }
493
+ className="wppr-review-import-modal"
494
+ onRequestClose={ () => this.props.setState( { isOpen: false } ) }>
495
+ { ( this.props.posts ) &&
496
+ Object.keys( this.props.posts ).map( ( key ) => (
497
+ <PanelBody
498
+ title={ this.props.posts[key].title.raw }
499
+ initialOpen={ false }
500
+ >
501
+ <div className="cwp_pitem_info">
502
+ <ul class="cwp_pitem_options_content">
503
+ <h4>{ __( 'Options' ) }</h4>
504
+ { Object.keys( this.props.posts[key].wppr_data.wppr_options ).map( ( i ) => (
505
+ <li>{ this.props.posts[key].wppr_data.wppr_options[i].name }</li>
506
+ ) ) }
507
+ </ul>
508
+
509
+ <ul class="cwp_pitem_options_pros">
510
+ <h4>{ __( 'Pros' ) }</h4>
511
+ { Object.keys( this.props.posts[key].wppr_data.wppr_pros ).map( ( i ) => (
512
+ <li>{ this.props.posts[key].wppr_data.wppr_pros[i] }</li>
513
+ ) ) }
514
+ </ul>
515
+
516
+ <ul class="cwp_pitem_options_cons">
517
+ <h4>{ __( 'Cons' ) }</h4>
518
+ { Object.keys( this.props.posts[key].wppr_data.wppr_cons ).map( ( i ) => (
519
+ <li>{ this.props.posts[key].wppr_data.wppr_cons[i] }</li>
520
+ ) ) }
521
+ </ul>
522
+ <Button
523
+ isLarge
524
+ onClick={ () => this.importReview( key ) }
525
+ >
526
+ { __( 'Import Review' ) }
527
+ </Button>
528
+ </div>
529
+ </PanelBody>
530
+ ) )
531
+ }
532
+ </Modal>
533
+ : null }
534
+ </div>
535
+ ) }
536
  </PluginSidebar>
537
  ] }
538
  </Fragment>
546
  getCurrentPostId,
547
  isSavingPost,
548
  isPublishingPost,
549
+ isAutosavingPost,
550
  getCurrentPostType,
551
  } = select( 'core/editor' );
552
+ const latestPostsQuery = pickBy( {
553
+ per_page: 100,
554
+ meta_key: 'cwp_meta_box_check',
555
+ meta_value: 'Yes'
556
+ }, ( value ) => ! isUndefined( value ) );
557
  return {
558
  postId: getCurrentPostId(),
559
  postType: getCurrentPostType(),
560
+ posts: select( 'core' ).getEntityRecords( 'postType', 'post', latestPostsQuery ),
561
+ post: select( 'core' ).getEntityRecord( 'postType', getCurrentPostType(), getCurrentPostId() ),
562
  isSaving: forceIsSaving || isSavingPost(),
563
+ isAutoSaving: isAutosavingPost(),
564
  isPublishing: isPublishingPost(),
565
  };
566
  } ),
567
 
568
+ withState( {
569
+ isOpen: false,
570
+ } ),
571
+
572
  withDispatch( ( dispatch ) => ( {
573
  openReviewSidebar: () => dispatch( 'core/edit-post' ).openGeneralSidebar( 'wp-product-review/wp-product-review' ),
574
  editPostStatus: dispatch( 'core/editor' ).editPost,
575
  } ) ),
 
 
 
 
 
 
576
  ] )( WP_Product_Review );
577
 
578
  registerPlugin( 'wp-product-review', {
includes/gutenberg/src/utils.js CHANGED
@@ -9,4 +9,17 @@ export const reverseObject = ( object ) => {
9
  newObject[ keys[i] ] = value;
10
  }
11
  return newObject;
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  newObject[ keys[i] ] = value;
10
  }
11
  return newObject;
12
+ }
13
+
14
+ export const renameKey = ( obj, oldName, newName ) => {
15
+ if ( typeof obj === 'string' ) {
16
+ newName = oldName;
17
+ oldName = obj;
18
+ obj = this;
19
+ }
20
+ if ( obj.hasOwnProperty( oldName ) ) {
21
+ obj[newName] = obj[oldName];
22
+ delete obj[oldName];
23
+ }
24
+ return obj;
25
+ };
includes/gutenberg/webpack.config.js CHANGED
@@ -30,7 +30,7 @@ const extractConfig = {
30
 
31
  module.exports = {
32
  entry: {
33
- './dist/block' : './src/block.js',
34
  },
35
  output: {
36
  path: path.resolve( __dirname ),
30
 
31
  module.exports = {
32
  entry: {
33
+ './dist/sidebar' : './src/sidebar.js',
34
  },
35
  output: {
36
  path: path.resolve( __dirname ),
includes/public/class-wppr-public.php CHANGED
@@ -507,7 +507,7 @@ class Wppr_Public {
507
  $sliders = array();
508
  foreach ( $option_names as $k => $value ) {
509
  $sliders[] =
510
- '<div class="wppr-comment-form-meta">
511
  <label for="wppr-slider-option-' . $k . '">' . $value . '</label>
512
  <input type="text" id="wppr-slider-option-' . $k . '" class="meta_option_input" value="" name="wppr-slider-option-' . $k . '" readonly="readonly">
513
  <div class="wppr-comment-meta-slider"></div>
507
  $sliders = array();
508
  foreach ( $option_names as $k => $value ) {
509
  $sliders[] =
510
+ '<div class="wppr-comment-form-meta ' . ( is_rtl() ? 'rtl' : '' ) . '">
511
  <label for="wppr-slider-option-' . $k . '">' . $value . '</label>
512
  <input type="text" id="wppr-slider-option-' . $k . '" class="meta_option_input" value="" name="wppr-slider-option-' . $k . '" readonly="readonly">
513
  <div class="wppr-comment-meta-slider"></div>
includes/public/layouts/default.php CHANGED
@@ -12,17 +12,8 @@
12
 
13
  $price_raw = $review_object->get_price_raw();
14
 
15
- $links = $review_object->get_links();
16
- $multiple_affiliates_class = 'affiliate-button';
17
- $links = array_filter( $links );
18
- if ( count( $links ) > 1 ) {
19
- $multiple_affiliates_class = 'affiliate-button2 affiliate-button';
20
- }
21
-
22
  $pros = $review_object->get_pros();
23
  $cons = $review_object->get_cons();
24
- $rating = round( $review_object->get_rating() );
25
- $rating_10 = round( $review_object->get_rating(), 0 ) / 10;
26
 
27
  ?>
28
  <div id="wppr-review-<?php echo $review_object->get_ID(); ?>"
@@ -36,116 +27,25 @@ $rating_10 = round( $review_object->get_rating(), 0 ) / 10;
36
  <div class="review-wu-content cwpr_clearfix">
37
  <div class="review-wu-left">
38
  <div class="review-wu-left-top">
39
- <?php
40
- wppr_default_get_image( $review_object );
41
- wppr_default_get_rating( $review_object );
42
- ?>
 
43
  </div><!-- end .review-wu-left-top -->
44
 
45
- <div class="review-wu-bars">
46
- <?php
47
- foreach ( $review_object->get_options() as $option ) {
48
 
49
- ?>
50
- <div class="rev-option" data-value="
51
- <?php echo $option['value']; ?>">
52
- <div class="cwpr_clearfix">
53
- <span>
54
- <h3><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></h3>
55
- </span>
56
- <span><?php echo esc_html( number_format( ( $option['value'] / 10 ), 1 ) ); ?>/10</span>
57
- </div>
58
- <ul class="cwpr_clearfix
59
- <?php echo ' ' . $review_object->get_rating_class( $option['value'] ) . apply_filters( 'wppr_option_custom_icon', '' ); ?>
60
- ">
61
- <?php
62
- $rating = round( $option['value'] / 10 );
63
- $start_from = is_rtl() ? ( 11 - $rating ) : 1;
64
- $stop_at = is_rtl() ? 10 : $rating;
65
- for ( $i = 1; $i <= 10; $i ++ ) {
66
- ?>
67
- <li
68
- <?php
69
- echo $i >= $start_from && $i <= $stop_at ? ' class="colored"' : '';
70
- ?>
71
- ></li>
72
- <?php } ?>
73
- </ul>
74
- </div>
75
- <?php } ?>
76
- </div><!-- end .review-wu-bars -->
77
  </div><!-- end .review-wu-left -->
78
 
79
- <?php if ( ! empty( $pros ) || ! empty( $cons ) ) : ?>
80
- <div class="review-wu-right">
81
- <?php if ( ! empty( $pros ) ) : ?>
82
- <div class="pros">
83
- <h2>
84
- <?php
85
- echo esc_html(
86
- apply_filters(
87
- 'wppr_review_pros_text',
88
- $review_object->wppr_get_option(
89
- 'cwppos_pros_text'
90
- )
91
- )
92
- );
93
- ?>
94
- </h2>
95
- <ul>
96
- <?php
97
- foreach ( $pros as $pro ) {
98
- ?>
99
- <li><?php echo esc_html( $pro ); ?></li>
100
- <?php
101
- }
102
- ?>
103
- </ul>
104
- </div><!-- end .pros -->
105
- <?php
106
- endif;
107
- if ( ! empty( $cons ) ) :
108
- ?>
109
- <div class="cons">
110
- <h2>
111
- <?php
112
- echo esc_html(
113
- apply_filters(
114
- 'wppr_review_cons_text',
115
- $review_object->wppr_get_option(
116
- 'cwppos_cons_text'
117
- )
118
- )
119
- );
120
- ?>
121
- </h2>
122
- <ul>
123
- <?php
124
- foreach ( $cons as $con ) {
125
- ?>
126
-
127
- <li><?php echo esc_html( $con ); ?></li>
128
 
129
- <?php } ?>
130
- </ul>
131
- </div>
132
-
133
- <?php endif; ?>
134
- </div><!-- end .review-wu-right -->
135
- <?php endif; ?>
136
  </div><!-- end .review-wu-content -->
137
  </div><!-- end .review-wrap-up -->
138
  </section>
139
- <?php
140
- foreach ( $links as $title => $link ) {
141
- if ( ! empty( $title ) && ! empty( $link ) ) {
142
- ?>
143
- <div class="<?php echo esc_attr( $multiple_affiliates_class ); ?>">
144
- <a href="<?php echo esc_url( $link ); ?>" rel="nofollow"
145
- target="_blank"><span><?php echo esc_html( $title ); ?></span> </a>
146
- </div><!-- end .affiliate-button -->
147
- <?php
148
- }
149
- }
150
- ?>
151
  </div>
12
 
13
  $price_raw = $review_object->get_price_raw();
14
 
 
 
 
 
 
 
 
15
  $pros = $review_object->get_pros();
16
  $cons = $review_object->get_cons();
 
 
17
 
18
  ?>
19
  <div id="wppr-review-<?php echo $review_object->get_ID(); ?>"
27
  <div class="review-wu-content cwpr_clearfix">
28
  <div class="review-wu-left">
29
  <div class="review-wu-left-top">
30
+ <div class="rev-wu-image">
31
+ <?php wppr_layout_get_image( $review_object, 'wppr-default-img', 'photo photo-wrapup wppr-product-image' ); ?>
32
+ </div>
33
+
34
+ <?php wppr_layout_get_rating( $review_object, 'donut', 'default', 'review-wu-grade' ); ?>
35
  </div><!-- end .review-wu-left-top -->
36
 
37
+ <?php wppr_layout_get_options_ratings( $review_object, 'dashes' ); ?>
 
 
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  </div><!-- end .review-wu-left -->
40
 
41
+ <div class="review-wu-right">
42
+ <?php wppr_layout_get_pros( $review_object, '', 'h2', '' ); ?>
43
+ <?php wppr_layout_get_cons( $review_object, '', 'h2', '' ); ?>
44
+ </div><!-- end .review-wu-right -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
 
 
 
 
 
 
 
46
  </div><!-- end .review-wu-content -->
47
  </div><!-- end .review-wrap-up -->
48
  </section>
49
+
50
+ <?php wppr_layout_get_affiliate_buttons( $review_object ); ?>
 
 
 
 
 
 
 
 
 
 
51
  </div>
includes/public/layouts/style1.php CHANGED
@@ -12,129 +12,35 @@
12
  <div class="wppr-template wppr-template-1 <?php echo is_rtl() ? 'rtl' : ''; ?>">
13
 
14
  <?php
15
- // Review info.
16
  $review_id = $review_object->get_ID();
17
  $review_pros = $review_object->get_pros();
18
  $review_cons = $review_object->get_cons();
19
- $review_rating = $review_object->get_rating();
20
- $rating_10 = round( $review_rating, 0 ) / 10;
21
-
22
- $links = $review_object->get_links();
23
- $multiple_affiliates_class = 'affiliate-button';
24
-
25
- if ( count( $links ) > 1 ) {
26
- $multiple_affiliates_class = 'affiliate-button2 affiliate-button';
27
- }
28
- $review_image = $review_object->get_small_thumbnail();
29
- $review_image_link = reset( $links );
30
-
31
- if ( $review_object->get_click() == 'image' ) {
32
- $lightbox = 'data-lightbox="' . esc_url( $review_object->get_small_thumbnail() ) . '"';
33
- $review_image_link = $review_object->get_image();
34
- }
35
  ?>
36
 
37
  <div id="wppr-review-<?php echo $review_id; ?>" class="wppr-review-container">
38
 
39
  <h2 class="wppr-review-name"><?php echo esc_html( $review_object->get_name() ); ?></h2>
40
 
41
- <?php
42
- wppr_display_rating_stars( 'style1', $review_object, false );
43
- ?>
44
 
45
  <div class="wppr-review-grade">
46
  <div class="wppr-review-grade-number">
47
- <span class=" <?php echo $review_object->get_rating_class(); ?> ">
48
- <?php
49
- // Display rating number.
50
- echo esc_html( $rating_10 );
51
- ?>
52
- </span>
53
  </div>
54
- <?php
55
- // Review image.
56
- if ( ! empty( $review_image ) ) {
57
- ?>
58
  <div class="wppr-review-product-image">
59
- <a href="<?php echo esc_url( $review_image_link ); ?>" <?php echo $lightbox; ?>
60
- rel="nofollow" target="_blank" class="wppr-default-img"><img
61
- src="<?php echo esc_attr( $review_image ); ?>"
62
- alt="<?php echo esc_attr( $review_object->get_image_alt() ); ?>" class="wppr-product-image"/></a>
63
  </div>
64
- <?php } ?>
65
- <div class="wppr-review-grade-options <?php echo is_rtl() ? 'rtl' : ''; ?>">
66
- <?php
67
- foreach ( $review_object->get_options() as $option ) {
68
- $review_option_rating = $option['value'];
69
- ?>
70
- <div class="wppr-review-grade-option">
71
- <div class="wppr-review-grade-option-header">
72
- <span><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></span>
73
- <span><?php echo esc_html( number_format( ( $review_option_rating / 10 ), 1 ) ); ?></span>
74
- </div>
75
- <div class="wppr-review-grade-option-rating wppr-default <?php echo $review_object->get_rating_class( $review_option_rating ); ?> <?php echo is_rtl() ? 'rtl' : ''; ?>">
76
- <span class="<?php echo $review_object->get_rating_class( $review_option_rating ); ?>" style="
77
- <?php
78
- /**
79
- * Adds min-width for amp support.
80
- */
81
- echo 'width:' . esc_attr( is_rtl() ? ( 100 - $review_option_rating ) : $review_option_rating ) . '%; ';
82
- echo esc_attr( apply_filters( 'wppr_review_option_rating_css', '', $review_option_rating ) );
83
- ?>
84
- "></span>
85
- </div>
86
- </div><!-- end .wppr-review-grade-option -->
87
- <?php } ?>
88
- </div><!-- end .wppr-review-grade-options -->
89
  </div><!-- end .wppr-review-grade -->
90
- <?php
91
- // Pros & Cons section.
92
- if ( ! empty( $review_pros ) || ! empty( $review_cons ) ) {
93
- ?>
94
- <div class="wppr-review-pros-cons<?php echo ( $review_pros && $review_cons ) ? '' : ' wppr-review-one-column'; ?>">
95
- <?php
96
- // Pros.
97
- if ( ! empty( $review_pros ) ) {
98
- ?>
99
- <div class="pros">
100
- <h3 class="wppr-review-pros-name">
101
- <?php echo esc_html( apply_filters( 'wppr_review_pros_text', $review_object->wppr_get_option( 'cwppos_pros_text' ) ) ); ?>
102
- </h3>
103
- <ul>
104
- <?php foreach ( $review_pros as $pro ) { ?>
105
- <li><?php echo esc_html( $pro ); ?></li>
106
- <?php } ?>
107
- </ul>
108
- </div>
109
- <?php
110
- }
111
- // Cons.
112
- if ( ! empty( $review_cons ) ) {
113
- ?>
114
- <div class="cons">
115
- <h3 class="wppr-review-cons-name">
116
- <?php echo esc_html( apply_filters( 'wppr_review_pros_text', $review_object->wppr_get_option( 'cwppos_cons_text' ) ) ); ?>
117
- </h3>
118
- <ul>
119
- <?php foreach ( $review_cons as $con ) { ?>
120
- <li><?php echo esc_html( $con ); ?></li>
121
- <?php } ?>
122
- </ul>
123
- </div>
124
- <?php } ?>
125
- </div><!-- end .wppr-review-pros-cons -->
126
- <?php } ?>
127
  </div><!-- end .wppr-review-container -->
128
- <?php
129
- foreach ( $links as $title => $link ) {
130
- if ( ! empty( $title ) && ! empty( $link ) ) {
131
- ?>
132
- <div class="<?php echo esc_attr( $multiple_affiliates_class ); ?>">
133
- <a href="<?php echo esc_url( $link ); ?>" rel="nofollow"
134
- target="_blank"><span><?php echo esc_html( $title ); ?></span> </a>
135
- </div><!-- end .affiliate-button -->
136
- <?php
137
- }
138
- }
139
- ?>
140
  </div>
12
  <div class="wppr-template wppr-template-1 <?php echo is_rtl() ? 'rtl' : ''; ?>">
13
 
14
  <?php
 
15
  $review_id = $review_object->get_ID();
16
  $review_pros = $review_object->get_pros();
17
  $review_cons = $review_object->get_cons();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  ?>
19
 
20
  <div id="wppr-review-<?php echo $review_id; ?>" class="wppr-review-container">
21
 
22
  <h2 class="wppr-review-name"><?php echo esc_html( $review_object->get_name() ); ?></h2>
23
 
24
+ <?php wppr_layout_get_rating( $review_object, 'stars', 'style1', false ); ?>
 
 
25
 
26
  <div class="wppr-review-grade">
27
  <div class="wppr-review-grade-number">
28
+ <?php wppr_layout_get_rating( $review_object, 'number', 'style1' ); ?>
 
 
 
 
 
29
  </div>
 
 
 
 
30
  <div class="wppr-review-product-image">
31
+ <?php wppr_layout_get_image( $review_object, 'wppr-default-img', 'wppr-product-image' ); ?>
 
 
 
32
  </div>
33
+
34
+ <?php wppr_layout_get_options_ratings( $review_object, 'bars' ); ?>
35
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
  </div><!-- end .wppr-review-grade -->
37
+
38
+ <div class="wppr-review-pros-cons<?php echo ( $review_pros && $review_cons ) ? '' : ' wppr-review-one-column'; ?>">
39
+ <?php wppr_layout_get_pros( $review_object, '', 'h3', 'wppr-review-pros-name' ); ?>
40
+ <?php wppr_layout_get_cons( $review_object, '', 'h3', 'wppr-review-cons-name' ); ?>
41
+ </div><!-- end .wppr-review-pros-cons -->
42
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  </div><!-- end .wppr-review-container -->
44
+ <?php wppr_layout_get_affiliate_buttons( $review_object ); ?>
45
+
 
 
 
 
 
 
 
 
 
 
46
  </div>
includes/public/layouts/style2.php CHANGED
@@ -12,136 +12,35 @@
12
  ?>
13
  <div class="wppr-template wppr-template-2 <?php echo is_rtl() ? 'rtl' : ''; ?>">
14
  <?php
15
- // Review info.
16
- $links = $review_object->get_links();
17
  $review_id = $review_object->get_ID();
18
  $review_pros = $review_object->get_pros();
19
  $review_cons = $review_object->get_cons();
20
- $review_rating = $review_object->get_rating();
21
  $review_image = $review_object->get_small_thumbnail();
22
- $review_image_link = reset( $links );
23
-
24
- $rating_10 = round( $review_rating, 0 ) / 10;
25
-
26
- $multiple_affiliates_class = 'affiliate-button';
27
-
28
- if ( count( $links ) > 1 ) {
29
- $multiple_affiliates_class = 'affiliate-button2 affiliate-button';
30
- }
31
- if ( $review_object->get_click() == 'image' ) {
32
- $lightbox = 'data-lightbox="' . esc_url( $review_object->get_small_thumbnail() ) . '"';
33
- $review_image_link = $review_object->get_image();
34
- }
35
  ?>
36
 
37
  <div id="wppr-review-<?php echo $review_id; ?>" class="wppr-review-container">
38
  <h2 class="wppr-review-name"><?php echo esc_html( $review_object->get_name() ); ?></h2>
39
  <div class="wppr-review-head<?php echo ( $review_pros && $review_cons ) ? ' wppr-review-with-pros-cons' : ''; ?><?php echo ( $review_image ) ? ' wppr-review-with-image' : ''; ?>">
40
  <div class="wppr-review-rating <?php echo is_rtl() ? 'rtl' : ''; ?>">
41
- <span class="wppr-review-rating-grade wppr-p<?php echo esc_attr( round( $review_rating ) ) . ' ' . $review_object->get_rating_class(); ?>">
42
- <?php
43
- // Display rating number.
44
- echo esc_html( $rating_10 );
45
- ?>
46
- </span>
47
- <?php
48
- // Review image.
49
- if ( ! empty( $review_image ) ) {
50
- ?>
51
- <a href="<?php echo esc_url( $review_image_link ); ?>" <?php echo $lightbox; ?>
52
- class="wppr-review-product-image wppr-default-img" rel="nofollow" target="_blank"><img
53
- src="<?php echo esc_attr( $review_image ); ?>"
54
- alt="<?php echo esc_attr( $review_object->get_image_alt() ); ?>" class="wppr-product-image"/></a>
55
- <?php } ?>
56
  <div class="clearfix"></div>
57
- <?php
58
- if ( $review_object->wppr_get_option( 'cwppos_show_userreview' ) === 'yes' ) {
59
- $comments_rating = $review_object->get_comments_rating();
60
- $number_comments = count( $review_object->get_comments_options() );
61
- ?>
62
- <span class="wppr-review-rating-users wppr-p<?php echo esc_attr( round( $comments_rating ) ) . ' ' . $review_object->get_rating_class( $comments_rating ); ?>">
63
- <span dir="<?php echo is_rtl() ? 'rtl' : ''; ?>">
64
- <?php echo sprintf( __( 'Users score: %1$d with %2$d votes', 'wp-product-review' ), $comments_rating, $number_comments ); ?>
65
- </span>
66
- </span>
67
- <?php } ?>
68
  </div>
69
- <?php
70
- // Pros & Cons section.
71
- if ( ! empty( $review_pros ) || ! empty( $review_cons ) ) {
72
- // Pros.
73
- if ( ! empty( $review_pros ) ) {
74
- ?>
75
- <div class="wppr-review-pros">
76
- <h3 class="wppr-review-pros-name">
77
- <?php echo esc_html( apply_filters( 'wppr_review_pros_text', $review_object->wppr_get_option( 'cwppos_pros_text' ) ) ); ?>
78
- </h3>
79
- <ul>
80
- <?php foreach ( $review_pros as $pro ) { ?>
81
- <li><?php echo esc_html( $pro ); ?></li>
82
- <?php } ?>
83
- </ul>
84
- </div>
85
- <?php
86
- }
87
- // Cons.
88
- if ( ! empty( $review_cons ) ) {
89
- ?>
90
- <div class="wppr-review-cons">
91
- <h3 class="wppr-review-cons-name">
92
- <?php echo esc_html( apply_filters( 'wppr_review_cons_text', $review_object->wppr_get_option( 'cwppos_cons_text' ) ) ); ?>
93
- </h3>
94
- <ul>
95
- <?php foreach ( $review_cons as $con ) { ?>
96
- <li><?php echo esc_html( $con ); ?></li>
97
- <?php } ?>
98
- </ul>
99
- </div>
100
- <?php
101
- }
102
- }
103
- ?>
104
  </div><!-- end .wppr-review-head -->
105
- <div class="wppr-review-options">
106
- <?php
107
- foreach ( $review_object->get_options() as $option ) {
108
- $review_option_rating = $option['value'];
109
- ?>
110
- <div class="wppr-review-option">
111
- <div class="wppr-review-option-header">
112
- <span><?php echo esc_html( apply_filters( 'wppr_option_name_html', $option['name'] ) ); ?></span>
113
- </div>
114
- <ul class="wppr-review-option-rating <?php echo apply_filters( 'wppr_option_custom_icon', '' ); ?>">
115
- <?php
116
- $rating = round( $option['value'] / 10 );
117
- $start_from = is_rtl() ? ( 11 - $rating ) : 1;
118
- $stop_at = is_rtl() ? 10 : $rating;
119
- for ( $i = 1; $i <= 10; $i ++ ) {
120
- ?>
121
- <li class="
122
- <?php
123
- echo $i >= $start_from && $i <= $stop_at ? $review_object->get_rating_class( $option['value'] ) : ' wppr-default';
124
- ?>
125
- ">
126
 
127
- </li>
128
- <?php } ?>
129
- </ul>
130
- </div><!-- end .wppr-review-option -->
131
- <?php } ?>
132
- </div><!-- end .wppr-review-options -->
133
  <div class="clearfix"></div>
134
  </div><!-- end .wppr-review-container -->
135
- <?php
136
- foreach ( $links as $title => $link ) {
137
- if ( ! empty( $title ) && ! empty( $link ) ) {
138
- ?>
139
- <div class="<?php echo esc_attr( $multiple_affiliates_class ); ?>">
140
- <a href="<?php echo esc_url( $link ); ?>" rel="nofollow"
141
- target="_blank"><span><?php echo esc_html( $title ); ?></span> </a>
142
- </div><!-- end .affiliate-button -->
143
- <?php
144
- }
145
- }
146
- ?>
147
  </div>
12
  ?>
13
  <div class="wppr-template wppr-template-2 <?php echo is_rtl() ? 'rtl' : ''; ?>">
14
  <?php
 
 
15
  $review_id = $review_object->get_ID();
16
  $review_pros = $review_object->get_pros();
17
  $review_cons = $review_object->get_cons();
 
18
  $review_image = $review_object->get_small_thumbnail();
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  ?>
20
 
21
  <div id="wppr-review-<?php echo $review_id; ?>" class="wppr-review-container">
22
  <h2 class="wppr-review-name"><?php echo esc_html( $review_object->get_name() ); ?></h2>
23
  <div class="wppr-review-head<?php echo ( $review_pros && $review_cons ) ? ' wppr-review-with-pros-cons' : ''; ?><?php echo ( $review_image ) ? ' wppr-review-with-image' : ''; ?>">
24
  <div class="wppr-review-rating <?php echo is_rtl() ? 'rtl' : ''; ?>">
25
+ <?php wppr_layout_get_rating( $review_object, 'number', 'style2' ); ?>
26
+ <?php wppr_layout_get_image( $review_object, 'wppr-review-product-image wppr-default-img', 'wppr-product-image' ); ?>
27
+
 
 
 
 
 
 
 
 
 
 
 
 
28
  <div class="clearfix"></div>
29
+
30
+ <?php wppr_layout_get_user_rating( $review_object ); ?>
31
+
 
 
 
 
 
 
 
 
32
  </div>
33
+
34
+ <?php wppr_layout_get_pros( $review_object, 'wppr-review-pros', 'h3', 'wppr-review-pros-name' ); ?>
35
+ <?php wppr_layout_get_cons( $review_object, 'wppr-review-pros', 'h3', 'wppr-review-cons-name' ); ?>
36
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  </div><!-- end .wppr-review-head -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
+ <?php wppr_layout_get_options_ratings( $review_object, 'stars' ); ?>
40
+
 
 
 
 
41
  <div class="clearfix"></div>
42
  </div><!-- end .wppr-review-container -->
43
+
44
+ <?php wppr_layout_get_affiliate_buttons( $review_object ); ?>
45
+
 
 
 
 
 
 
 
 
 
46
  </div>
includes/public/layouts/widget/default.php CHANGED
@@ -50,22 +50,8 @@ foreach ( $results as $review ) :
50
  $review_class = $review_object->get_rating_class();
51
  if ( ! empty( $review_score ) ) {
52
  ?>
53
- <div class="review-grade-widget wppr-col">
54
- <div class="review-wu-grade-content">
55
- <div class="wppr-c100
56
- <?php
57
- echo esc_attr( ' wppr-p' . $rating ) . ' ' . esc_attr( $review_class );
58
- ?>
59
- ">
60
- <span><?php echo esc_html( $rating_10 ); ?></span>
61
- <div class="wppr-slice">
62
- <div class="wppr-bar" style="<?php echo apply_filters( 'wppr_rating_circle_bar_styles', '', $rating ); ?>"></div>
63
- <div class="wppr-fill" style="<?php echo apply_filters( 'wppr_rating_circle_fill_styles', '', $rating ); ?>"></div>
64
- </div>
65
- <div class="wppr-slice-center"></div>
66
- </div>
67
- </div>
68
- </div>
69
  <?php } ?>
70
  </li>
71
  <?php
50
  $review_class = $review_object->get_rating_class();
51
  if ( ! empty( $review_score ) ) {
52
  ?>
53
+ <?php wppr_layout_get_rating( $review_object, 'donut', 'style1-widget', 'review-grade-widget wppr-col' ); ?>
54
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  <?php } ?>
56
  </li>
57
  <?php
includes/public/layouts/widget/style 1.php CHANGED
@@ -32,7 +32,7 @@
32
  <div class="wppr-prodrow">
33
  <?php if ( $showingImg ) { ?>
34
  <div class="wppr-prodrowleft">
35
- <a href="<?php echo $review_link; ?>" class="wppr-col" title="<?php echo $product_title; ?>">
36
  <img class="cwp_rev_image wppr-col" src="<?php echo $product_image; ?>"
37
  alt="<?php echo $product_title; ?>"/>
38
  </a>
@@ -42,25 +42,7 @@
42
  ?>
43
  <div class="wppr-prodrowright <?php echo $showingImg ? 'wppr-prodrowrightadjust' : '' ?>">
44
  <p><strong><?php echo $product_title_display; ?></strong></p>
45
- <?php
46
- $review_score = $review_object->get_rating();
47
-
48
- if ( ! empty( $review_score ) ) {
49
- if ( $instance['cwp_tp_rating_type'] == 'round' ) {
50
- ?>
51
- <div class="review-grade-widget wppr-col">
52
- <div class="cwp-review-chart relative">
53
- <div class="cwp-review-percentage" data-percent="<?php echo $review_score; ?>">
54
- <span></span></div>
55
- </div><!-- end .chart -->
56
- </div>
57
- <div class="clear"></div>
58
- <?php
59
- } else {
60
- wppr_display_rating_stars( 'style1-widget', $review_object, false );
61
- }
62
- }
63
- ?>
64
  <p class="wppr-style1-buttons">
65
  <?php
66
  $link = "<a href='{$affiliate_link}' rel='nofollow' target='_blank' class='wppr-bttn'>" . __( $instance['cwp_tp_buynow'], 'wp-product-review' ) . '</a>';
32
  <div class="wppr-prodrow">
33
  <?php if ( $showingImg ) { ?>
34
  <div class="wppr-prodrowleft">
35
+ <a href="<?php echo $review_link; ?>" class="wppr-col" title="<?php echo $product_title; ?>" rel="noopener">
36
  <img class="cwp_rev_image wppr-col" src="<?php echo $product_image; ?>"
37
  alt="<?php echo $product_title; ?>"/>
38
  </a>
42
  ?>
43
  <div class="wppr-prodrowright <?php echo $showingImg ? 'wppr-prodrowrightadjust' : '' ?>">
44
  <p><strong><?php echo $product_title_display; ?></strong></p>
45
+ <?php wppr_layout_get_rating( $review_object, 'stars', 'style1-widget' ); ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  <p class="wppr-style1-buttons">
47
  <?php
48
  $link = "<a href='{$affiliate_link}' rel='nofollow' target='_blank' class='wppr-bttn'>" . __( $instance['cwp_tp_buynow'], 'wp-product-review' ) . '</a>';
languages/wp-product-review.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the no.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WP Product Review Lite 3.4.2\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/wp-product-review/issues\n"
7
- "POT-Creation-Date: 2018-03-20 12:29:55+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -24,581 +24,1041 @@ msgstr ""
24
  "X-Poedit-Bookmarks: \n"
25
  "X-Textdomain-Support: yes\n"
26
 
27
- #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:112
 
 
28
  msgid "10"
29
  msgstr ""
30
 
31
- #: includes/admin/class-wppr-admin.php:131
 
 
32
  msgid "WP Product Review"
33
  msgstr ""
34
 
35
- #: includes/admin/class-wppr-admin.php:131
 
 
36
  msgid "Product Review"
37
  msgstr ""
38
 
39
- #: includes/admin/class-wppr-admin.php:138
 
 
40
  msgid "More Features"
41
  msgstr ""
42
 
43
- #: includes/admin/class-wppr-admin.php:138
 
 
44
  msgid "More Features "
45
  msgstr ""
46
 
47
- #: includes/admin/class-wppr-admin.php:283
 
 
48
  msgid "Show All"
49
  msgstr ""
50
 
51
- #: includes/admin/class-wppr-admin.php:285
 
 
52
  msgid "Show only Reviews"
53
  msgstr ""
54
 
55
- #: includes/admin/class-wppr-admin.php:326
 
 
56
  msgid "Review"
57
  msgstr ""
58
 
59
- #: includes/admin/class-wppr-editor.php:58
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  msgid "Product Review Extra Settings"
61
  msgstr ""
62
 
63
- #: includes/admin/class-wppr-global-settings.php:61
 
 
64
  msgid "General settings"
65
  msgstr ""
66
 
67
- #: includes/admin/class-wppr-global-settings.php:62
 
 
68
  msgid "Rating colors"
69
  msgstr ""
70
 
71
- #: includes/admin/class-wppr-global-settings.php:63
 
 
72
  msgid "Typography"
73
  msgstr ""
74
 
75
- #: includes/admin/class-wppr-global-settings.php:64
 
 
76
  msgid "Buy button"
77
  msgstr ""
78
 
79
- #: includes/admin/class-wppr-global-settings.php:72
 
 
80
  msgid "Position of the review box"
81
  msgstr ""
82
 
83
- #: includes/admin/class-wppr-global-settings.php:73
84
- msgid ""
85
- "You display the review using the shortcode available in the pro version "
86
- "<code> [P_REVIEW post_id=3067 visual='full']</code>"
87
- msgstr ""
88
-
89
- #: includes/admin/class-wppr-global-settings.php:76
90
  msgid "After content"
91
  msgstr ""
92
 
93
- #: includes/admin/class-wppr-global-settings.php:77
 
 
94
  msgid "Before content"
95
  msgstr ""
96
 
97
- #: includes/admin/class-wppr-global-settings.php:78
 
 
98
  msgid "Manually placed"
99
  msgstr ""
100
 
101
- #: includes/admin/class-wppr-global-settings.php:84
 
 
102
  msgid "Show review comment"
103
  msgstr ""
104
 
105
- #: includes/admin/class-wppr-global-settings.php:85
 
 
106
  msgid "Activate comment review user"
107
  msgstr ""
108
 
109
- #: includes/admin/class-wppr-global-settings.php:88
110
- #: includes/admin/class-wppr-global-settings.php:144
111
- #: includes/admin/class-wppr-global-settings.php:155
112
- #: includes/admin/class-wppr-global-settings.php:166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  #: includes/admin/layouts/editor-default-tpl.php:32
114
  msgid "Yes"
115
  msgstr ""
116
 
117
- #: includes/admin/class-wppr-global-settings.php:89
118
- #: includes/admin/class-wppr-global-settings.php:145
119
- #: includes/admin/class-wppr-global-settings.php:156
120
- #: includes/admin/class-wppr-global-settings.php:167
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  #: includes/admin/layouts/editor-default-tpl.php:44
122
  msgid "No"
123
  msgstr ""
124
 
125
- #: includes/admin/class-wppr-global-settings.php:96
 
 
126
  msgid "Visitor Review Influence"
127
  msgstr ""
128
 
129
- #: includes/admin/class-wppr-global-settings.php:97
 
 
130
  msgid "Select how much visitors rating will affect the main one"
131
  msgstr ""
132
 
133
- #: includes/admin/class-wppr-global-settings.php:116
 
 
134
  msgid "Number of options/pros/cons"
135
  msgstr ""
136
 
137
- #: includes/admin/class-wppr-global-settings.php:117
 
 
138
  msgid "You can select the default number of options / pros/ cons (3-10)"
139
  msgstr ""
140
 
141
- #: includes/admin/class-wppr-global-settings.php:133
 
 
142
  msgid "Content width"
143
  msgstr ""
144
 
145
- #: includes/admin/class-wppr-global-settings.php:134
 
 
146
  msgid ""
147
  "Write your content width in pixels in this format : 600 if you want to "
148
  "limit the review box width."
149
  msgstr ""
150
 
151
- #: includes/admin/class-wppr-global-settings.php:140
 
 
152
  msgid "Disable Lighbox images"
153
  msgstr ""
154
 
155
- #: includes/admin/class-wppr-global-settings.php:141
 
 
156
  msgid "Disable lightbox effect on product images (increase loading speed)"
157
  msgstr ""
158
 
159
- #: includes/admin/class-wppr-global-settings.php:151
 
 
160
  msgid "Disable Font Awesome"
161
  msgstr ""
162
 
163
- #: includes/admin/class-wppr-global-settings.php:152
 
 
164
  msgid ""
165
  "Disable Font Awesome for websites that already are including it (increase "
166
  "loading speed)"
167
  msgstr ""
168
 
169
- #: includes/admin/class-wppr-global-settings.php:162
 
 
170
  msgid "Enable Rich Snippets"
171
  msgstr ""
172
 
173
- #: includes/admin/class-wppr-global-settings.php:163
 
 
174
  msgid "Enable rich snippets on the product page."
175
  msgstr ""
176
 
 
 
177
  #: includes/admin/class-wppr-global-settings.php:175
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  msgid "Rating options default color"
179
  msgstr ""
180
 
181
- #: includes/admin/class-wppr-global-settings.php:176
 
 
182
  msgid "Select the color to be used by default on rating."
183
  msgstr ""
184
 
185
- #: includes/admin/class-wppr-global-settings.php:182
 
 
186
  msgid "Rating chart default color"
187
  msgstr ""
188
 
189
- #: includes/admin/class-wppr-global-settings.php:183
 
 
190
  msgid "Select the color to be used by default on rating chart."
191
  msgstr ""
192
 
193
- #: includes/admin/class-wppr-global-settings.php:189
 
 
194
  msgid "Weak rating"
195
  msgstr ""
196
 
197
- #: includes/admin/class-wppr-global-settings.php:190
 
 
198
  msgid "Select the color to be used when the rating is weak. ( < 2.5)"
199
  msgstr ""
200
 
201
- #: includes/admin/class-wppr-global-settings.php:196
 
 
202
  msgid "Not bad rating"
203
  msgstr ""
204
 
205
- #: includes/admin/class-wppr-global-settings.php:197
 
 
206
  msgid "Select the color to be used when the rating is not bad. ( > 2.5 and < 5)"
207
  msgstr ""
208
 
209
- #: includes/admin/class-wppr-global-settings.php:203
 
 
210
  msgid "Good rating"
211
  msgstr ""
212
 
213
- #: includes/admin/class-wppr-global-settings.php:204
 
 
214
  msgid "Select the color to be used when the rating is good. ( >5 and <7.5)"
215
  msgstr ""
216
 
217
- #: includes/admin/class-wppr-global-settings.php:210
 
 
218
  msgid "Very good rating"
219
  msgstr ""
220
 
221
- #: includes/admin/class-wppr-global-settings.php:211
 
 
222
  msgid "Select the color to be used when the rating is very good. ( 7.5 < and <10)"
223
  msgstr ""
224
 
225
- #: includes/admin/class-wppr-global-settings.php:220
 
 
226
  msgid "Font color"
227
  msgstr ""
228
 
229
- #: includes/admin/class-wppr-global-settings.php:221
 
 
230
  msgid "Select the color to be used on the font."
231
  msgstr ""
232
 
233
- #: includes/admin/class-wppr-global-settings.php:227
 
 
234
  msgid "Pros text color"
235
  msgstr ""
236
 
237
- #: includes/admin/class-wppr-global-settings.php:228
 
 
238
  msgid "Select the color to be used on the 'Pros' text."
239
  msgstr ""
240
 
241
- #: includes/admin/class-wppr-global-settings.php:234
 
 
242
  msgid "Cons text color"
243
  msgstr ""
244
 
245
- #: includes/admin/class-wppr-global-settings.php:235
 
 
246
  msgid "Select the color to be used on the Cons text."
247
  msgstr ""
248
 
249
- #: includes/admin/class-wppr-global-settings.php:241
 
 
250
  msgid "Pros text"
251
  msgstr ""
252
 
253
- #: includes/admin/class-wppr-global-settings.php:242
 
 
254
  msgid "Specify text for pros heading"
255
  msgstr ""
256
 
257
- #: includes/admin/class-wppr-global-settings.php:248
 
 
258
  msgid "Cons text"
259
  msgstr ""
260
 
261
- #: includes/admin/class-wppr-global-settings.php:249
 
 
262
  msgid "Specify text for cons heading"
263
  msgstr ""
264
 
265
- #: includes/admin/class-wppr-global-settings.php:255
 
 
266
  msgid "Review box border"
267
  msgstr ""
268
 
269
- #: includes/admin/class-wppr-global-settings.php:256
 
 
270
  msgid "Select the border color to be used on the review box"
271
  msgstr ""
272
 
273
- #: includes/admin/class-wppr-global-settings.php:262
 
 
274
  msgid "Review box border width"
275
  msgstr ""
276
 
277
- #: includes/admin/class-wppr-global-settings.php:263
 
 
278
  msgid "Select the width in pixels of the top border of the review box"
279
  msgstr ""
280
 
281
- #: includes/admin/class-wppr-global-settings.php:271
 
 
282
  msgid "Show button icon"
283
  msgstr ""
284
 
285
- #: includes/admin/class-wppr-global-settings.php:272
 
 
286
  msgid "Show icon on the cart icon on button."
287
  msgstr ""
288
 
289
- #: includes/admin/class-wppr-global-settings.php:282
 
 
290
  msgid "Button border"
291
  msgstr ""
292
 
293
- #: includes/admin/class-wppr-global-settings.php:283
 
 
294
  msgid "Select the border color to be used on the buy button for the default state"
295
  msgstr ""
296
 
297
- #: includes/admin/class-wppr-global-settings.php:289
 
 
298
  msgid "Button border hover"
299
  msgstr ""
300
 
301
- #: includes/admin/class-wppr-global-settings.php:290
 
 
302
  msgid "Select the border color to be used on the buy button for the hover state"
303
  msgstr ""
304
 
305
- #: includes/admin/class-wppr-global-settings.php:296
 
 
306
  msgid "Button background"
307
  msgstr ""
308
 
309
- #: includes/admin/class-wppr-global-settings.php:297
 
 
310
  msgid ""
311
  "Select the background color to be used on the buy button for the default "
312
  "state"
313
  msgstr ""
314
 
315
- #: includes/admin/class-wppr-global-settings.php:303
 
 
316
  msgid "Button background hover"
317
  msgstr ""
318
 
319
- #: includes/admin/class-wppr-global-settings.php:304
 
 
320
  msgid ""
321
  "Select the background color to be used on the buy button for the hover "
322
  "state"
323
  msgstr ""
324
 
325
- #: includes/admin/class-wppr-global-settings.php:310
 
 
326
  msgid "Button text color"
327
  msgstr ""
328
 
329
- #: includes/admin/class-wppr-global-settings.php:311
 
 
330
  msgid "Select the text color to be used on the buy button for the default state"
331
  msgstr ""
332
 
333
- #: includes/admin/class-wppr-global-settings.php:317
 
 
334
  msgid "Button text color hover"
335
  msgstr ""
336
 
337
- #: includes/admin/class-wppr-global-settings.php:318
 
 
338
  msgid "Select the text color to be used on the buy button for the hover state"
339
  msgstr ""
340
 
341
- #: includes/admin/class-wppr-global-settings.php:357
 
 
342
  msgid "We see %s active, so user feedback is disabled"
343
  msgstr ""
344
 
 
 
345
  #: includes/admin/helpers/class-wppr-html-fields.php:122
346
  msgid "Choose image"
347
  msgstr ""
348
 
 
 
349
  #: includes/admin/helpers/class-wppr-html-fields.php:224
350
  msgid ". Use Default Styling"
351
  msgstr ""
352
 
 
 
353
  #: includes/admin/helpers/class-wppr-html-fields.php:227
354
  msgid "* Currently set to the default styling"
355
  msgstr ""
356
 
 
 
357
  #: includes/admin/helpers/class-wppr-html-fields.php:238
358
  msgid ""
359
  "You need the PRO <a style=\"color:red;\" href=\"http://bit.ly/2bhylar\" "
360
  "target=\"_blank\" >add-on</a> in order to change the review icons."
361
  msgstr ""
362
 
 
 
363
  #: includes/admin/layouts/editor-default-tpl.php:20
364
  msgid "Is this a review post ?"
365
  msgstr ""
366
 
 
 
367
  #: includes/admin/layouts/editor-default-tpl.php:51
368
  msgid "Product Details"
369
  msgstr ""
370
 
 
 
371
  #: includes/admin/layouts/editor-default-tpl.php:52
372
  msgid "Specify the general details for the reviewed product."
373
  msgstr ""
374
 
 
 
375
  #: includes/admin/layouts/editor-default-tpl.php:61
376
  msgid "Template"
377
  msgstr ""
378
 
379
- #: includes/admin/layouts/editor-default-tpl.php:89
 
 
380
  msgid ""
381
  "You will need the %1$spremium%2$s version to use the extra review "
382
  "templates. You can checkout this %3$sdemo%4$s to see how they are looking."
383
  msgstr ""
384
 
385
- #: includes/admin/layouts/editor-default-tpl.php:95
 
 
386
  msgid "Product Name"
387
  msgstr ""
388
 
389
- #: includes/admin/layouts/editor-default-tpl.php:101
 
 
390
  msgid "Product name"
391
  msgstr ""
392
 
393
- #: includes/admin/layouts/editor-default-tpl.php:107
 
 
394
  msgid "Product Image"
395
  msgstr ""
396
 
397
- #: includes/admin/layouts/editor-default-tpl.php:113
 
 
398
  msgid "Choose or Upload an Image"
399
  msgstr ""
400
 
401
- #: includes/admin/layouts/editor-default-tpl.php:118
 
 
402
  msgid "The optimum size of the product image must be 600 x 600 px"
403
  msgstr ""
404
 
405
- #: includes/admin/layouts/editor-default-tpl.php:121
 
 
406
  msgid "If no image is provided, featured image is used"
407
  msgstr ""
408
 
409
- #: includes/admin/layouts/editor-default-tpl.php:125
 
 
410
  msgid "Product Image Click"
411
  msgstr ""
412
 
413
- #: includes/admin/layouts/editor-default-tpl.php:138
 
 
414
  msgid "Show Whole Image"
415
  msgstr ""
416
 
417
- #: includes/admin/layouts/editor-default-tpl.php:150
 
 
418
  msgid "Open Affiliate link"
419
  msgstr ""
420
 
421
- #: includes/admin/layouts/editor-default-tpl.php:157
422
- #: includes/admin/layouts/editor-default-tpl.php:163
423
- #: includes/admin/layouts/editor-default-tpl.php:187
424
- #: includes/admin/layouts/editor-default-tpl.php:193
425
- #: includes/admin/layouts/editor-default-tpl.php:221
426
- #: includes/admin/layouts/editor-default-tpl.php:227
427
- msgid "Affiliate Button Text"
428
- msgstr ""
429
-
 
 
 
430
  #: includes/admin/layouts/editor-default-tpl.php:169
431
  #: includes/admin/layouts/editor-default-tpl.php:175
432
  #: includes/admin/layouts/editor-default-tpl.php:199
433
  #: includes/admin/layouts/editor-default-tpl.php:205
434
  #: includes/admin/layouts/editor-default-tpl.php:233
435
  #: includes/admin/layouts/editor-default-tpl.php:239
436
- msgid "Affiliate Link"
437
  msgstr ""
438
 
 
 
 
 
 
 
 
 
 
 
 
 
439
  #: includes/admin/layouts/editor-default-tpl.php:181
440
- msgid "Add new link"
 
 
 
 
 
441
  msgstr ""
442
 
443
- #: includes/admin/layouts/editor-default-tpl.php:253
444
- #: includes/admin/layouts/editor-default-tpl.php:259
445
- msgid "Product Price"
 
446
  msgstr ""
447
 
448
- #: includes/admin/layouts/editor-default-tpl.php:270
 
 
449
  msgid "Product Options"
450
  msgstr ""
451
 
452
- #: includes/admin/layouts/editor-default-tpl.php:271
 
 
453
  msgid "Insert your options and their grades. Grading must be done from 0 to 100."
454
  msgstr ""
455
 
456
- #: includes/admin/layouts/editor-default-tpl.php:276
 
 
457
  msgid "Preload Info"
458
  msgstr ""
459
 
460
- #: includes/admin/layouts/editor-default-tpl.php:279
 
 
461
  msgid ""
462
  " In order to be able to automatically load your options from another posts, "
463
  "you need the "
464
  msgstr ""
465
 
466
- #: includes/admin/layouts/editor-default-tpl.php:279
 
 
467
  msgid "PRO add-on"
468
  msgstr ""
469
 
470
- #: includes/admin/layouts/editor-default-tpl.php:299
471
- #: includes/admin/layouts/editor-default-tpl.php:341
472
- #: includes/admin/layouts/editor-default-tpl.php:372
 
 
 
 
 
 
473
  msgid "Option"
474
  msgstr ""
475
 
476
- #: includes/admin/layouts/editor-default-tpl.php:308
 
 
477
  msgid "Grade"
478
  msgstr ""
479
 
480
- #: includes/admin/layouts/editor-default-tpl.php:322
 
 
481
  msgid "Pro Features"
482
  msgstr ""
483
 
484
- #: includes/admin/layouts/editor-default-tpl.php:323
 
 
485
  msgid "Insert product's pro features below."
486
  msgstr ""
487
 
488
- #: includes/admin/layouts/editor-default-tpl.php:354
 
 
489
  msgid "Cons Features"
490
  msgstr ""
491
 
492
- #: includes/admin/layouts/editor-default-tpl.php:355
 
 
493
  msgid "Insert product's cons features below."
494
  msgstr ""
495
 
496
- #: includes/admin/layouts/settings-tpl.php:60
 
 
497
  msgid "Save All Changes"
498
  msgstr ""
499
 
 
 
500
  #: includes/admin/layouts/widget-admin-tpl.php:15
501
  msgid "Title:"
502
  msgstr ""
503
 
 
 
504
  #: includes/admin/layouts/widget-admin-tpl.php:19
505
  msgid "Number of posts to show:"
506
  msgstr ""
507
 
 
 
508
  #: includes/admin/layouts/widget-admin-tpl.php:23
509
  msgid "Post Types:"
510
  msgstr ""
511
 
 
 
512
  #: includes/admin/layouts/widget-admin-tpl.php:37
513
  msgid "Category:"
514
  msgstr ""
515
 
 
 
516
  #: includes/admin/layouts/widget-admin-tpl.php:72
517
  msgid "Timespan (weeks):"
518
  msgstr ""
519
 
 
 
520
  #: includes/admin/layouts/widget-admin-tpl.php:76
521
  msgid "Posts published between %s%d%s and %s%d%s week(s) ago"
522
  msgstr ""
523
 
 
 
524
  #: includes/admin/layouts/widget-admin-tpl.php:84
525
  msgid "Layout:"
526
  msgstr ""
527
 
 
 
528
  #: includes/admin/layouts/widget-admin-tpl.php:108
529
  msgid "Buy Now text:"
530
  msgstr ""
531
 
 
 
532
  #: includes/admin/layouts/widget-admin-tpl.php:113
533
  msgid "Read Review text:"
534
  msgstr ""
535
 
 
 
536
  #: includes/admin/layouts/widget-admin-tpl.php:117
537
  msgid "Display Product Titles :"
538
  msgstr ""
539
 
 
 
540
  #: includes/admin/layouts/widget-admin-tpl.php:121
541
  msgid "Display Product Image :"
542
  msgstr ""
543
 
 
 
544
  #: includes/admin/models/class-wppr-editor-model.php:268
545
  msgid "Add a product image to the review"
546
  msgstr ""
547
 
 
 
548
  #: includes/admin/models/class-wppr-editor-model.php:269
549
  msgid "Attach the image"
550
  msgstr ""
551
 
 
 
 
 
552
  #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:82
553
- #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:128
554
  msgid "Buy Now"
555
  msgstr ""
556
 
 
 
 
 
557
  #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:85
558
- #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:132
559
  msgid "Read Review"
560
  msgstr ""
561
 
562
- #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:116
 
 
563
  msgid "Select Category"
564
  msgstr ""
565
 
 
 
566
  #: includes/admin/widgets/class-wppr-latest-products-widget.php:26
567
  msgid "Latest Products Widget"
568
  msgstr ""
569
 
 
 
570
  #: includes/admin/widgets/class-wppr-latest-products-widget.php:28
571
  msgid "This widget displays the latest products based on their rating."
572
  msgstr ""
573
 
574
- #: includes/admin/widgets/class-wppr-latest-products-widget.php:106
 
 
575
  msgid "Latest Products"
576
  msgstr ""
577
 
 
 
578
  #: includes/admin/widgets/class-wppr-top-products-widget.php:26
579
  msgid "Top Products Widget"
580
  msgstr ""
581
 
 
 
582
  #: includes/admin/widgets/class-wppr-top-products-widget.php:28
583
  msgid "This widget displays the top products based on their rating."
584
  msgstr ""
585
 
586
- #: includes/admin/widgets/class-wppr-top-products-widget.php:132
 
 
587
  msgid "Top Products"
588
  msgstr ""
589
 
590
- #: includes/public/layouts/style1.php:44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
591
  msgid "'s rating"
592
  msgstr ""
593
 
594
- #: includes/public/layouts/style2.php:61
595
  msgid "Users score:"
596
  msgstr ""
597
 
598
- #: includes/public/layouts/style2.php:63
599
  msgid "votes"
600
  msgstr ""
601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
602
  #. Plugin Name of the plugin/theme
603
  msgid "WP Product Review Lite"
604
  msgstr ""
@@ -619,4 +1079,34 @@ msgstr ""
619
 
620
  #. Author URI of the plugin/theme
621
  msgid "https://themeisle.com/"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
622
  msgstr ""
2
  # This file is distributed under the no.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WP Product Review Lite 3.4.9\n"
6
  "Report-Msgid-Bugs-To: https://github.com/Codeinwp/wp-product-review/issues\n"
7
+ "POT-Creation-Date: 2018-11-13 08:29:02+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
24
  "X-Poedit-Bookmarks: \n"
25
  "X-Textdomain-Support: yes\n"
26
 
27
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:129
28
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:129
29
+ #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:129
30
  msgid "10"
31
  msgstr ""
32
 
33
+ #: dist/dist/includes/admin/class-wppr-admin.php:134
34
+ #: dist/includes/admin/class-wppr-admin.php:134
35
+ #: includes/admin/class-wppr-admin.php:134
36
  msgid "WP Product Review"
37
  msgstr ""
38
 
39
+ #: dist/dist/includes/admin/class-wppr-admin.php:135
40
+ #: dist/includes/admin/class-wppr-admin.php:135
41
+ #: includes/admin/class-wppr-admin.php:135
42
  msgid "Product Review"
43
  msgstr ""
44
 
45
+ #: dist/dist/includes/admin/class-wppr-admin.php:148
46
+ #: dist/includes/admin/class-wppr-admin.php:148
47
+ #: includes/admin/class-wppr-admin.php:148
48
  msgid "More Features"
49
  msgstr ""
50
 
51
+ #: dist/dist/includes/admin/class-wppr-admin.php:149
52
+ #: dist/includes/admin/class-wppr-admin.php:149
53
+ #: includes/admin/class-wppr-admin.php:149
54
  msgid "More Features "
55
  msgstr ""
56
 
57
+ #: dist/dist/includes/admin/class-wppr-admin.php:298
58
+ #: dist/includes/admin/class-wppr-admin.php:298
59
+ #: includes/admin/class-wppr-admin.php:298
60
  msgid "Show All"
61
  msgstr ""
62
 
63
+ #: dist/dist/includes/admin/class-wppr-admin.php:300
64
+ #: dist/includes/admin/class-wppr-admin.php:300
65
+ #: includes/admin/class-wppr-admin.php:300
66
  msgid "Show only Reviews"
67
  msgstr ""
68
 
69
+ #: dist/dist/includes/admin/class-wppr-admin.php:341
70
+ #: dist/includes/admin/class-wppr-admin.php:341
71
+ #: includes/admin/class-wppr-admin.php:341
72
  msgid "Review"
73
  msgstr ""
74
 
75
+ #: dist/dist/includes/admin/class-wppr-admin.php:386
76
+ #: dist/includes/admin/class-wppr-admin.php:386
77
+ #: includes/admin/class-wppr-admin.php:386
78
+ msgid "Enter Review Title"
79
+ msgstr ""
80
+
81
+ #: dist/dist/includes/admin/class-wppr-admin.php:412
82
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:265
83
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:271
84
+ #: dist/includes/admin/class-wppr-admin.php:412
85
+ #: dist/includes/admin/layouts/editor-default-tpl.php:265
86
+ #: dist/includes/admin/layouts/editor-default-tpl.php:271
87
+ #: includes/admin/class-wppr-admin.php:412
88
+ #: includes/admin/layouts/editor-default-tpl.php:265
89
+ #: includes/admin/layouts/editor-default-tpl.php:271
90
+ msgid "Product Price"
91
+ msgstr ""
92
+
93
+ #: dist/dist/includes/admin/class-wppr-admin.php:413
94
+ #: dist/includes/admin/class-wppr-admin.php:413
95
+ #: includes/admin/class-wppr-admin.php:413
96
+ msgid "Rating"
97
+ msgstr ""
98
+
99
+ #: dist/dist/includes/admin/class-wppr-editor.php:59
100
+ #: dist/includes/admin/class-wppr-editor.php:59
101
+ #: includes/admin/class-wppr-editor.php:59
102
  msgid "Product Review Extra Settings"
103
  msgstr ""
104
 
105
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:62
106
+ #: dist/includes/admin/class-wppr-global-settings.php:62
107
+ #: includes/admin/class-wppr-global-settings.php:62
108
  msgid "General settings"
109
  msgstr ""
110
 
111
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:63
112
+ #: dist/includes/admin/class-wppr-global-settings.php:63
113
+ #: includes/admin/class-wppr-global-settings.php:63
114
  msgid "Rating colors"
115
  msgstr ""
116
 
117
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:64
118
+ #: dist/includes/admin/class-wppr-global-settings.php:64
119
+ #: includes/admin/class-wppr-global-settings.php:64
120
  msgid "Typography"
121
  msgstr ""
122
 
123
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:65
124
+ #: dist/includes/admin/class-wppr-global-settings.php:65
125
+ #: includes/admin/class-wppr-global-settings.php:65
126
  msgid "Buy button"
127
  msgstr ""
128
 
129
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:74
130
+ #: dist/includes/admin/class-wppr-global-settings.php:74
131
+ #: includes/admin/class-wppr-global-settings.php:74
132
  msgid "Position of the review box"
133
  msgstr ""
134
 
135
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:78
136
+ #: dist/includes/admin/class-wppr-global-settings.php:78
137
+ #: includes/admin/class-wppr-global-settings.php:78
 
 
 
 
138
  msgid "After content"
139
  msgstr ""
140
 
141
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:79
142
+ #: dist/includes/admin/class-wppr-global-settings.php:79
143
+ #: includes/admin/class-wppr-global-settings.php:79
144
  msgid "Before content"
145
  msgstr ""
146
 
147
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:80
148
+ #: dist/includes/admin/class-wppr-global-settings.php:80
149
+ #: includes/admin/class-wppr-global-settings.php:80
150
  msgid "Manually placed"
151
  msgstr ""
152
 
153
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:86
154
+ #: dist/includes/admin/class-wppr-global-settings.php:86
155
+ #: includes/admin/class-wppr-global-settings.php:86
156
  msgid "Show review comment"
157
  msgstr ""
158
 
159
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:87
160
+ #: dist/includes/admin/class-wppr-global-settings.php:87
161
+ #: includes/admin/class-wppr-global-settings.php:87
162
  msgid "Activate comment review user"
163
  msgstr ""
164
 
165
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:90
166
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:146
167
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:157
168
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:168
169
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:179
170
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:190
171
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:32
172
+ #: dist/includes/admin/class-wppr-global-settings.php:90
173
+ #: dist/includes/admin/class-wppr-global-settings.php:146
174
+ #: dist/includes/admin/class-wppr-global-settings.php:157
175
+ #: dist/includes/admin/class-wppr-global-settings.php:168
176
+ #: dist/includes/admin/class-wppr-global-settings.php:179
177
+ #: dist/includes/admin/class-wppr-global-settings.php:190
178
+ #: dist/includes/admin/layouts/editor-default-tpl.php:32
179
+ #: includes/admin/class-wppr-global-settings.php:90
180
+ #: includes/admin/class-wppr-global-settings.php:146
181
+ #: includes/admin/class-wppr-global-settings.php:157
182
+ #: includes/admin/class-wppr-global-settings.php:168
183
+ #: includes/admin/class-wppr-global-settings.php:179
184
+ #: includes/admin/class-wppr-global-settings.php:190
185
  #: includes/admin/layouts/editor-default-tpl.php:32
186
  msgid "Yes"
187
  msgstr ""
188
 
189
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:91
190
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:147
191
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:158
192
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:169
193
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:180
194
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:191
195
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:44
196
+ #: dist/includes/admin/class-wppr-global-settings.php:91
197
+ #: dist/includes/admin/class-wppr-global-settings.php:147
198
+ #: dist/includes/admin/class-wppr-global-settings.php:158
199
+ #: dist/includes/admin/class-wppr-global-settings.php:169
200
+ #: dist/includes/admin/class-wppr-global-settings.php:180
201
+ #: dist/includes/admin/class-wppr-global-settings.php:191
202
+ #: dist/includes/admin/layouts/editor-default-tpl.php:44
203
+ #: includes/admin/class-wppr-global-settings.php:91
204
+ #: includes/admin/class-wppr-global-settings.php:147
205
+ #: includes/admin/class-wppr-global-settings.php:158
206
+ #: includes/admin/class-wppr-global-settings.php:169
207
+ #: includes/admin/class-wppr-global-settings.php:180
208
+ #: includes/admin/class-wppr-global-settings.php:191
209
  #: includes/admin/layouts/editor-default-tpl.php:44
210
  msgid "No"
211
  msgstr ""
212
 
213
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:98
214
+ #: dist/includes/admin/class-wppr-global-settings.php:98
215
+ #: includes/admin/class-wppr-global-settings.php:98
216
  msgid "Visitor Review Influence"
217
  msgstr ""
218
 
219
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:99
220
+ #: dist/includes/admin/class-wppr-global-settings.php:99
221
+ #: includes/admin/class-wppr-global-settings.php:99
222
  msgid "Select how much visitors rating will affect the main one"
223
  msgstr ""
224
 
225
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:118
226
+ #: dist/includes/admin/class-wppr-global-settings.php:118
227
+ #: includes/admin/class-wppr-global-settings.php:118
228
  msgid "Number of options/pros/cons"
229
  msgstr ""
230
 
231
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:119
232
+ #: dist/includes/admin/class-wppr-global-settings.php:119
233
+ #: includes/admin/class-wppr-global-settings.php:119
234
  msgid "You can select the default number of options / pros/ cons (3-10)"
235
  msgstr ""
236
 
237
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:135
238
+ #: dist/includes/admin/class-wppr-global-settings.php:135
239
+ #: includes/admin/class-wppr-global-settings.php:135
240
  msgid "Content width"
241
  msgstr ""
242
 
243
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:136
244
+ #: dist/includes/admin/class-wppr-global-settings.php:136
245
+ #: includes/admin/class-wppr-global-settings.php:136
246
  msgid ""
247
  "Write your content width in pixels in this format : 600 if you want to "
248
  "limit the review box width."
249
  msgstr ""
250
 
251
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:142
252
+ #: dist/includes/admin/class-wppr-global-settings.php:142
253
+ #: includes/admin/class-wppr-global-settings.php:142
254
  msgid "Disable Lighbox images"
255
  msgstr ""
256
 
257
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:143
258
+ #: dist/includes/admin/class-wppr-global-settings.php:143
259
+ #: includes/admin/class-wppr-global-settings.php:143
260
  msgid "Disable lightbox effect on product images (increase loading speed)"
261
  msgstr ""
262
 
263
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:153
264
+ #: dist/includes/admin/class-wppr-global-settings.php:153
265
+ #: includes/admin/class-wppr-global-settings.php:153
266
  msgid "Disable Font Awesome"
267
  msgstr ""
268
 
269
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:154
270
+ #: dist/includes/admin/class-wppr-global-settings.php:154
271
+ #: includes/admin/class-wppr-global-settings.php:154
272
  msgid ""
273
  "Disable Font Awesome for websites that already are including it (increase "
274
  "loading speed)"
275
  msgstr ""
276
 
277
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:164
278
+ #: dist/includes/admin/class-wppr-global-settings.php:164
279
+ #: includes/admin/class-wppr-global-settings.php:164
280
  msgid "Enable Rich Snippets"
281
  msgstr ""
282
 
283
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:165
284
+ #: dist/includes/admin/class-wppr-global-settings.php:165
285
+ #: includes/admin/class-wppr-global-settings.php:165
286
  msgid "Enable rich snippets on the product page."
287
  msgstr ""
288
 
289
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:175
290
+ #: dist/includes/admin/class-wppr-global-settings.php:175
291
  #: includes/admin/class-wppr-global-settings.php:175
292
+ msgid "Enable review post type"
293
+ msgstr ""
294
+
295
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:176
296
+ msgid "Enabling this will create a new post type where you can manage your reviews."
297
+ msgstr ""
298
+
299
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:186
300
+ #: dist/includes/admin/class-wppr-global-settings.php:186
301
+ #: includes/admin/class-wppr-global-settings.php:186
302
+ msgid "Enable AMP CSS."
303
+ msgstr ""
304
+
305
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:187
306
+ #: dist/includes/admin/class-wppr-global-settings.php:187
307
+ #: includes/admin/class-wppr-global-settings.php:187
308
+ msgid "Enabling this will result in including custom CSS for AMP."
309
+ msgstr ""
310
+
311
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:199
312
+ #: dist/includes/admin/class-wppr-global-settings.php:199
313
+ #: includes/admin/class-wppr-global-settings.php:199
314
  msgid "Rating options default color"
315
  msgstr ""
316
 
317
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:200
318
+ #: dist/includes/admin/class-wppr-global-settings.php:200
319
+ #: includes/admin/class-wppr-global-settings.php:200
320
  msgid "Select the color to be used by default on rating."
321
  msgstr ""
322
 
323
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:206
324
+ #: dist/includes/admin/class-wppr-global-settings.php:206
325
+ #: includes/admin/class-wppr-global-settings.php:206
326
  msgid "Rating chart default color"
327
  msgstr ""
328
 
329
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:207
330
+ #: dist/includes/admin/class-wppr-global-settings.php:207
331
+ #: includes/admin/class-wppr-global-settings.php:207
332
  msgid "Select the color to be used by default on rating chart."
333
  msgstr ""
334
 
335
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:213
336
+ #: dist/includes/admin/class-wppr-global-settings.php:213
337
+ #: includes/admin/class-wppr-global-settings.php:213
338
  msgid "Weak rating"
339
  msgstr ""
340
 
341
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:214
342
+ #: dist/includes/admin/class-wppr-global-settings.php:214
343
+ #: includes/admin/class-wppr-global-settings.php:214
344
  msgid "Select the color to be used when the rating is weak. ( < 2.5)"
345
  msgstr ""
346
 
347
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:220
348
+ #: dist/includes/admin/class-wppr-global-settings.php:220
349
+ #: includes/admin/class-wppr-global-settings.php:220
350
  msgid "Not bad rating"
351
  msgstr ""
352
 
353
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:221
354
+ #: dist/includes/admin/class-wppr-global-settings.php:221
355
+ #: includes/admin/class-wppr-global-settings.php:221
356
  msgid "Select the color to be used when the rating is not bad. ( > 2.5 and < 5)"
357
  msgstr ""
358
 
359
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:227
360
+ #: dist/includes/admin/class-wppr-global-settings.php:227
361
+ #: includes/admin/class-wppr-global-settings.php:227
362
  msgid "Good rating"
363
  msgstr ""
364
 
365
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:228
366
+ #: dist/includes/admin/class-wppr-global-settings.php:228
367
+ #: includes/admin/class-wppr-global-settings.php:228
368
  msgid "Select the color to be used when the rating is good. ( >5 and <7.5)"
369
  msgstr ""
370
 
371
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:234
372
+ #: dist/includes/admin/class-wppr-global-settings.php:234
373
+ #: includes/admin/class-wppr-global-settings.php:234
374
  msgid "Very good rating"
375
  msgstr ""
376
 
377
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:235
378
+ #: dist/includes/admin/class-wppr-global-settings.php:235
379
+ #: includes/admin/class-wppr-global-settings.php:235
380
  msgid "Select the color to be used when the rating is very good. ( 7.5 < and <10)"
381
  msgstr ""
382
 
383
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:244
384
+ #: dist/includes/admin/class-wppr-global-settings.php:244
385
+ #: includes/admin/class-wppr-global-settings.php:244
386
  msgid "Font color"
387
  msgstr ""
388
 
389
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:245
390
+ #: dist/includes/admin/class-wppr-global-settings.php:245
391
+ #: includes/admin/class-wppr-global-settings.php:245
392
  msgid "Select the color to be used on the font."
393
  msgstr ""
394
 
395
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:251
396
+ #: dist/includes/admin/class-wppr-global-settings.php:251
397
+ #: includes/admin/class-wppr-global-settings.php:251
398
  msgid "Pros text color"
399
  msgstr ""
400
 
401
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:252
402
+ #: dist/includes/admin/class-wppr-global-settings.php:252
403
+ #: includes/admin/class-wppr-global-settings.php:252
404
  msgid "Select the color to be used on the 'Pros' text."
405
  msgstr ""
406
 
407
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:258
408
+ #: dist/includes/admin/class-wppr-global-settings.php:258
409
+ #: includes/admin/class-wppr-global-settings.php:258
410
  msgid "Cons text color"
411
  msgstr ""
412
 
413
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:259
414
+ #: dist/includes/admin/class-wppr-global-settings.php:259
415
+ #: includes/admin/class-wppr-global-settings.php:259
416
  msgid "Select the color to be used on the Cons text."
417
  msgstr ""
418
 
419
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:265
420
+ #: dist/includes/admin/class-wppr-global-settings.php:265
421
+ #: includes/admin/class-wppr-global-settings.php:265
422
  msgid "Pros text"
423
  msgstr ""
424
 
425
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:266
426
+ #: dist/includes/admin/class-wppr-global-settings.php:266
427
+ #: includes/admin/class-wppr-global-settings.php:266
428
  msgid "Specify text for pros heading"
429
  msgstr ""
430
 
431
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:272
432
+ #: dist/includes/admin/class-wppr-global-settings.php:272
433
+ #: includes/admin/class-wppr-global-settings.php:272
434
  msgid "Cons text"
435
  msgstr ""
436
 
437
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:273
438
+ #: dist/includes/admin/class-wppr-global-settings.php:273
439
+ #: includes/admin/class-wppr-global-settings.php:273
440
  msgid "Specify text for cons heading"
441
  msgstr ""
442
 
443
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:279
444
+ #: dist/includes/admin/class-wppr-global-settings.php:279
445
+ #: includes/admin/class-wppr-global-settings.php:279
446
  msgid "Review box border"
447
  msgstr ""
448
 
449
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:280
450
+ #: dist/includes/admin/class-wppr-global-settings.php:280
451
+ #: includes/admin/class-wppr-global-settings.php:280
452
  msgid "Select the border color to be used on the review box"
453
  msgstr ""
454
 
455
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:286
456
+ #: dist/includes/admin/class-wppr-global-settings.php:286
457
+ #: includes/admin/class-wppr-global-settings.php:286
458
  msgid "Review box border width"
459
  msgstr ""
460
 
461
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:287
462
+ #: dist/includes/admin/class-wppr-global-settings.php:287
463
+ #: includes/admin/class-wppr-global-settings.php:287
464
  msgid "Select the width in pixels of the top border of the review box"
465
  msgstr ""
466
 
467
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:295
468
+ #: dist/includes/admin/class-wppr-global-settings.php:295
469
+ #: includes/admin/class-wppr-global-settings.php:295
470
  msgid "Show button icon"
471
  msgstr ""
472
 
473
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:296
474
+ #: dist/includes/admin/class-wppr-global-settings.php:296
475
+ #: includes/admin/class-wppr-global-settings.php:296
476
  msgid "Show icon on the cart icon on button."
477
  msgstr ""
478
 
479
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:306
480
+ #: dist/includes/admin/class-wppr-global-settings.php:306
481
+ #: includes/admin/class-wppr-global-settings.php:306
482
  msgid "Button border"
483
  msgstr ""
484
 
485
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:307
486
+ #: dist/includes/admin/class-wppr-global-settings.php:307
487
+ #: includes/admin/class-wppr-global-settings.php:307
488
  msgid "Select the border color to be used on the buy button for the default state"
489
  msgstr ""
490
 
491
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:313
492
+ #: dist/includes/admin/class-wppr-global-settings.php:313
493
+ #: includes/admin/class-wppr-global-settings.php:313
494
  msgid "Button border hover"
495
  msgstr ""
496
 
497
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:314
498
+ #: dist/includes/admin/class-wppr-global-settings.php:314
499
+ #: includes/admin/class-wppr-global-settings.php:314
500
  msgid "Select the border color to be used on the buy button for the hover state"
501
  msgstr ""
502
 
503
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:320
504
+ #: dist/includes/admin/class-wppr-global-settings.php:320
505
+ #: includes/admin/class-wppr-global-settings.php:320
506
  msgid "Button background"
507
  msgstr ""
508
 
509
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:321
510
+ #: dist/includes/admin/class-wppr-global-settings.php:321
511
+ #: includes/admin/class-wppr-global-settings.php:321
512
  msgid ""
513
  "Select the background color to be used on the buy button for the default "
514
  "state"
515
  msgstr ""
516
 
517
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:327
518
+ #: dist/includes/admin/class-wppr-global-settings.php:327
519
+ #: includes/admin/class-wppr-global-settings.php:327
520
  msgid "Button background hover"
521
  msgstr ""
522
 
523
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:328
524
+ #: dist/includes/admin/class-wppr-global-settings.php:328
525
+ #: includes/admin/class-wppr-global-settings.php:328
526
  msgid ""
527
  "Select the background color to be used on the buy button for the hover "
528
  "state"
529
  msgstr ""
530
 
531
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:334
532
+ #: dist/includes/admin/class-wppr-global-settings.php:334
533
+ #: includes/admin/class-wppr-global-settings.php:334
534
  msgid "Button text color"
535
  msgstr ""
536
 
537
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:335
538
+ #: dist/includes/admin/class-wppr-global-settings.php:335
539
+ #: includes/admin/class-wppr-global-settings.php:335
540
  msgid "Select the text color to be used on the buy button for the default state"
541
  msgstr ""
542
 
543
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:341
544
+ #: dist/includes/admin/class-wppr-global-settings.php:341
545
+ #: includes/admin/class-wppr-global-settings.php:341
546
  msgid "Button text color hover"
547
  msgstr ""
548
 
549
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:342
550
+ #: dist/includes/admin/class-wppr-global-settings.php:342
551
+ #: includes/admin/class-wppr-global-settings.php:342
552
  msgid "Select the text color to be used on the buy button for the hover state"
553
  msgstr ""
554
 
555
+ #: dist/dist/includes/admin/class-wppr-global-settings.php:384
556
+ #: dist/includes/admin/class-wppr-global-settings.php:384
557
+ #: includes/admin/class-wppr-global-settings.php:384
558
  msgid "We see %s active, so user feedback is disabled"
559
  msgstr ""
560
 
561
+ #: dist/dist/includes/admin/helpers/class-wppr-html-fields.php:122
562
+ #: dist/includes/admin/helpers/class-wppr-html-fields.php:122
563
  #: includes/admin/helpers/class-wppr-html-fields.php:122
564
  msgid "Choose image"
565
  msgstr ""
566
 
567
+ #: dist/dist/includes/admin/helpers/class-wppr-html-fields.php:224
568
+ #: dist/includes/admin/helpers/class-wppr-html-fields.php:224
569
  #: includes/admin/helpers/class-wppr-html-fields.php:224
570
  msgid ". Use Default Styling"
571
  msgstr ""
572
 
573
+ #: dist/dist/includes/admin/helpers/class-wppr-html-fields.php:227
574
+ #: dist/includes/admin/helpers/class-wppr-html-fields.php:227
575
  #: includes/admin/helpers/class-wppr-html-fields.php:227
576
  msgid "* Currently set to the default styling"
577
  msgstr ""
578
 
579
+ #: dist/dist/includes/admin/helpers/class-wppr-html-fields.php:238
580
+ #: dist/includes/admin/helpers/class-wppr-html-fields.php:238
581
  #: includes/admin/helpers/class-wppr-html-fields.php:238
582
  msgid ""
583
  "You need the PRO <a style=\"color:red;\" href=\"http://bit.ly/2bhylar\" "
584
  "target=\"_blank\" >add-on</a> in order to change the review icons."
585
  msgstr ""
586
 
587
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:20
588
+ #: dist/includes/admin/layouts/editor-default-tpl.php:20
589
  #: includes/admin/layouts/editor-default-tpl.php:20
590
  msgid "Is this a review post ?"
591
  msgstr ""
592
 
593
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:51
594
+ #: dist/includes/admin/layouts/editor-default-tpl.php:51
595
  #: includes/admin/layouts/editor-default-tpl.php:51
596
  msgid "Product Details"
597
  msgstr ""
598
 
599
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:52
600
+ #: dist/includes/admin/layouts/editor-default-tpl.php:52
601
  #: includes/admin/layouts/editor-default-tpl.php:52
602
  msgid "Specify the general details for the reviewed product."
603
  msgstr ""
604
 
605
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:61
606
+ #: dist/includes/admin/layouts/editor-default-tpl.php:61
607
  #: includes/admin/layouts/editor-default-tpl.php:61
608
  msgid "Template"
609
  msgstr ""
610
 
611
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:101
612
+ #: dist/includes/admin/layouts/editor-default-tpl.php:101
613
+ #: includes/admin/layouts/editor-default-tpl.php:101
614
  msgid ""
615
  "You will need the %1$spremium%2$s version to use the extra review "
616
  "templates. You can checkout this %3$sdemo%4$s to see how they are looking."
617
  msgstr ""
618
 
619
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:107
620
+ #: dist/includes/admin/layouts/editor-default-tpl.php:107
621
+ #: includes/admin/layouts/editor-default-tpl.php:107
622
  msgid "Product Name"
623
  msgstr ""
624
 
625
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:113
626
+ #: dist/includes/admin/layouts/editor-default-tpl.php:113
627
+ #: includes/admin/layouts/editor-default-tpl.php:113
628
  msgid "Product name"
629
  msgstr ""
630
 
631
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:119
632
+ #: dist/includes/admin/layouts/editor-default-tpl.php:119
633
+ #: includes/admin/layouts/editor-default-tpl.php:119
634
  msgid "Product Image"
635
  msgstr ""
636
 
637
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:125
638
+ #: dist/includes/admin/layouts/editor-default-tpl.php:125
639
+ #: includes/admin/layouts/editor-default-tpl.php:125
640
  msgid "Choose or Upload an Image"
641
  msgstr ""
642
 
643
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:130
644
+ #: dist/includes/admin/layouts/editor-default-tpl.php:130
645
+ #: includes/admin/layouts/editor-default-tpl.php:130
646
  msgid "The optimum size of the product image must be 600 x 600 px"
647
  msgstr ""
648
 
649
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:133
650
+ #: dist/includes/admin/layouts/editor-default-tpl.php:133
651
+ #: includes/admin/layouts/editor-default-tpl.php:133
652
  msgid "If no image is provided, featured image is used"
653
  msgstr ""
654
 
655
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:137
656
+ #: dist/includes/admin/layouts/editor-default-tpl.php:137
657
+ #: includes/admin/layouts/editor-default-tpl.php:137
658
  msgid "Product Image Click"
659
  msgstr ""
660
 
661
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:150
662
+ #: dist/includes/admin/layouts/editor-default-tpl.php:150
663
+ #: includes/admin/layouts/editor-default-tpl.php:150
664
  msgid "Show Whole Image"
665
  msgstr ""
666
 
667
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:162
668
+ #: dist/includes/admin/layouts/editor-default-tpl.php:162
669
+ #: includes/admin/layouts/editor-default-tpl.php:162
670
  msgid "Open Affiliate link"
671
  msgstr ""
672
 
673
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:169
674
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:175
675
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:199
676
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:205
677
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:233
678
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:239
679
+ #: dist/includes/admin/layouts/editor-default-tpl.php:169
680
+ #: dist/includes/admin/layouts/editor-default-tpl.php:175
681
+ #: dist/includes/admin/layouts/editor-default-tpl.php:199
682
+ #: dist/includes/admin/layouts/editor-default-tpl.php:205
683
+ #: dist/includes/admin/layouts/editor-default-tpl.php:233
684
+ #: dist/includes/admin/layouts/editor-default-tpl.php:239
685
  #: includes/admin/layouts/editor-default-tpl.php:169
686
  #: includes/admin/layouts/editor-default-tpl.php:175
687
  #: includes/admin/layouts/editor-default-tpl.php:199
688
  #: includes/admin/layouts/editor-default-tpl.php:205
689
  #: includes/admin/layouts/editor-default-tpl.php:233
690
  #: includes/admin/layouts/editor-default-tpl.php:239
691
+ msgid "Affiliate Button Text"
692
  msgstr ""
693
 
694
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:181
695
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:187
696
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:211
697
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:217
698
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:245
699
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:251
700
+ #: dist/includes/admin/layouts/editor-default-tpl.php:181
701
+ #: dist/includes/admin/layouts/editor-default-tpl.php:187
702
+ #: dist/includes/admin/layouts/editor-default-tpl.php:211
703
+ #: dist/includes/admin/layouts/editor-default-tpl.php:217
704
+ #: dist/includes/admin/layouts/editor-default-tpl.php:245
705
+ #: dist/includes/admin/layouts/editor-default-tpl.php:251
706
  #: includes/admin/layouts/editor-default-tpl.php:181
707
+ #: includes/admin/layouts/editor-default-tpl.php:187
708
+ #: includes/admin/layouts/editor-default-tpl.php:211
709
+ #: includes/admin/layouts/editor-default-tpl.php:217
710
+ #: includes/admin/layouts/editor-default-tpl.php:245
711
+ #: includes/admin/layouts/editor-default-tpl.php:251
712
+ msgid "Affiliate Link"
713
  msgstr ""
714
 
715
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:193
716
+ #: dist/includes/admin/layouts/editor-default-tpl.php:193
717
+ #: includes/admin/layouts/editor-default-tpl.php:193
718
+ msgid "Add new link"
719
  msgstr ""
720
 
721
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:282
722
+ #: dist/includes/admin/layouts/editor-default-tpl.php:282
723
+ #: includes/admin/layouts/editor-default-tpl.php:282
724
  msgid "Product Options"
725
  msgstr ""
726
 
727
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:283
728
+ #: dist/includes/admin/layouts/editor-default-tpl.php:283
729
+ #: includes/admin/layouts/editor-default-tpl.php:283
730
  msgid "Insert your options and their grades. Grading must be done from 0 to 100."
731
  msgstr ""
732
 
733
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:288
734
+ #: dist/includes/admin/layouts/editor-default-tpl.php:288
735
+ #: includes/admin/layouts/editor-default-tpl.php:288
736
  msgid "Preload Info"
737
  msgstr ""
738
 
739
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:291
740
+ #: dist/includes/admin/layouts/editor-default-tpl.php:291
741
+ #: includes/admin/layouts/editor-default-tpl.php:291
742
  msgid ""
743
  " In order to be able to automatically load your options from another posts, "
744
  "you need the "
745
  msgstr ""
746
 
747
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:291
748
+ #: dist/includes/admin/layouts/editor-default-tpl.php:291
749
+ #: includes/admin/layouts/editor-default-tpl.php:291
750
  msgid "PRO add-on"
751
  msgstr ""
752
 
753
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:311
754
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:353
755
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:384
756
+ #: dist/includes/admin/layouts/editor-default-tpl.php:311
757
+ #: dist/includes/admin/layouts/editor-default-tpl.php:353
758
+ #: dist/includes/admin/layouts/editor-default-tpl.php:384
759
+ #: includes/admin/layouts/editor-default-tpl.php:311
760
+ #: includes/admin/layouts/editor-default-tpl.php:353
761
+ #: includes/admin/layouts/editor-default-tpl.php:384
762
  msgid "Option"
763
  msgstr ""
764
 
765
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:320
766
+ #: dist/includes/admin/layouts/editor-default-tpl.php:320
767
+ #: includes/admin/layouts/editor-default-tpl.php:320
768
  msgid "Grade"
769
  msgstr ""
770
 
771
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:334
772
+ #: dist/includes/admin/layouts/editor-default-tpl.php:334
773
+ #: includes/admin/layouts/editor-default-tpl.php:334
774
  msgid "Pro Features"
775
  msgstr ""
776
 
777
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:335
778
+ #: dist/includes/admin/layouts/editor-default-tpl.php:335
779
+ #: includes/admin/layouts/editor-default-tpl.php:335
780
  msgid "Insert product's pro features below."
781
  msgstr ""
782
 
783
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:366
784
+ #: dist/includes/admin/layouts/editor-default-tpl.php:366
785
+ #: includes/admin/layouts/editor-default-tpl.php:366
786
  msgid "Cons Features"
787
  msgstr ""
788
 
789
+ #: dist/dist/includes/admin/layouts/editor-default-tpl.php:367
790
+ #: dist/includes/admin/layouts/editor-default-tpl.php:367
791
+ #: includes/admin/layouts/editor-default-tpl.php:367
792
  msgid "Insert product's cons features below."
793
  msgstr ""
794
 
795
+ #: dist/dist/includes/admin/layouts/settings-tpl.php:64
796
+ #: dist/includes/admin/layouts/settings-tpl.php:64
797
+ #: includes/admin/layouts/settings-tpl.php:64
798
  msgid "Save All Changes"
799
  msgstr ""
800
 
801
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:15
802
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:15
803
  #: includes/admin/layouts/widget-admin-tpl.php:15
804
  msgid "Title:"
805
  msgstr ""
806
 
807
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:19
808
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:19
809
  #: includes/admin/layouts/widget-admin-tpl.php:19
810
  msgid "Number of posts to show:"
811
  msgstr ""
812
 
813
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:23
814
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:23
815
  #: includes/admin/layouts/widget-admin-tpl.php:23
816
  msgid "Post Types:"
817
  msgstr ""
818
 
819
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:37
820
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:37
821
  #: includes/admin/layouts/widget-admin-tpl.php:37
822
  msgid "Category:"
823
  msgstr ""
824
 
825
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:72
826
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:72
827
  #: includes/admin/layouts/widget-admin-tpl.php:72
828
  msgid "Timespan (weeks):"
829
  msgstr ""
830
 
831
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:76
832
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:76
833
  #: includes/admin/layouts/widget-admin-tpl.php:76
834
  msgid "Posts published between %s%d%s and %s%d%s week(s) ago"
835
  msgstr ""
836
 
837
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:84
838
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:84
839
  #: includes/admin/layouts/widget-admin-tpl.php:84
840
  msgid "Layout:"
841
  msgstr ""
842
 
843
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:108
844
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:108
845
  #: includes/admin/layouts/widget-admin-tpl.php:108
846
  msgid "Buy Now text:"
847
  msgstr ""
848
 
849
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:113
850
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:113
851
  #: includes/admin/layouts/widget-admin-tpl.php:113
852
  msgid "Read Review text:"
853
  msgstr ""
854
 
855
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:117
856
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:117
857
  #: includes/admin/layouts/widget-admin-tpl.php:117
858
  msgid "Display Product Titles :"
859
  msgstr ""
860
 
861
+ #: dist/dist/includes/admin/layouts/widget-admin-tpl.php:121
862
+ #: dist/includes/admin/layouts/widget-admin-tpl.php:121
863
  #: includes/admin/layouts/widget-admin-tpl.php:121
864
  msgid "Display Product Image :"
865
  msgstr ""
866
 
867
+ #: dist/dist/includes/admin/models/class-wppr-editor-model.php:268
868
+ #: dist/includes/admin/models/class-wppr-editor-model.php:268
869
  #: includes/admin/models/class-wppr-editor-model.php:268
870
  msgid "Add a product image to the review"
871
  msgstr ""
872
 
873
+ #: dist/dist/includes/admin/models/class-wppr-editor-model.php:269
874
+ #: dist/includes/admin/models/class-wppr-editor-model.php:269
875
  #: includes/admin/models/class-wppr-editor-model.php:269
876
  msgid "Attach the image"
877
  msgstr ""
878
 
879
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:82
880
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:145
881
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:82
882
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:145
883
  #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:82
884
+ #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:145
885
  msgid "Buy Now"
886
  msgstr ""
887
 
888
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:85
889
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:149
890
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:85
891
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:149
892
  #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:85
893
+ #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:149
894
  msgid "Read Review"
895
  msgstr ""
896
 
897
+ #: dist/dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:133
898
+ #: dist/includes/admin/widgets/abstract/class-wppr-widget-abstract.php:133
899
+ #: includes/admin/widgets/abstract/class-wppr-widget-abstract.php:133
900
  msgid "Select Category"
901
  msgstr ""
902
 
903
+ #: dist/dist/includes/admin/widgets/class-wppr-latest-products-widget.php:26
904
+ #: dist/includes/admin/widgets/class-wppr-latest-products-widget.php:26
905
  #: includes/admin/widgets/class-wppr-latest-products-widget.php:26
906
  msgid "Latest Products Widget"
907
  msgstr ""
908
 
909
+ #: dist/dist/includes/admin/widgets/class-wppr-latest-products-widget.php:28
910
+ #: dist/includes/admin/widgets/class-wppr-latest-products-widget.php:28
911
  #: includes/admin/widgets/class-wppr-latest-products-widget.php:28
912
  msgid "This widget displays the latest products based on their rating."
913
  msgstr ""
914
 
915
+ #: dist/dist/includes/admin/widgets/class-wppr-latest-products-widget.php:107
916
+ #: dist/includes/admin/widgets/class-wppr-latest-products-widget.php:107
917
+ #: includes/admin/widgets/class-wppr-latest-products-widget.php:107
918
  msgid "Latest Products"
919
  msgstr ""
920
 
921
+ #: dist/dist/includes/admin/widgets/class-wppr-top-products-widget.php:26
922
+ #: dist/includes/admin/widgets/class-wppr-top-products-widget.php:26
923
  #: includes/admin/widgets/class-wppr-top-products-widget.php:26
924
  msgid "Top Products Widget"
925
  msgstr ""
926
 
927
+ #: dist/dist/includes/admin/widgets/class-wppr-top-products-widget.php:28
928
+ #: dist/includes/admin/widgets/class-wppr-top-products-widget.php:28
929
  #: includes/admin/widgets/class-wppr-top-products-widget.php:28
930
  msgid "This widget displays the top products based on their rating."
931
  msgstr ""
932
 
933
+ #: dist/dist/includes/admin/widgets/class-wppr-top-products-widget.php:133
934
+ #: dist/includes/admin/widgets/class-wppr-top-products-widget.php:133
935
+ #: includes/admin/widgets/class-wppr-top-products-widget.php:133
936
  msgid "Top Products"
937
  msgstr ""
938
 
939
+ #: dist/dist/includes/class-wppr.php:238 dist/includes/class-wppr.php:238
940
+ #: includes/class-wppr.php:238
941
+ msgid "Add New Review"
942
+ msgstr ""
943
+
944
+ #: dist/dist/includes/class-wppr.php:239 dist/includes/class-wppr.php:239
945
+ #: includes/class-wppr.php:239
946
+ msgid "New Review"
947
+ msgstr ""
948
+
949
+ #: dist/dist/includes/class-wppr.php:240 dist/includes/class-wppr.php:240
950
+ #: includes/class-wppr.php:240
951
+ msgid "Edit Review"
952
+ msgstr ""
953
+
954
+ #: dist/dist/includes/class-wppr.php:241 dist/includes/class-wppr.php:241
955
+ #: includes/class-wppr.php:241
956
+ msgid "View Review"
957
+ msgstr ""
958
+
959
+ #: dist/dist/includes/class-wppr.php:242 dist/includes/class-wppr.php:242
960
+ #: includes/class-wppr.php:242
961
+ msgid "All Reviews"
962
+ msgstr ""
963
+
964
+ #: dist/dist/includes/class-wppr.php:243 dist/includes/class-wppr.php:243
965
+ #: includes/class-wppr.php:243
966
+ msgid "Search Reviews"
967
+ msgstr ""
968
+
969
+ #: dist/dist/includes/class-wppr.php:244 dist/includes/class-wppr.php:244
970
+ #: includes/class-wppr.php:244
971
+ msgid "Parent Review:"
972
+ msgstr ""
973
+
974
+ #: dist/dist/includes/class-wppr.php:245 dist/includes/class-wppr.php:245
975
+ #: includes/class-wppr.php:245
976
+ msgid "No review found."
977
+ msgstr ""
978
+
979
+ #: dist/dist/includes/class-wppr.php:246 dist/includes/class-wppr.php:246
980
+ #: includes/class-wppr.php:246
981
+ msgid "No reviews found in Trash."
982
+ msgstr ""
983
+
984
+ #: dist/dist/includes/class-wppr.php:250 dist/includes/class-wppr.php:250
985
+ #: includes/class-wppr.php:250
986
+ msgid "Reviews from WP Product Review"
987
+ msgstr ""
988
+
989
+ #: dist/dist/includes/class-wppr.php:276 dist/dist/includes/class-wppr.php:277
990
+ #: dist/includes/class-wppr.php:275 dist/includes/class-wppr.php:276
991
+ #: includes/class-wppr.php:275 includes/class-wppr.php:276
992
+ msgid "Review Category"
993
+ msgstr ""
994
+
995
+ #: dist/dist/includes/class-wppr.php:278 dist/includes/class-wppr.php:277
996
+ #: includes/class-wppr.php:277
997
+ msgid "Search Review Categories"
998
+ msgstr ""
999
+
1000
+ #: dist/dist/includes/class-wppr.php:279 dist/includes/class-wppr.php:278
1001
+ #: includes/class-wppr.php:278
1002
+ msgid "All Review Categories"
1003
+ msgstr ""
1004
+
1005
+ #: dist/dist/includes/class-wppr.php:280 dist/dist/includes/class-wppr.php:281
1006
+ #: dist/includes/class-wppr.php:279 dist/includes/class-wppr.php:280
1007
+ #: includes/class-wppr.php:279 includes/class-wppr.php:280
1008
+ msgid "Parent Review Category"
1009
+ msgstr ""
1010
+
1011
+ #: dist/dist/includes/class-wppr.php:282 dist/includes/class-wppr.php:281
1012
+ #: includes/class-wppr.php:281
1013
+ msgid "Edit Review Category"
1014
+ msgstr ""
1015
+
1016
+ #: dist/dist/includes/class-wppr.php:283 dist/includes/class-wppr.php:282
1017
+ #: includes/class-wppr.php:282
1018
+ msgid "Update Review Category"
1019
+ msgstr ""
1020
+
1021
+ #: dist/dist/includes/class-wppr.php:284 dist/includes/class-wppr.php:283
1022
+ #: includes/class-wppr.php:283
1023
+ msgid "Add New Review Category"
1024
+ msgstr ""
1025
+
1026
+ #: dist/dist/includes/class-wppr.php:285 dist/includes/class-wppr.php:284
1027
+ #: includes/class-wppr.php:284
1028
+ msgid "New Review Category"
1029
+ msgstr ""
1030
+
1031
+ #: dist/dist/includes/class-wppr.php:286 dist/includes/class-wppr.php:285
1032
+ #: includes/class-wppr.php:285
1033
+ msgid "Review Categories"
1034
+ msgstr ""
1035
+
1036
+ #: dist/dist/includes/functions.php:72 dist/includes/functions.php:71
1037
+ #: includes/functions.php:71
1038
  msgid "'s rating"
1039
  msgstr ""
1040
 
1041
+ #: dist/dist/includes/public/layouts/style2.php:63
1042
  msgid "Users score:"
1043
  msgstr ""
1044
 
1045
+ #: dist/dist/includes/public/layouts/style2.php:65
1046
  msgid "votes"
1047
  msgstr ""
1048
 
1049
+ #: dist/includes/admin/class-wppr-global-settings.php:176
1050
+ #: includes/admin/class-wppr-global-settings.php:176
1051
+ msgid ""
1052
+ "Enabling this will create a new post type where you can manage your "
1053
+ "reviews. Refresh the page on saving changes to see the \"Reviews\" menu on "
1054
+ "the left."
1055
+ msgstr ""
1056
+
1057
+ #: dist/includes/public/layouts/style2.php:64
1058
+ #: includes/public/layouts/style2.php:64
1059
+ msgid "Users score: %1$d with %2$d votes"
1060
+ msgstr ""
1061
+
1062
  #. Plugin Name of the plugin/theme
1063
  msgid "WP Product Review Lite"
1064
  msgstr ""
1079
 
1080
  #. Author URI of the plugin/theme
1081
  msgid "https://themeisle.com/"
1082
+ msgstr ""
1083
+
1084
+ #: dist/dist/includes/class-wppr.php:233 dist/includes/class-wppr.php:233
1085
+ #: includes/class-wppr.php:233
1086
+ msgctxt "post type general name"
1087
+ msgid "Reviews"
1088
+ msgstr ""
1089
+
1090
+ #: dist/dist/includes/class-wppr.php:234 dist/includes/class-wppr.php:234
1091
+ #: includes/class-wppr.php:234
1092
+ msgctxt "post type singular name"
1093
+ msgid "Review"
1094
+ msgstr ""
1095
+
1096
+ #: dist/dist/includes/class-wppr.php:235 dist/includes/class-wppr.php:235
1097
+ #: includes/class-wppr.php:235
1098
+ msgctxt "admin menu"
1099
+ msgid "Reviews"
1100
+ msgstr ""
1101
+
1102
+ #: dist/dist/includes/class-wppr.php:236 dist/includes/class-wppr.php:236
1103
+ #: includes/class-wppr.php:236
1104
+ msgctxt "add new on admin bar"
1105
+ msgid "Review"
1106
+ msgstr ""
1107
+
1108
+ #: dist/dist/includes/class-wppr.php:237 dist/includes/class-wppr.php:237
1109
+ #: includes/class-wppr.php:237
1110
+ msgctxt "review"
1111
+ msgid "Add New"
1112
  msgstr ""
package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "wp-product-review",
3
- "version": "3.4.10",
4
  "lockfileVersion": 1,
5
  "requires": true,
6
  "dependencies": {
@@ -11,9 +11,9 @@
11
  "dev": true
12
  },
13
  "ajv": {
14
- "version": "6.6.1",
15
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.1.tgz",
16
- "integrity": "sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==",
17
  "dev": true,
18
  "requires": {
19
  "fast-deep-equal": "2.0.1",
@@ -69,7 +69,7 @@
69
  },
70
  "archiver": {
71
  "version": "1.3.0",
72
- "resolved": "http://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
73
  "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
74
  "dev": true,
75
  "requires": {
@@ -207,7 +207,7 @@
207
  },
208
  "async": {
209
  "version": "1.5.2",
210
- "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
211
  "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
212
  "dev": true
213
  },
@@ -231,7 +231,7 @@
231
  "dev": true,
232
  "requires": {
233
  "browserslist": "1.7.7",
234
- "caniuse-db": "1.0.30000916",
235
  "normalize-range": "0.1.2",
236
  "num2fraction": "1.2.2",
237
  "postcss": "5.2.18",
@@ -279,7 +279,7 @@
279
  },
280
  "bin-build": {
281
  "version": "2.2.0",
282
- "resolved": "http://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz",
283
  "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=",
284
  "dev": true,
285
  "optional": true,
@@ -288,7 +288,7 @@
288
  "decompress": "3.0.0",
289
  "download": "4.4.3",
290
  "exec-series": "1.0.3",
291
- "rimraf": "2.6.2",
292
  "tempfile": "1.1.1",
293
  "url-regex": "3.2.0"
294
  }
@@ -305,7 +305,7 @@
305
  },
306
  "bin-version": {
307
  "version": "1.0.4",
308
- "resolved": "http://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz",
309
  "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=",
310
  "dev": true,
311
  "optional": true,
@@ -315,7 +315,7 @@
315
  },
316
  "bin-version-check": {
317
  "version": "2.1.0",
318
- "resolved": "http://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz",
319
  "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=",
320
  "dev": true,
321
  "optional": true,
@@ -328,7 +328,7 @@
328
  "dependencies": {
329
  "semver": {
330
  "version": "4.3.6",
331
- "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
332
  "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
333
  "dev": true,
334
  "optional": true
@@ -337,7 +337,7 @@
337
  },
338
  "bin-wrapper": {
339
  "version": "3.0.2",
340
- "resolved": "http://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz",
341
  "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=",
342
  "dev": true,
343
  "optional": true,
@@ -352,7 +352,7 @@
352
  },
353
  "bl": {
354
  "version": "1.2.2",
355
- "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
356
  "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
357
  "dev": true,
358
  "requires": {
@@ -409,8 +409,8 @@
409
  "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
410
  "dev": true,
411
  "requires": {
412
- "caniuse-db": "1.0.30000916",
413
- "electron-to-chromium": "1.3.88"
414
  }
415
  },
416
  "buffer": {
@@ -471,18 +471,12 @@
471
  "dependencies": {
472
  "uuid": {
473
  "version": "2.0.3",
474
- "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
475
  "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
476
  "dev": true
477
  }
478
  }
479
  },
480
- "builtin-modules": {
481
- "version": "1.1.1",
482
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
483
- "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
484
- "dev": true
485
- },
486
  "bytes": {
487
  "version": "1.0.0",
488
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
@@ -490,44 +484,15 @@
490
  "dev": true
491
  },
492
  "cache-swap": {
493
- "version": "0.0.6",
494
- "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.0.6.tgz",
495
- "integrity": "sha1-F834NebDAf0VgJCwPRzDb0Z7FpU=",
496
  "dev": true,
497
  "requires": {
498
- "async": "0.2.10",
499
- "lodash": "1.1.1",
500
- "rimraf": "2.1.4"
501
- },
502
- "dependencies": {
503
- "async": {
504
- "version": "0.2.10",
505
- "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz",
506
- "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
507
- "dev": true
508
- },
509
- "graceful-fs": {
510
- "version": "1.2.3",
511
- "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
512
- "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
513
- "dev": true,
514
- "optional": true
515
- },
516
- "lodash": {
517
- "version": "1.1.1",
518
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.1.1.tgz",
519
- "integrity": "sha1-QaKy6aAOZNbRmZ8UP/awdV9ruyQ=",
520
- "dev": true
521
- },
522
- "rimraf": {
523
- "version": "2.1.4",
524
- "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz",
525
- "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=",
526
- "dev": true,
527
- "requires": {
528
- "graceful-fs": "1.2.3"
529
- }
530
- }
531
  }
532
  },
533
  "camelcase": {
@@ -538,7 +503,7 @@
538
  },
539
  "camelcase-keys": {
540
  "version": "2.1.0",
541
- "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
542
  "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
543
  "dev": true,
544
  "requires": {
@@ -547,9 +512,9 @@
547
  }
548
  },
549
  "caniuse-db": {
550
- "version": "1.0.30000916",
551
- "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000916.tgz",
552
- "integrity": "sha512-XuMzGxlFYXDEm+e/6ti7ThqQki/hRXHw4aaFMQXtFHYoj2XNn92zZ5aH75AADfQ1tnXoZTOvS2+NbaaWWPypIw==",
553
  "dev": true
554
  },
555
  "capture-stack-trace": {
@@ -591,9 +556,9 @@
591
  }
592
  },
593
  "chalk": {
594
- "version": "2.4.1",
595
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
596
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
597
  "dev": true,
598
  "requires": {
599
  "ansi-styles": "3.2.1",
@@ -627,7 +592,7 @@
627
  },
628
  "chalk": {
629
  "version": "1.1.3",
630
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
631
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
632
  "dev": true,
633
  "optional": true,
@@ -737,7 +702,7 @@
737
  },
738
  "colors": {
739
  "version": "1.1.2",
740
- "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
741
  "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
742
  "dev": true
743
  },
@@ -752,7 +717,7 @@
752
  },
753
  "commander": {
754
  "version": "2.8.1",
755
- "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
756
  "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
757
  "dev": true,
758
  "requires": {
@@ -869,7 +834,7 @@
869
  "coffee-script": "1.12.7",
870
  "cson-parser": "1.3.5",
871
  "extract-opts": "3.3.1",
872
- "requirefresh": "2.1.0",
873
  "safefs": "4.1.0"
874
  },
875
  "dependencies": {
@@ -883,7 +848,7 @@
883
  },
884
  "cson-parser": {
885
  "version": "1.3.5",
886
- "resolved": "http://registry.npmjs.org/cson-parser/-/cson-parser-1.3.5.tgz",
887
  "integrity": "sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ=",
888
  "dev": true,
889
  "requires": {
@@ -918,7 +883,7 @@
918
  "dependencies": {
919
  "commander": {
920
  "version": "2.0.0",
921
- "resolved": "http://registry.npmjs.org/commander/-/commander-2.0.0.tgz",
922
  "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=",
923
  "dev": true
924
  }
@@ -968,13 +933,6 @@
968
  "array-find-index": "1.0.2"
969
  }
970
  },
971
- "cycle": {
972
- "version": "1.0.3",
973
- "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
974
- "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
975
- "dev": true,
976
- "optional": true
977
- },
978
  "dashdash": {
979
  "version": "1.14.1",
980
  "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -1010,13 +968,12 @@
1010
  }
1011
  },
1012
  "debug": {
1013
- "version": "2.6.9",
1014
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1015
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1016
  "dev": true,
1017
- "optional": true,
1018
  "requires": {
1019
- "ms": "2.0.0"
1020
  }
1021
  },
1022
  "decamelize": {
@@ -1220,9 +1177,9 @@
1220
  "optional": true
1221
  },
1222
  "diff": {
1223
- "version": "2.2.3",
1224
- "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz",
1225
- "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=",
1226
  "dev": true
1227
  },
1228
  "dom-serializer": {
@@ -1237,7 +1194,7 @@
1237
  "dependencies": {
1238
  "domelementtype": {
1239
  "version": "1.1.3",
1240
- "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1241
  "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1242
  "dev": true
1243
  },
@@ -1307,9 +1264,9 @@
1307
  }
1308
  },
1309
  "duplexify": {
1310
- "version": "3.6.1",
1311
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
1312
- "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
1313
  "dev": true,
1314
  "requires": {
1315
  "end-of-stream": "1.4.1",
@@ -1335,7 +1292,7 @@
1335
  "dev": true,
1336
  "requires": {
1337
  "editions": "1.3.4",
1338
- "typechecker": "4.6.0"
1339
  }
1340
  },
1341
  "ecc-jsbn": {
@@ -1355,9 +1312,9 @@
1355
  "dev": true
1356
  },
1357
  "electron-to-chromium": {
1358
- "version": "1.3.88",
1359
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz",
1360
- "integrity": "sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A==",
1361
  "dev": true
1362
  },
1363
  "encoding": {
@@ -1380,17 +1337,29 @@
1380
  },
1381
  "entities": {
1382
  "version": "1.0.0",
1383
- "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
1384
  "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
1385
  "dev": true
1386
  },
1387
  "errlop": {
1388
- "version": "1.0.3",
1389
- "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.0.3.tgz",
1390
- "integrity": "sha512-5VTnt0yikY4LlQEfCXVSqfE6oLj1HVM4zVSvAKMnoYjL/zrb6nqiLowZS4XlG7xENfyj7lpYWvT+wfSCr6dtlA==",
1391
  "dev": true,
1392
  "requires": {
1393
- "editions": "1.3.4"
 
 
 
 
 
 
 
 
 
 
 
 
1394
  }
1395
  },
1396
  "error": {
@@ -1412,13 +1381,6 @@
1412
  "is-arrayish": "0.2.1"
1413
  }
1414
  },
1415
- "es6-promise": {
1416
- "version": "4.2.5",
1417
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
1418
- "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
1419
- "dev": true,
1420
- "optional": true
1421
- },
1422
  "escape-string-regexp": {
1423
  "version": "1.0.5",
1424
  "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@@ -1433,7 +1395,7 @@
1433
  },
1434
  "eventemitter2": {
1435
  "version": "0.4.14",
1436
- "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
1437
  "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
1438
  "dev": true
1439
  },
@@ -1444,7 +1406,7 @@
1444
  "dev": true,
1445
  "optional": true,
1446
  "requires": {
1447
- "rimraf": "2.6.2",
1448
  "tempfile": "1.1.1"
1449
  }
1450
  },
@@ -1486,7 +1448,7 @@
1486
  },
1487
  "expand-range": {
1488
  "version": "1.8.2",
1489
- "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
1490
  "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
1491
  "dev": true,
1492
  "requires": {
@@ -1540,42 +1502,7 @@
1540
  "requires": {
1541
  "eachr": "3.2.0",
1542
  "editions": "1.3.4",
1543
- "typechecker": "4.6.0"
1544
- }
1545
- },
1546
- "extract-zip": {
1547
- "version": "1.6.7",
1548
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
1549
- "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
1550
- "dev": true,
1551
- "optional": true,
1552
- "requires": {
1553
- "concat-stream": "1.6.2",
1554
- "debug": "2.6.9",
1555
- "mkdirp": "0.5.1",
1556
- "yauzl": "2.4.1"
1557
- },
1558
- "dependencies": {
1559
- "fd-slicer": {
1560
- "version": "1.0.1",
1561
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
1562
- "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
1563
- "dev": true,
1564
- "optional": true,
1565
- "requires": {
1566
- "pend": "1.2.0"
1567
- }
1568
- },
1569
- "yauzl": {
1570
- "version": "2.4.1",
1571
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
1572
- "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
1573
- "dev": true,
1574
- "optional": true,
1575
- "requires": {
1576
- "fd-slicer": "1.0.1"
1577
- }
1578
- }
1579
  }
1580
  },
1581
  "extsprintf": {
@@ -1584,13 +1511,6 @@
1584
  "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
1585
  "dev": true
1586
  },
1587
- "eyes": {
1588
- "version": "0.1.8",
1589
- "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
1590
- "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
1591
- "dev": true,
1592
- "optional": true
1593
- },
1594
  "fancy-log": {
1595
  "version": "1.3.3",
1596
  "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
@@ -1599,7 +1519,7 @@
1599
  "requires": {
1600
  "ansi-gray": "0.1.1",
1601
  "color-support": "1.1.3",
1602
- "parse-node-version": "1.0.0",
1603
  "time-stamp": "1.1.0"
1604
  }
1605
  },
@@ -1651,7 +1571,7 @@
1651
  },
1652
  "file-type": {
1653
  "version": "3.9.0",
1654
- "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
1655
  "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
1656
  "dev": true
1657
  },
@@ -1703,7 +1623,7 @@
1703
  },
1704
  "find-versions": {
1705
  "version": "1.2.1",
1706
- "resolved": "http://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz",
1707
  "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=",
1708
  "dev": true,
1709
  "optional": true,
@@ -1782,18 +1702,6 @@
1782
  "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
1783
  "dev": true
1784
  },
1785
- "fs-extra": {
1786
- "version": "1.0.0",
1787
- "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
1788
- "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
1789
- "dev": true,
1790
- "optional": true,
1791
- "requires": {
1792
- "graceful-fs": "4.1.15",
1793
- "jsonfile": "2.4.0",
1794
- "klaw": "1.3.1"
1795
- }
1796
- },
1797
  "fs.realpath": {
1798
  "version": "1.0.0",
1799
  "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -1809,7 +1717,7 @@
1809
  "graceful-fs": "4.1.15",
1810
  "inherits": "2.0.3",
1811
  "mkdirp": "0.5.1",
1812
- "rimraf": "2.6.2"
1813
  }
1814
  },
1815
  "gauge": {
@@ -1869,7 +1777,7 @@
1869
  },
1870
  "gettext-parser": {
1871
  "version": "1.1.2",
1872
- "resolved": "http://registry.npmjs.org/gettext-parser/-/gettext-parser-1.1.2.tgz",
1873
  "integrity": "sha1-zw8MnJCJrtsO5RSZKRg+ncQ1hKc=",
1874
  "dev": true,
1875
  "requires": {
@@ -1878,7 +1786,7 @@
1878
  },
1879
  "gifsicle": {
1880
  "version": "3.0.4",
1881
- "resolved": "http://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz",
1882
  "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=",
1883
  "dev": true,
1884
  "optional": true,
@@ -1968,7 +1876,7 @@
1968
  "ordered-read-streams": "0.3.0",
1969
  "through2": "0.6.5",
1970
  "to-absolute-glob": "0.1.1",
1971
- "unique-stream": "2.2.1"
1972
  },
1973
  "dependencies": {
1974
  "glob": {
@@ -2014,9 +1922,9 @@
2014
  }
2015
  },
2016
  "glogg": {
2017
- "version": "1.0.1",
2018
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
2019
- "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
2020
  "dev": true,
2021
  "requires": {
2022
  "sparkles": "1.0.1"
@@ -2030,7 +1938,7 @@
2030
  },
2031
  "got": {
2032
  "version": "5.7.1",
2033
- "resolved": "http://registry.npmjs.org/got/-/got-5.7.1.tgz",
2034
  "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
2035
  "dev": true,
2036
  "requires": {
@@ -2085,12 +1993,12 @@
2085
  "mkdirp": "0.5.1",
2086
  "nopt": "3.0.6",
2087
  "path-is-absolute": "1.0.1",
2088
- "rimraf": "2.6.2"
2089
  },
2090
  "dependencies": {
2091
  "grunt-cli": {
2092
  "version": "1.2.0",
2093
- "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
2094
  "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
2095
  "dev": true,
2096
  "requires": {
@@ -2099,6 +2007,12 @@
2099
  "nopt": "3.0.6",
2100
  "resolve": "1.1.7"
2101
  }
 
 
 
 
 
 
2102
  }
2103
  }
2104
  },
@@ -2126,7 +2040,7 @@
2126
  },
2127
  "chalk": {
2128
  "version": "0.2.1",
2129
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
2130
  "integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=",
2131
  "dev": true,
2132
  "requires": {
@@ -2158,7 +2072,7 @@
2158
  },
2159
  "chalk": {
2160
  "version": "1.1.3",
2161
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2162
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2163
  "dev": true,
2164
  "requires": {
@@ -2195,7 +2109,7 @@
2195
  },
2196
  "chalk": {
2197
  "version": "1.1.3",
2198
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2199
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2200
  "dev": true,
2201
  "requires": {
@@ -2216,7 +2130,7 @@
2216
  },
2217
  "grunt-contrib-imagemin": {
2218
  "version": "1.0.1",
2219
- "resolved": "http://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz",
2220
  "integrity": "sha1-5Ho1YTN29MqpwfkERlA8rhyUTXk=",
2221
  "dev": true,
2222
  "requires": {
@@ -2235,7 +2149,7 @@
2235
  },
2236
  "chalk": {
2237
  "version": "1.1.3",
2238
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2239
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2240
  "dev": true,
2241
  "requires": {
@@ -2248,7 +2162,7 @@
2248
  },
2249
  "pretty-bytes": {
2250
  "version": "3.0.1",
2251
- "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
2252
  "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
2253
  "dev": true,
2254
  "requires": {
@@ -2265,13 +2179,13 @@
2265
  },
2266
  "grunt-contrib-jshint": {
2267
  "version": "1.1.0",
2268
- "resolved": "http://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz",
2269
  "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=",
2270
  "dev": true,
2271
  "requires": {
2272
  "chalk": "1.1.3",
2273
  "hooker": "0.2.3",
2274
- "jshint": "2.9.6"
2275
  },
2276
  "dependencies": {
2277
  "ansi-styles": {
@@ -2282,7 +2196,7 @@
2282
  },
2283
  "chalk": {
2284
  "version": "1.1.3",
2285
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2286
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2287
  "dev": true,
2288
  "requires": {
@@ -2354,7 +2268,7 @@
2354
  "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
2355
  "dev": true,
2356
  "requires": {
2357
- "chalk": "2.4.1",
2358
  "lodash": "4.17.11"
2359
  }
2360
  },
@@ -2386,7 +2300,7 @@
2386
  "dev": true,
2387
  "requires": {
2388
  "async": "1.5.2",
2389
- "rimraf": "2.6.2"
2390
  }
2391
  },
2392
  "grunt-phpcbf": {
@@ -2402,12 +2316,12 @@
2402
  "dev": true
2403
  },
2404
  "grunt-phplint": {
2405
- "version": "0.0.8",
2406
- "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.0.8.tgz",
2407
- "integrity": "sha1-wSeqKP930jnBSgHwUMx7cVnOkMA=",
2408
  "dev": true,
2409
  "requires": {
2410
- "cache-swap": "0.0.6",
2411
  "grunt": "0.4.5"
2412
  },
2413
  "dependencies": {
@@ -2423,7 +2337,7 @@
2423
  "dependencies": {
2424
  "underscore.string": {
2425
  "version": "2.4.0",
2426
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
2427
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
2428
  "dev": true
2429
  }
@@ -2431,7 +2345,7 @@
2431
  },
2432
  "async": {
2433
  "version": "0.1.22",
2434
- "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz",
2435
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
2436
  "dev": true
2437
  },
@@ -2443,7 +2357,7 @@
2443
  },
2444
  "colors": {
2445
  "version": "0.6.2",
2446
- "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
2447
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
2448
  "dev": true
2449
  },
@@ -2481,7 +2395,7 @@
2481
  },
2482
  "lodash": {
2483
  "version": "2.4.2",
2484
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2485
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2486
  "dev": true
2487
  },
@@ -2518,13 +2432,13 @@
2518
  },
2519
  "graceful-fs": {
2520
  "version": "1.2.3",
2521
- "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
2522
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
2523
  "dev": true
2524
  },
2525
  "grunt": {
2526
  "version": "0.4.5",
2527
- "resolved": "http://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
2528
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
2529
  "dev": true,
2530
  "requires": {
@@ -2565,13 +2479,13 @@
2565
  "dependencies": {
2566
  "lodash": {
2567
  "version": "2.4.2",
2568
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2569
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2570
  "dev": true
2571
  },
2572
  "underscore.string": {
2573
  "version": "2.3.3",
2574
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2575
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2576
  "dev": true
2577
  }
@@ -2590,13 +2504,13 @@
2590
  "dependencies": {
2591
  "lodash": {
2592
  "version": "2.4.2",
2593
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2594
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2595
  "dev": true
2596
  },
2597
  "underscore.string": {
2598
  "version": "2.3.3",
2599
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2600
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2601
  "dev": true
2602
  }
@@ -2619,7 +2533,7 @@
2619
  },
2620
  "iconv-lite": {
2621
  "version": "0.2.11",
2622
- "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
2623
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
2624
  "dev": true
2625
  },
@@ -2635,7 +2549,7 @@
2635
  },
2636
  "lodash": {
2637
  "version": "0.9.2",
2638
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
2639
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
2640
  "dev": true
2641
  },
@@ -2660,13 +2574,13 @@
2660
  },
2661
  "rimraf": {
2662
  "version": "2.2.8",
2663
- "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2664
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2665
  "dev": true
2666
  },
2667
  "underscore.string": {
2668
  "version": "2.2.1",
2669
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
2670
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
2671
  "dev": true
2672
  },
@@ -2685,7 +2599,7 @@
2685
  "dev": true
2686
  },
2687
  "grunt-plugin-fleet": {
2688
- "version": "github:codeinwp/grunt-plugin-fleet#6b1d2f7ba79d618ef88df683d20e84e04accea07",
2689
  "dev": true,
2690
  "requires": {
2691
  "autoprefixer": "6.7.7",
@@ -2701,9 +2615,9 @@
2701
  "grunt-newer": "1.3.0",
2702
  "grunt-phpcbf": "0.1.1",
2703
  "grunt-phpcs": "0.4.0",
2704
- "grunt-phplint": "0.0.8",
2705
  "grunt-phpunit": "0.3.6",
2706
- "grunt-postcss": "0.8.0",
2707
  "grunt-rsync": "2.0.1",
2708
  "grunt-sync": "0.6.2",
2709
  "grunt-text-replace": "0.4.0",
@@ -2726,7 +2640,7 @@
2726
  "dependencies": {
2727
  "underscore.string": {
2728
  "version": "2.4.0",
2729
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
2730
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
2731
  "dev": true
2732
  }
@@ -2734,7 +2648,7 @@
2734
  },
2735
  "async": {
2736
  "version": "0.1.22",
2737
- "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz",
2738
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
2739
  "dev": true
2740
  },
@@ -2746,7 +2660,7 @@
2746
  },
2747
  "colors": {
2748
  "version": "0.6.2",
2749
- "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
2750
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
2751
  "dev": true
2752
  },
@@ -2784,7 +2698,7 @@
2784
  },
2785
  "lodash": {
2786
  "version": "2.4.2",
2787
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2788
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2789
  "dev": true
2790
  },
@@ -2821,13 +2735,13 @@
2821
  },
2822
  "graceful-fs": {
2823
  "version": "1.2.3",
2824
- "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
2825
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
2826
  "dev": true
2827
  },
2828
  "grunt": {
2829
  "version": "0.4.5",
2830
- "resolved": "http://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
2831
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
2832
  "dev": true,
2833
  "requires": {
@@ -2868,13 +2782,13 @@
2868
  "dependencies": {
2869
  "lodash": {
2870
  "version": "2.4.2",
2871
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2872
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2873
  "dev": true
2874
  },
2875
  "underscore.string": {
2876
  "version": "2.3.3",
2877
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2878
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2879
  "dev": true
2880
  }
@@ -2893,13 +2807,13 @@
2893
  "dependencies": {
2894
  "lodash": {
2895
  "version": "2.4.2",
2896
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2897
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2898
  "dev": true
2899
  },
2900
  "underscore.string": {
2901
  "version": "2.3.3",
2902
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2903
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2904
  "dev": true
2905
  }
@@ -2922,7 +2836,7 @@
2922
  },
2923
  "iconv-lite": {
2924
  "version": "0.2.11",
2925
- "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
2926
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
2927
  "dev": true
2928
  },
@@ -2938,7 +2852,7 @@
2938
  },
2939
  "lodash": {
2940
  "version": "0.9.2",
2941
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
2942
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
2943
  "dev": true
2944
  },
@@ -2963,13 +2877,13 @@
2963
  },
2964
  "rimraf": {
2965
  "version": "2.2.8",
2966
- "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2967
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2968
  "dev": true
2969
  },
2970
  "underscore.string": {
2971
  "version": "2.2.1",
2972
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
2973
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
2974
  "dev": true
2975
  },
@@ -2982,39 +2896,31 @@
2982
  }
2983
  },
2984
  "grunt-postcss": {
2985
- "version": "0.8.0",
2986
- "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.8.0.tgz",
2987
- "integrity": "sha1-jzCor2B5A84MRfAfC+QsYOMc6w4=",
2988
  "dev": true,
2989
  "requires": {
2990
- "chalk": "1.1.3",
2991
- "diff": "2.2.3",
2992
- "postcss": "5.2.18"
2993
  },
2994
  "dependencies": {
2995
- "ansi-styles": {
2996
- "version": "2.2.1",
2997
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
2998
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
2999
- "dev": true
3000
- },
3001
- "chalk": {
3002
- "version": "1.1.3",
3003
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3004
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3005
  "dev": true,
3006
  "requires": {
3007
- "ansi-styles": "2.2.1",
3008
- "escape-string-regexp": "1.0.5",
3009
- "has-ansi": "2.0.0",
3010
- "strip-ansi": "3.0.1",
3011
- "supports-color": "2.0.0"
3012
  }
3013
  },
3014
- "supports-color": {
3015
- "version": "2.0.0",
3016
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3017
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3018
  "dev": true
3019
  }
3020
  }
@@ -3058,7 +2964,7 @@
3058
  "dependencies": {
3059
  "semver": {
3060
  "version": "4.3.6",
3061
- "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
3062
  "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
3063
  "dev": true
3064
  }
@@ -3100,13 +3006,13 @@
3100
  "dependencies": {
3101
  "underscore": {
3102
  "version": "1.7.0",
3103
- "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
3104
  "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
3105
  "dev": true
3106
  },
3107
  "underscore.string": {
3108
  "version": "2.4.0",
3109
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
3110
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
3111
  "dev": true
3112
  }
@@ -3114,7 +3020,7 @@
3114
  },
3115
  "async": {
3116
  "version": "0.9.2",
3117
- "resolved": "http://registry.npmjs.org/async/-/async-0.9.2.tgz",
3118
  "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
3119
  "dev": true
3120
  },
@@ -3126,7 +3032,7 @@
3126
  },
3127
  "colors": {
3128
  "version": "0.6.2",
3129
- "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
3130
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
3131
  "dev": true
3132
  },
@@ -3164,7 +3070,7 @@
3164
  },
3165
  "lodash": {
3166
  "version": "2.4.2",
3167
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3168
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3169
  "dev": true
3170
  },
@@ -3201,13 +3107,13 @@
3201
  },
3202
  "graceful-fs": {
3203
  "version": "1.2.3",
3204
- "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
3205
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
3206
  "dev": true
3207
  },
3208
  "grunt": {
3209
  "version": "0.4.5",
3210
- "resolved": "http://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
3211
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
3212
  "dev": true,
3213
  "requires": {
@@ -3235,13 +3141,13 @@
3235
  "dependencies": {
3236
  "async": {
3237
  "version": "0.1.22",
3238
- "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz",
3239
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
3240
  "dev": true
3241
  },
3242
  "underscore.string": {
3243
  "version": "2.2.1",
3244
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
3245
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
3246
  "dev": true
3247
  }
@@ -3262,13 +3168,13 @@
3262
  "dependencies": {
3263
  "lodash": {
3264
  "version": "2.4.2",
3265
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3266
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3267
  "dev": true
3268
  },
3269
  "underscore.string": {
3270
  "version": "2.3.3",
3271
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
3272
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
3273
  "dev": true
3274
  }
@@ -3287,13 +3193,13 @@
3287
  "dependencies": {
3288
  "lodash": {
3289
  "version": "2.4.2",
3290
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3291
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3292
  "dev": true
3293
  },
3294
  "underscore.string": {
3295
  "version": "2.3.3",
3296
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
3297
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
3298
  "dev": true
3299
  }
@@ -3316,13 +3222,13 @@
3316
  "dependencies": {
3317
  "async": {
3318
  "version": "0.1.22",
3319
- "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz",
3320
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
3321
  "dev": true
3322
  },
3323
  "underscore.string": {
3324
  "version": "2.2.1",
3325
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
3326
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
3327
  "dev": true
3328
  }
@@ -3330,7 +3236,7 @@
3330
  },
3331
  "iconv-lite": {
3332
  "version": "0.2.11",
3333
- "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
3334
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
3335
  "dev": true
3336
  },
@@ -3346,7 +3252,7 @@
3346
  },
3347
  "lodash": {
3348
  "version": "0.9.2",
3349
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
3350
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
3351
  "dev": true
3352
  },
@@ -3371,19 +3277,19 @@
3371
  },
3372
  "rimraf": {
3373
  "version": "2.2.8",
3374
- "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
3375
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
3376
  "dev": true
3377
  },
3378
  "underscore": {
3379
  "version": "1.8.3",
3380
- "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
3381
  "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
3382
  "dev": true
3383
  },
3384
  "underscore.string": {
3385
  "version": "3.0.3",
3386
- "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-3.0.3.tgz",
3387
  "integrity": "sha1-Rhe4waJQz25QZPu7Nj0PqWzxRVI=",
3388
  "dev": true
3389
  },
@@ -3478,7 +3384,7 @@
3478
  },
3479
  "chalk": {
3480
  "version": "1.1.3",
3481
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3482
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3483
  "dev": true,
3484
  "requires": {
@@ -3536,7 +3442,7 @@
3536
  "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
3537
  "dev": true,
3538
  "requires": {
3539
- "glogg": "1.0.1"
3540
  }
3541
  },
3542
  "har-schema": {
@@ -3551,7 +3457,7 @@
3551
  "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
3552
  "dev": true,
3553
  "requires": {
3554
- "ajv": "6.6.1",
3555
  "har-schema": "2.0.0"
3556
  }
3557
  },
@@ -3591,17 +3497,6 @@
3591
  "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
3592
  "dev": true
3593
  },
3594
- "hasha": {
3595
- "version": "2.2.0",
3596
- "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
3597
- "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
3598
- "dev": true,
3599
- "optional": true,
3600
- "requires": {
3601
- "is-stream": "1.1.0",
3602
- "pinkie-promise": "2.0.1"
3603
- }
3604
- },
3605
  "hooker": {
3606
  "version": "0.2.3",
3607
  "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
@@ -3616,7 +3511,7 @@
3616
  },
3617
  "htmlparser2": {
3618
  "version": "3.8.3",
3619
- "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
3620
  "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
3621
  "dev": true,
3622
  "requires": {
@@ -3635,7 +3530,7 @@
3635
  },
3636
  "readable-stream": {
3637
  "version": "1.1.14",
3638
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
3639
  "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
3640
  "dev": true,
3641
  "requires": {
@@ -3647,7 +3542,7 @@
3647
  },
3648
  "string_decoder": {
3649
  "version": "0.10.31",
3650
- "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
3651
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
3652
  "dev": true
3653
  }
@@ -3667,7 +3562,7 @@
3667
  "requires": {
3668
  "assert-plus": "1.0.0",
3669
  "jsprim": "1.4.1",
3670
- "sshpk": "1.15.2"
3671
  }
3672
  },
3673
  "iconv-lite": {
@@ -3693,14 +3588,14 @@
3693
  "optional": true,
3694
  "requires": {
3695
  "detect-libc": "0.2.0",
3696
- "nan": "2.11.1",
3697
  "node-gyp": "3.8.0",
3698
  "prebuild-install": "2.5.3"
3699
  }
3700
  },
3701
  "imagemin": {
3702
  "version": "4.0.0",
3703
- "resolved": "http://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz",
3704
  "integrity": "sha1-6Q5/CTaDZZXxj6Ff6Qb0+iWeqEc=",
3705
  "dev": true,
3706
  "requires": {
@@ -3718,7 +3613,7 @@
3718
  },
3719
  "imagemin-gifsicle": {
3720
  "version": "4.2.0",
3721
- "resolved": "http://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz",
3722
  "integrity": "sha1-D++butNHbmt2iFc2zFsLh6CHV8o=",
3723
  "dev": true,
3724
  "optional": true,
@@ -3730,7 +3625,7 @@
3730
  },
3731
  "imagemin-jpegtran": {
3732
  "version": "4.3.2",
3733
- "resolved": "http://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz",
3734
  "integrity": "sha1-G8bR4r0T/bZNJFUm1jWn5d/rEvw=",
3735
  "dev": true,
3736
  "optional": true,
@@ -3755,7 +3650,7 @@
3755
  },
3756
  "imagemin-optipng": {
3757
  "version": "4.3.0",
3758
- "resolved": "http://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz",
3759
  "integrity": "sha1-dgRmOrLuMVczJ0cm/Rw3TStErbY=",
3760
  "dev": true,
3761
  "optional": true,
@@ -3856,15 +3751,6 @@
3856
  "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3857
  "dev": true
3858
  },
3859
- "is-builtin-module": {
3860
- "version": "1.0.0",
3861
- "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
3862
- "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
3863
- "dev": true,
3864
- "requires": {
3865
- "builtin-modules": "1.1.1"
3866
- }
3867
- },
3868
  "is-bzip2": {
3869
  "version": "1.0.0",
3870
  "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz",
@@ -3918,7 +3804,7 @@
3918
  },
3919
  "is-gif": {
3920
  "version": "1.0.0",
3921
- "resolved": "http://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz",
3922
  "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=",
3923
  "dev": true,
3924
  "optional": true
@@ -3962,7 +3848,7 @@
3962
  },
3963
  "is-obj": {
3964
  "version": "1.0.1",
3965
- "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
3966
  "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
3967
  "dev": true
3968
  },
@@ -4087,7 +3973,7 @@
4087
  },
4088
  "jpegtran-bin": {
4089
  "version": "3.2.0",
4090
- "resolved": "http://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz",
4091
  "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=",
4092
  "dev": true,
4093
  "optional": true,
@@ -4098,9 +3984,9 @@
4098
  }
4099
  },
4100
  "js-base64": {
4101
- "version": "2.4.9",
4102
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
4103
- "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
4104
  "dev": true
4105
  },
4106
  "js-yaml": {
@@ -4120,9 +4006,9 @@
4120
  "dev": true
4121
  },
4122
  "jshint": {
4123
- "version": "2.9.6",
4124
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz",
4125
- "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==",
4126
  "dev": true,
4127
  "requires": {
4128
  "cli": "1.0.1",
@@ -4131,11 +4017,8 @@
4131
  "htmlparser2": "3.8.3",
4132
  "lodash": "4.17.11",
4133
  "minimatch": "3.0.4",
4134
- "phantom": "4.0.12",
4135
- "phantomjs-prebuilt": "2.1.16",
4136
  "shelljs": "0.3.0",
4137
- "strip-json-comments": "1.0.4",
4138
- "unicode-5.2.0": "0.7.5"
4139
  },
4140
  "dependencies": {
4141
  "strip-json-comments": {
@@ -4158,14 +4041,11 @@
4158
  "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4159
  "dev": true
4160
  },
4161
- "json-stable-stringify": {
4162
  "version": "1.0.1",
4163
- "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
4164
- "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
4165
- "dev": true,
4166
- "requires": {
4167
- "jsonify": "0.0.0"
4168
- }
4169
  },
4170
  "json-stringify-safe": {
4171
  "version": "5.0.1",
@@ -4173,22 +4053,6 @@
4173
  "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
4174
  "dev": true
4175
  },
4176
- "jsonfile": {
4177
- "version": "2.4.0",
4178
- "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
4179
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
4180
- "dev": true,
4181
- "optional": true,
4182
- "requires": {
4183
- "graceful-fs": "4.1.15"
4184
- }
4185
- },
4186
- "jsonify": {
4187
- "version": "0.0.0",
4188
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
4189
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
4190
- "dev": true
4191
- },
4192
  "jsprim": {
4193
  "version": "1.4.1",
4194
  "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@@ -4201,13 +4065,6 @@
4201
  "verror": "1.10.0"
4202
  }
4203
  },
4204
- "kew": {
4205
- "version": "0.7.0",
4206
- "resolved": "http://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
4207
- "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
4208
- "dev": true,
4209
- "optional": true
4210
- },
4211
  "kind-of": {
4212
  "version": "3.2.2",
4213
  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -4217,19 +4074,9 @@
4217
  "is-buffer": "1.1.6"
4218
  }
4219
  },
4220
- "klaw": {
4221
- "version": "1.3.1",
4222
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
4223
- "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
4224
- "dev": true,
4225
- "optional": true,
4226
- "requires": {
4227
- "graceful-fs": "4.1.15"
4228
- }
4229
- },
4230
  "lazy-req": {
4231
  "version": "1.1.0",
4232
- "resolved": "http://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
4233
  "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
4234
  "dev": true,
4235
  "optional": true
@@ -4289,7 +4136,7 @@
4289
  },
4290
  "lodash": {
4291
  "version": "3.10.1",
4292
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
4293
  "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
4294
  "dev": true
4295
  }
@@ -4308,7 +4155,7 @@
4308
  },
4309
  "load-json-file": {
4310
  "version": "1.1.0",
4311
- "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
4312
  "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
4313
  "dev": true,
4314
  "requires": {
@@ -4332,7 +4179,7 @@
4332
  "dependencies": {
4333
  "lodash": {
4334
  "version": "3.10.1",
4335
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
4336
  "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
4337
  "dev": true
4338
  }
@@ -4518,7 +4365,7 @@
4518
  },
4519
  "lru-cache": {
4520
  "version": "2.7.3",
4521
- "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
4522
  "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
4523
  "dev": true
4524
  },
@@ -4529,9 +4376,9 @@
4529
  "dev": true
4530
  },
4531
  "math-random": {
4532
- "version": "1.0.1",
4533
- "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
4534
- "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
4535
  "dev": true
4536
  },
4537
  "md5-file": {
@@ -4542,7 +4389,7 @@
4542
  },
4543
  "meow": {
4544
  "version": "3.7.0",
4545
- "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
4546
  "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
4547
  "dev": true,
4548
  "requires": {
@@ -4551,7 +4398,7 @@
4551
  "loud-rejection": "1.6.0",
4552
  "map-obj": "1.0.1",
4553
  "minimist": "1.2.0",
4554
- "normalize-package-data": "2.4.0",
4555
  "object-assign": "4.1.1",
4556
  "read-pkg-up": "1.0.1",
4557
  "redent": "1.0.0",
@@ -4638,13 +4485,13 @@
4638
  },
4639
  "minimist": {
4640
  "version": "1.2.0",
4641
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
4642
  "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
4643
  "dev": true
4644
  },
4645
  "mkdirp": {
4646
  "version": "0.5.1",
4647
- "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
4648
  "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
4649
  "dev": true,
4650
  "requires": {
@@ -4653,18 +4500,17 @@
4653
  "dependencies": {
4654
  "minimist": {
4655
  "version": "0.0.8",
4656
- "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
4657
  "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
4658
  "dev": true
4659
  }
4660
  }
4661
  },
4662
  "ms": {
4663
- "version": "2.0.0",
4664
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
4665
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
4666
- "dev": true,
4667
- "optional": true
4668
  },
4669
  "multimatch": {
4670
  "version": "2.1.0",
@@ -4704,7 +4550,7 @@
4704
  },
4705
  "readable-stream": {
4706
  "version": "1.1.14",
4707
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
4708
  "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
4709
  "dev": true,
4710
  "requires": {
@@ -4716,23 +4562,23 @@
4716
  },
4717
  "string_decoder": {
4718
  "version": "0.10.31",
4719
- "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
4720
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
4721
  "dev": true
4722
  }
4723
  }
4724
  },
4725
  "nan": {
4726
- "version": "2.11.1",
4727
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
4728
- "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
4729
  "dev": true,
4730
  "optional": true
4731
  },
4732
  "node-abi": {
4733
- "version": "2.5.0",
4734
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.5.0.tgz",
4735
- "integrity": "sha512-9g2twBGSP6wIR5PW7tXvAWnEWKJDH/VskdXp168xsw9VVxpEGov8K4jsP4/VeoC7b2ZAyzckvMCuQuQlw44lXg==",
4736
  "dev": true,
4737
  "optional": true,
4738
  "requires": {
@@ -4754,7 +4600,7 @@
4754
  "npmlog": "4.1.2",
4755
  "osenv": "0.1.5",
4756
  "request": "2.88.0",
4757
- "rimraf": "2.6.2",
4758
  "semver": "5.3.0",
4759
  "tar": "2.2.1",
4760
  "which": "1.3.1"
@@ -4762,7 +4608,7 @@
4762
  "dependencies": {
4763
  "semver": {
4764
  "version": "5.3.0",
4765
- "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
4766
  "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
4767
  "dev": true,
4768
  "optional": true
@@ -4771,7 +4617,7 @@
4771
  },
4772
  "node-status-codes": {
4773
  "version": "1.0.0",
4774
- "resolved": "http://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
4775
  "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
4776
  "dev": true
4777
  },
@@ -4798,13 +4644,13 @@
4798
  }
4799
  },
4800
  "normalize-package-data": {
4801
- "version": "2.4.0",
4802
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
4803
- "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
4804
  "dev": true,
4805
  "requires": {
4806
  "hosted-git-info": "2.7.1",
4807
- "is-builtin-module": "1.0.0",
4808
  "semver": "5.6.0",
4809
  "validate-npm-package-license": "3.0.4"
4810
  }
@@ -4881,7 +4727,7 @@
4881
  },
4882
  "onetime": {
4883
  "version": "1.1.0",
4884
- "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
4885
  "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
4886
  "dev": true
4887
  },
@@ -4922,13 +4768,13 @@
4922
  },
4923
  "os-homedir": {
4924
  "version": "1.0.2",
4925
- "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
4926
  "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
4927
  "dev": true
4928
  },
4929
  "os-tmpdir": {
4930
  "version": "1.0.2",
4931
- "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
4932
  "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
4933
  "dev": true
4934
  },
@@ -4988,9 +4834,9 @@
4988
  "dev": true
4989
  },
4990
  "parse-node-version": {
4991
- "version": "1.0.0",
4992
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz",
4993
- "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==",
4994
  "dev": true
4995
  },
4996
  "path-dirname": {
@@ -5010,10 +4856,16 @@
5010
  },
5011
  "path-is-absolute": {
5012
  "version": "1.0.1",
5013
- "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
5014
  "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
5015
  "dev": true
5016
  },
 
 
 
 
 
 
5017
  "path-type": {
5018
  "version": "1.1.0",
5019
  "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
@@ -5037,39 +4889,9 @@
5037
  "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
5038
  "dev": true
5039
  },
5040
- "phantom": {
5041
- "version": "4.0.12",
5042
- "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz",
5043
- "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==",
5044
- "dev": true,
5045
- "optional": true,
5046
- "requires": {
5047
- "phantomjs-prebuilt": "2.1.16",
5048
- "split": "1.0.1",
5049
- "winston": "2.4.4"
5050
- }
5051
- },
5052
- "phantomjs-prebuilt": {
5053
- "version": "2.1.16",
5054
- "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
5055
- "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
5056
- "dev": true,
5057
- "optional": true,
5058
- "requires": {
5059
- "es6-promise": "4.2.5",
5060
- "extract-zip": "1.6.7",
5061
- "fs-extra": "1.0.0",
5062
- "hasha": "2.2.0",
5063
- "kew": "0.7.0",
5064
- "progress": "1.1.8",
5065
- "request": "2.88.0",
5066
- "request-progress": "2.0.1",
5067
- "which": "1.3.1"
5068
- }
5069
- },
5070
  "pify": {
5071
  "version": "2.3.0",
5072
- "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
5073
  "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
5074
  "dev": true
5075
  },
@@ -5110,7 +4932,7 @@
5110
  "dev": true,
5111
  "requires": {
5112
  "chalk": "1.1.3",
5113
- "js-base64": "2.4.9",
5114
  "source-map": "0.5.7",
5115
  "supports-color": "3.2.3"
5116
  },
@@ -5123,7 +4945,7 @@
5123
  },
5124
  "chalk": {
5125
  "version": "1.1.3",
5126
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5127
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5128
  "dev": true,
5129
  "requires": {
@@ -5177,7 +4999,7 @@
5177
  "github-from-package": "0.0.0",
5178
  "minimist": "1.2.0",
5179
  "mkdirp": "0.5.1",
5180
- "node-abi": "2.5.0",
5181
  "noop-logger": "0.1.1",
5182
  "npmlog": "4.1.2",
5183
  "os-homedir": "1.0.2",
@@ -5212,13 +5034,13 @@
5212
  },
5213
  "pretty-bytes": {
5214
  "version": "4.0.2",
5215
- "resolved": "http://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
5216
  "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
5217
  "dev": true
5218
  },
5219
  "pretty-ms": {
5220
  "version": "2.1.0",
5221
- "resolved": "http://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz",
5222
  "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=",
5223
  "dev": true,
5224
  "requires": {
@@ -5233,13 +5055,6 @@
5233
  "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
5234
  "dev": true
5235
  },
5236
- "progress": {
5237
- "version": "1.1.8",
5238
- "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
5239
- "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
5240
- "dev": true,
5241
- "optional": true
5242
- },
5243
  "promised-io": {
5244
  "version": "0.3.5",
5245
  "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz",
@@ -5247,9 +5062,9 @@
5247
  "dev": true
5248
  },
5249
  "psl": {
5250
- "version": "1.1.29",
5251
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
5252
- "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
5253
  "dev": true
5254
  },
5255
  "pump": {
@@ -5290,7 +5105,7 @@
5290
  "requires": {
5291
  "is-number": "4.0.0",
5292
  "kind-of": "6.0.2",
5293
- "math-random": "1.0.1"
5294
  },
5295
  "dependencies": {
5296
  "is-number": {
@@ -5319,7 +5134,7 @@
5319
  "dependencies": {
5320
  "string_decoder": {
5321
  "version": "0.10.31",
5322
- "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
5323
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
5324
  "dev": true
5325
  }
@@ -5354,7 +5169,7 @@
5354
  "dev": true,
5355
  "requires": {
5356
  "load-json-file": "1.1.0",
5357
- "normalize-package-data": "2.4.0",
5358
  "path-type": "1.1.0"
5359
  }
5360
  },
@@ -5370,7 +5185,7 @@
5370
  },
5371
  "readable-stream": {
5372
  "version": "2.3.6",
5373
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
5374
  "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
5375
  "dev": true,
5376
  "requires": {
@@ -5463,38 +5278,59 @@
5463
  "uuid": "3.3.2"
5464
  }
5465
  },
5466
- "request-progress": {
5467
- "version": "2.0.1",
5468
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
5469
- "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
5470
  "dev": true,
5471
- "optional": true,
5472
  "requires": {
5473
- "throttleit": "1.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
5474
  }
5475
  },
5476
- "requirefresh": {
5477
- "version": "2.1.0",
5478
- "resolved": "https://registry.npmjs.org/requirefresh/-/requirefresh-2.1.0.tgz",
5479
- "integrity": "sha1-dC3Mwg86lpGNZsbxWX3I/+vE9vU=",
5480
  "dev": true,
5481
  "requires": {
5482
- "editions": "1.3.4"
5483
  }
5484
  },
5485
- "resolve": {
5486
- "version": "1.1.7",
5487
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
5488
- "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
5489
- "dev": true
5490
- },
5491
  "rimraf": {
5492
- "version": "2.6.2",
5493
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
5494
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
5495
  "dev": true,
5496
  "requires": {
5497
- "glob": "7.0.6"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5498
  }
5499
  },
5500
  "rsyncwrapper": {
@@ -5508,7 +5344,7 @@
5508
  "dependencies": {
5509
  "lodash": {
5510
  "version": "4.15.0",
5511
- "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz",
5512
  "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=",
5513
  "dev": true
5514
  }
@@ -5595,7 +5431,7 @@
5595
  },
5596
  "shelljs": {
5597
  "version": "0.3.0",
5598
- "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
5599
  "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
5600
  "dev": true
5601
  },
@@ -5649,7 +5485,7 @@
5649
  "dev": true,
5650
  "requires": {
5651
  "spdx-expression-parse": "3.0.0",
5652
- "spdx-license-ids": "3.0.2"
5653
  }
5654
  },
5655
  "spdx-exceptions": {
@@ -5665,29 +5501,19 @@
5665
  "dev": true,
5666
  "requires": {
5667
  "spdx-exceptions": "2.2.0",
5668
- "spdx-license-ids": "3.0.2"
5669
  }
5670
  },
5671
  "spdx-license-ids": {
5672
- "version": "3.0.2",
5673
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
5674
- "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
5675
  "dev": true
5676
  },
5677
- "split": {
5678
- "version": "1.0.1",
5679
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
5680
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
5681
- "dev": true,
5682
- "optional": true,
5683
- "requires": {
5684
- "through": "2.3.8"
5685
- }
5686
- },
5687
  "sprintf-js": {
5688
- "version": "1.1.1",
5689
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz",
5690
- "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=",
5691
  "dev": true
5692
  },
5693
  "squeak": {
@@ -5711,7 +5537,7 @@
5711
  },
5712
  "chalk": {
5713
  "version": "1.1.3",
5714
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5715
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5716
  "dev": true,
5717
  "optional": true,
@@ -5733,9 +5559,9 @@
5733
  }
5734
  },
5735
  "sshpk": {
5736
- "version": "1.15.2",
5737
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
5738
- "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
5739
  "dev": true,
5740
  "requires": {
5741
  "asn1": "0.2.4",
@@ -5749,13 +5575,6 @@
5749
  "tweetnacl": "0.14.5"
5750
  }
5751
  },
5752
- "stack-trace": {
5753
- "version": "0.0.10",
5754
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
5755
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
5756
- "dev": true,
5757
- "optional": true
5758
- },
5759
  "stat-mode": {
5760
  "version": "0.2.2",
5761
  "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
@@ -5803,7 +5622,7 @@
5803
  },
5804
  "string_decoder": {
5805
  "version": "1.1.1",
5806
- "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5807
  "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5808
  "dev": true,
5809
  "requires": {
@@ -5812,7 +5631,7 @@
5812
  },
5813
  "strip-ansi": {
5814
  "version": "3.0.1",
5815
- "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
5816
  "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
5817
  "dev": true,
5818
  "requires": {
@@ -5840,7 +5659,7 @@
5840
  },
5841
  "strip-dirs": {
5842
  "version": "1.1.1",
5843
- "resolved": "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz",
5844
  "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=",
5845
  "dev": true,
5846
  "requires": {
@@ -5860,7 +5679,7 @@
5860
  },
5861
  "chalk": {
5862
  "version": "1.1.3",
5863
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5864
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5865
  "dev": true,
5866
  "requires": {
@@ -5920,7 +5739,7 @@
5920
  },
5921
  "chalk": {
5922
  "version": "1.1.3",
5923
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5924
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5925
  "dev": true,
5926
  "requires": {
@@ -5950,7 +5769,7 @@
5950
  },
5951
  "svgo": {
5952
  "version": "0.6.6",
5953
- "resolved": "http://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz",
5954
  "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=",
5955
  "dev": true,
5956
  "optional": true,
@@ -5979,7 +5798,7 @@
5979
  },
5980
  "tar": {
5981
  "version": "2.2.1",
5982
- "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
5983
  "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
5984
  "dev": true,
5985
  "optional": true,
@@ -6042,7 +5861,7 @@
6042
  "dependencies": {
6043
  "uuid": {
6044
  "version": "2.0.3",
6045
- "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
6046
  "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
6047
  "dev": true
6048
  }
@@ -6054,23 +5873,9 @@
6054
  "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
6055
  "dev": true
6056
  },
6057
- "throttleit": {
6058
- "version": "1.0.0",
6059
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
6060
- "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
6061
- "dev": true,
6062
- "optional": true
6063
- },
6064
- "through": {
6065
- "version": "2.3.8",
6066
- "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
6067
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
6068
- "dev": true,
6069
- "optional": true
6070
- },
6071
  "through2": {
6072
  "version": "0.6.5",
6073
- "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
6074
  "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
6075
  "dev": true,
6076
  "requires": {
@@ -6086,7 +5891,7 @@
6086
  },
6087
  "readable-stream": {
6088
  "version": "1.0.34",
6089
- "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
6090
  "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
6091
  "dev": true,
6092
  "requires": {
@@ -6098,7 +5903,7 @@
6098
  },
6099
  "string_decoder": {
6100
  "version": "0.10.31",
6101
- "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
6102
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
6103
  "dev": true
6104
  }
@@ -6128,7 +5933,7 @@
6128
  },
6129
  "time-grunt": {
6130
  "version": "1.4.0",
6131
- "resolved": "http://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz",
6132
  "integrity": "sha1-BiIT5mDJB+hvRAVWwB6mWXtxJCA=",
6133
  "dev": true,
6134
  "requires": {
@@ -6149,7 +5954,7 @@
6149
  },
6150
  "chalk": {
6151
  "version": "1.1.3",
6152
- "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
6153
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
6154
  "dev": true,
6155
  "requires": {
@@ -6198,23 +6003,6 @@
6198
  "livereload-js": "2.4.0",
6199
  "object-assign": "4.1.1",
6200
  "qs": "6.5.2"
6201
- },
6202
- "dependencies": {
6203
- "debug": {
6204
- "version": "3.2.6",
6205
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
6206
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
6207
- "dev": true,
6208
- "requires": {
6209
- "ms": "2.1.1"
6210
- }
6211
- },
6212
- "ms": {
6213
- "version": "2.1.1",
6214
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
6215
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
6216
- "dev": true
6217
- }
6218
  }
6219
  },
6220
  "to-absolute-glob": {
@@ -6238,7 +6026,7 @@
6238
  "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
6239
  "dev": true,
6240
  "requires": {
6241
- "psl": "1.1.29",
6242
  "punycode": "1.4.1"
6243
  },
6244
  "dependencies": {
@@ -6281,21 +6069,21 @@
6281
  "dev": true
6282
  },
6283
  "typechecker": {
6284
- "version": "4.6.0",
6285
- "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.6.0.tgz",
6286
- "integrity": "sha512-83OrXpyP3LNr7aRbLkt2nkjE/d7q8su8/uRvrKxCpswqVCVGOgyaKpaz8/MTjQqBYe4eLNuJ44pNakFZKqyPMA==",
6287
  "dev": true,
6288
  "requires": {
6289
- "editions": "2.1.0"
6290
  },
6291
  "dependencies": {
6292
  "editions": {
6293
- "version": "2.1.0",
6294
- "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.0.tgz",
6295
- "integrity": "sha512-yKrimWcvOXcYXtqsOeebbMLynm9qbYVd0005wveGU2biPxJaJoxA0jtaZrxiMe3mAanLr5lxoYFVz5zjv9JdnA==",
6296
  "dev": true,
6297
  "requires": {
6298
- "errlop": "1.0.3",
6299
  "semver": "5.6.0"
6300
  }
6301
  }
@@ -6309,7 +6097,7 @@
6309
  },
6310
  "underscore": {
6311
  "version": "1.7.0",
6312
- "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
6313
  "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
6314
  "dev": true
6315
  },
@@ -6319,24 +6107,40 @@
6319
  "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
6320
  "dev": true,
6321
  "requires": {
6322
- "sprintf-js": "1.1.1",
6323
  "util-deprecate": "1.0.2"
6324
  }
6325
  },
6326
- "unicode-5.2.0": {
6327
- "version": "0.7.5",
6328
- "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz",
6329
- "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==",
6330
- "dev": true
6331
- },
6332
  "unique-stream": {
6333
- "version": "2.2.1",
6334
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
6335
- "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
6336
  "dev": true,
6337
  "requires": {
6338
- "json-stable-stringify": "1.0.1",
6339
- "through2-filter": "2.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6340
  }
6341
  },
6342
  "unzip-response": {
@@ -6439,7 +6243,7 @@
6439
  "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
6440
  "dev": true,
6441
  "requires": {
6442
- "duplexify": "3.6.1",
6443
  "glob-stream": "5.3.5",
6444
  "graceful-fs": "4.1.15",
6445
  "gulp-sourcemaps": "1.6.0",
@@ -6472,7 +6276,7 @@
6472
  },
6473
  "vow": {
6474
  "version": "0.4.4",
6475
- "resolved": "http://registry.npmjs.org/vow/-/vow-0.4.4.tgz",
6476
  "integrity": "sha1-yf5GCRKdf1qmIVCOvmS1HJW8e5g=",
6477
  "dev": true
6478
  },
@@ -6582,37 +6386,6 @@
6582
  "string-width": "1.0.2"
6583
  }
6584
  },
6585
- "winston": {
6586
- "version": "2.4.4",
6587
- "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz",
6588
- "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==",
6589
- "dev": true,
6590
- "optional": true,
6591
- "requires": {
6592
- "async": "1.0.0",
6593
- "colors": "1.0.3",
6594
- "cycle": "1.0.3",
6595
- "eyes": "0.1.8",
6596
- "isstream": "0.1.2",
6597
- "stack-trace": "0.0.10"
6598
- },
6599
- "dependencies": {
6600
- "async": {
6601
- "version": "1.0.0",
6602
- "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz",
6603
- "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
6604
- "dev": true,
6605
- "optional": true
6606
- },
6607
- "colors": {
6608
- "version": "1.0.3",
6609
- "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
6610
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
6611
- "dev": true,
6612
- "optional": true
6613
- }
6614
- }
6615
- },
6616
  "wrap-fn": {
6617
  "version": "0.1.5",
6618
  "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz",
1
  {
2
  "name": "wp-product-review",
3
+ "version": "3.5.0",
4
  "lockfileVersion": 1,
5
  "requires": true,
6
  "dependencies": {
11
  "dev": true
12
  },
13
  "ajv": {
14
+ "version": "6.9.1",
15
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz",
16
+ "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==",
17
  "dev": true,
18
  "requires": {
19
  "fast-deep-equal": "2.0.1",
69
  },
70
  "archiver": {
71
  "version": "1.3.0",
72
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz",
73
  "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=",
74
  "dev": true,
75
  "requires": {
207
  },
208
  "async": {
209
  "version": "1.5.2",
210
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
211
  "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
212
  "dev": true
213
  },
231
  "dev": true,
232
  "requires": {
233
  "browserslist": "1.7.7",
234
+ "caniuse-db": "1.0.30000936",
235
  "normalize-range": "0.1.2",
236
  "num2fraction": "1.2.2",
237
  "postcss": "5.2.18",
279
  },
280
  "bin-build": {
281
  "version": "2.2.0",
282
+ "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz",
283
  "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=",
284
  "dev": true,
285
  "optional": true,
288
  "decompress": "3.0.0",
289
  "download": "4.4.3",
290
  "exec-series": "1.0.3",
291
+ "rimraf": "2.6.3",
292
  "tempfile": "1.1.1",
293
  "url-regex": "3.2.0"
294
  }
305
  },
306
  "bin-version": {
307
  "version": "1.0.4",
308
+ "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz",
309
  "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=",
310
  "dev": true,
311
  "optional": true,
315
  },
316
  "bin-version-check": {
317
  "version": "2.1.0",
318
+ "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz",
319
  "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=",
320
  "dev": true,
321
  "optional": true,
328
  "dependencies": {
329
  "semver": {
330
  "version": "4.3.6",
331
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
332
  "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
333
  "dev": true,
334
  "optional": true
337
  },
338
  "bin-wrapper": {
339
  "version": "3.0.2",
340
+ "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz",
341
  "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=",
342
  "dev": true,
343
  "optional": true,
352
  },
353
  "bl": {
354
  "version": "1.2.2",
355
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
356
  "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
357
  "dev": true,
358
  "requires": {
409
  "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
410
  "dev": true,
411
  "requires": {
412
+ "caniuse-db": "1.0.30000936",
413
+ "electron-to-chromium": "1.3.113"
414
  }
415
  },
416
  "buffer": {
471
  "dependencies": {
472
  "uuid": {
473
  "version": "2.0.3",
474
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
475
  "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
476
  "dev": true
477
  }
478
  }
479
  },
 
 
 
 
 
 
480
  "bytes": {
481
  "version": "1.0.0",
482
  "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
484
  "dev": true
485
  },
486
  "cache-swap": {
487
+ "version": "0.3.0",
488
+ "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.3.0.tgz",
489
+ "integrity": "sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E=",
490
  "dev": true,
491
  "requires": {
492
+ "graceful-fs": "4.1.15",
493
+ "mkdirp": "0.5.1",
494
+ "object-assign": "4.1.1",
495
+ "rimraf": "2.6.3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
496
  }
497
  },
498
  "camelcase": {
503
  },
504
  "camelcase-keys": {
505
  "version": "2.1.0",
506
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
507
  "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
508
  "dev": true,
509
  "requires": {
512
  }
513
  },
514
  "caniuse-db": {
515
+ "version": "1.0.30000936",
516
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000936.tgz",
517
+ "integrity": "sha512-gOrcU8d+h5AdrO/Mhnj35vttNvAed2taqzrYDfhJE/qVnLxAaGb1doWlRF7iDex+EQPhkwAHc07RBwixnxpFDQ==",
518
  "dev": true
519
  },
520
  "capture-stack-trace": {
556
  }
557
  },
558
  "chalk": {
559
+ "version": "2.4.2",
560
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
561
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
562
  "dev": true,
563
  "requires": {
564
  "ansi-styles": "3.2.1",
592
  },
593
  "chalk": {
594
  "version": "1.1.3",
595
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
596
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
597
  "dev": true,
598
  "optional": true,
702
  },
703
  "colors": {
704
  "version": "1.1.2",
705
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
706
  "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
707
  "dev": true
708
  },
717
  },
718
  "commander": {
719
  "version": "2.8.1",
720
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
721
  "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
722
  "dev": true,
723
  "requires": {
834
  "coffee-script": "1.12.7",
835
  "cson-parser": "1.3.5",
836
  "extract-opts": "3.3.1",
837
+ "requirefresh": "2.2.0",
838
  "safefs": "4.1.0"
839
  },
840
  "dependencies": {
848
  },
849
  "cson-parser": {
850
  "version": "1.3.5",
851
+ "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-1.3.5.tgz",
852
  "integrity": "sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ=",
853
  "dev": true,
854
  "requires": {
883
  "dependencies": {
884
  "commander": {
885
  "version": "2.0.0",
886
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz",
887
  "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=",
888
  "dev": true
889
  }
933
  "array-find-index": "1.0.2"
934
  }
935
  },
 
 
 
 
 
 
 
936
  "dashdash": {
937
  "version": "1.14.1",
938
  "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
968
  }
969
  },
970
  "debug": {
971
+ "version": "3.2.6",
972
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
973
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
974
  "dev": true,
 
975
  "requires": {
976
+ "ms": "2.1.1"
977
  }
978
  },
979
  "decamelize": {
1177
  "optional": true
1178
  },
1179
  "diff": {
1180
+ "version": "3.5.0",
1181
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
1182
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
1183
  "dev": true
1184
  },
1185
  "dom-serializer": {
1194
  "dependencies": {
1195
  "domelementtype": {
1196
  "version": "1.1.3",
1197
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
1198
  "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
1199
  "dev": true
1200
  },
1264
  }
1265
  },
1266
  "duplexify": {
1267
+ "version": "3.7.1",
1268
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
1269
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
1270
  "dev": true,
1271
  "requires": {
1272
  "end-of-stream": "1.4.1",
1292
  "dev": true,
1293
  "requires": {
1294
  "editions": "1.3.4",
1295
+ "typechecker": "4.7.0"
1296
  }
1297
  },
1298
  "ecc-jsbn": {
1312
  "dev": true
1313
  },
1314
  "electron-to-chromium": {
1315
+ "version": "1.3.113",
1316
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz",
1317
+ "integrity": "sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==",
1318
  "dev": true
1319
  },
1320
  "encoding": {
1337
  },
1338
  "entities": {
1339
  "version": "1.0.0",
1340
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
1341
  "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=",
1342
  "dev": true
1343
  },
1344
  "errlop": {
1345
+ "version": "1.1.1",
1346
+ "resolved": "https://registry.npmjs.org/errlop/-/errlop-1.1.1.tgz",
1347
+ "integrity": "sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw==",
1348
  "dev": true,
1349
  "requires": {
1350
+ "editions": "2.1.3"
1351
+ },
1352
+ "dependencies": {
1353
+ "editions": {
1354
+ "version": "2.1.3",
1355
+ "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
1356
+ "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
1357
+ "dev": true,
1358
+ "requires": {
1359
+ "errlop": "1.1.1",
1360
+ "semver": "5.6.0"
1361
+ }
1362
+ }
1363
  }
1364
  },
1365
  "error": {
1381
  "is-arrayish": "0.2.1"
1382
  }
1383
  },
 
 
 
 
 
 
 
1384
  "escape-string-regexp": {
1385
  "version": "1.0.5",
1386
  "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1395
  },
1396
  "eventemitter2": {
1397
  "version": "0.4.14",
1398
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
1399
  "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
1400
  "dev": true
1401
  },
1406
  "dev": true,
1407
  "optional": true,
1408
  "requires": {
1409
+ "rimraf": "2.6.3",
1410
  "tempfile": "1.1.1"
1411
  }
1412
  },
1448
  },
1449
  "expand-range": {
1450
  "version": "1.8.2",
1451
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
1452
  "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
1453
  "dev": true,
1454
  "requires": {
1502
  "requires": {
1503
  "eachr": "3.2.0",
1504
  "editions": "1.3.4",
1505
+ "typechecker": "4.7.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1506
  }
1507
  },
1508
  "extsprintf": {
1511
  "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
1512
  "dev": true
1513
  },
 
 
 
 
 
 
 
1514
  "fancy-log": {
1515
  "version": "1.3.3",
1516
  "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
1519
  "requires": {
1520
  "ansi-gray": "0.1.1",
1521
  "color-support": "1.1.3",
1522
+ "parse-node-version": "1.0.1",
1523
  "time-stamp": "1.1.0"
1524
  }
1525
  },
1571
  },
1572
  "file-type": {
1573
  "version": "3.9.0",
1574
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
1575
  "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
1576
  "dev": true
1577
  },
1623
  },
1624
  "find-versions": {
1625
  "version": "1.2.1",
1626
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz",
1627
  "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=",
1628
  "dev": true,
1629
  "optional": true,
1702
  "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
1703
  "dev": true
1704
  },
 
 
 
 
 
 
 
 
 
 
 
 
1705
  "fs.realpath": {
1706
  "version": "1.0.0",
1707
  "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1717
  "graceful-fs": "4.1.15",
1718
  "inherits": "2.0.3",
1719
  "mkdirp": "0.5.1",
1720
+ "rimraf": "2.6.3"
1721
  }
1722
  },
1723
  "gauge": {
1777
  },
1778
  "gettext-parser": {
1779
  "version": "1.1.2",
1780
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.1.2.tgz",
1781
  "integrity": "sha1-zw8MnJCJrtsO5RSZKRg+ncQ1hKc=",
1782
  "dev": true,
1783
  "requires": {
1786
  },
1787
  "gifsicle": {
1788
  "version": "3.0.4",
1789
+ "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz",
1790
  "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=",
1791
  "dev": true,
1792
  "optional": true,
1876
  "ordered-read-streams": "0.3.0",
1877
  "through2": "0.6.5",
1878
  "to-absolute-glob": "0.1.1",
1879
+ "unique-stream": "2.3.1"
1880
  },
1881
  "dependencies": {
1882
  "glob": {
1922
  }
1923
  },
1924
  "glogg": {
1925
+ "version": "1.0.2",
1926
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
1927
+ "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
1928
  "dev": true,
1929
  "requires": {
1930
  "sparkles": "1.0.1"
1938
  },
1939
  "got": {
1940
  "version": "5.7.1",
1941
+ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
1942
  "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
1943
  "dev": true,
1944
  "requires": {
1993
  "mkdirp": "0.5.1",
1994
  "nopt": "3.0.6",
1995
  "path-is-absolute": "1.0.1",
1996
+ "rimraf": "2.6.3"
1997
  },
1998
  "dependencies": {
1999
  "grunt-cli": {
2000
  "version": "1.2.0",
2001
+ "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
2002
  "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
2003
  "dev": true,
2004
  "requires": {
2007
  "nopt": "3.0.6",
2008
  "resolve": "1.1.7"
2009
  }
2010
+ },
2011
+ "resolve": {
2012
+ "version": "1.1.7",
2013
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
2014
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
2015
+ "dev": true
2016
  }
2017
  }
2018
  },
2040
  },
2041
  "chalk": {
2042
  "version": "0.2.1",
2043
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
2044
  "integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=",
2045
  "dev": true,
2046
  "requires": {
2072
  },
2073
  "chalk": {
2074
  "version": "1.1.3",
2075
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2076
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2077
  "dev": true,
2078
  "requires": {
2109
  },
2110
  "chalk": {
2111
  "version": "1.1.3",
2112
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2113
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2114
  "dev": true,
2115
  "requires": {
2130
  },
2131
  "grunt-contrib-imagemin": {
2132
  "version": "1.0.1",
2133
+ "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz",
2134
  "integrity": "sha1-5Ho1YTN29MqpwfkERlA8rhyUTXk=",
2135
  "dev": true,
2136
  "requires": {
2149
  },
2150
  "chalk": {
2151
  "version": "1.1.3",
2152
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2153
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2154
  "dev": true,
2155
  "requires": {
2162
  },
2163
  "pretty-bytes": {
2164
  "version": "3.0.1",
2165
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
2166
  "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
2167
  "dev": true,
2168
  "requires": {
2179
  },
2180
  "grunt-contrib-jshint": {
2181
  "version": "1.1.0",
2182
+ "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz",
2183
  "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=",
2184
  "dev": true,
2185
  "requires": {
2186
  "chalk": "1.1.3",
2187
  "hooker": "0.2.3",
2188
+ "jshint": "2.9.7"
2189
  },
2190
  "dependencies": {
2191
  "ansi-styles": {
2196
  },
2197
  "chalk": {
2198
  "version": "1.1.3",
2199
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
2200
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
2201
  "dev": true,
2202
  "requires": {
2268
  "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
2269
  "dev": true,
2270
  "requires": {
2271
+ "chalk": "2.4.2",
2272
  "lodash": "4.17.11"
2273
  }
2274
  },
2300
  "dev": true,
2301
  "requires": {
2302
  "async": "1.5.2",
2303
+ "rimraf": "2.6.3"
2304
  }
2305
  },
2306
  "grunt-phpcbf": {
2316
  "dev": true
2317
  },
2318
  "grunt-phplint": {
2319
+ "version": "0.1.0",
2320
+ "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.1.0.tgz",
2321
+ "integrity": "sha1-bb4uauxTqiKc+sCtmnyZ4kGEhI0=",
2322
  "dev": true,
2323
  "requires": {
2324
+ "cache-swap": "0.3.0",
2325
  "grunt": "0.4.5"
2326
  },
2327
  "dependencies": {
2337
  "dependencies": {
2338
  "underscore.string": {
2339
  "version": "2.4.0",
2340
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
2341
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
2342
  "dev": true
2343
  }
2345
  },
2346
  "async": {
2347
  "version": "0.1.22",
2348
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
2349
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
2350
  "dev": true
2351
  },
2357
  },
2358
  "colors": {
2359
  "version": "0.6.2",
2360
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
2361
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
2362
  "dev": true
2363
  },
2395
  },
2396
  "lodash": {
2397
  "version": "2.4.2",
2398
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2399
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2400
  "dev": true
2401
  },
2432
  },
2433
  "graceful-fs": {
2434
  "version": "1.2.3",
2435
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
2436
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
2437
  "dev": true
2438
  },
2439
  "grunt": {
2440
  "version": "0.4.5",
2441
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
2442
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
2443
  "dev": true,
2444
  "requires": {
2479
  "dependencies": {
2480
  "lodash": {
2481
  "version": "2.4.2",
2482
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2483
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2484
  "dev": true
2485
  },
2486
  "underscore.string": {
2487
  "version": "2.3.3",
2488
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2489
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2490
  "dev": true
2491
  }
2504
  "dependencies": {
2505
  "lodash": {
2506
  "version": "2.4.2",
2507
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2508
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2509
  "dev": true
2510
  },
2511
  "underscore.string": {
2512
  "version": "2.3.3",
2513
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2514
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2515
  "dev": true
2516
  }
2533
  },
2534
  "iconv-lite": {
2535
  "version": "0.2.11",
2536
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
2537
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
2538
  "dev": true
2539
  },
2549
  },
2550
  "lodash": {
2551
  "version": "0.9.2",
2552
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
2553
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
2554
  "dev": true
2555
  },
2574
  },
2575
  "rimraf": {
2576
  "version": "2.2.8",
2577
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2578
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2579
  "dev": true
2580
  },
2581
  "underscore.string": {
2582
  "version": "2.2.1",
2583
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
2584
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
2585
  "dev": true
2586
  },
2599
  "dev": true
2600
  },
2601
  "grunt-plugin-fleet": {
2602
+ "version": "github:codeinwp/grunt-plugin-fleet#2d97d75d7c9f3d5cf7ae0c6038fcdeafe1642b98",
2603
  "dev": true,
2604
  "requires": {
2605
  "autoprefixer": "6.7.7",
2615
  "grunt-newer": "1.3.0",
2616
  "grunt-phpcbf": "0.1.1",
2617
  "grunt-phpcs": "0.4.0",
2618
+ "grunt-phplint": "0.1.0",
2619
  "grunt-phpunit": "0.3.6",
2620
+ "grunt-postcss": "0.9.0",
2621
  "grunt-rsync": "2.0.1",
2622
  "grunt-sync": "0.6.2",
2623
  "grunt-text-replace": "0.4.0",
2640
  "dependencies": {
2641
  "underscore.string": {
2642
  "version": "2.4.0",
2643
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
2644
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
2645
  "dev": true
2646
  }
2648
  },
2649
  "async": {
2650
  "version": "0.1.22",
2651
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
2652
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
2653
  "dev": true
2654
  },
2660
  },
2661
  "colors": {
2662
  "version": "0.6.2",
2663
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
2664
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
2665
  "dev": true
2666
  },
2698
  },
2699
  "lodash": {
2700
  "version": "2.4.2",
2701
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2702
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2703
  "dev": true
2704
  },
2735
  },
2736
  "graceful-fs": {
2737
  "version": "1.2.3",
2738
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
2739
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
2740
  "dev": true
2741
  },
2742
  "grunt": {
2743
  "version": "0.4.5",
2744
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
2745
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
2746
  "dev": true,
2747
  "requires": {
2782
  "dependencies": {
2783
  "lodash": {
2784
  "version": "2.4.2",
2785
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2786
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2787
  "dev": true
2788
  },
2789
  "underscore.string": {
2790
  "version": "2.3.3",
2791
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2792
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2793
  "dev": true
2794
  }
2807
  "dependencies": {
2808
  "lodash": {
2809
  "version": "2.4.2",
2810
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
2811
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
2812
  "dev": true
2813
  },
2814
  "underscore.string": {
2815
  "version": "2.3.3",
2816
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
2817
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
2818
  "dev": true
2819
  }
2836
  },
2837
  "iconv-lite": {
2838
  "version": "0.2.11",
2839
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
2840
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
2841
  "dev": true
2842
  },
2852
  },
2853
  "lodash": {
2854
  "version": "0.9.2",
2855
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
2856
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
2857
  "dev": true
2858
  },
2877
  },
2878
  "rimraf": {
2879
  "version": "2.2.8",
2880
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
2881
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
2882
  "dev": true
2883
  },
2884
  "underscore.string": {
2885
  "version": "2.2.1",
2886
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
2887
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
2888
  "dev": true
2889
  },
2896
  }
2897
  },
2898
  "grunt-postcss": {
2899
+ "version": "0.9.0",
2900
+ "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.9.0.tgz",
2901
+ "integrity": "sha512-lglLcVaoOIqH0sFv7RqwUKkEFGQwnlqyAKbatxZderwZGV1nDyKHN7gZS9LUiTx1t5GOvRBx0BEalHMyVwFAIA==",
2902
  "dev": true,
2903
  "requires": {
2904
+ "chalk": "2.4.2",
2905
+ "diff": "3.5.0",
2906
+ "postcss": "6.0.23"
2907
  },
2908
  "dependencies": {
2909
+ "postcss": {
2910
+ "version": "6.0.23",
2911
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
2912
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
 
 
 
 
 
 
2913
  "dev": true,
2914
  "requires": {
2915
+ "chalk": "2.4.2",
2916
+ "source-map": "0.6.1",
2917
+ "supports-color": "5.5.0"
 
 
2918
  }
2919
  },
2920
+ "source-map": {
2921
+ "version": "0.6.1",
2922
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
2923
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
2924
  "dev": true
2925
  }
2926
  }
2964
  "dependencies": {
2965
  "semver": {
2966
  "version": "4.3.6",
2967
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
2968
  "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
2969
  "dev": true
2970
  }
3006
  "dependencies": {
3007
  "underscore": {
3008
  "version": "1.7.0",
3009
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
3010
  "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
3011
  "dev": true
3012
  },
3013
  "underscore.string": {
3014
  "version": "2.4.0",
3015
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz",
3016
  "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=",
3017
  "dev": true
3018
  }
3020
  },
3021
  "async": {
3022
  "version": "0.9.2",
3023
+ "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
3024
  "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
3025
  "dev": true
3026
  },
3032
  },
3033
  "colors": {
3034
  "version": "0.6.2",
3035
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
3036
  "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
3037
  "dev": true
3038
  },
3070
  },
3071
  "lodash": {
3072
  "version": "2.4.2",
3073
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3074
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3075
  "dev": true
3076
  },
3107
  },
3108
  "graceful-fs": {
3109
  "version": "1.2.3",
3110
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
3111
  "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
3112
  "dev": true
3113
  },
3114
  "grunt": {
3115
  "version": "0.4.5",
3116
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz",
3117
  "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=",
3118
  "dev": true,
3119
  "requires": {
3141
  "dependencies": {
3142
  "async": {
3143
  "version": "0.1.22",
3144
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
3145
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
3146
  "dev": true
3147
  },
3148
  "underscore.string": {
3149
  "version": "2.2.1",
3150
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
3151
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
3152
  "dev": true
3153
  }
3168
  "dependencies": {
3169
  "lodash": {
3170
  "version": "2.4.2",
3171
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3172
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3173
  "dev": true
3174
  },
3175
  "underscore.string": {
3176
  "version": "2.3.3",
3177
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
3178
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
3179
  "dev": true
3180
  }
3193
  "dependencies": {
3194
  "lodash": {
3195
  "version": "2.4.2",
3196
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz",
3197
  "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=",
3198
  "dev": true
3199
  },
3200
  "underscore.string": {
3201
  "version": "2.3.3",
3202
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz",
3203
  "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=",
3204
  "dev": true
3205
  }
3222
  "dependencies": {
3223
  "async": {
3224
  "version": "0.1.22",
3225
+ "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz",
3226
  "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=",
3227
  "dev": true
3228
  },
3229
  "underscore.string": {
3230
  "version": "2.2.1",
3231
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz",
3232
  "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=",
3233
  "dev": true
3234
  }
3236
  },
3237
  "iconv-lite": {
3238
  "version": "0.2.11",
3239
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
3240
  "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
3241
  "dev": true
3242
  },
3252
  },
3253
  "lodash": {
3254
  "version": "0.9.2",
3255
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz",
3256
  "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=",
3257
  "dev": true
3258
  },
3277
  },
3278
  "rimraf": {
3279
  "version": "2.2.8",
3280
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
3281
  "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
3282
  "dev": true
3283
  },
3284
  "underscore": {
3285
  "version": "1.8.3",
3286
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
3287
  "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
3288
  "dev": true
3289
  },
3290
  "underscore.string": {
3291
  "version": "3.0.3",
3292
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.0.3.tgz",
3293
  "integrity": "sha1-Rhe4waJQz25QZPu7Nj0PqWzxRVI=",
3294
  "dev": true
3295
  },
3384
  },
3385
  "chalk": {
3386
  "version": "1.1.3",
3387
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3388
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3389
  "dev": true,
3390
  "requires": {
3442
  "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
3443
  "dev": true,
3444
  "requires": {
3445
+ "glogg": "1.0.2"
3446
  }
3447
  },
3448
  "har-schema": {
3457
  "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
3458
  "dev": true,
3459
  "requires": {
3460
+ "ajv": "6.9.1",
3461
  "har-schema": "2.0.0"
3462
  }
3463
  },
3497
  "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
3498
  "dev": true
3499
  },
 
 
 
 
 
 
 
 
 
 
 
3500
  "hooker": {
3501
  "version": "0.2.3",
3502
  "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
3511
  },
3512
  "htmlparser2": {
3513
  "version": "3.8.3",
3514
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
3515
  "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
3516
  "dev": true,
3517
  "requires": {
3530
  },
3531
  "readable-stream": {
3532
  "version": "1.1.14",
3533
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
3534
  "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
3535
  "dev": true,
3536
  "requires": {
3542
  },
3543
  "string_decoder": {
3544
  "version": "0.10.31",
3545
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
3546
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
3547
  "dev": true
3548
  }
3562
  "requires": {
3563
  "assert-plus": "1.0.0",
3564
  "jsprim": "1.4.1",
3565
+ "sshpk": "1.16.1"
3566
  }
3567
  },
3568
  "iconv-lite": {
3588
  "optional": true,
3589
  "requires": {
3590
  "detect-libc": "0.2.0",
3591
+ "nan": "2.12.1",
3592
  "node-gyp": "3.8.0",
3593
  "prebuild-install": "2.5.3"
3594
  }
3595
  },
3596
  "imagemin": {
3597
  "version": "4.0.0",
3598
+ "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz",
3599
  "integrity": "sha1-6Q5/CTaDZZXxj6Ff6Qb0+iWeqEc=",
3600
  "dev": true,
3601
  "requires": {
3613
  },
3614
  "imagemin-gifsicle": {
3615
  "version": "4.2.0",
3616
+ "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz",
3617
  "integrity": "sha1-D++butNHbmt2iFc2zFsLh6CHV8o=",
3618
  "dev": true,
3619
  "optional": true,
3625
  },
3626
  "imagemin-jpegtran": {
3627
  "version": "4.3.2",
3628
+ "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz",
3629
  "integrity": "sha1-G8bR4r0T/bZNJFUm1jWn5d/rEvw=",
3630
  "dev": true,
3631
  "optional": true,
3650
  },
3651
  "imagemin-optipng": {
3652
  "version": "4.3.0",
3653
+ "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz",
3654
  "integrity": "sha1-dgRmOrLuMVczJ0cm/Rw3TStErbY=",
3655
  "dev": true,
3656
  "optional": true,
3751
  "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
3752
  "dev": true
3753
  },
 
 
 
 
 
 
 
 
 
3754
  "is-bzip2": {
3755
  "version": "1.0.0",
3756
  "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz",
3804
  },
3805
  "is-gif": {
3806
  "version": "1.0.0",
3807
+ "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz",
3808
  "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=",
3809
  "dev": true,
3810
  "optional": true
3848
  },
3849
  "is-obj": {
3850
  "version": "1.0.1",
3851
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
3852
  "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
3853
  "dev": true
3854
  },
3973
  },
3974
  "jpegtran-bin": {
3975
  "version": "3.2.0",
3976
+ "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz",
3977
  "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=",
3978
  "dev": true,
3979
  "optional": true,
3984
  }
3985
  },
3986
  "js-base64": {
3987
+ "version": "2.5.1",
3988
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
3989
+ "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
3990
  "dev": true
3991
  },
3992
  "js-yaml": {
4006
  "dev": true
4007
  },
4008
  "jshint": {
4009
+ "version": "2.9.7",
4010
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz",
4011
+ "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==",
4012
  "dev": true,
4013
  "requires": {
4014
  "cli": "1.0.1",
4017
  "htmlparser2": "3.8.3",
4018
  "lodash": "4.17.11",
4019
  "minimatch": "3.0.4",
 
 
4020
  "shelljs": "0.3.0",
4021
+ "strip-json-comments": "1.0.4"
 
4022
  },
4023
  "dependencies": {
4024
  "strip-json-comments": {
4041
  "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
4042
  "dev": true
4043
  },
4044
+ "json-stable-stringify-without-jsonify": {
4045
  "version": "1.0.1",
4046
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
4047
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
4048
+ "dev": true
 
 
 
4049
  },
4050
  "json-stringify-safe": {
4051
  "version": "5.0.1",
4053
  "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
4054
  "dev": true
4055
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4056
  "jsprim": {
4057
  "version": "1.4.1",
4058
  "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
4065
  "verror": "1.10.0"
4066
  }
4067
  },
 
 
 
 
 
 
 
4068
  "kind-of": {
4069
  "version": "3.2.2",
4070
  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4074
  "is-buffer": "1.1.6"
4075
  }
4076
  },
 
 
 
 
 
 
 
 
 
 
4077
  "lazy-req": {
4078
  "version": "1.1.0",
4079
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
4080
  "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
4081
  "dev": true,
4082
  "optional": true
4136
  },
4137
  "lodash": {
4138
  "version": "3.10.1",
4139
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
4140
  "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
4141
  "dev": true
4142
  }
4155
  },
4156
  "load-json-file": {
4157
  "version": "1.1.0",
4158
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
4159
  "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
4160
  "dev": true,
4161
  "requires": {
4179
  "dependencies": {
4180
  "lodash": {
4181
  "version": "3.10.1",
4182
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
4183
  "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
4184
  "dev": true
4185
  }
4365
  },
4366
  "lru-cache": {
4367
  "version": "2.7.3",
4368
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
4369
  "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
4370
  "dev": true
4371
  },
4376
  "dev": true
4377
  },
4378
  "math-random": {
4379
+ "version": "1.0.4",
4380
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
4381
+ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
4382
  "dev": true
4383
  },
4384
  "md5-file": {
4389
  },
4390
  "meow": {
4391
  "version": "3.7.0",
4392
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
4393
  "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
4394
  "dev": true,
4395
  "requires": {
4398
  "loud-rejection": "1.6.0",
4399
  "map-obj": "1.0.1",
4400
  "minimist": "1.2.0",
4401
+ "normalize-package-data": "2.5.0",
4402
  "object-assign": "4.1.1",
4403
  "read-pkg-up": "1.0.1",
4404
  "redent": "1.0.0",
4485
  },
4486
  "minimist": {
4487
  "version": "1.2.0",
4488
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
4489
  "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
4490
  "dev": true
4491
  },
4492
  "mkdirp": {
4493
  "version": "0.5.1",
4494
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
4495
  "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
4496
  "dev": true,
4497
  "requires": {
4500
  "dependencies": {
4501
  "minimist": {
4502
  "version": "0.0.8",
4503
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
4504
  "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
4505
  "dev": true
4506
  }
4507
  }
4508
  },
4509
  "ms": {
4510
+ "version": "2.1.1",
4511
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
4512
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
4513
+ "dev": true
 
4514
  },
4515
  "multimatch": {
4516
  "version": "2.1.0",
4550
  },
4551
  "readable-stream": {
4552
  "version": "1.1.14",
4553
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
4554
  "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
4555
  "dev": true,
4556
  "requires": {
4562
  },
4563
  "string_decoder": {
4564
  "version": "0.10.31",
4565
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
4566
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
4567
  "dev": true
4568
  }
4569
  }
4570
  },
4571
  "nan": {
4572
+ "version": "2.12.1",
4573
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
4574
+ "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
4575
  "dev": true,
4576
  "optional": true
4577
  },
4578
  "node-abi": {
4579
+ "version": "2.7.0",
4580
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.0.tgz",
4581
+ "integrity": "sha512-egTtvNoZLMjwxkL/5iiJKYKZgn2im0zP+G+PncMxICYGiD3aZtXUvEsDmu0pF8gpASvLZyD8v53qi1/ELaRZpg==",
4582
  "dev": true,
4583
  "optional": true,
4584
  "requires": {
4600
  "npmlog": "4.1.2",
4601
  "osenv": "0.1.5",
4602
  "request": "2.88.0",
4603
+ "rimraf": "2.6.3",
4604
  "semver": "5.3.0",
4605
  "tar": "2.2.1",
4606
  "which": "1.3.1"
4608
  "dependencies": {
4609
  "semver": {
4610
  "version": "5.3.0",
4611
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
4612
  "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
4613
  "dev": true,
4614
  "optional": true
4617
  },
4618
  "node-status-codes": {
4619
  "version": "1.0.0",
4620
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
4621
  "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
4622
  "dev": true
4623
  },
4644
  }
4645
  },
4646
  "normalize-package-data": {
4647
+ "version": "2.5.0",
4648
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
4649
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
4650
  "dev": true,
4651
  "requires": {
4652
  "hosted-git-info": "2.7.1",
4653
+ "resolve": "1.10.0",
4654
  "semver": "5.6.0",
4655
  "validate-npm-package-license": "3.0.4"
4656
  }
4727
  },
4728
  "onetime": {
4729
  "version": "1.1.0",
4730
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
4731
  "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
4732
  "dev": true
4733
  },
4768
  },
4769
  "os-homedir": {
4770
  "version": "1.0.2",
4771
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
4772
  "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
4773
  "dev": true
4774
  },
4775
  "os-tmpdir": {
4776
  "version": "1.0.2",
4777
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
4778
  "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
4779
  "dev": true
4780
  },
4834
  "dev": true
4835
  },
4836
  "parse-node-version": {
4837
+ "version": "1.0.1",
4838
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
4839
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
4840
  "dev": true
4841
  },
4842
  "path-dirname": {
4856
  },
4857
  "path-is-absolute": {
4858
  "version": "1.0.1",
4859
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
4860
  "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
4861
  "dev": true
4862
  },
4863
+ "path-parse": {
4864
+ "version": "1.0.6",
4865
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
4866
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
4867
+ "dev": true
4868
+ },
4869
  "path-type": {
4870
  "version": "1.1.0",
4871
  "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
4889
  "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
4890
  "dev": true
4891
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4892
  "pify": {
4893
  "version": "2.3.0",
4894
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
4895
  "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
4896
  "dev": true
4897
  },
4932
  "dev": true,
4933
  "requires": {
4934
  "chalk": "1.1.3",
4935
+ "js-base64": "2.5.1",
4936
  "source-map": "0.5.7",
4937
  "supports-color": "3.2.3"
4938
  },
4945
  },
4946
  "chalk": {
4947
  "version": "1.1.3",
4948
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
4949
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
4950
  "dev": true,
4951
  "requires": {
4999
  "github-from-package": "0.0.0",
5000
  "minimist": "1.2.0",
5001
  "mkdirp": "0.5.1",
5002
+ "node-abi": "2.7.0",
5003
  "noop-logger": "0.1.1",
5004
  "npmlog": "4.1.2",
5005
  "os-homedir": "1.0.2",
5034
  },
5035
  "pretty-bytes": {
5036
  "version": "4.0.2",
5037
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
5038
  "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
5039
  "dev": true
5040
  },
5041
  "pretty-ms": {
5042
  "version": "2.1.0",
5043
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz",
5044
  "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=",
5045
  "dev": true,
5046
  "requires": {
5055
  "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
5056
  "dev": true
5057
  },
 
 
 
 
 
 
 
5058
  "promised-io": {
5059
  "version": "0.3.5",
5060
  "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz",
5062
  "dev": true
5063
  },
5064
  "psl": {
5065
+ "version": "1.1.31",
5066
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
5067
+ "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==",
5068
  "dev": true
5069
  },
5070
  "pump": {
5105
  "requires": {
5106
  "is-number": "4.0.0",
5107
  "kind-of": "6.0.2",
5108
+ "math-random": "1.0.4"
5109
  },
5110
  "dependencies": {
5111
  "is-number": {
5134
  "dependencies": {
5135
  "string_decoder": {
5136
  "version": "0.10.31",
5137
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
5138
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
5139
  "dev": true
5140
  }
5169
  "dev": true,
5170
  "requires": {
5171
  "load-json-file": "1.1.0",
5172
+ "normalize-package-data": "2.5.0",
5173
  "path-type": "1.1.0"
5174
  }
5175
  },
5185
  },
5186
  "readable-stream": {
5187
  "version": "2.3.6",
5188
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
5189
  "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
5190
  "dev": true,
5191
  "requires": {
5278
  "uuid": "3.3.2"
5279
  }
5280
  },
5281
+ "requirefresh": {
5282
+ "version": "2.2.0",
5283
+ "resolved": "https://registry.npmjs.org/requirefresh/-/requirefresh-2.2.0.tgz",
5284
+ "integrity": "sha512-gXQWrZkXNZZ6qVEh6PQvoASxLY3r6AR4jH8fFjZ+BfPJpDV6RTI82J4A3tkAn2wikU7rxfzU3sIPj94zEV6xPA==",
5285
  "dev": true,
 
5286
  "requires": {
5287
+ "editions": "2.1.3"
5288
+ },
5289
+ "dependencies": {
5290
+ "editions": {
5291
+ "version": "2.1.3",
5292
+ "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
5293
+ "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
5294
+ "dev": true,
5295
+ "requires": {
5296
+ "errlop": "1.1.1",
5297
+ "semver": "5.6.0"
5298
+ }
5299
+ }
5300
  }
5301
  },
5302
+ "resolve": {
5303
+ "version": "1.10.0",
5304
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
5305
+ "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
5306
  "dev": true,
5307
  "requires": {
5308
+ "path-parse": "1.0.6"
5309
  }
5310
  },
 
 
 
 
 
 
5311
  "rimraf": {
5312
+ "version": "2.6.3",
5313
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
5314
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
5315
  "dev": true,
5316
  "requires": {
5317
+ "glob": "7.1.3"
5318
+ },
5319
+ "dependencies": {
5320
+ "glob": {
5321
+ "version": "7.1.3",
5322
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
5323
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
5324
+ "dev": true,
5325
+ "requires": {
5326
+ "fs.realpath": "1.0.0",
5327
+ "inflight": "1.0.6",
5328
+ "inherits": "2.0.3",
5329
+ "minimatch": "3.0.4",
5330
+ "once": "1.4.0",
5331
+ "path-is-absolute": "1.0.1"
5332
+ }
5333
+ }
5334
  }
5335
  },
5336
  "rsyncwrapper": {
5344
  "dependencies": {
5345
  "lodash": {
5346
  "version": "4.15.0",
5347
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.15.0.tgz",
5348
  "integrity": "sha1-MWI5HY8BQKoiz49rPDTWt/Y9Oqk=",
5349
  "dev": true
5350
  }
5431
  },
5432
  "shelljs": {
5433
  "version": "0.3.0",
5434
+ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
5435
  "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
5436
  "dev": true
5437
  },
5485
  "dev": true,
5486
  "requires": {
5487
  "spdx-expression-parse": "3.0.0",
5488
+ "spdx-license-ids": "3.0.3"
5489
  }
5490
  },
5491
  "spdx-exceptions": {
5501
  "dev": true,
5502
  "requires": {
5503
  "spdx-exceptions": "2.2.0",
5504
+ "spdx-license-ids": "3.0.3"
5505
  }
5506
  },
5507
  "spdx-license-ids": {
5508
+ "version": "3.0.3",
5509
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz",
5510
+ "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==",
5511
  "dev": true
5512
  },
 
 
 
 
 
 
 
 
 
 
5513
  "sprintf-js": {
5514
+ "version": "1.1.2",
5515
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
5516
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
5517
  "dev": true
5518
  },
5519
  "squeak": {
5537
  },
5538
  "chalk": {
5539
  "version": "1.1.3",
5540
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5541
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5542
  "dev": true,
5543
  "optional": true,
5559
  }
5560
  },
5561
  "sshpk": {
5562
+ "version": "1.16.1",
5563
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
5564
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
5565
  "dev": true,
5566
  "requires": {
5567
  "asn1": "0.2.4",
5575
  "tweetnacl": "0.14.5"
5576
  }
5577
  },
 
 
 
 
 
 
 
5578
  "stat-mode": {
5579
  "version": "0.2.2",
5580
  "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
5622
  },
5623
  "string_decoder": {
5624
  "version": "1.1.1",
5625
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
5626
  "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
5627
  "dev": true,
5628
  "requires": {
5631
  },
5632
  "strip-ansi": {
5633
  "version": "3.0.1",
5634
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
5635
  "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
5636
  "dev": true,
5637
  "requires": {
5659
  },
5660
  "strip-dirs": {
5661
  "version": "1.1.1",
5662
+ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz",
5663
  "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=",
5664
  "dev": true,
5665
  "requires": {
5679
  },
5680
  "chalk": {
5681
  "version": "1.1.3",
5682
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5683
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5684
  "dev": true,
5685
  "requires": {
5739
  },
5740
  "chalk": {
5741
  "version": "1.1.3",
5742
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5743
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5744
  "dev": true,
5745
  "requires": {
5769
  },
5770
  "svgo": {
5771
  "version": "0.6.6",
5772
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz",
5773
  "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=",
5774
  "dev": true,
5775
  "optional": true,
5798
  },
5799
  "tar": {
5800
  "version": "2.2.1",
5801
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
5802
  "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
5803
  "dev": true,
5804
  "optional": true,
5861
  "dependencies": {
5862
  "uuid": {
5863
  "version": "2.0.3",
5864
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
5865
  "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
5866
  "dev": true
5867
  }
5873
  "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
5874
  "dev": true
5875
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5876
  "through2": {
5877
  "version": "0.6.5",
5878
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
5879
  "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
5880
  "dev": true,
5881
  "requires": {
5891
  },
5892
  "readable-stream": {
5893
  "version": "1.0.34",
5894
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
5895
  "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
5896
  "dev": true,
5897
  "requires": {
5903
  },
5904
  "string_decoder": {
5905
  "version": "0.10.31",
5906
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
5907
  "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
5908
  "dev": true
5909
  }
5933
  },
5934
  "time-grunt": {
5935
  "version": "1.4.0",
5936
+ "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz",
5937
  "integrity": "sha1-BiIT5mDJB+hvRAVWwB6mWXtxJCA=",
5938
  "dev": true,
5939
  "requires": {
5954
  },
5955
  "chalk": {
5956
  "version": "1.1.3",
5957
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
5958
  "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
5959
  "dev": true,
5960
  "requires": {
6003
  "livereload-js": "2.4.0",
6004
  "object-assign": "4.1.1",
6005
  "qs": "6.5.2"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6006
  }
6007
  },
6008
  "to-absolute-glob": {
6026
  "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
6027
  "dev": true,
6028
  "requires": {
6029
+ "psl": "1.1.31",
6030
  "punycode": "1.4.1"
6031
  },
6032
  "dependencies": {
6069
  "dev": true
6070
  },
6071
  "typechecker": {
6072
+ "version": "4.7.0",
6073
+ "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-4.7.0.tgz",
6074
+ "integrity": "sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ==",
6075
  "dev": true,
6076
  "requires": {
6077
+ "editions": "2.1.3"
6078
  },
6079
  "dependencies": {
6080
  "editions": {
6081
+ "version": "2.1.3",
6082
+ "resolved": "https://registry.npmjs.org/editions/-/editions-2.1.3.tgz",
6083
+ "integrity": "sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw==",
6084
  "dev": true,
6085
  "requires": {
6086
+ "errlop": "1.1.1",
6087
  "semver": "5.6.0"
6088
  }
6089
  }
6097
  },
6098
  "underscore": {
6099
  "version": "1.7.0",
6100
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz",
6101
  "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=",
6102
  "dev": true
6103
  },
6107
  "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
6108
  "dev": true,
6109
  "requires": {
6110
+ "sprintf-js": "1.1.2",
6111
  "util-deprecate": "1.0.2"
6112
  }
6113
  },
 
 
 
 
 
 
6114
  "unique-stream": {
6115
+ "version": "2.3.1",
6116
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
6117
+ "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
6118
  "dev": true,
6119
  "requires": {
6120
+ "json-stable-stringify-without-jsonify": "1.0.1",
6121
+ "through2-filter": "3.0.0"
6122
+ },
6123
+ "dependencies": {
6124
+ "through2": {
6125
+ "version": "2.0.5",
6126
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
6127
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
6128
+ "dev": true,
6129
+ "requires": {
6130
+ "readable-stream": "2.3.6",
6131
+ "xtend": "4.0.1"
6132
+ }
6133
+ },
6134
+ "through2-filter": {
6135
+ "version": "3.0.0",
6136
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
6137
+ "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
6138
+ "dev": true,
6139
+ "requires": {
6140
+ "through2": "2.0.5",
6141
+ "xtend": "4.0.1"
6142
+ }
6143
+ }
6144
  }
6145
  },
6146
  "unzip-response": {
6243
  "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
6244
  "dev": true,
6245
  "requires": {
6246
+ "duplexify": "3.7.1",
6247
  "glob-stream": "5.3.5",
6248
  "graceful-fs": "4.1.15",
6249
  "gulp-sourcemaps": "1.6.0",
6276
  },
6277
  "vow": {
6278
  "version": "0.4.4",
6279
+ "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.4.tgz",
6280
  "integrity": "sha1-yf5GCRKdf1qmIVCOvmS1HJW8e5g=",
6281
  "dev": true
6282
  },
6386
  "string-width": "1.0.2"
6387
  }
6388
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6389
  "wrap-fn": {
6390
  "version": "0.1.5",
6391
  "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz",
readme.md CHANGED
@@ -67,6 +67,17 @@ If you wanna learn more about the <a href="http://www.codeinwp.com/blog/fastest-
67
  * fr_FR translation by Jacques Soule of http://wordpress-pour-vous.com/
68
 
69
  ## Changelog ##
 
 
 
 
 
 
 
 
 
 
 
70
  ### 3.4.10 - 2018-12-06 ###
71
 
72
  * Add filter to change schema information
@@ -523,6 +534,7 @@ Alternatively you can also follow the following steps to install the WP Product
523
 
524
 
525
 
 
526
  ### How to activate user reviews ###
527
 
528
  By default user reviews are disabled since not all the themes are compatible with this option due to different designs for the comment box. You can easily activate them from General Settings
@@ -692,6 +704,9 @@ https://themeisle.com/contact
692
  = How to dynamically change the price of the review for particular posts =
693
  [https://docs.themeisle.com/article/906-how-to-dynamically-change-the-price-of-the-review-for-particular-posts](https://docs.themeisle.com/article/906-how-to-dynamically-change-the-price-of-the-review-for-particular-posts)
694
 
 
 
 
695
  == Upgrade Notice ==
696
 
697
  ### 3.0 ###
67
  * fr_FR translation by Jacques Soule of http://wordpress-pour-vous.com/
68
 
69
  ## Changelog ##
70
+ ### 3.5.0 - 2019-02-11 ###
71
+
72
+ * Fix issue with Gutenberg
73
+ * Outgoing Links should have “noopener”
74
+ * Fix RTL support for review comments slider
75
+ * Fix default template showing empty image tag
76
+ * Add ability to recalculate comment ratings
77
+ * Add widget for Top rated products by tag or custom taxonomy
78
+ * Fix user rating in comment for small screens
79
+
80
+
81
  ### 3.4.10 - 2018-12-06 ###
82
 
83
  * Add filter to change schema information
534
 
535
 
536
 
537
+
538
  ### How to activate user reviews ###
539
 
540
  By default user reviews are disabled since not all the themes are compatible with this option due to different designs for the comment box. You can easily activate them from General Settings
704
  = How to dynamically change the price of the review for particular posts =
705
  [https://docs.themeisle.com/article/906-how-to-dynamically-change-the-price-of-the-review-for-particular-posts](https://docs.themeisle.com/article/906-how-to-dynamically-change-the-price-of-the-review-for-particular-posts)
706
 
707
+ = Amazon Integration Documentation =
708
+ [https://docs.themeisle.com/article/448-amazon-integration-documentation](https://docs.themeisle.com/article/448-amazon-integration-documentation)
709
+
710
  == Upgrade Notice ==
711
 
712
  ### 3.0 ###
readme.txt CHANGED
@@ -67,6 +67,17 @@ If you wanna learn more about the <a href="http://www.codeinwp.com/blog/fastest-
67
  * fr_FR translation by Jacques Soule of http://wordpress-pour-vous.com/
68
 
69
  == Changelog ==
 
 
 
 
 
 
 
 
 
 
 
70
  = 3.4.10 - 2018-12-06 =
71
 
72
  * Add filter to change schema information
@@ -524,6 +535,7 @@ Alternatively you can also follow the following steps to install the WP Product
524
 
525
 
526
 
 
527
  = How to activate user reviews =
528
 
529
  By default user reviews are disabled since not all the themes are compatible with this option due to different designs for the comment box. You can easily activate them from General Settings
@@ -696,6 +708,12 @@ https://themeisle.com/contact
696
  = Amazon Integration Documentation =
697
  [https://docs.themeisle.com/article/448-amazon-integration-documentation](https://docs.themeisle.com/article/448-amazon-integration-documentation)
698
 
 
 
 
 
 
 
699
  == Upgrade Notice ==
700
 
701
  = 3.0 =
67
  * fr_FR translation by Jacques Soule of http://wordpress-pour-vous.com/
68
 
69
  == Changelog ==
70
+ = 3.5.0 - 2019-02-11 =
71
+
72
+ * Fix issue with Gutenberg
73
+ * Outgoing Links should have “noopener”
74
+ * Fix RTL support for review comments slider
75
+ * Fix default template showing empty image tag
76
+ * Add ability to recalculate comment ratings
77
+ * Add widget for Top rated products by tag or custom taxonomy
78
+ * Fix user rating in comment for small screens
79
+
80
+
81
  = 3.4.10 - 2018-12-06 =
82
 
83
  * Add filter to change schema information
535
 
536
 
537
 
538
+
539
  = How to activate user reviews =
540
 
541
  By default user reviews are disabled since not all the themes are compatible with this option due to different designs for the comment box. You can easily activate them from General Settings
708
  = Amazon Integration Documentation =
709
  [https://docs.themeisle.com/article/448-amazon-integration-documentation](https://docs.themeisle.com/article/448-amazon-integration-documentation)
710
 
711
+ = In WPPR, how do I,. =
712
+ [https://docs.themeisle.com/article/969-in-wppr-how-do-i](https://docs.themeisle.com/article/969-in-wppr-how-do-i)
713
+
714
+ = How to display product title and image both in review comparison table =
715
+ [https://docs.themeisle.com/article/981-how-to-display-product-title-and-image-both-in-review-comparison-table](https://docs.themeisle.com/article/981-how-to-display-product-title-and-image-both-in-review-comparison-table)
716
+
717
  == Upgrade Notice ==
718
 
719
  = 3.0 =
themeisle-hash.json CHANGED
@@ -1 +1 @@
1
- {"class-wppr-autoloader.php":"96be4219e0b4502f5698c5a8b084d108","index.php":"c76772901fa1b2b14aa3ba32d7773c8a","uninstall.php":"7c6d36652e8dcf013f2c246f4a289acf","wp-product-review.php":"9e47f577befe25e1ad23417955a987e3"}
1
+ {"class-wppr-autoloader.php":"87f19e0b5e3819c2edbd7e3e49b489f9","class-wppr-recursive-filter.php":"6c74b0e7c04529d797ae9689d9a44c8d","index.php":"c76772901fa1b2b14aa3ba32d7773c8a","uninstall.php":"7c6d36652e8dcf013f2c246f4a289acf","wp-product-review.php":"fba78b6fddfe5ce653722ee50d3ffc11"}
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit547363de495c427ec824cfa76390bced::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInita782336d552cb538f39c8cfe5ec6b2ad::getLoader();
vendor/autoload_52.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
- return ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a::getLoader();
4
 
5
  require_once dirname(__FILE__) . '/composer'.'/autoload_real_52.php';
6
 
7
+ return ComposerAutoloaderInitd52742cd39f648242626aa88f81155f0::getLoader();
vendor/codeinwp/themeisle-sdk/CHANGELOG.md ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## [3.0.4](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.3...v3.0.4) (2019-01-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * uninstall feedback disclosure issues when one of the feedback fields is open ([4631eef](https://github.com/Codeinwp/themeisle-sdk/commit/4631eef))
7
+
8
+ ## [3.0.3](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.2...v3.0.3) (2019-01-07)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **build:** fix exit code when is running outside wordpress context ([d298bb5](https://github.com/Codeinwp/themeisle-sdk/commit/d298bb5))
14
+
15
+ ## [3.0.2](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.1...v3.0.2) (2018-12-28)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * remove composer/installers from package requirements ([a0ad543](https://github.com/Codeinwp/themeisle-sdk/commit/a0ad543))
21
+
22
+ ## [3.0.1](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.0...v3.0.1) (2018-12-24)
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * notifications setup triggers after all products register their n… ([999a944](https://github.com/Codeinwp/themeisle-sdk/commit/999a944))
28
+ * notifications setup triggers after all products register their notices ([ec3cacc](https://github.com/Codeinwp/themeisle-sdk/commit/ec3cacc))
29
+
30
+ # 1.0.0 (2018-12-21)
31
+
32
+
33
+ ### Features
34
+
35
+ * adds uninstall feedback privacy policy info ([ed17943](https://github.com/Codeinwp/themeisle-sdk/commit/ed17943))
vendor/codeinwp/themeisle-sdk/Gruntfile.js ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ module.exports = function (grunt) {
2
+ grunt.initConfig(
3
+ {
4
+ version: {
5
+ project: {
6
+ src: [
7
+ 'package.json'
8
+ ]
9
+ },
10
+ composer: {
11
+ src: [
12
+ 'composer.json'
13
+ ]
14
+ },
15
+ load_php: {
16
+ options: {
17
+ prefix: '\\.*\\$themeisle_sdk_version\.*\\s=\.*\\s\''
18
+ },
19
+ src: [
20
+ 'load.php'
21
+ ]
22
+ },
23
+ },
24
+ }
25
+ );
26
+ grunt.loadNpmTasks( 'grunt-version' );
27
+ };
vendor/codeinwp/themeisle-sdk/README.md ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Themeisle SDK
2
+
3
+ ThemeIsle SDK used to register common features for products in the portfolio.
4
+
5
+ Can be installed using composer:
6
+ `composer require codeinwp/themeisle-sdk`
7
+ and manually autoloading the load.php file in the composer.json file of your project:
8
+
9
+ ```
10
+
11
+ "autoload": {
12
+ "files": [
13
+ "vendor/codeinwp/themeisle-sdk/load.php"
14
+ ]
15
+ }
16
+
17
+ ```
18
+
19
+
20
+ ### Features
21
+
22
+ * Loads the most recent version of the library across all the products on the same wordpress instance. For instance if there is a theme which bundles v2.0.0 of the SDK and one plugin which bundles the v1.9.1, it will load on the most recent one, v2.0.0 for both products.
23
+ * If there are two products using the same version, it will load the first one that register the SDK, unless it's explicitly overwritten.
24
+ * Each functionality is bundled into modules, which are loaded based on the product type. Free/Pro, is available on wordpress or not.
25
+
26
+ ### How to register product
27
+
28
+ * The library works out of the box by simply loading the autoloader into the plugin/theme files.
29
+ * Some modules are loaded only if the product is not available on WordPress.org ( licenser/review ). You can define if the product is available on wordpress.org by adding this file header `WordPress Available: <yes|no>` where `<yes|no>` will be replaced with the proper status.
30
+ * If the product requires is a premium one and requires a licesing mechanism, we can use `Requires License: <yes|no>` to specifically tell that the product requires license.
31
+
32
+
vendor/codeinwp/themeisle-sdk/bin/install-wp-tests.sh ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ if [ $# -lt 3 ]; then
4
+ echo "usage: $0 <db-name> <db-user> <db-pass> [db-host] [wp-version] [skip-database-creation]"
5
+ exit 1
6
+ fi
7
+
8
+ DB_NAME=$1
9
+ DB_USER=$2
10
+ DB_PASS=$3
11
+ DB_HOST=${4-localhost}
12
+ WP_VERSION=${5-latest}
13
+ SKIP_DB_CREATE=${6-false}
14
+
15
+ WP_TESTS_DIR=${WP_TESTS_DIR-/tmp/wordpress-tests-lib}
16
+ WP_CORE_DIR=${WP_CORE_DIR-/tmp/wordpress/}
17
+
18
+ command_exists() {
19
+ type -t "$1" >/dev/null 2>&1
20
+ }
21
+ download() {
22
+ if command_exists "curl"; then
23
+ curl -s -o "${2:--}" "$1"
24
+ elif command_exists "wget"; then
25
+ wget -nv -O "${2:--}" "$1"
26
+ fi
27
+ }
28
+ if [[ $WP_VERSION =~ [0-9]+\.[0-9]+(\.[0-9]+)? ]]; then
29
+ WP_TESTS_TAG="tags/$WP_VERSION"
30
+ elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
31
+ WP_TESTS_TAG="trunk"
32
+ else
33
+ # http serves a single offer, whereas https serves multiple. we only want one
34
+ download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json
35
+ grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json
36
+ LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//')
37
+ if [[ -z "$LATEST_VERSION" ]]; then
38
+ echo "Latest WordPress version could not be found"
39
+ exit 1
40
+ fi
41
+ WP_TESTS_TAG="tags/$LATEST_VERSION"
42
+ fi
43
+
44
+ set -ex
45
+
46
+
47
+ install_wp() {
48
+
49
+ if [ -d $WP_CORE_DIR ]; then
50
+ return;
51
+ fi
52
+
53
+ mkdir -p $WP_CORE_DIR
54
+
55
+ if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
56
+ mkdir -p /tmp/wordpress-nightly
57
+ download https://wordpress.org/nightly-builds/wordpress-latest.zip /tmp/wordpress-nightly/wordpress-nightly.zip
58
+ unzip -q /tmp/wordpress-nightly/wordpress-nightly.zip -d /tmp/wordpress-nightly/
59
+ mv /tmp/wordpress-nightly/wordpress/* $WP_CORE_DIR
60
+ else
61
+ if [ $WP_VERSION == 'latest' ]; then
62
+ local ARCHIVE_NAME='latest'
63
+ else
64
+ local ARCHIVE_NAME="wordpress-$WP_VERSION"
65
+ fi
66
+ download https://wordpress.org/${ARCHIVE_NAME}.tar.gz /tmp/wordpress.tar.gz
67
+ tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
68
+ fi
69
+
70
+ download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
71
+ }
72
+
73
+ install_test_suite() {
74
+ # portable in-place argument for both GNU sed and Mac OSX sed
75
+ if [[ $(uname -s) == 'Darwin' ]]; then
76
+ local ioption='-i .bak'
77
+ else
78
+ local ioption='-i'
79
+ fi
80
+
81
+ # set up testing suite if it doesn't yet exist
82
+ if [ ! -d $WP_TESTS_DIR ]; then
83
+ # set up testing suite
84
+ mkdir -p $WP_TESTS_DIR
85
+ svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes
86
+ svn co --quiet https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data
87
+ fi
88
+
89
+ if [ ! -f wp-tests-config.php ]; then
90
+ download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php
91
+ # remove all forward slashes in the end
92
+ WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::")
93
+ sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php
94
+ sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php
95
+ sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php
96
+ sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php
97
+ sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php
98
+ fi
99
+
100
+ }
101
+
102
+ install_db() {
103
+
104
+ if [ ${SKIP_DB_CREATE} = "true" ]; then
105
+ return 0
106
+ fi
107
+
108
+ # parse DB_HOST for port or socket references
109
+ local PARTS=(${DB_HOST//\:/ })
110
+ local DB_HOSTNAME=${PARTS[0]};
111
+ local DB_SOCK_OR_PORT=${PARTS[1]};
112
+ local EXTRA=""
113
+
114
+ if ! [ -z $DB_HOSTNAME ] ; then
115
+ if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then
116
+ EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp"
117
+ elif ! [ -z $DB_SOCK_OR_PORT ] ; then
118
+ EXTRA=" --socket=$DB_SOCK_OR_PORT"
119
+ elif ! [ -z $DB_HOSTNAME ] ; then
120
+ EXTRA=" --host=$DB_HOSTNAME --protocol=tcp"
121
+ fi
122
+ fi
123
+
124
+ # create database
125
+ mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA --execute "CREATE DATABASE IF NOT EXISTS $DB_NAME;"
126
+ }
127
+
128
+ install_wp
129
+ install_test_suite
130
+ install_db
vendor/codeinwp/themeisle-sdk/bin/run-unit-tests.sh ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+ composer global require "phpunit/phpunit=4.8.*|5.7.*"
3
+ bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
4
+ phpunit --version
5
+ php -v
6
+ phpunit || exit 1
7
+ WP_MULTISITE=1 phpunit || exit 1
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-endpoints.php DELETED
@@ -1,312 +0,0 @@
1
- <?php
2
- /**
3
- * The class that exposes endpoints.
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Endpoints
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Endpoints' ) ) :
16
- /**
17
- * Expose endpoints for ThemeIsle SDK.
18
- */
19
- final class ThemeIsle_SDK_Endpoints {
20
-
21
- const SDK_ENDPOINT = 'themeisle-sdk';
22
- const SDK_ENDPOINT_VERSION = 1;
23
-
24
- const HASH_FILE = 'themeisle-hash.json';
25
-
26
- // if true, the endpoint will expect a product slug and will return the value only for that.
27
- const PRODUCT_SPECIFIC = false;
28
-
29
- /**
30
- * @var ThemeIsle_SDK_Product $products Array of Themeisle Product.
31
- */
32
- static protected $products = array();
33
-
34
- /**
35
- * ThemeIsle_SDK_Endpoints constructor.
36
- *
37
- * @param ThemeIsle_SDK_Product $product_object Product Object.
38
- */
39
- public function __construct( $product_object ) {
40
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
41
- self::$products[] = $product_object;
42
- }
43
- $this->setup_endpoints();
44
- }
45
-
46
- /**
47
- * Setup endpoints.
48
- */
49
- private function setup_endpoints() {
50
- global $wp_version;
51
- if ( version_compare( $wp_version, '4.4', '<' ) ) {
52
- // no REST support.
53
- return;
54
- }
55
-
56
- $this->setup_rest();
57
- }
58
-
59
- /**
60
- * Setup REST endpoints.
61
- */
62
- private function setup_rest() {
63
- add_action( 'rest_api_init', array( $this, 'rest_register' ) );
64
- }
65
-
66
- /**
67
- * Registers the endpoints
68
- */
69
- function rest_register() {
70
- register_rest_route(
71
- self::SDK_ENDPOINT . '/v' . self::SDK_ENDPOINT_VERSION,
72
- '/checksum/' . ( self::PRODUCT_SPECIFIC ? '(?P<slug>.*)/' : '' ),
73
- array(
74
- 'methods' => 'GET',
75
- 'callback' => array( $this, 'checksum' ),
76
- )
77
- );
78
- }
79
-
80
- /**
81
- * The checksum endpoint.
82
- *
83
- * @param WP_REST_Request $data the request.
84
- *
85
- * @return WP_REST_Response Response or the error
86
- */
87
- function checksum( WP_REST_Request $data ) {
88
- $products = self::$products;
89
- if ( self::PRODUCT_SPECIFIC ) {
90
- $params = $this->validate_params( $data, array( 'slug' ) );
91
- foreach ( self::$products as $product ) {
92
- if ( $params['slug'] === $product->get_slug() ) {
93
- $products = array( $product );
94
- break;
95
- }
96
- }
97
- }
98
- $response = array();
99
- $custom_css = $this->has_custom_css();
100
- if ( is_bool( $custom_css ) ) {
101
- $response['custom_css'] = $custom_css;
102
- }
103
-
104
- $response['child_theme'] = $this->get_theme_properties();
105
-
106
- foreach ( $products as $product ) {
107
- $files = array();
108
- switch ( $product->get_type() ) {
109
- case 'plugin':
110
- $files = array();
111
- break;
112
- case 'theme':
113
- $files = array( 'style.css', 'functions.php' );
114
- break;
115
- }
116
-
117
- $error = '';
118
-
119
- // if any element in the $files array contains a '/', this would imply recursion is required.
120
- $diff = $this->generate_diff( $product, $files, array_reduce( $files, array( $this, 'is_recursion_required' ), false ) );
121
- if ( is_wp_error( $diff ) ) {
122
- $error = $diff->get_error_message();
123
- $diff = array();
124
- }
125
-
126
- $response['products'][] = array(
127
- 'slug' => $product->get_slug(),
128
- 'version' => $product->get_version(),
129
- 'diffs' => $diff,
130
- 'error' => $error,
131
- );
132
- }
133
-
134
- return new WP_REST_Response( array( 'checksum' => $response ) );
135
- }
136
-
137
- /**
138
- * Get the current theme properties.
139
- *
140
- * @return array Properties of the current theme.
141
- */
142
- function get_theme_properties() {
143
- if ( ! is_child_theme() ) {
144
- return false;
145
- }
146
-
147
- $properties = array();
148
- $theme = wp_get_theme();
149
- // @codingStandardsIgnoreStart
150
- $properties['name'] = $theme->Name;
151
- // @codingStandardsIgnoreEnd
152
-
153
- // get the files in the child theme.
154
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
155
- WP_Filesystem();
156
- global $wp_filesystem;
157
- $path = str_replace( ABSPATH, $wp_filesystem->abspath(), get_stylesheet_directory() );
158
- $list = $wp_filesystem->dirlist( $path, false, false );
159
- if ( $list ) {
160
- $list = array_keys( self::flatten_dirlist( $list ) );
161
- $properties['files'] = $list;
162
- }
163
- return $properties;
164
- }
165
-
166
- /**
167
- * Check if custom css has been added to the theme.
168
- *
169
- * @return bool Whether custom css has been added to the theme.
170
- */
171
- private function has_custom_css() {
172
- $query = new WP_Query(
173
- array(
174
- 'post_type' => 'custom_css',
175
- 'post_status' => 'publish',
176
- 'numberposts' => 1,
177
- 'update_post_meta_cache' => false,
178
- 'update_post_term_cache' => false,
179
- )
180
- );
181
-
182
- if ( $query->have_posts() ) {
183
- $query->the_post();
184
- $content = get_the_content();
185
- // if the content contains a colon, a CSS rule has been added.
186
- return strpos( $content, ':' ) === false ? false : true;
187
- }
188
- return false;
189
- }
190
-
191
- /**
192
- * Check if recursion needs to be enabled on the WP_Filesystem by reducing the array of files to a boolean.
193
- *
194
- * @param string $carry Value of the previous iteration.
195
- * @param string $item Value of the current iteration.
196
- *
197
- * @return bool Whether to recurse or not.
198
- */
199
- function is_recursion_required( $carry, $item ) {
200
- if ( ! $carry ) {
201
- return ( strpos( $item, '/' ) !== false );
202
- }
203
- return $carry;
204
- }
205
-
206
- /**
207
- * Generate the diff of the files.
208
- *
209
- * @param ThemeIsle_SDK_Product $product Themeisle Product.
210
- * @param array $files Array of files.
211
- * @param bool $recurse Whether to recurse or not.
212
- *
213
- * @return string
214
- */
215
- private function generate_diff( $product, $files, $recurse = false ) {
216
- require_once( ABSPATH . 'wp-admin/includes/file.php' );
217
- WP_Filesystem();
218
- global $wp_filesystem;
219
-
220
- $diff = array();
221
- $path = str_replace( ABSPATH, $wp_filesystem->abspath(), plugin_dir_path( $product->get_basefile() ) );
222
- $list = $wp_filesystem->dirlist( $path, false, $recurse );
223
- // nothing found.
224
- if ( ! $list ) {
225
- return $diff;
226
- }
227
- $list = array_keys( self::flatten_dirlist( $list ) );
228
-
229
- // now let's get the valid files that actually exist.
230
- if ( empty( $files ) ) {
231
- $files = $list;
232
- } else {
233
- $files = array_intersect( $files, $list );
234
- }
235
-
236
- // fetch the calculated hashes.
237
- if ( ! $wp_filesystem->is_readable( $path . '/' . self::HASH_FILE ) ) {
238
- return new WP_Error( 'themeisle_sdk_hash_not_found', sprintf( '%s not found', self::HASH_FILE ) );
239
- }
240
-
241
- $hashes = json_decode( $wp_filesystem->get_contents( $path . '/' . self::HASH_FILE ), true );
242
- ksort( $hashes );
243
-
244
- $diff = array();
245
- foreach ( $files as $file ) {
246
- // file does not exist in the hashes.
247
- if ( ! array_key_exists( $file, $hashes ) ) {
248
- continue;
249
- }
250
- $new = md5( $wp_filesystem->get_contents( $path . $file ) );
251
- $old = $hashes[ $file ];
252
-
253
- // same hash, bail.
254
- if ( $new === $old ) {
255
- continue;
256
- }
257
- $diff[] = $file;
258
- }
259
- return $diff;
260
- }
261
-
262
- /**
263
- * Flatten the results of WP_Filesystem::dirlist() for iterating over.
264
- *
265
- * @access private
266
- *
267
- * @param array $nested_files Array of files as returned by WP_Filesystem::dirlist().
268
- * @param string $path Relative path to prepend to child nodes. Optional.
269
- * @return array $files A flattened array of the $nested_files specified.
270
- */
271
- private static function flatten_dirlist( $nested_files, $path = '' ) {
272
- $files = array();
273
- foreach ( $nested_files as $name => $details ) {
274
- $files[ $path . $name ] = $details;
275
- // Append children recursively
276
- if ( ! empty( $details['files'] ) ) {
277
- $children = self::flatten_dirlist( $details['files'], $path . $name . '/' );
278
- // Merge keeping possible numeric keys, which array_merge() will reindex from 0..n
279
- $files = $files + $children;
280
- }
281
- }
282
- return $files;
283
- }
284
-
285
- /**
286
- * Validates the parameters to the API
287
- *
288
- * @param WP_REST_Request $data the request.
289
- * @param array $params the parameters to validate.
290
- *
291
- * @return array of parameter name=>value
292
- */
293
- private function validate_params( WP_REST_Request $data, $params ) {
294
- $collect = array();
295
- foreach ( $params as $param ) {
296
- $value = sanitize_text_field( $data[ $param ] );
297
- if ( empty( $value ) ) {
298
- return new WP_Error(
299
- 'themeisle_' . $param . '_invalid', sprintf( 'Invalid %', $param ), array(
300
- 'status' => 403,
301
- )
302
- );
303
- } else {
304
- $collect[ $param ] = $value;
305
- }
306
- }
307
-
308
- return $collect;
309
- }
310
-
311
- }
312
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-deactivate.php DELETED
@@ -1,556 +0,0 @@
1
- <?php
2
- /**
3
- * The deactivate feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Deactivate' ) ) :
16
- /**
17
- * Deactivate feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Deactivate extends ThemeIsle_SDK_Feedback {
20
-
21
- /**
22
- * @var array $options_plugin The main options list for plugins.
23
- */
24
- private $options_plugin = array(
25
- 'I found a better plugin' => array(
26
- 'id' => 3,
27
- 'type' => 'text',
28
- 'placeholder' => 'What\'s the plugin\'s name?',
29
- ),
30
- 'I could not get the plugin to work' => array(
31
- 'id' => 4,
32
- ),
33
- 'I no longer need the plugin' => array(
34
- 'id' => 5,
35
- 'type' => 'textarea',
36
- 'placeholder' => 'If you could improve one thing about our product, what would it be?',
37
- ),
38
- 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
39
- 'id' => 6,
40
- ),
41
- );
42
-
43
- /**
44
- * @var array $options_theme The main options list for themes.
45
- */
46
- private $options_theme = array(
47
- 'I don\'t know how to make it look like demo' => array(
48
- 'id' => 7,
49
- ),
50
- 'It lacks options' => array(
51
- 'id' => 8,
52
- ),
53
- 'Is not working with a plugin that I need' => array(
54
- 'id' => 9,
55
- 'type' => 'text',
56
- 'placeholder' => 'What is the name of the plugin',
57
- ),
58
- 'I want to try a new design, I don\'t like {theme} style' => array(
59
- 'id' => 10,
60
- ),
61
- );
62
-
63
- /**
64
- * @var array $other The other option
65
- */
66
- private $other = array(
67
- 'Other' => array(
68
- 'id' => 999,
69
- 'type' => 'textarea',
70
- 'placeholder' => 'cmon cmon tell us',
71
- ),
72
- );
73
-
74
- /**
75
- * @var string $heading_plugin The heading of the modal
76
- */
77
- private $heading_plugin = 'Quick Feedback <span>Because we care about our clients, please leave us a feedback.</span>';
78
-
79
- /**
80
- * @var string $heading_theme The heading of the modal
81
- */
82
- private $heading_theme = 'Looking to change {theme} <span> What does not work for you?</span>';
83
-
84
- /**
85
- * @var string $button_submit_before The text of the deactivate button before an option is chosen
86
- */
87
- private $button_submit_before = 'Skip &amp; Deactivate';
88
-
89
- /**
90
- * @var string $button_submit The text of the deactivate button
91
- */
92
- private $button_submit = 'Submit &amp; Deactivate';
93
-
94
- /**
95
- * @var string $button_cancel The text of the cancel button
96
- */
97
- private $button_cancel = 'Skip &amp; Deactivate';
98
-
99
- /**
100
- * @var int how many seconds before the deactivation window is triggered for themes
101
- */
102
- const AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS = 3;
103
-
104
- /**
105
- * @var int how many days before the deactivation window pops up again for the theme
106
- */
107
- const PAUSE_DEACTIVATE_WINDOW_DAYS = 100;
108
-
109
- /**
110
- * ThemeIsle_SDK_Feedback_Deactivate constructor.
111
- *
112
- * @param ThemeIsle_SDK_Product $product_object The product object.
113
- */
114
- public function __construct( $product_object ) {
115
- parent::__construct( $product_object );
116
- }
117
-
118
- /**
119
- * Registers the hooks
120
- */
121
- public function setup_hooks_child() {
122
- global $pagenow;
123
-
124
- if ( ( $this->product->get_type() === 'plugin' && $pagenow === 'plugins.php' ) || ( $this->product->get_type() === 'theme' && $pagenow === 'theme-install.php' ) ) {
125
- add_action( 'admin_head', array( $this, 'load_resources' ) );
126
- }
127
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'post_deactivate' ) );
128
- }
129
-
130
- /**
131
- * Loads the additional resources
132
- */
133
- function load_resources() {
134
- add_thickbox();
135
-
136
- $id = $this->product->get_key() . '_deactivate';
137
-
138
- $this->add_css( $this->product->get_type(), $this->product->get_key() );
139
- $this->add_js( $this->product->get_type(), $this->product->get_key(), '#TB_inline?' . apply_filters( $this->product->get_key() . '_feedback_deactivate_attributes', 'width=600&height=550' ) . '&inlineId=' . $id );
140
-
141
- echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
142
- }
143
-
144
- /**
145
- * Loads the css
146
- *
147
- * @param string $type The type of product.
148
- * @param string $key The product key.
149
- */
150
- function add_css( $type, $key ) {
151
- $suffix = 'theme' === $type ? 'theme-install-php' : 'plugins-php';
152
- ?>
153
- <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
154
- input[name="ti-deactivate-option"] ~ div {
155
- display: none;
156
- }
157
-
158
- input[name="ti-deactivate-option"]:checked ~ div {
159
- display: block;
160
- }
161
-
162
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
163
- background: none !important;
164
- }
165
-
166
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
167
- background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkVDM0M4RkYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkVDM0M5MEYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2RUMzQzhERjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM2RUMzQzhFRjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KBNOswAAFtFJREFUeNrkWwmUXVWV3W/8Y81zkVAhgUwQg00IAYIRGcRuERDSKqALtVEbxRYcGzWIuhatKCYuUXQtERRtFAccQCDtckCZwpRISEIlIXMqlaGGP///ht7n3vd//YRUUkljN718a53U+++//97d95yzz3BvjDAM8fd02May4YndaZhoDErYeu/laCyN8rN16PuDAPA83mcAjjOxd8jcVypydhrlKspCSidlhPIk5T8p9/+PAP8fTrZJaaQ0UFxKiVKk/CvlU5Rk3b0C+gTKFZRvUa75/wJ4EuVcyimU2RGQdkqCkoOBDExjBoJx3Uwm5OlXt4bFrIPgTXSJK+DY59PEO8a5s0mPiEPyfUrwMieh3ED57qsTsJBhoXAOmps+gd6u85AvGtgxQEOmJcfj+vvxDsvS/hzsB5pkgA9QplJuoux59QD2g1ZUvCXhVe+4pnjxJc5gdx8SxTza1jwDY9ntMDdsBlLJQ4O2CTogRs+vBzydFmLCMm98NWl4OvL5O3Hd+09/9p8/iK/9GOjfRHZKpnHZWy7AlbfPRuK918DYTm3H3PHZWrQbVnHKtUBbh201EvSFvHLX0TLlK3ksRLG4HPPmnL7+0vfiaz8EOkwP+aduwPKbZ+DadyzBnVuPBa4nEQf+/hqW0zKvZcqkJoYmi0DTMXo2+cyltiu8oSi+HQrR3UG5+n9Fw6bFmRYJOVehUf/VAsrPacodOPtM3LcmjmPSwMz4cvzXAJEXt6C89gv49rJTcMk3zkdPL8e9e0iTVNHTTziuGTi9D5jF73oaNVg5RnLAjiywagfwp01ybiJufQOOuYMTdf9hg3s5H83oEQIWhYwOMGySf2KNFTjJchW0EMmPKB1KMx2d2LQFGCKtvPD0A1izbitnitcZbrat+T12Fi8i4C5g6y49kDkk7re/RoNtTmo+DiKmFlPupaZPbAPOp3VceSLwYD/fttrFUPlbSNsL+YgtB48QjGKmje+ceBlKlqsATBywIe82sG9TC5OhONqP2wOnucB0wRY13Cn6qQWPYgEtVNZvf8/J3RhnZAprrtjY81qkxHX3jGrtvn8esHgm0wzek6Vf76Y2Q19ncibBmymeM1Mz+H1IS2ji9XfPAuZzAm5+ajLWDn8JKfvymgprQczHyvbpGEh14f2nX89sLyVsehQmbQewKj5GBxtQzMXQ3DvyWcvxz9rPvFf9Fed+ELjnl8Q07To07FyJ3MATCDouxXmL344pO55nmsFs8avMHE8jmH1/puzmkEsarBo7n2dweCbn06YFxJizWJzFErVW5Kwez8m45VTgM08txqqhu5C0HxyDHNIIDSxedCP6Ozk5Bb6rNHzkpCWQTJqlwQcWcgkUh+NXG2b4sf1uSjDGPvQITh98Bh/5F35s6UXTovvR+eaVuPD6O/DRt8bg/uL7CK+nj75mI7DtD0CefhkUopfYkUZtDdyn75Y2kMz+wvtW6s8yMRmCaCLwG2Za6E5ch4xnoMLPZUo2g3uPPQfr25iNFob3U76BpUMTVK2JBLOmP37hU5hE5yzBvbZz2p6lyXYSiH/AvBVLCI/pRvnmG7Fy8nysYtgVEz+jIYPuu7+NSvIe2OfZMIvh4YuQevIRkxYtx6fxd662hkZOzu9257Fk/esZrlaI2arY+PY70d8yhRNZOWKWPobSS4fPFBx37YaeHkwdGrgCqfDWZGveRHAQI6GWje07EXvfRzB/0XzMn0UfzdBnH/oLwrOogTcfS7BbtSaPxL7kfp+aLayliR+nJytDEz8jnsRpDW/F45kVFTfE0rmXo7+VPOqXjygOn0f5qXgk5QnKc9Ty50MVfozbGjqyVFFwIFWM0XkioXPiB8hct9wGfI15Qmo3gnfSb3MZVW4e1SGmHtL8K1u1G1QYciyCflPqPFRK9ouN0/CJM6+LNBtOKA6Lqy6hfJri1H5jWbFUIX9D75597yM/NSWaiwfG4ZeDlpw4ldLvjXO23zOPeYMPw9/HqY5pRj+qg8/1yebYp0ktzwfNDGdgvnvcKnd6P7yKDmcTzLQE7Oc4SMflty1xA21JEyazng8v/4110uDmrrAphBXzdK47kUNYdS7j94ITEI7uhOkEh56sCefsGQ1cEotkIV3+ePKUm856txCXlKCXqLzgMIDfqEowaqQ1YaCv0URrjJyciGHu9k24+k8PsiB1EW8q6rg40S6GzPbZ3bSnOK1xAJZtHrpwmHDM4HODnDbtcAiPetNnb8x1fBFmebnK+oBHKVeOZ9JMBPEfHKDbTrBdKZMZX4gS3TDvmHjvA79BayGDYSONWKo8ce36BNZGgCd3EmyRRDt8BMw8kaNquhXmLC3vrHhOj2GXqp54POUHUVL0hQM1fBXvOjnlGOgm2Arjrcdn5VwHJ2zZggueXYEc4tSOD8vxxupW4zDAJcuaxBDSmUaQzzKS5HXV87cowWFMgWPElBtSHLPGW1I/L64HzGwB75KTjqShrI3JlBprgbnoPz3xONqZrVRoEKYVQrGzmJSkhgJ6PABGBLiPBBW3SJySXHhjJd8rfhiK/CVtF8X1pk3EdP4iL/x36ZOZtUonxClJ3iQ3lqldscQK70tmczj/mRUoE6z8TqolBboKWDqSVeDjabvZ0n7MxCH0A/ytjqyf5msspTCxTpvDEdCmHtZrKYuqgC8VbTe5ot1QZWjyg6ztYNbmzZi+Y5tkViqlNKhdQ4BVw45Dc3Uj0CIHalvuFfsJyuqrMLReAcI6+DGCHsX+AccZRPSR4JCa40bVtF8no4tJ4a7GxXELWLnRDyUBt7DghReQCop8gHFAmhdGPWd7f007ddqu4hLt+gX6vuTJCX4MXnHvlVRzS2lmrfgQxYVROtDg1sb+D6Zql4Y4PsY6ltasAQfanA3Px4xtWyIXqFZd9EXF0KFuw4h2rQioAu3UmbmpQUtiIKHDFKtoQTlb0t+9YkeFFtmNFUNMJw0ydGjUwErH16VNR6/rkT9zJCSJc8tNnjLnkD5rIp3N44TB7UzHx8KI75mcxGiw5XIENgLp2AdoPLq2Tx6aV1qOt01CcUieUTk8w0848SpjXeFUPDvUQmCBAloFK2IyZzC1jlIy8mnqN2bVlDWPlqnVhlwO7SOj/DymjYCARdRgBbA8yHXHfLhewwJW/GSbaJkaDrKwk0m4bXMwujkLv1JSWaJ6vIyoKvJMSWwM6XuVyXWM374kO8FBJknYKYn1T07hKzxyjPbfsE7qWoEyIsxU8SliNvFdZdJ8sctEIVEq1/xXDCVkdVQpOHAk+ZDYVSCQpubIj0w9SDVoQycnTGIwyAcOcBr7mAp6MSS6ephenonsrrX06wzcRJSLmJoMaYD0FpvjINsZbeQhxvAKx5HfiFR7hWltXV9bUtyB45G6YzPMS0scq1XTcFjT8Jiz26r0k4nlVS9ATUJ+jpVKcFgD1/uwvKY4GkeyI6fnbZQgWlt0fSqrDPJ039DgxfSFmkd5/Uk+9DiadSWrfhZjgRxrWohyIY+glFcmboQmgcdYVzTDdJs4KQ0E18RrBGi5KA3vRqb/e2jsLfKxjp5ctxW4mwnRmgHFlZ7y33BMwxHVBDqSlgVwuxF94YU6u/KV8UtzkjE3Yrux0B4qwGHF4kB4U5GmNkoQba21RoGWqI8soMVzHufnN1CaWc/6jh4N73HTSdJoS9TlqIoVdTwkhPH54u+Bg1hbL7zhhfByD8BtciS7AJa3oXD3Ls73ND7Oh7TpqiYtMELolkBkEFmzuqajTDnyYb/6i4NkRAKYZSdBM5pZUWjas0f/KBar8+U6ApNguJevepD3S1oq5WFYjjqT9GOPbiEpZ00KWgLpcVV0p0OE1uE0dHGiCLSBz3osicqyvchk5V1mzb9rJh2pStrdUSDca0buq8ZbZWgvMt4SycejnRgHKYCkiad8VF5C08fOnWPsXGXsGmh+bqTJ/5Gv+4skeOL/uxWJVTMwMuH+f2vnVcCVKMaWYIiKfsf33pLF8EuuKtsrDv1eIkagDTqo8+OSF1Y1vM6MNF5LOJT/Rg5QJPuWGGfNAzoH8rk4EkdxOKGb8uI8+6i1wUHdxKuxdB14N5J7ONCnKEkBRMuo7NXaRtSDluEoYNXzYIxn42KFW2H8mr/9RoD8YAK5bJqG7yGXSMC3rJqGa2YtU1RbnsJacZS9QlyS45vRzETxB3kOcJQAmlnlAC8v6Ya2NaG7saTSTbUSsX2H1mZ3J99i6BaPYYyJpO5Fyvd8zdxn82Ux+nSZBOinOIBG3cEQkgqicCXEZEvSQlm5De6d62CtcMmPDvYNtCh05GXsaGmlm/Pd5aI230hpokBZoeF8+VXA2yX58ALNxYrMOMNhpYJhFv4bWzswbe+gWp4/0JdL+RiGCbplCrVbbeYx91Ya6u2l9jy9hUHFV1NPgISpMuUXPF8VgZ7O8zSBm6MRUdmatITtZa1pE8H+gdHg90xP88yVYw72bGiHR841VdAMsbp7kn5HqJspSsOGNueK1uJW6cvZ0Yr6BWOa9RnfPSU+zbm/vRMX9P91nGIsxMiuBrXkku6kFXhV0FsYn8mufX3UakL7uBFpu8ri0vXYxGvfpbRR+qQ/ymE2+nqhf4TnWzlhLxLwFko+VGwfsHzd3d+OYjamwIp2C2T21cccq0mwluqHKsUs+DV3FJy7BfCDlE+q7ocCW1Ga0H+BZ6YcC+8xs6b9AwHLRO3a1KxCTLo9r8OQaGcX/ZmlJSZz5pv5vR1qbVc3usgT04a+f4R/VxDg414UNH3USjaJ55KvM8Hw6Q4717eiRP5wIt5leoLdqUb0d3VANe/qxik/r/PfX1cbAOTN8F7RqMkSzvA9DVYYkgnBo32TsT3Vwhf44y4/BjTnLRtbMTSQ1pwvaaGQlmRh617UMjwytvovImvDVUJL8LzBlrKGk0CRxSdh9WaGuTSvxwzkMzG8tJYxl2DdCFKoSj0Pz07qow83wygXUQ1Gmp1R5SQx598qwAZ1bwTBZw2/sgu+NmVEJm0z192VTuGxqceypK1gvCpW6ksh602bmrCV4rGiUhqVBN3k+fAwTZOgX1jDV/PdmYzWpLCqG9XTMgFy7lRragkbJKB8EQMbXWxY08yCy1Wldf3CiVS/D594orIaQ1mo7pULCZfHNsfcSxnU+7Sk7RJiA5/+Sf7gzv1MWkyLL//ZSSfirc8/zzwjPKAuHnt5Ujieyf3OXUkMZ1z09mTR0soUUIBX15IlKxOti7nXJyhG3Sq/76kmurx+eNjFjp2NJPE4Gvn8GIz9Jl2UsLmhDQ/PnKUX2eQdQri81w9q95JR8c0xi4wiMjV9l+GX51C7HzUi4hJN28UAj0yZhGe6e3Dqzu3Iwh23G5siMGmrDBdsrNnYgPSuBDoIurWpzCTMZ4IU+a56pRexeFhXaxsoknn3jiSxZyiGQs5BOrTQRgDmAWCrgH8697UYbOZ00BoNy9HRgn4fmrWGrCwobKgDnNAxTmvu0wQ7jdq9WJk1NW3zb9G1cMcpc3Dab7brimmcJpzyKYLu5PAkaR3OGViXt2EPkNASHhqZbCQI3LGDagRRIMuUfNFGJm+xxONAPQspPqNLadXcr8yrHi45ZWeiEXedOo+2WyJ1cGRq+cZSZaTkBtT0V3jh9v04x3SeQpibxxtGRKPSLriaoNtpWgurmnaLJfxqxhRc8WwfXrd9G0Zgjdt3rA6skeWdLEEXGY4ynLgcZ2AoK9SnSa32+9BQnmhT4jxvJcAUn+9EXYvxmkEpavfW+QuxpZ2ESu2GaoVfp6msukbD0FrCRy57Wa8g9p5f0s+eRzi0AIYnhWmZEc94yPTKi0hkvaJpiw5VJE+v7whx0Ysb4Pr2YZeFor6m0riYZRMhNfJvo3wmoJQ6t9DMJKOV0hY6PLcI+uDmW//cBpTxdFcvPn7hBZxAQ2l3LKMz/0jbvoqgfnawBTvLeRvhpVfDSD3Hp3GWStKkdzJGJfaQEeTONYJyl1FxOePD2HT2UnrALrxx5SSUEE60vVYDL3bhEk6cwJIEFuNfV5X7Ri3OH+6pYsoVMvn7Lv5HvNTWBlfiOlSltJl+chOB/htls+ztODjgxbKKx9fGNsFs+gPM9ntZkrK+tEdGjHz3b81ifD7cHZPDObfAbFmJJ2ZmMXVLA07d2oa8mt8j7i++TCa+ZhgyGnhYsuhM/Oqk6YiXmDeY5mBoWt8kwA9QHmYY9BXYcQDbtWEECf3XGoLR8X2QMSgztgT5rvuQ2ngG0ttglRLw3AAfvfZpdIzE8PrVnRhGpa67ZEZtfh0fxwCadZVW9bpRIz8j+nSo60Jdab7rK/Pm4tvzZiNeLA7CjP2ARHUbtfvShNcmEj9JtEWl0J66TZ6S2b4OZmkx06+FLDSVFdRWP8m07QT8nS/NxzmruzEkoGMBUhcW4E4vo9zvIv/LJIKyLLP6SF2Uh9PnofRXF7n7Eyp0WC28fnEOdpeP4tMMQcvjasKc7gqSb8nDag5QfDSO/J8lswoU2K/PnYUbz16wwTGdH5pm7K7QcjZSFGGFJsWOxIrxL8W0Dgp4drSzzVHNSr3Fty3a0jv+ki9BNzHkfHXpPFzy5CTElg0geWlG0yqDcf7HDdjzuVZ0LtuN+Hl5XWyzasrc3ozh25rQ+d1diJ1WrDWbRm5uRebeNLp/NAB7dinaZ2lg9DOt2Ht3E76+YMajSxfM/QFJ7Sem6exToBTYIwcsfxdR7o7ATsw0JFelVg1iuXXzdFy7uEHFT5BtmQUwQlRQejyO+MKC6lQq77HKCAs+ys/FEDtLth/FdP/KLiEYZhnX7yB2ulyXriSvx3i+r1z6ycfmfehtfed/H+1WOc2iIqiCOgrAJC21sYRFLO6LAM+e6Hq0RQ2ULQ99cwy8OdHNCyIs4o0043ce9hQBm6Tt9PB6g4qehpGFPZlAPH52u/X1MAnDzcCeRAMrs7Jy5DoLkYATksoWEyflbyqY7s7n9/WgUIrBdkNNSgKoKkbd+SFIq/6KOP5llPOjnaq7J7QIz/LOzUlY4ODcTmqL3uB06hXYkpR3BGx31V3nfaVQA3Wi+90u1ZVU99ukEIelnt2uvy+45tSpQ6nvXPgAnrrsDlwxaxUrRwsFz8HRHPYBw1+ktv8CA9FC7oSOuBnuYaLcBrvDqHU7jfU6T5LNKwJA9aaCqKMRRDvsOnV3RJp0og11Pa0nSMrRIK9VUtLLE3M6d+Dui36IM57ehqWr3oD+zGRYTFmtowQcQv9HC9Hy6ye42WCfZeDz81NSxFpfVqZbXVU0qsCk5OvV8xdGSyWmdD9oAW5v1I2sjO3ZkL2V1fv90aoidJzypca2cc3Jf8a7pq/CHS8uwJfXnIvthW7FsbI74Uj3Sz9GOScC/fNqDXmQTRXS87mlFARnzYwnll3U1JZFmR7g7dba9Bjh1F4Ot4IKjSUY0vslKzs0CLle3qZ70GLS5c16c4rBqqL8kloN1PsqX9K9aea7+42gHEfaKeLDJz+MNRd/HjedfB+unPYnloQWg4F52Dh8qO8lHk+Jtv+INWSjpp+MarjAYvvnfVNxSXOrlJWP8pY07BaClRLUl//g8Fma7FJqmfVAU3Q9WMfrzFF9ZkdxQ5GTtGoN40lev4cfblVmbST0xBnmI/xHdhcVDo6A8++UlH0+t28qrlxxPVbnZnBOjYOy9OG2Hm6OZPz9/q6EHNG4eTlHuIQaPY7mzN+Yn1N9JMMq0mQ/icquHmpwLa/LXotHVPEalD5EP23l9VUc+fUc9UoOKQU/9x7OLSndelJfHwesckRqtKyVdnLbOjQ4hUPuATP+3v4r3n8LMAAsR90w+kkNLQAAAABJRU5ErkJggg==') 40px 30px no-repeat;
168
- border: none;
169
- box-sizing: border-box;
170
- color: #373e40;
171
- font-size: 24px;
172
- font-weight: 700;
173
- height: 90px;
174
- padding: 40px 40px 0 120px;
175
- text-transform: uppercase;
176
- width: 100%;
177
- }
178
-
179
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
180
- box-sizing: border-box;
181
- padding: 30px 40px;
182
- background-color: #eaeaea;
183
- }
184
-
185
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button {
186
- background: #ec5d60;
187
- border: none;
188
- box-shadow: none;
189
- color: #ffffff;
190
- font-size: 15px;
191
- font-weight: 700;
192
- height: auto;
193
- line-height: 20px;
194
- padding: 10px 15px;
195
- text-transform: uppercase;
196
- -webkit-transition: 0.3s ease;
197
- -moz-transition: 0.3s ease;
198
- -ms-transition: 0.3s ease;
199
- -o-transition: 0.3s ease;
200
- transition: 0.3s ease;
201
- }
202
-
203
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary {
204
- background: transparent;
205
- box-shadow: none;
206
- color: #8d9192;
207
- font-weight: 400;
208
- float: right;
209
- line-height: 40px;
210
- padding: 0;
211
- text-decoration: underline;
212
- text-shadow: none;
213
- text-transform: none;
214
- }
215
-
216
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:hover {
217
- background: #e83f42;
218
- }
219
-
220
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
221
- background: transparent;
222
- }
223
-
224
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:focus {
225
- box-shadow: none;
226
- outline: none;
227
- }
228
-
229
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:active {
230
- box-shadow: none;
231
- transform: translateY(0);
232
- }
233
-
234
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:disabled {
235
- cursor: not-allowed;
236
- }
237
-
238
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
239
- text-decoration: none;
240
- }
241
-
242
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
243
- background-color: #ffffff;
244
- }
245
-
246
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list {
247
- margin: 0;
248
- }
249
-
250
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
251
- color: #373e40;
252
- font-size: 13px;
253
- margin-bottom: 5px;
254
- }
255
-
256
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li label {
257
- margin-left: 10px;
258
- line-height: 28px;
259
- font-size: 15px;
260
- }
261
-
262
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list input[type=radio] {
263
- margin-top: 1px;
264
- }
265
-
266
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxContent {
267
- box-sizing: border-box;
268
- height: auto !important;
269
- padding: 20px 40px;
270
- width: 100% !important;
271
- }
272
-
273
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
274
- padding: 10px 15px;
275
- width: 100%;
276
- }
277
-
278
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
279
- margin: 10px 30px;
280
- }
281
-
282
- .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
283
- box-sizing: border-box;
284
- display: block;
285
- float: none;
286
- font-weight: 700;
287
- line-height: 1;
288
- padding: 0;
289
- text-align: left;
290
- width: 100%;
291
- }
292
-
293
- .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle span {
294
- color: #8d9192;
295
- display: block;
296
- font-size: 15px;
297
- font-weight: 400;
298
- margin-top: 5px;
299
- text-transform: none;
300
- }
301
-
302
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
303
- width: 100%;
304
- display: block;
305
- position: absolute;
306
- left: 0;
307
- bottom: 0;
308
- }
309
-
310
- .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
311
- font-size: 32px;
312
- }
313
-
314
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
315
- color: #eee;
316
- }
317
-
318
- .<?php echo $key; ?>-container #TB_closeWindowButton {
319
- left: auto;
320
- right: -5px;
321
- top: -35px;
322
- color: #eee;
323
- }
324
-
325
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
326
- text-align: right;
327
- line-height: 25px;
328
- width: 25px;
329
- height: 25px;
330
- }
331
-
332
- .<?php echo $key; ?>-container #TB_closeWindowButton:focus .tb-close-icon {
333
- box-shadow: none;
334
- outline: none;
335
- }
336
-
337
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
338
- font: normal 25px dashicons;
339
- }
340
-
341
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container {
342
- margin: auto !important;
343
- height: 500px !important;
344
- top: 0 !important;
345
- left: 0 !important;
346
- bottom: 0 !important;
347
- right: 0 !important;
348
- width: 600px !important;
349
- }
350
- </style>
351
- <?php
352
- }
353
-
354
- /**
355
- * Loads the js
356
- *
357
- * @param string $type The type of product.
358
- * @param string $key The product key.
359
- * @param string $src The url that will hijack the deactivate button url.
360
- */
361
- function add_js( $type, $key, $src ) {
362
- $heading = 'plugin' === $type ? $this->heading_plugin : str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
363
- $heading = apply_filters( $this->product->get_key() . '_feedback_deactivate_heading', $heading );
364
- ?>
365
- <script type="text/javascript" id="ti-deactivate-js">
366
- (function ($) {
367
- $(document).ready(function () {
368
- var auto_trigger = false;
369
- var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
370
- <?php
371
- if ( 'theme' === $type ) {
372
- ?>
373
- auto_trigger = true;
374
- if ($('a.ti-auto-anchor').length == 0) {
375
- $('body').append($('<a class="ti-auto-anchor" href=""></a>'));
376
- }
377
- target_element = 'a.ti-auto-anchor';
378
- <?php
379
- }
380
- ?>
381
-
382
- if (auto_trigger) {
383
- setTimeout(function () {
384
- $('a.ti-auto-anchor').trigger('click');
385
- }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
386
- }
387
- $(document).on('thickbox:removed', function () {
388
- $.ajax({
389
- url: ajaxurl,
390
- method: 'post',
391
- data: {
392
- 'action': '<?php echo $key . __CLASS__; ?>',
393
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
394
- 'type': '<?php echo $type; ?>',
395
- 'key': '<?php echo $key; ?>'
396
- },
397
- });
398
- });
399
- var href = $(target_element).attr('href');
400
- $('#<?php echo $key; ?>ti-deactivate-no').attr('data-ti-action', href).on('click', function (e) {
401
- e.preventDefault();
402
- e.stopPropagation();
403
-
404
- $('body').unbind('thickbox:removed');
405
- tb_remove();
406
- var redirect = $(this).attr('data-ti-action');
407
- if (redirect != '') {
408
- location.href = redirect;
409
- }
410
- });
411
-
412
- $('#<?php echo $key; ?> ul.ti-list label, #<?php echo $key; ?> ul.ti-list input[name="ti-deactivate-option"]').on('click', function (e) {
413
- $('#<?php echo $key; ?>ti-deactivate-yes').val($('#<?php echo $key; ?>ti-deactivate-yes').attr('data-after-text'));
414
-
415
- var radio = $(this).prop('tagName') === 'LABEL' ? $(this).parent() : $(this);
416
- if (radio.parent().find('textarea').length > 0 && radio.parent().find('textarea').val().length === 0) {
417
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
418
- radio.parent().find('textarea').on('keyup', function (ee) {
419
- if ($(this).val().length === 0) {
420
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
421
- } else {
422
- $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
423
- }
424
- });
425
- } else {
426
- $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
427
- }
428
- });
429
-
430
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('data-ti-action', href).on('click', function (e) {
431
- e.preventDefault();
432
- e.stopPropagation();
433
- $.ajax({
434
- url: ajaxurl,
435
- method: 'post',
436
- data: {
437
- 'action': '<?php echo $key . __CLASS__; ?>',
438
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
439
- 'id': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().attr('ti-option-id'),
440
- 'msg': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().find('textarea').val(),
441
- 'type': '<?php echo $type; ?>',
442
- 'key': '<?php echo $key; ?>'
443
- },
444
- });
445
- var redirect = $(this).attr('data-ti-action');
446
- if (redirect != '') {
447
- location.href = redirect;
448
- } else {
449
- $('body').unbind('thickbox:removed');
450
- tb_remove();
451
- }
452
- });
453
-
454
- $(target_element).attr('name', '<?php echo wp_kses( $heading, array( 'span' => array() ) ); ?>').attr('href', '<?php echo $src; ?>').addClass('thickbox');
455
- var thicbox_timer;
456
- $(target_element).on('click', function () {
457
- tiBindThickbox();
458
- });
459
-
460
- function tiBindThickbox() {
461
- var thicbox_timer = setTimeout(function () {
462
- if ($("#<?php echo esc_html( $key ); ?>").is(":visible")) {
463
- $("body").trigger('thickbox:iframe:loaded');
464
- $("#TB_window").addClass("<?php echo $key; ?>-container");
465
- clearTimeout(thicbox_timer);
466
- $('body').unbind('thickbox:removed');
467
- } else {
468
- tiBindThickbox();
469
- }
470
- }, 100);
471
- }
472
- });
473
- })(jQuery);
474
- </script>
475
- <?php
476
- }
477
-
478
- /**
479
- * Generates the HTML
480
- *
481
- * @param string $type The type of product.
482
- * @param string $key The product key.
483
- */
484
- function get_html( $type, $key ) {
485
- $options = 'plugin' === $type ? $this->options_plugin : $this->options_theme;
486
- $button_submit_before = 'plugin' === $type ? $this->button_submit_before : 'Submit';
487
- $button_submit = 'plugin' === $type ? $this->button_submit : 'Submit';
488
- $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
489
- $button_submit_before = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit_before', $button_submit_before );
490
- $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $button_submit );
491
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
492
-
493
- $options += $this->other;
494
-
495
- $list = '';
496
- foreach ( $options as $title => $attributes ) {
497
- $id = $attributes['id'];
498
- $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
499
- if ( array_key_exists( 'type', $attributes ) ) {
500
- $list .= '<div>';
501
- $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
502
- switch ( $attributes['type'] ) {
503
- case 'text':
504
- $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
505
- break;
506
- case 'textarea':
507
- $list .= '<textarea style="width: 100%" rows="2" name="comments" placeholder="' . $placeholder . '"></textarea>';
508
- break;
509
- }
510
- $list .= '</div>';
511
- }
512
- $list .= '</li>';
513
- }
514
-
515
- return '<div id="' . $this->product->get_key() . '">'
516
- . '<ul class="ti-list">' . $list . '</ul>'
517
- . '<div class="actions">'
518
- . get_submit_button(
519
- $button_submit, 'secondary', $this->product->get_key() . 'ti-deactivate-yes', false, array(
520
- 'data-after-text' => $button_submit,
521
- 'disabled' => true,
522
- )
523
- )
524
- . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
525
- . '</div></div>';
526
- }
527
-
528
- /**
529
- * Called when the deactivate button is clicked
530
- */
531
- function post_deactivate() {
532
- check_ajax_referer( (string) __CLASS__, 'nonce' );
533
-
534
- if ( ! empty( $_POST['id'] ) ) {
535
- $this->call_api(
536
- array(
537
- 'type' => 'deactivate',
538
- 'id' => $_POST['id'],
539
- 'comment' => isset( $_POST['msg'] ) ? $_POST['msg'] : '',
540
- )
541
- );
542
- }
543
-
544
- $this->post_deactivate_or_cancel();
545
- }
546
-
547
- /**
548
- * Called when the deactivate/cancel button is clicked
549
- */
550
- private function post_deactivate_or_cancel() {
551
- if ( isset( $_POST['type'] ) && isset( $_POST['key'] ) && 'theme' === $_POST['type'] ) {
552
- set_transient( 'ti_sdk_pause_' . $_POST['key'], true, PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );
553
- }
554
- }
555
- }
556
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-factory.php DELETED
@@ -1,50 +0,0 @@
1
- <?php
2
- /**
3
- * The feedback factory class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Factory' ) ) :
16
- /**
17
- * Feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Factory {
20
-
21
- /**
22
- * @var array $instances collection of the instances that are registered with the factory
23
- */
24
- private $_instances = array();
25
-
26
- /**
27
- * ThemeIsle_SDK_Feedback_Factory constructor.
28
- *
29
- * @param ThemeIsle_SDK_Product $product_object Product Object.
30
- * @param array $feedback_types the feedback types.
31
- */
32
- public function __construct( $product_object, $feedback_types ) {
33
- if ( $product_object instanceof ThemeIsle_SDK_Product && $feedback_types && is_array( $feedback_types ) ) {
34
- foreach ( $feedback_types as $type ) {
35
- $class = 'ThemeIsle_SDK_Feedback_' . ucwords( $type );
36
- $instance = new $class( $product_object );
37
- $this->_instances[ $type ] = $instance;
38
- $instance->setup_hooks();
39
- }
40
- }
41
- }
42
-
43
- /**
44
- * Get the registered instances
45
- */
46
- public function get_instances() {
47
- return $this->_instances;
48
- }
49
- }
50
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-review.php DELETED
@@ -1,209 +0,0 @@
1
- <?php
2
- /**
3
- * The review feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Review' ) ) :
16
- /**
17
- * Deactivate feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Review extends ThemeIsle_SDK_Feedback {
20
-
21
- /**
22
- * @var string $heading The heading of the modal
23
- */
24
- private $heading = 'Hey, it’s great to see you have <b>{product}</b> active for a few days now. How is everything going? If you can spare a few moments to rate it on WordPress.org it would help us a lot (and boost my motivation). Cheers! <br/> <br/>~ {developer}, developer of {product}';
25
-
26
- /**
27
- * @var string $msg The text of the modal
28
- */
29
- private $msg = '';
30
-
31
- /**
32
- * @var string $button_cancel The text of the cancel button
33
- */
34
- private $button_cancel = 'No, thanks.';
35
- /**
36
- * @var array Developers who work for each type of product for review purpose.
37
- */
38
- private $developers = array(
39
- 'plugin' => array( 'Marius', 'Bogdan' ),
40
- 'theme' => array( 'Rodica', 'Andrei', 'Bogdan', 'Cristi' ),
41
- );
42
- /**
43
- * @var string $button_already The text of the already did it button
44
- */
45
- private $button_do = 'Ok, I will gladly help.';
46
-
47
- /**
48
- * ThemeIsle_SDK_Feedback_Deactivate constructor.
49
- *
50
- * @param ThemeIsle_SDK_Product $product_object The product object.
51
- */
52
- public function __construct( $product_object ) {
53
- parent::__construct( $product_object );
54
- }
55
-
56
- /**
57
- * Registers the hooks
58
- */
59
- public function setup_hooks_child() {
60
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
61
- }
62
-
63
- /**
64
- * Either we can notify or not.
65
- *
66
- * @return bool Notification available or not.
67
- */
68
- public function can_notify() {
69
- if ( ! $this->product->is_wordpress_available() ) {
70
- $this->disable();
71
-
72
- return false;
73
- }
74
- $show = get_option( $this->product->get_key() . '_review_flag', 'yes' );
75
- if ( 'no' === $show ) {
76
- return false;
77
- }
78
- $finally_show = apply_filters( $this->product->get_key() . '_feedback_review_trigger', true );
79
- if ( false !== $finally_show ) {
80
- if ( is_array( $finally_show ) && ! empty( $finally_show ) ) {
81
- $this->heading = $finally_show['heading'];
82
- $this->msg = $finally_show['msg'];
83
- }
84
- } else {
85
- return false;
86
- }
87
-
88
- return true;
89
- }
90
-
91
- /**
92
- * Shows the notification
93
- */
94
- function show_notification() {
95
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
96
- }
97
-
98
- /**
99
- * Shows the admin notice
100
- */
101
- function admin_notices() {
102
- $id = $this->product->get_key() . '_review';
103
-
104
- $this->add_css( $this->product->get_key() );
105
- $this->add_js( $this->product->get_key() );
106
-
107
- echo '<div class="notice notice-success is-dismissible" id="' . $id . '" ><div class="themeisle-review-box">' . $this->get_html( $this->product->get_key() ) . '</div></div>';
108
- }
109
-
110
- /**
111
- * Loads the css
112
- *
113
- * @param string $key The product key.
114
- */
115
- function add_css( $key ) {
116
- ?>
117
- <style type="text/css" id="<?php echo $key; ?>ti-review-css">
118
- #<?php echo $key; ?>-review-notification {
119
- padding-bottom: 5px;
120
- }
121
-
122
- #<?php echo $key; ?>-review-notification .review-dismiss {
123
- margin-left: 5px;
124
- }
125
- </style>
126
- <?php
127
- }
128
-
129
- /**
130
- * Loads the js
131
- *
132
- * @param string $key The product key.
133
- */
134
- function add_js( $key ) {
135
- ?>
136
- <script type="text/javascript" id="<?php echo $key; ?>ti-review-js">
137
- (function ($) {
138
- $(document).ready(function () {
139
- $('#<?php echo $key; ?>_review').on('click', '.notice-dismiss, .review-dismiss', function (e) {
140
-
141
- $.ajax({
142
- url: ajaxurl,
143
- method: "post",
144
- data: {
145
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
146
- 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>'
147
- },
148
- success: function () {
149
- $('#<?php echo $key; ?>_review').html('<p><b>Thanks for your answer.</b></p>');
150
- }
151
- });
152
- });
153
- });
154
- })(jQuery);
155
- </script>
156
- <?php
157
- }
158
-
159
- /**
160
- * Generates the HTML
161
- *
162
- * @param string $key The product key.
163
- */
164
- function get_html( $key ) {
165
- $link = 'https://wordpress.org/support/' . $this->product->get_type() . '/' . $this->product->get_slug() . '/reviews/#wporg-footer';
166
- $heading = apply_filters( $this->product->get_key() . '_feedback_review_heading', $this->heading );
167
- $heading = str_replace(
168
- array( '{product}' ),
169
- $this->product->get_friendly_name(), $heading
170
- );
171
- $heading = str_replace( '{developer}', $this->developers[ $this->product->get_type() ][ rand( 0, ( count( $this->developers[ $this->product->get_type() ] ) - 1 ) ) ], $heading );
172
-
173
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_review_button_cancel', $this->button_cancel );
174
- $button_do = apply_filters( $this->product->get_key() . '_feedback_review_button_do', $this->button_do );
175
- $msg = apply_filters( $this->product->get_key() . '_feedback_review_message', $this->msg );
176
-
177
- return '<div id="' . $this->product->get_key() . '-review-notification" class="themeisle-sdk-review-box">'
178
- . '<p>' . $heading . '</p>'
179
- . ( $msg ? '<p>' . $msg . '</p>' : '' )
180
- . '<div class="actions">'
181
- . '<a href="' . $link . '" target="_blank" class="button button-primary review-dismiss"> ' . $button_do . '</a>'
182
- . get_submit_button( $button_cancel, 'review-dismiss ' . $this->product->get_key() . '-ti-review', $this->product->get_key() . 'ti-review-no', false )
183
- . '</div></div>';
184
- }
185
-
186
- /**
187
- * Called when the either button is clicked
188
- */
189
- function dismiss() {
190
- check_ajax_referer( (string) __CLASS__, 'nonce' );
191
-
192
- $this->disable();
193
- }
194
-
195
- /**
196
- * Disables the notification
197
- */
198
- protected function disable() {
199
- update_option( $this->product->get_key() . '_review_flag', 'no' );
200
- }
201
-
202
- /**
203
- * Enables the notification
204
- */
205
- protected function enable() {
206
- update_option( $this->product->get_key() . '_review_flag', 'yes' );
207
- }
208
- }
209
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback-translate.php DELETED
@@ -1,983 +0,0 @@
1
- <?php
2
- /**
3
- * The Translate feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback_Translate' ) ) :
16
- /**
17
- * Translate feedback model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Feedback_Translate extends ThemeIsle_SDK_Feedback {
20
-
21
- /**
22
- * @var string $heading The heading of the modal
23
- */
24
- private $heading = 'Improve {product}';
25
- /**
26
- * @var string The message.
27
- */
28
- private $msg = 'Translating <b>{product}</b> into as many languages as possible is a huge project. We still need help with a lot of them, so if you are good at translating into <b>{language}</b>, it would be greatly appreciated.
29
- The process is easy, and you can join by following the link below!';
30
- /**
31
- * @var string $button_cancel The text of the cancel button
32
- */
33
- private $button_cancel = 'No, thanks.';
34
- /**
35
- * @var string $button_already The text of the already did it button
36
- */
37
- private $button_do = 'Ok, I will gladly help.';
38
- /**
39
- * @var array Array of available locals.
40
- */
41
- private $locales = array(
42
- 'af' => array(
43
- 'slug' => 'af',
44
- 'name' => 'Afrikaans',
45
- ),
46
- 'ak' => array(
47
- 'slug' => 'ak',
48
- 'name' => 'Akan',
49
- ),
50
- 'am' => array(
51
- 'slug' => 'am',
52
- 'name' => 'Amharic',
53
- ),
54
- 'ar' => array(
55
- 'slug' => 'ar',
56
- 'name' => 'Arabic',
57
- ),
58
- 'arq' => array(
59
- 'slug' => 'arq',
60
- 'name' => 'Algerian Arabic',
61
- ),
62
- 'ary' => array(
63
- 'slug' => 'ary',
64
- 'name' => 'Moroccan Arabic',
65
- ),
66
- 'as' => array(
67
- 'slug' => 'as',
68
- 'name' => 'Assamese',
69
- ),
70
- 'ast' => array(
71
- 'slug' => 'ast',
72
- 'name' => 'Asturian',
73
- ),
74
- 'az' => array(
75
- 'slug' => 'az',
76
- 'name' => 'Azerbaijani',
77
- ),
78
- 'azb' => array(
79
- 'slug' => 'azb',
80
- 'name' => 'South Azerbaijani',
81
- ),
82
- 'az_TR' => array(
83
- 'slug' => 'az-tr',
84
- 'name' => 'Azerbaijani (Turkey)',
85
- ),
86
- 'ba' => array(
87
- 'slug' => 'ba',
88
- 'name' => 'Bashkir',
89
- ),
90
- 'bal' => array(
91
- 'slug' => 'bal',
92
- 'name' => 'Catalan (Balear)',
93
- ),
94
- 'bcc' => array(
95
- 'slug' => 'bcc',
96
- 'name' => 'Balochi Southern',
97
- ),
98
- 'bel' => array(
99
- 'slug' => 'bel',
100
- 'name' => 'Belarusian',
101
- ),
102
- 'bg_BG' => array(
103
- 'slug' => 'bg',
104
- 'name' => 'Bulgarian',
105
- ),
106
- 'bn_BD' => array(
107
- 'slug' => 'bn',
108
- 'name' => 'Bengali',
109
- ),
110
- 'bo' => array(
111
- 'slug' => 'bo',
112
- 'name' => 'Tibetan',
113
- ),
114
- 'bre' => array(
115
- 'slug' => 'br',
116
- 'name' => 'Breton',
117
- ),
118
- 'bs_BA' => array(
119
- 'slug' => 'bs',
120
- 'name' => 'Bosnian',
121
- ),
122
- 'ca' => array(
123
- 'slug' => 'ca',
124
- 'name' => 'Catalan',
125
- ),
126
- 'ceb' => array(
127
- 'slug' => 'ceb',
128
- 'name' => 'Cebuano',
129
- ),
130
- 'ckb' => array(
131
- 'slug' => 'ckb',
132
- 'name' => 'Kurdish (Sorani)',
133
- ),
134
- 'co' => array(
135
- 'slug' => 'co',
136
- 'name' => 'Corsican',
137
- ),
138
- 'cs_CZ' => array(
139
- 'slug' => 'cs',
140
- 'name' => 'Czech',
141
- ),
142
- 'cy' => array(
143
- 'slug' => 'cy',
144
- 'name' => 'Welsh',
145
- ),
146
- 'da_DK' => array(
147
- 'slug' => 'da',
148
- 'name' => 'Danish',
149
- ),
150
- 'de_DE' => array(
151
- 'slug' => 'de',
152
- 'name' => 'German',
153
- ),
154
- 'de_CH' => array(
155
- 'slug' => 'de-ch',
156
- 'name' => 'German (Switzerland)',
157
- ),
158
- 'dv' => array(
159
- 'slug' => 'dv',
160
- 'name' => 'Dhivehi',
161
- ),
162
- 'dzo' => array(
163
- 'slug' => 'dzo',
164
- 'name' => 'Dzongkha',
165
- ),
166
- 'el' => array(
167
- 'slug' => 'el',
168
- 'name' => 'Greek',
169
- ),
170
- 'art_xemoji' => array(
171
- 'slug' => 'art-xemoji',
172
- 'name' => 'Emoji',
173
- ),
174
- 'en_US' => array(
175
- 'slug' => 'en',
176
- 'name' => 'English',
177
- ),
178
- 'en_AU' => array(
179
- 'slug' => 'en-au',
180
- 'name' => 'English (Australia)',
181
- ),
182
- 'en_CA' => array(
183
- 'slug' => 'en-ca',
184
- 'name' => 'English (Canada)',
185
- ),
186
- 'en_GB' => array(
187
- 'slug' => 'en-gb',
188
- 'name' => 'English (UK)',
189
- ),
190
- 'en_NZ' => array(
191
- 'slug' => 'en-nz',
192
- 'name' => 'English (New Zealand)',
193
- ),
194
- 'en_ZA' => array(
195
- 'slug' => 'en-za',
196
- 'name' => 'English (South Africa)',
197
- ),
198
- 'eo' => array(
199
- 'slug' => 'eo',
200
- 'name' => 'Esperanto',
201
- ),
202
- 'es_ES' => array(
203
- 'slug' => 'es',
204
- 'name' => 'Spanish (Spain)',
205
- ),
206
- 'es_AR' => array(
207
- 'slug' => 'es-ar',
208
- 'name' => 'Spanish (Argentina)',
209
- ),
210
- 'es_CL' => array(
211
- 'slug' => 'es-cl',
212
- 'name' => 'Spanish (Chile)',
213
- ),
214
- 'es_CO' => array(
215
- 'slug' => 'es-co',
216
- 'name' => 'Spanish (Colombia)',
217
- ),
218
- 'es_CR' => array(
219
- 'slug' => 'es-cr',
220
- 'name' => 'Spanish (Costa Rica)',
221
- ),
222
- 'es_GT' => array(
223
- 'slug' => 'es-gt',
224
- 'name' => 'Spanish (Guatemala)',
225
- ),
226
- 'es_MX' => array(
227
- 'slug' => 'es-mx',
228
- 'name' => 'Spanish (Mexico)',
229
- ),
230
- 'es_PE' => array(
231
- 'slug' => 'es-pe',
232
- 'name' => 'Spanish (Peru)',
233
- ),
234
- 'es_PR' => array(
235
- 'slug' => 'es-pr',
236
- 'name' => 'Spanish (Puerto Rico)',
237
- ),
238
- 'es_VE' => array(
239
- 'slug' => 'es-ve',
240
- 'name' => 'Spanish (Venezuela)',
241
- ),
242
- 'et' => array(
243
- 'slug' => 'et',
244
- 'name' => 'Estonian',
245
- ),
246
- 'eu' => array(
247
- 'slug' => 'eu',
248
- 'name' => 'Basque',
249
- ),
250
- 'fa_IR' => array(
251
- 'slug' => 'fa',
252
- 'name' => 'Persian',
253
- ),
254
- 'fa_AF' => array(
255
- 'slug' => 'fa-af',
256
- 'name' => 'Persian (Afghanistan)',
257
- ),
258
- 'fuc' => array(
259
- 'slug' => 'fuc',
260
- 'name' => 'Fulah',
261
- ),
262
- 'fi' => array(
263
- 'slug' => 'fi',
264
- 'name' => 'Finnish',
265
- ),
266
- 'fo' => array(
267
- 'slug' => 'fo',
268
- 'name' => 'Faroese',
269
- ),
270
- 'fr_FR' => array(
271
- 'slug' => 'fr',
272
- 'name' => 'French (France)',
273
- ),
274
- 'fr_BE' => array(
275
- 'slug' => 'fr-be',
276
- 'name' => 'French (Belgium)',
277
- ),
278
- 'fr_CA' => array(
279
- 'slug' => 'fr-ca',
280
- 'name' => 'French (Canada)',
281
- ),
282
- 'frp' => array(
283
- 'slug' => 'frp',
284
- 'name' => 'Arpitan',
285
- ),
286
- 'fur' => array(
287
- 'slug' => 'fur',
288
- 'name' => 'Friulian',
289
- ),
290
- 'fy' => array(
291
- 'slug' => 'fy',
292
- 'name' => 'Frisian',
293
- ),
294
- 'ga' => array(
295
- 'slug' => 'ga',
296
- 'name' => 'Irish',
297
- ),
298
- 'gd' => array(
299
- 'slug' => 'gd',
300
- 'name' => 'Scottish Gaelic',
301
- ),
302
- 'gl_ES' => array(
303
- 'slug' => 'gl',
304
- 'name' => 'Galician',
305
- ),
306
- 'gn' => array(
307
- 'slug' => 'gn',
308
- 'name' => 'Guaraní',
309
- ),
310
- 'gsw' => array(
311
- 'slug' => 'gsw',
312
- 'name' => 'Swiss German',
313
- ),
314
- 'gu' => array(
315
- 'slug' => 'gu',
316
- 'name' => 'Gujarati',
317
- ),
318
- 'hat' => array(
319
- 'slug' => 'hat',
320
- 'name' => 'Haitian Creole',
321
- ),
322
- 'hau' => array(
323
- 'slug' => 'hau',
324
- 'name' => 'Hausa',
325
- ),
326
- 'haw_US' => array(
327
- 'slug' => 'haw',
328
- 'name' => 'Hawaiian',
329
- ),
330
- 'haz' => array(
331
- 'slug' => 'haz',
332
- 'name' => 'Hazaragi',
333
- ),
334
- 'he_IL' => array(
335
- 'slug' => 'he',
336
- 'name' => 'Hebrew',
337
- ),
338
- 'hi_IN' => array(
339
- 'slug' => 'hi',
340
- 'name' => 'Hindi',
341
- ),
342
- 'hr' => array(
343
- 'slug' => 'hr',
344
- 'name' => 'Croatian',
345
- ),
346
- 'hu_HU' => array(
347
- 'slug' => 'hu',
348
- 'name' => 'Hungarian',
349
- ),
350
- 'hy' => array(
351
- 'slug' => 'hy',
352
- 'name' => 'Armenian',
353
- ),
354
- 'id_ID' => array(
355
- 'slug' => 'id',
356
- 'name' => 'Indonesian',
357
- ),
358
- 'ido' => array(
359
- 'slug' => 'ido',
360
- 'name' => 'Ido',
361
- ),
362
- 'is_IS' => array(
363
- 'slug' => 'is',
364
- 'name' => 'Icelandic',
365
- ),
366
- 'it_IT' => array(
367
- 'slug' => 'it',
368
- 'name' => 'Italian',
369
- ),
370
- 'ja' => array(
371
- 'slug' => 'ja',
372
- 'name' => 'Japanese',
373
- ),
374
- 'jv_ID' => array(
375
- 'slug' => 'jv',
376
- 'name' => 'Javanese',
377
- ),
378
- 'ka_GE' => array(
379
- 'slug' => 'ka',
380
- 'name' => 'Georgian',
381
- ),
382
- 'kab' => array(
383
- 'slug' => 'kab',
384
- 'name' => 'Kabyle',
385
- ),
386
- 'kal' => array(
387
- 'slug' => 'kal',
388
- 'name' => 'Greenlandic',
389
- ),
390
- 'kin' => array(
391
- 'slug' => 'kin',
392
- 'name' => 'Kinyarwanda',
393
- ),
394
- 'kk' => array(
395
- 'slug' => 'kk',
396
- 'name' => 'Kazakh',
397
- ),
398
- 'km' => array(
399
- 'slug' => 'km',
400
- 'name' => 'Khmer',
401
- ),
402
- 'kn' => array(
403
- 'slug' => 'kn',
404
- 'name' => 'Kannada',
405
- ),
406
- 'ko_KR' => array(
407
- 'slug' => 'ko',
408
- 'name' => 'Korean',
409
- ),
410
- 'kir' => array(
411
- 'slug' => 'kir',
412
- 'name' => 'Kyrgyz',
413
- ),
414
- 'lb_LU' => array(
415
- 'slug' => 'lb',
416
- 'name' => 'Luxembourgish',
417
- ),
418
- 'li' => array(
419
- 'slug' => 'li',
420
- 'name' => 'Limburgish',
421
- ),
422
- 'lin' => array(
423
- 'slug' => 'lin',
424
- 'name' => 'Lingala',
425
- ),
426
- 'lo' => array(
427
- 'slug' => 'lo',
428
- 'name' => 'Lao',
429
- ),
430
- 'lt_LT' => array(
431
- 'slug' => 'lt',
432
- 'name' => 'Lithuanian',
433
- ),
434
- 'lv' => array(
435
- 'slug' => 'lv',
436
- 'name' => 'Latvian',
437
- ),
438
- 'me_ME' => array(
439
- 'slug' => 'me',
440
- 'name' => 'Montenegrin',
441
- ),
442
- 'mg_MG' => array(
443
- 'slug' => 'mg',
444
- 'name' => 'Malagasy',
445
- ),
446
- 'mk_MK' => array(
447
- 'slug' => 'mk',
448
- 'name' => 'Macedonian',
449
- ),
450
- 'ml_IN' => array(
451
- 'slug' => 'ml',
452
- 'name' => 'Malayalam',
453
- ),
454
- 'mlt' => array(
455
- 'slug' => 'mlt',
456
- 'name' => 'Maltese',
457
- ),
458
- 'mn' => array(
459
- 'slug' => 'mn',
460
- 'name' => 'Mongolian',
461
- ),
462
- 'mr' => array(
463
- 'slug' => 'mr',
464
- 'name' => 'Marathi',
465
- ),
466
- 'mri' => array(
467
- 'slug' => 'mri',
468
- 'name' => 'Maori',
469
- ),
470
- 'ms_MY' => array(
471
- 'slug' => 'ms',
472
- 'name' => 'Malay',
473
- ),
474
- 'my_MM' => array(
475
- 'slug' => 'mya',
476
- 'name' => 'Myanmar (Burmese)',
477
- ),
478
- 'ne_NP' => array(
479
- 'slug' => 'ne',
480
- 'name' => 'Nepali',
481
- ),
482
- 'nb_NO' => array(
483
- 'slug' => 'nb',
484
- 'name' => 'Norwegian (Bokmål)',
485
- ),
486
- 'nl_NL' => array(
487
- 'slug' => 'nl',
488
- 'name' => 'Dutch',
489
- ),
490
- 'nl_BE' => array(
491
- 'slug' => 'nl-be',
492
- 'name' => 'Dutch (Belgium)',
493
- ),
494
- 'nn_NO' => array(
495
- 'slug' => 'nn',
496
- 'name' => 'Norwegian (Nynorsk)',
497
- ),
498
- 'oci' => array(
499
- 'slug' => 'oci',
500
- 'name' => 'Occitan',
501
- ),
502
- 'ory' => array(
503
- 'slug' => 'ory',
504
- 'name' => 'Oriya',
505
- ),
506
- 'os' => array(
507
- 'slug' => 'os',
508
- 'name' => 'Ossetic',
509
- ),
510
- 'pa_IN' => array(
511
- 'slug' => 'pa',
512
- 'name' => 'Punjabi',
513
- ),
514
- 'pl_PL' => array(
515
- 'slug' => 'pl',
516
- 'name' => 'Polish',
517
- ),
518
- 'pt_BR' => array(
519
- 'slug' => 'pt-br',
520
- 'name' => 'Portuguese (Brazil)',
521
- ),
522
- 'pt_PT' => array(
523
- 'slug' => 'pt',
524
- 'name' => 'Portuguese (Portugal)',
525
- ),
526
- 'ps' => array(
527
- 'slug' => 'ps',
528
- 'name' => 'Pashto',
529
- ),
530
- 'rhg' => array(
531
- 'slug' => 'rhg',
532
- 'name' => 'Rohingya',
533
- ),
534
- 'ro_RO' => array(
535
- 'slug' => 'ro',
536
- 'name' => 'Romanian',
537
- ),
538
- 'roh' => array(
539
- 'slug' => 'roh',
540
- 'name' => 'Romansh',
541
- ),
542
- 'ru_RU' => array(
543
- 'slug' => 'ru',
544
- 'name' => 'Russian',
545
- ),
546
- 'rue' => array(
547
- 'slug' => 'rue',
548
- 'name' => 'Rusyn',
549
- ),
550
- 'rup_MK' => array(
551
- 'slug' => 'rup',
552
- 'name' => 'Aromanian',
553
- ),
554
- 'sah' => array(
555
- 'slug' => 'sah',
556
- 'name' => 'Sakha',
557
- ),
558
- 'sa_IN' => array(
559
- 'slug' => 'sa-in',
560
- 'name' => 'Sanskrit',
561
- ),
562
- 'scn' => array(
563
- 'slug' => 'scn',
564
- 'name' => 'Sicilian',
565
- ),
566
- 'si_LK' => array(
567
- 'slug' => 'si',
568
- 'name' => 'Sinhala',
569
- ),
570
- 'sk_SK' => array(
571
- 'slug' => 'sk',
572
- 'name' => 'Slovak',
573
- ),
574
- 'sl_SI' => array(
575
- 'slug' => 'sl',
576
- 'name' => 'Slovenian',
577
- ),
578
- 'sna' => array(
579
- 'slug' => 'sna',
580
- 'name' => 'Shona',
581
- ),
582
- 'snd' => array(
583
- 'slug' => 'snd',
584
- 'name' => 'Sindhi',
585
- ),
586
- 'so_SO' => array(
587
- 'slug' => 'so',
588
- 'name' => 'Somali',
589
- ),
590
- 'sq' => array(
591
- 'slug' => 'sq',
592
- 'name' => 'Albanian',
593
- ),
594
- 'sq_XK' => array(
595
- 'slug' => 'sq-xk',
596
- 'name' => 'Shqip (Kosovo)',
597
- ),
598
- 'sr_RS' => array(
599
- 'slug' => 'sr',
600
- 'name' => 'Serbian',
601
- ),
602
- 'srd' => array(
603
- 'slug' => 'srd',
604
- 'name' => 'Sardinian',
605
- ),
606
- 'su_ID' => array(
607
- 'slug' => 'su',
608
- 'name' => 'Sundanese',
609
- ),
610
- 'sv_SE' => array(
611
- 'slug' => 'sv',
612
- 'name' => 'Swedish',
613
- ),
614
- 'sw' => array(
615
- 'slug' => 'sw',
616
- 'name' => 'Swahili',
617
- ),
618
- 'syr' => array(
619
- 'slug' => 'syr',
620
- 'name' => 'Syriac',
621
- ),
622
- 'szl' => array(
623
- 'slug' => 'szl',
624
- 'name' => 'Silesian',
625
- ),
626
- 'ta_IN' => array(
627
- 'slug' => 'ta',
628
- 'name' => 'Tamil',
629
- ),
630
- 'ta_LK' => array(
631
- 'slug' => 'ta-lk',
632
- 'name' => 'Tamil (Sri Lanka)',
633
- ),
634
- 'tah' => array(
635
- 'slug' => 'tah',
636
- 'name' => 'Tahitian',
637
- ),
638
- 'te' => array(
639
- 'slug' => 'te',
640
- 'name' => 'Telugu',
641
- ),
642
- 'tg' => array(
643
- 'slug' => 'tg',
644
- 'name' => 'Tajik',
645
- ),
646
- 'th' => array(
647
- 'slug' => 'th',
648
- 'name' => 'Thai',
649
- ),
650
- 'tir' => array(
651
- 'slug' => 'tir',
652
- 'name' => 'Tigrinya',
653
- ),
654
- 'tl' => array(
655
- 'slug' => 'tl',
656
- 'name' => 'Tagalog',
657
- ),
658
- 'tr_TR' => array(
659
- 'slug' => 'tr',
660
- 'name' => 'Turkish',
661
- ),
662
- 'tt_RU' => array(
663
- 'slug' => 'tt',
664
- 'name' => 'Tatar',
665
- ),
666
- 'tuk' => array(
667
- 'slug' => 'tuk',
668
- 'name' => 'Turkmen',
669
- ),
670
- 'twd' => array(
671
- 'slug' => 'twd',
672
- 'name' => 'Tweants',
673
- ),
674
- 'tzm' => array(
675
- 'slug' => 'tzm',
676
- 'name' => 'Tamazight (Central Atlas)',
677
- ),
678
- 'ug_CN' => array(
679
- 'slug' => 'ug',
680
- 'name' => 'Uighur',
681
- ),
682
- 'uk' => array(
683
- 'slug' => 'uk',
684
- 'name' => 'Ukrainian',
685
- ),
686
- 'ur' => array(
687
- 'slug' => 'ur',
688
- 'name' => 'Urdu',
689
- ),
690
- 'uz_UZ' => array(
691
- 'slug' => 'uz',
692
- 'name' => 'Uzbek',
693
- ),
694
- 'vi' => array(
695
- 'slug' => 'vi',
696
- 'name' => 'Vietnamese',
697
- ),
698
- 'wa' => array(
699
- 'slug' => 'wa',
700
- 'name' => 'Walloon',
701
- ),
702
- 'xho' => array(
703
- 'slug' => 'xho',
704
- 'name' => 'Xhosa',
705
- ),
706
- 'xmf' => array(
707
- 'slug' => 'xmf',
708
- 'name' => 'Mingrelian',
709
- ),
710
- 'yor' => array(
711
- 'slug' => 'yor',
712
- 'name' => 'Yoruba',
713
- ),
714
- 'zh_CN' => array(
715
- 'slug' => 'zh-cn',
716
- 'name' => 'Chinese (China)',
717
- ),
718
- 'zh_HK' => array(
719
- 'slug' => 'zh-hk',
720
- 'name' => 'Chinese (Hong Kong)',
721
- ),
722
- 'zh_TW' => array(
723
- 'slug' => 'zh-tw',
724
- 'name' => 'Chinese (Taiwan)',
725
- ),
726
- 'de_DE_formal' => array(
727
- 'slug' => 'de/formal',
728
- 'name' => 'German (Formal)',
729
- ),
730
- 'nl_NL_formal' => array(
731
- 'slug' => 'nl/formal',
732
- 'name' => 'Dutch (Formal)',
733
- ),
734
- 'de_CH_informal' => array(
735
- 'slug' => 'de-ch/informal',
736
- 'name' => 'Chinese (Taiwan)',
737
- ),
738
- 'pt_PT_ao90' => array(
739
- 'slug' => 'pt/ao90',
740
- 'name' => 'Portuguese (Portugal, AO90)',
741
- ),
742
- );
743
-
744
- /**
745
- * ThemeIsle_SDK_Feedback_Translate constructor.
746
- *
747
- * @param ThemeIsle_SDK_Product $product_object The product object.
748
- */
749
- public function __construct( $product_object ) {
750
- parent::__construct( $product_object );
751
- }
752
-
753
- /**
754
- * Return the locale path.
755
- *
756
- * @param string $locale Locale code.
757
- *
758
- * @return string Locale path.
759
- */
760
- private function get_locale_paths( $locale ) {
761
- if ( empty( $locale ) ) {
762
- return '';
763
- }
764
-
765
- $slug = isset( $this->locales[ $locale ] ) ? $this->locales[ $locale ]['slug'] : '';
766
- if ( empty( $slug ) ) {
767
- return '';
768
- }
769
- if ( strpos( $slug, '/' ) === false ) {
770
- $slug .= '/default';
771
- }
772
- $url = 'https://translate.wordpress.org/projects/wp-' . $this->product->get_type() . 's/' . $this->product->get_slug() . '/' . ( $this->product->get_type() === 'plugin' ? 'dev/' : '' ) . $slug . '?filters%5Bstatus%5D=untranslated&sort%5Bby%5D=random';
773
-
774
- return $url;
775
- }
776
-
777
- /**
778
- * Registers the hooks
779
- */
780
- public function setup_hooks_child() {
781
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
782
- }
783
-
784
- /**
785
- * Either we should show the notification or not.
786
- *
787
- * @return bool Valid notification.
788
- */
789
- function can_notify() {
790
- if ( ! $this->product->is_wordpress_available() ) {
791
- $this->disable();
792
- return false;
793
- }
794
- $show = get_option( $this->product->get_key() . '_translate_flag', 'yes' );
795
- if ( 'no' === $show ) {
796
- return false;
797
- }
798
- $lang = $this->get_user_locale();
799
- if ( 'en_US' === $lang ) {
800
- return false;
801
- }
802
- $languages = $this->get_translations();
803
- if ( ! is_array( $languages ) ) {
804
- return false;
805
- }
806
- if ( ! isset( $languages['translations'] ) ) {
807
- return false;
808
- }
809
-
810
- $languages = $languages['translations'];
811
- $available = wp_list_pluck( $languages, 'language' );
812
- if ( in_array( $lang, $available ) ) {
813
- return false;
814
- }
815
- if ( ! isset( $this->locales[ $lang ] ) ) {
816
- return false;
817
- }
818
-
819
- return true;
820
- }
821
-
822
- /**
823
- * Get the user's locale.
824
- */
825
- private function get_user_locale() {
826
- global $wp_version;
827
- if ( version_compare( $wp_version, '4.7.0', '>=' ) ) {
828
- return get_user_locale();
829
- }
830
- $user = wp_get_current_user();
831
- if ( $user ) {
832
- $locale = $user->locale;
833
- }
834
- return $locale ? $locale : get_locale();
835
- }
836
-
837
- /**
838
- * Shows the notification
839
- */
840
- function show_notification() {
841
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
842
- }
843
-
844
- /**
845
- * Shows the admin notice
846
- */
847
- function admin_notices() {
848
- $id = $this->product->get_key() . '_translate';
849
-
850
- $this->add_css( $this->product->get_key() );
851
- $this->add_js( $this->product->get_key() );
852
- $html = $this->get_html( $this->product->get_key() );
853
-
854
- if ( $html ) {
855
- echo '<div class="notice notice-success is-dismissible" id="' . $id . '" ><div class="themeisle-translate-box">' . $html . '</div></div>';
856
- }
857
- }
858
-
859
- /**
860
- * Loads the css
861
- *
862
- * @param string $key The product key.
863
- */
864
- function add_css( $key ) {
865
- ?>
866
- <style type="text/css" id="<?php echo $key; ?>ti-translate-css">
867
- </style>
868
- <?php
869
- }
870
-
871
- /**
872
- * Loads the js
873
- *
874
- * @param string $key The product key.
875
- */
876
- function add_js( $key ) {
877
- ?>
878
- <script type="text/javascript" id="<?php echo $key; ?>ti-translate-js">
879
- (function ($) {
880
- $(document).ready(function () {
881
- $('#<?php echo $key; ?>_translate').on('click', '.translate-dismiss', function (e) {
882
-
883
- $.ajax({
884
- url: ajaxurl,
885
- method: "post",
886
- data: {
887
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
888
- 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>'
889
- },
890
- success: function () {
891
- $('#<?php echo $key; ?>_translate').html('<p><b>Thanks for your answer.</b></p>');
892
- }
893
- });
894
- });
895
- });
896
- })(jQuery);
897
- </script>
898
- <?php
899
- }
900
-
901
- /**
902
- * Fetch translations from api.
903
- *
904
- * @return mixed Translation array.
905
- */
906
- private function get_translations() {
907
- $cache_key = $this->product->get_key() . '_all_languages';
908
- $translations = get_transient( $cache_key );
909
-
910
- if ( $translations === false ) {
911
- require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
912
- $translations = translations_api(
913
- $this->product->get_type() . 's',
914
- array(
915
- 'slug' => $this->product->get_slug(),
916
- 'version' => $this->product->get_version(),
917
- )
918
- );
919
- set_transient( $cache_key, $translations, WEEK_IN_SECONDS );
920
- }
921
-
922
- return $translations;
923
-
924
- }
925
-
926
- /**
927
- * Generates the HTML
928
- *
929
- * @param string $key The product key.
930
- *
931
- * @return void|string Html code of the notification.
932
- */
933
- function get_html( $key ) {
934
- $lang = $this->get_user_locale();
935
- $link = $this->get_locale_paths( $lang );
936
- $heading = apply_filters( $this->product->get_key() . '_feedback_translate_heading', $this->heading );
937
- $product = $this->product->get_friendly_name();
938
- $heading = str_replace(
939
- array( '{product}' ),
940
- $product, $heading
941
- );
942
-
943
- $message = apply_filters( $this->product->get_key() . '_feedback_translation', $this->msg );
944
- $language_meta = $this->locales[ $lang ];
945
- $message = str_replace( '{language}', $language_meta['name'], $message );
946
- $message = str_replace( '{product}', $product, $message );
947
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_translate_button_cancel', $this->button_cancel );
948
- $button_do = apply_filters( $this->product->get_key() . '_feedback_translate_button_do', $this->button_do );
949
-
950
- return '<div id="' . $this->product->get_key() . '-translate-notification" class="themeisle-sdk-translate-box">'
951
- . '<h2>' . $heading . '</h2>'
952
- . '<p>' . $message . '</p>'
953
- . '<div class="actions">'
954
- . '<a href="' . $link . '" target="_blank" class="button button-primary translate-dismiss"> ' . $button_do . '</a>&nbsp;'
955
- . get_submit_button( $button_cancel, 'translate-dismiss ' . $this->product->get_key() . '-ti-translate', $this->product->get_key() . 'ti-translate-no', false )
956
- . '</div></br></div>';
957
- }
958
-
959
- /**
960
- * Called when the either button is clicked
961
- */
962
- function dismiss() {
963
- check_ajax_referer( (string) __CLASS__, 'nonce' );
964
-
965
- $this->disable();
966
- }
967
-
968
- /**
969
- * Disables the notification
970
- */
971
- protected function disable() {
972
-
973
- update_option( $this->product->get_key() . '_translate_flag', 'no' );
974
- }
975
-
976
- /**
977
- * Enables the notification
978
- */
979
- protected function enable() {
980
- update_option( $this->product->get_key() . '_translate_flag', 'yes' );
981
- }
982
- }
983
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-feedback.php DELETED
@@ -1,90 +0,0 @@
1
- <?php
2
- /**
3
- * The feedback model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Feedback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Feedback' ) ) :
16
- /**
17
- * Feedback model for ThemeIsle SDK.
18
- */
19
- abstract class ThemeIsle_SDK_Feedback {
20
- /**
21
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
22
- */
23
- protected $product;
24
-
25
- /**
26
- * @var string $feedback_url Url where to send the feedback
27
- */
28
- private $feedback_url = 'http://feedback.themeisle.com/wordpress/wp-json/__pirate_feedback_/v1/feedback';
29
-
30
- /**
31
- * ThemeIsle_SDK_Feedback constructor.
32
- *
33
- * @param ThemeIsle_SDK_Product $product_object Product Object.
34
- */
35
- public function __construct( $product_object ) {
36
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
37
- $this->product = $product_object;
38
- }
39
- $this->setup_hooks();
40
- }
41
-
42
- /**
43
- * Registers the hooks and then delegates to the child
44
- */
45
- public function setup_hooks() {
46
- $this->setup_hooks_child();
47
- }
48
-
49
- /**
50
- * Calls the API
51
- *
52
- * @param string $attributes The attributes of the post body.
53
- */
54
- protected function call_api( $attributes ) {
55
- $slug = $this->product->get_slug();
56
- $version = $this->product->get_version();
57
- $attributes['slug'] = $slug;
58
- $attributes['version'] = $version;
59
-
60
- $response = wp_remote_post(
61
- $this->feedback_url, array(
62
- 'body' => $attributes,
63
- )
64
- );
65
- }
66
-
67
- /**
68
- * Randomizes the options array
69
- *
70
- * @param array $options The options array.
71
- */
72
- function randomize_options( $options ) {
73
- $new = array();
74
- $keys = array_keys( $options );
75
- shuffle( $keys );
76
-
77
- foreach ( $keys as $key ) {
78
- $new[ $key ] = $options[ $key ];
79
- }
80
-
81
- return $new;
82
- }
83
-
84
- /**
85
- * Abstract function for delegating to the child
86
- */
87
- protected abstract function setup_hooks_child();
88
-
89
- }
90
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-licenser.php DELETED
@@ -1,686 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for license handling.
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Licenser
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- if ( ! class_exists( 'ThemeIsle_SDK_Licenser' ) ) :
12
- /**
13
- * Class ThemeIsle_SDK_Licenser
14
- *
15
- * Used to update the themeisle products
16
- */
17
- class ThemeIsle_SDK_Licenser {
18
-
19
- /**
20
- * @var string $license_key The license key string
21
- */
22
- public $license_key;
23
-
24
- /**
25
- * @var bool $do_check This ensures that the custom API request only runs on the second time that WP fires the update check
26
- */
27
- private $do_check = false;
28
-
29
- /**
30
- * @var bool $failed_checks Number of failed checks to the api endpoint
31
- */
32
- private $failed_checks = 0;
33
- /**
34
- * @var ThemeIsle_SDK_Product $product The ThemeIsle Product.
35
- */
36
- private $product;
37
- /**
38
- * @var string $product_key The product update response key.
39
- */
40
- private $product_key;
41
- /**
42
- * @var int $max_failed Maximum failed checks allowed before show the notice
43
- */
44
- private static $max_failed = 5;
45
-
46
- /**
47
- * ThemeIsle_SDK_Licenser constructor.
48
- *
49
- * @param ThemeIsle_SDK_Product $product The product object.
50
- */
51
- public function __construct( $product ) {
52
- $this->product = $product;
53
-
54
- $this->product_key = $this->product->get_key() . '-update-response';
55
- if ( ! $this->product->requires_license() ) {
56
- $this->license_key = 'free';
57
- } else {
58
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
59
- $this->failed_checks = intval( get_option( $this->product->get_key() . '_failed_checks', 0 ) );
60
- if ( $license_data !== '' ) {
61
- $this->license_key = isset( $license_data->key ) ? $license_data->key : get_option( $this->product->get_key() . '_license', '' );
62
- } else {
63
- $this->license_key = get_option( $this->product->get_key() . '_license', '' );
64
- }
65
- $this->register_license_hooks();
66
- }
67
- }
68
-
69
- /**
70
- * Register license hooks for the themeisle products
71
- */
72
- public function register_license_hooks() {
73
- add_action( 'admin_init', array( $this, 'register_settings' ) );
74
- add_action( 'admin_init', array( $this, 'activate_license' ) );
75
- add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
76
- add_action( 'admin_notices', array( $this, 'show_notice' ) );
77
- add_filter( $this->product->get_key() . '_license_status', array( $this, 'get_license_status' ) );
78
- }
79
-
80
- /**
81
- * @param string $r Update payload.
82
- * @param string $url The api url.
83
- *
84
- * @return mixed List of themes to check for update.
85
- */
86
- function disable_wporg_update( $r, $url ) {
87
-
88
- if ( 0 !== strpos( $url, 'https://api.wordpress.org/themes/update-check/' ) ) {
89
- return $r;
90
- }
91
-
92
- // Decode the JSON response
93
- $themes = json_decode( $r['body']['themes'] );
94
-
95
- unset( $themes->themes->{$this->product->get_slug()} );
96
-
97
- // Encode the updated JSON response
98
- $r['body']['themes'] = json_encode( $themes );
99
-
100
- return $r;
101
- }
102
-
103
- /**
104
- * Register the setting for the license of the product
105
- *
106
- * @return bool
107
- */
108
- public function register_settings() {
109
- if ( ! is_admin() ) {
110
- return false;
111
- }
112
- add_settings_field(
113
- $this->product->get_key() . '_license',
114
- $this->product->get_name() . ' license',
115
- array( $this, 'license_view' ),
116
- 'general'
117
- );
118
- }
119
-
120
- /**
121
- * The license view field
122
- */
123
- public function license_view() {
124
- $status = $this->get_license_status();
125
- $value = $this->license_key;
126
-
127
- $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', 'Activate' );
128
- $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', 'Deactivate' );
129
- $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
130
- $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
131
- $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
132
-
133
- echo '<p ><input ' . ( ( $status === 'valid' ) ? ( 'style="border:1px solid #7ad03a; "' ) : '' ) . ' type="text" id="' . $this->product->get_key() . '_license" name="' . $this->product->get_key() . '_license" value="' . $value . '" /><a ' . ( ( $status === 'valid' ) ? ( 'style="color:#fff;background: #7ad03a; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $valid_string ) : ( 'style="color:#fff;background: #dd3d36; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $invalid_string ) ) . ' </a>&nbsp;&nbsp;&nbsp;<button name="' . $this->product->get_key() . '_btn_trigger" ' . ( ( $status === 'valid' ) ? ( ' class="button button-primary">' . $deactivate_string ) : ( ' class="button button-primary" value="yes" type="submit" >' . $activate_string ) ) . ' </button></p><p class="description">' . sprintf( $license_message, '<a href="' . $this->product->get_store_url() . '">' . $this->product->get_store_name() . '</a> ', $this->product->get_type() ) . '</p>';
134
-
135
- }
136
-
137
- /**
138
- * Return the license status.
139
- *
140
- * @return string The License status.
141
- */
142
- public function get_license_status() {
143
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
144
- if ( $license_data !== '' ) {
145
- return isset( $license_data->license ) ? $license_data->license : get_option( $this->product->get_key() . '_license_status', 'not_active' );
146
- } else {
147
- return get_option( $this->product->get_key() . '_license_status', 'not_active' );
148
- }
149
-
150
- }
151
-
152
- /**
153
- * Check if the license is active or not
154
- *
155
- * @return bool
156
- */
157
- public function check_activation() {
158
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
159
- if ( $license_data !== '' ) {
160
- return isset( $license_data->error ) ? ( $license_data->error == 'no_activations_left' ) : false;
161
- }
162
-
163
- return false;
164
- }
165
-
166
- /**
167
- * Check if the license is about to expire in the next month
168
- *
169
- * @return bool
170
- */
171
- function check_expiration() {
172
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
173
- if ( $license_data !== '' ) {
174
- if ( isset( $license_data->expires ) ) {
175
- if ( strtotime( $license_data->expires ) - time() < 30 * 24 * 3600 ) {
176
- return true;
177
- }
178
- }
179
- }
180
-
181
- return false;
182
- }
183
-
184
- /**
185
- * Return the renew url from the store used
186
- *
187
- * @return string The renew url.
188
- */
189
- function renew_url() {
190
- $license_data = get_option( $this->product->get_key() . '_license_data', '' );
191
- if ( $license_data !== '' ) {
192
- if ( isset( $license_data->download_id ) && isset( $license_data->key ) ) {
193
- return $this->product->get_store_url() . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
194
- }
195
- }
196
-
197
- return $this->product->get_store_url();
198
- }
199
-
200
- /**
201
- * Check if we hide the notificatin nag or not
202
- *
203
- * @param string $hide The notification to hide.
204
- *
205
- * @return bool Either hide them or not.
206
- */
207
- function check_hide( $hide ) {
208
- return true;
209
- }
210
-
211
- /**
212
- * Show the admin notice regarding the license status
213
- *
214
- * @return bool
215
- */
216
- function show_notice() {
217
- if ( ! is_admin() ) {
218
- return false;
219
- }
220
- $status = $this->get_license_status();
221
- $no_activations_string = apply_filters(
222
- $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to
223
- upgrade your plan in order to use %s on more
224
- websites. Please ask the %s
225
- Staff for more details.'
226
- );
227
- $no_valid_string = apply_filters(
228
- $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s, please add
229
- your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a
230
- href="%s">here</a>. '
231
- );
232
- $expiration_string = apply_filters(
233
- $this->product->get_key() . '_lc_expiration_string', 'Your license is about to expire
234
- for %s. You can go to %s and renew it '
235
- );
236
- if ( $status != 'valid' ) {
237
- if ( $this->check_activation() ) {
238
- if ( $this->check_hide( 'activation' ) ) {
239
- ?>
240
- <div class="error">
241
- <p><strong>
242
- <?php
243
- echo sprintf(
244
- $no_activations_string, $this->product->get_name(), $this->product->get_name(), '<a href="' . $this->product->get_store_url() . '"
245
- target="_blank">' . $this->product->get_store_name() . '</a>'
246
- );
247
- ?>
248
- </strong>
249
- </p>
250
- </div>
251
- <?php
252
- return false;
253
- }
254
- }
255
- ?>
256
- <?php if ( $this->check_hide( 'valid' ) ) : ?>
257
- <div class="error">
258
- <p>
259
- <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->product->get_store_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() ); ?> </strong>
260
- </p>
261
- </div>
262
- <?php endif; ?>
263
- <?php
264
- } else {
265
- if ( $this->check_expiration() ) {
266
- if ( $this->check_hide( 'expiration' ) ) {
267
- ?>
268
- <div class="update-nag">
269
- <p>
270
- <strong>
271
- <?php
272
- echo sprintf(
273
- $expiration_string, $this->product->get_name() . ' ' . $this->product->get_type(), '<a
274
- href="' . $this->renew_url() . '"
275
- target="_blank">' . $this->product->get_store_name() . '</a>'
276
- );
277
- ?>
278
- </strong>
279
- </p>
280
- </div>
281
- <?php
282
- }
283
- }
284
- }
285
- }
286
-
287
- /**
288
- * Run the license check call
289
- */
290
- public function product_valid() {
291
- if ( false === ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) {
292
- $license = $this->check_license();
293
- set_transient( $this->product->get_key() . '_license_data', $license, 12 * HOUR_IN_SECONDS );
294
- update_option( $this->product->get_key() . '_license_data', $license );
295
- }
296
-
297
- }
298
-
299
- /**
300
- * Increment the failed checks
301
- */
302
- private function increment_failed_checks() {
303
- $this->failed_checks ++;
304
- update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
305
- }
306
-
307
- /**
308
- * Reset the failed checks
309
- */
310
- private function reset_failed_checks() {
311
- $this->failed_checks = 1;
312
- update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
313
- }
314
-
315
- /**
316
- * Check the license status
317
- *
318
- * @return object The license data.
319
- */
320
- public function check_license() {
321
- $status = $this->get_license_status();
322
- if ( $status == 'not_active' ) {
323
- $license_data = new stdClass();
324
- $license_data->license = 'not_active';
325
-
326
- return $license_data;
327
- }
328
- $license = trim( $this->license_key );
329
- $api_params = array(
330
- 'edd_action' => 'check_license',
331
- 'license' => $license,
332
- 'item_name' => rawurlencode( $this->product->get_name() ),
333
- 'url' => rawurlencode( home_url() ),
334
- );
335
- // Call the custom API.
336
- $response = wp_remote_get(
337
- add_query_arg( $api_params, $this->product->get_store_url() ), array(
338
- 'timeout' => 15,
339
- 'sslverify' => false,
340
- )
341
- );
342
- if ( is_wp_error( $response ) ) {
343
- $license_data = new stdClass();
344
- $license_data->license = 'valid';
345
-
346
- } else {
347
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
348
- if ( ! is_object( $license_data ) ) {
349
- $license_data = new stdClass();
350
- $license_data->license = 'valid';
351
- }
352
- }
353
- $license_old = get_option( $this->product->get_key() . '_license_data', '' );
354
- if ( $license_old->license == 'valid' && ( $license_data->license != $license_old->license ) ) {
355
- $this->increment_failed_checks();
356
- } else {
357
- $this->reset_failed_checks();
358
- }
359
-
360
- if ( $this->failed_checks <= self::$max_failed ) {
361
- return $license_old;
362
- }
363
-
364
- if ( isset( $license_old->hide_valid ) ) {
365
- $license_data->hide_valid = true;
366
- }
367
-
368
- if ( ! isset( $license_data->key ) ) {
369
- $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
370
- }
371
-
372
- if ( isset( $license_old->hide_expiration ) ) {
373
- $license_data->hide_expiration = true;
374
- }
375
-
376
- if ( isset( $license_old->hide_activation ) ) {
377
- $license_data->hide_activation = true;
378
- }
379
-
380
- return $license_data;
381
-
382
- }
383
-
384
- /**
385
- * Activate the license remotely
386
- */
387
- function activate_license() {
388
- // listen for our activate button to be clicked
389
- if ( isset( $_POST[ $this->product->get_key() . '_btn_trigger' ] ) ) {
390
- $status = $this->get_license_status();
391
- // retrieve the license from the database
392
- $license = $_POST[ $this->product->get_key() . '_license' ];
393
- $api_params = array(
394
- 'license' => $license,
395
- 'item_name' => rawurlencode( $this->product->get_name() ),
396
- 'url' => rawurlencode( home_url() ),
397
- );
398
- if ( $status != 'valid' ) {
399
- // data to send in our API request
400
- $api_params['edd_action'] = 'activate_license';
401
- } else {
402
- $api_params['edd_action'] = 'deactivate_license';
403
- }
404
- // Call the custom API.
405
- $response = wp_remote_get( add_query_arg( $api_params, $this->product->get_store_url() ) );
406
- // make sure the response came back okay
407
- if ( is_wp_error( $response ) ) {
408
- $license_data = new stdClass();
409
- $license_data->license = ( $status != 'valid' ) ? 'valid' : 'invalid';
410
-
411
- } else {
412
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
413
- if ( ! is_object( $license_data ) ) {
414
- $license_data = new stdClass();
415
- $license_data->license = ( $status != 'valid' ) ? 'valid' : 'invalid';
416
- }
417
- }
418
- if ( ! isset( $license_data->key ) ) {
419
- $license_data->key = $license;
420
- }
421
- if ( $license_data->license == 'valid' ) {
422
- $this->reset_failed_checks();
423
- }
424
-
425
- if ( isset( $license_data->plan ) ) {
426
- update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
427
- }
428
-
429
- update_option( $this->product->get_key() . '_license_data', $license_data );
430
- delete_transient( $this->product->get_key() . '_license_data' );
431
- set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
432
-
433
- }
434
- }
435
-
436
- /**
437
- * Enable the license system
438
- */
439
- public function enable() {
440
- if ( $this->product->get_type() == 'plugin' ) {
441
- add_filter(
442
- 'pre_set_site_transient_update_plugins', array(
443
- $this,
444
- 'pre_set_site_transient_update_plugins_filter',
445
- )
446
- );
447
- add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
448
- add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
449
- }
450
- if ( $this->product->get_type() == 'theme' ) {
451
- add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
452
- add_filter( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
453
- add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
454
- add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
455
- add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
456
- add_filter( 'http_request_args', array( $this, 'disable_wporg_update' ), 5, 2 );
457
-
458
- }
459
-
460
- }
461
-
462
- /**
463
- * Load the Themes screen
464
- */
465
- function load_themes_screen() {
466
- add_thickbox();
467
- add_action( 'admin_notices', array( &$this, 'update_nag' ) );
468
- }
469
-
470
- /**
471
- * Alter the nag for themes update
472
- */
473
- function update_nag() {
474
- $theme = wp_get_theme( $this->product->get_slug() );
475
- $api_response = get_transient( $this->product_key );
476
- if ( false === $api_response ) {
477
- return;
478
- }
479
- $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
480
- $update_message = apply_filters( 'themeisle_sdk_license_update_message', 'Updating this theme will lose any customizations you have made. Cancel to stop, OK to update.' );
481
- $update_onclick = ' onclick="if ( confirm(\'' . esc_js( $update_message ) . '\') ) {return true;}return false;"';
482
- if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
483
- echo '<div id="update-nag">';
484
- printf(
485
- '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
486
- $theme->get( 'Name' ),
487
- $api_response->new_version,
488
- '#TB_inline?width=640&amp;inlineId=' . $this->product->get_version() . '_changelog',
489
- $theme->get( 'Name' ),
490
- $update_url,
491
- $update_onclick
492
- );
493
- echo '</div>';
494
- echo '<div id="' . $this->product->get_slug() . '_' . 'changelog" style="display:none;">';
495
- echo wpautop( $api_response->sections['changelog'] );
496
- echo '</div>';
497
- }
498
- }
499
-
500
- /**
501
- * @param mixed $value The transient data.
502
- *
503
- * @return mixed
504
- */
505
- function theme_update_transient( $value ) {
506
- $update_data = $this->check_for_update();
507
- if ( $update_data ) {
508
- $value->response[ $this->product->get_slug() ] = $update_data;
509
- }
510
-
511
- return $value;
512
- }
513
-
514
- /**
515
- * Delete the update transient
516
- */
517
- function delete_theme_update_transient() {
518
- delete_transient( $this->product_key );
519
- }
520
-
521
- /**
522
- * Check remote api for latest version.
523
- *
524
- * @return bool|mixed Update api response.
525
- */
526
- private function get_version_data() {
527
- $api_params = array(
528
- 'edd_action' => 'get_version',
529
- 'version' => $this->product->get_version(),
530
- 'license' => $this->license_key,
531
- 'name' => $this->product->get_name(),
532
- 'slug' => $this->product->get_slug(),
533
- 'author' => $this->product->get_store_name(),
534
- 'url' => rawurlencode( home_url() ),
535
- );
536
- $response = wp_remote_post(
537
- $this->product->get_store_url(), array(
538
- 'timeout' => 15,
539
- 'sslverify' => false,
540
- 'body' => $api_params,
541
- )
542
- );
543
- if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
544
- return false;
545
- }
546
- $update_data = json_decode( wp_remote_retrieve_body( $response ) );
547
- if ( ! is_object( $update_data ) ) {
548
- return false;
549
- }
550
-
551
- return $update_data;
552
- }
553
-
554
- /**
555
- * Check for updates
556
- *
557
- * @return array|bool Either the update data or false in case of failure
558
- */
559
- function check_for_update() {
560
- $theme = wp_get_theme( $this->product->get_slug() );
561
- $update_data = get_transient( $this->product_key );
562
-
563
- if ( false === $update_data ) {
564
- $failed = false;
565
-
566
- $update_data = $this->get_version_data();
567
- if ( empty( $update_data ) ) {
568
- $failed = true;
569
- }
570
- // If the response failed, try again in 30 minutes.
571
- if ( $failed ) {
572
- $data = new stdClass;
573
- $data->new_version = $this->product->get_version();
574
- set_transient( $this->product_key, $data, strtotime( '+30 minutes' ) );
575
-
576
- return false;
577
- } else {
578
- $update_data->sections = maybe_unserialize( $update_data->sections );
579
- set_transient( $this->product_key, $update_data, strtotime( '+12 hours' ) );
580
- }
581
- }
582
- if ( ! isset( $update_data->new_version ) ) {
583
- return false;
584
- }
585
- if ( version_compare( $this->product->get_version(), $update_data->new_version, '>=' ) ) {
586
- return false;
587
- }
588
-
589
- return (array) $update_data;
590
- }
591
-
592
- /**
593
- * Check for Updates at the defined API endpoint and modify the update array.
594
- *
595
- * This function dives into the update API just when WordPress creates its update array,
596
- * then adds a custom API call and injects the custom plugin data retrieved from the API.
597
- * It is reassembled from parts of the native WordPress plugin update code.
598
- * See wp-includes/update.php line 121 for the original wp_update_plugins() function.
599
- *
600
- * @uses api_request()
601
- *
602
- * @param array $_transient_data Update array build by WordPress.
603
- *
604
- * @return array Modified update array with custom plugin data.
605
- */
606
- public function pre_set_site_transient_update_plugins_filter( $_transient_data ) {
607
- if ( empty( $_transient_data ) || ! $this->do_check ) {
608
- $this->do_check = true;
609
-
610
- return $_transient_data;
611
- }
612
- $api_response = $this->api_request();
613
- if ( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
614
- if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
615
- $_transient_data->response[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
616
- }
617
- }
618
-
619
- return $_transient_data;
620
- }
621
-
622
- /**
623
- * Calls the API and, if successfull, returns the object delivered by the API.
624
- *
625
- * @uses get_bloginfo()
626
- * @uses wp_remote_post()
627
- * @uses is_wp_error()
628
- *
629
- * @param string $_action The requested action.
630
- * @param array $_data Parameters for the API action.
631
- *
632
- * @return false||object
633
- */
634
- private function api_request( $_action = '', $_data = '' ) {
635
- $update_data = $this->get_version_data();
636
- if ( empty( $update_data ) ) {
637
- return false;
638
- }
639
- if ( $update_data && isset( $update_data->sections ) ) {
640
- $update_data->sections = maybe_unserialize( $update_data->sections );
641
- }
642
- return $update_data;
643
- }
644
-
645
- /**
646
- * Updates information on the "View version x.x details" page with custom data.
647
- *
648
- * @uses api_request()
649
- *
650
- * @param mixed $_data Plugin data.
651
- * @param string $_action Action to send.
652
- * @param object $_args Arguments to use.
653
- *
654
- * @return object $_data
655
- */
656
- public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
657
- if ( ( $_action != 'plugin_information' ) || ! isset( $_args->slug ) || ( $_args->slug != $this->product->get_slug() ) ) {
658
- return $_data;
659
- }
660
- $api_response = $this->api_request();
661
- if ( false !== $api_response ) {
662
- $_data = $api_response;
663
- }
664
-
665
- return $_data;
666
- }
667
-
668
- /**
669
- * Disable SSL verification in order to prevent download update failures
670
- *
671
- * @param array $args Http args.
672
- * @param string $url Url to check.
673
- *
674
- * @return object $array
675
- */
676
- function http_request_args( $args, $url ) {
677
- // If it is an https request and we are performing a package download, disable ssl verification
678
- if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
679
- $args['sslverify'] = false;
680
- }
681
-
682
- return $args;
683
- }
684
-
685
- }
686
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-loader.php DELETED
@@ -1,96 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Loader
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Loader' ) ) :
16
- /**
17
- * Singleton loader for ThemeIsle SDK.
18
- */
19
- final class ThemeIsle_SDK_Loader {
20
- /**
21
- * @var ThemeIsle_SDK_Loader instance The singleton instance
22
- */
23
- private static $instance;
24
- /**
25
- * @var string $version The class version.
26
- */
27
- private static $version = '1.0.0';
28
- /**
29
- * @var array The products which use the SDK.
30
- */
31
- private static $products;
32
-
33
- /**
34
- * Register product into SDK.
35
- *
36
- * @param string $basefile The product basefile.
37
- *
38
- * @return ThemeIsle_SDK_Loader The singleton object.
39
- */
40
- public static function init_product( $basefile ) {
41
-
42
- if ( ! isset( self::$instance ) && ! ( self::$instance instanceof ThemeIsle_SDK_Loader ) ) {
43
- self::$instance = new ThemeIsle_SDK_Loader;
44
-
45
- }
46
- $product_object = new ThemeIsle_SDK_Product( $basefile );
47
- self::$products[ $product_object->get_slug() ] = $product_object;
48
-
49
- $notifications = array();
50
- // Based on the WordPress Available file header we enable the logger or not.
51
- if ( ! $product_object->is_wordpress_available() && apply_filters( $product_object->get_key() . '_enable_licenser', true ) === true ) {
52
- $licenser = new ThemeIsle_SDK_Licenser( $product_object );
53
- $licenser->enable();
54
- }
55
-
56
- $logger = new ThemeIsle_SDK_Logger( $product_object );
57
- if ( $product_object->is_logger_active() ) {
58
- $logger->enable();
59
- } else {
60
- $notifications[] = $logger;
61
- }
62
-
63
- $feedback = new ThemeIsle_SDK_Feedback_Factory( $product_object, $product_object->get_feedback_types() );
64
-
65
- $instances = $feedback->get_instances();
66
- if ( array_key_exists( 'review', $instances ) ) {
67
- $notifications[] = $instances['review'];
68
- }
69
- if ( array_key_exists( 'translate', $instances ) ) {
70
- $notifications[] = $instances['translate'];
71
- }
72
- new ThemeIsle_SDK_Notification_Manager( $product_object, $notifications );
73
- if ( ! $product_object->is_external_author() ) {
74
- new ThemeIsle_SDK_Widgets_Factory( $product_object, $product_object->get_widget_types() );
75
- }
76
- if ( ! $product_object->is_external_author() ) {
77
- new ThemeIsle_SDK_Rollback( $product_object );
78
- }
79
-
80
- new ThemeIsle_SDK_Endpoints( $product_object );
81
-
82
- return self::$instance;
83
- }
84
-
85
- /**
86
- * Get all products using the SDK.
87
- *
88
- * @return array Products available.
89
- */
90
- public static function get_products() {
91
- return self::$products;
92
- }
93
-
94
-
95
- }
96
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-logger.php DELETED
@@ -1,227 +0,0 @@
1
- <?php
2
- /**
3
- * The main loader class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Logger
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- if ( ! class_exists( 'ThemeIsle_SDK_Logger' ) ) :
12
- /**
13
- * Class ThemeIsle_SDK_Logger
14
- *
15
- * Send the statistics to the Themeisle Endpoint
16
- */
17
- /**
18
- * Class ThemeIsle_SDK_Logger
19
- */
20
- class ThemeIsle_SDK_Logger {
21
-
22
- /**
23
- * @var string $logging_url Url where to send the logs
24
- */
25
- private $logging_url = 'http://log.themeisle.com/wp-json/v1/logs/';
26
-
27
- /**
28
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
29
- */
30
- private $product;
31
-
32
- /**
33
- * @var string $product_cron Cron name handler
34
- */
35
- private $product_cron;
36
-
37
- /**
38
- * @var string $heading The heading of the modal
39
- */
40
- private $heading = 'Do you enjoy <b>{product}</b>? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.';
41
-
42
- /**
43
- * @var string $button_submit The text of the submit button
44
- */
45
- private $button_submit = 'Sure, I would love to help.';
46
-
47
- /**
48
- * @var string $button_cancel The text of the cancel button
49
- */
50
- private $button_cancel = 'No, thanks.';
51
-
52
- /**
53
- * ThemeIsle_SDK_Logger constructor.
54
- *
55
- * @param ThemeIsle_SDK_Product $product_object Product Object.
56
- */
57
- public function __construct( $product_object ) {
58
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
59
- $this->product = $product_object;
60
- $this->product_cron = $product_object->get_key() . '_log_activity';
61
- }
62
- add_action( 'wp_ajax_' . $this->product->get_key() . __CLASS__, array( $this, 'dismiss' ) );
63
- }
64
-
65
-
66
- /**
67
- * Start the cron to send the log. It will randomize the interval in order to not send all the logs at the same time.
68
- */
69
- public function enable() {
70
- if ( ! wp_next_scheduled( $this->product_cron ) ) {
71
- wp_schedule_single_event( time() + ( rand( 15, 24 ) * 3600 ), $this->product_cron );
72
- }
73
- add_action( $this->product_cron, array( $this, 'send_log' ) );
74
- }
75
-
76
- /**
77
- * Send the statistics to the api endpoint
78
- */
79
- public function send_log() {
80
- $environment = array();
81
- $theme = wp_get_theme();
82
- $environment['theme'] = array();
83
- $environment['theme']['name'] = $theme->get( 'Name' );
84
- $environment['theme']['author'] = $theme->get( 'Author' );
85
- $environment['plugins'] = get_option( 'active_plugins' );
86
-
87
- wp_remote_post(
88
- $this->logging_url, array(
89
- 'method' => 'POST',
90
- 'timeout' => 3,
91
- 'redirection' => 5,
92
- 'headers' => array(
93
- 'X-ThemeIsle-Event' => 'log_site',
94
- ),
95
- 'body' => array(
96
- 'site' => get_site_url(),
97
- 'slug' => $this->product->get_slug(),
98
- 'version' => $this->product->get_version(),
99
- 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
100
- 'environment' => $environment,
101
- 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
102
- ),
103
- )
104
- );
105
- }
106
-
107
- /**
108
- * Dismiss the notification
109
- */
110
- function dismiss() {
111
- check_ajax_referer( (string) __CLASS__, 'nonce' );
112
-
113
- $flag = intval( $_POST['enable'] ) === 1;
114
- update_option( $this->product->logger_option, ( $flag ? 'yes' : 'no' ) );
115
-
116
- if ( true === $flag ) {
117
- $this->enable();
118
- }
119
- }
120
-
121
- /**
122
- * Either we should show the notification or not.
123
- *
124
- * @return bool Valida notification.
125
- */
126
- function can_notify() {
127
- $show = $this->product->is_logger_active();
128
- $checked = get_option( $this->product->logger_option, '' );
129
- if ( ! $show && $checked == '' ) {
130
- return true;
131
- }
132
-
133
- return false;
134
- }
135
-
136
- /**
137
- * Shows the notification
138
- */
139
- function show_notification() {
140
- add_action( 'admin_notices', array( $this, 'admin_notices' ) );
141
- }
142
-
143
- /**
144
- * Shows the admin notice
145
- */
146
- function admin_notices() {
147
- $id = $this->product->get_key() . '_logger';
148
-
149
- $this->add_media( $this->product->get_key() );
150
-
151
- echo '<div class="notice notice-success is-dismissible " id="' . $this->product->get_key() . '-logger-notification" ><div id="' . $id . '" class="themeisle-logger-box">' . $this->get_html( $this->product->get_key() ) . '</div></div>';
152
- }
153
-
154
- /**
155
- * Generates the HTML
156
- *
157
- * @param string $key The product key.
158
- */
159
- function get_html( $key ) {
160
- $heading = apply_filters( $this->product->get_key() . '_logger_heading', $this->heading );
161
- $heading = str_replace(
162
- array( '{product}' ), array(
163
- trim( str_replace( 'Lite', '', $this->product->get_name() ) ),
164
- ),
165
- $heading
166
- );
167
- $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', $this->button_submit );
168
- $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', $this->button_cancel );
169
-
170
- return '<div >'
171
- . '<p>' . $heading . '</p>'
172
- . '<div class="actions">'
173
- . get_submit_button(
174
- $button_submit, 'primary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-yes', false, array(
175
- 'data-ti-log-enable' => 1,
176
- )
177
- )
178
- . get_submit_button(
179
- $button_cancel, 'secondary ' . $this->product->get_key() . '-ti-logger', $this->product->get_key() . 'ti-logger-no', false, array(
180
- 'data-ti-log-enable' => 0,
181
- )
182
- )
183
- . '</div></div>';
184
- }
185
-
186
- /**
187
- * Loads the js
188
- *
189
- * @param string $key The product key.
190
- */
191
- function add_media( $key ) {
192
- ?>
193
- <style type="text/css">
194
- #<?php echo $key; ?>-logger-notification {
195
- padding-bottom: 5px;
196
- }
197
-
198
- #<?php echo $key; ?>-logger-notification .button {
199
- margin-left: 5px;
200
- }
201
- </style>
202
- <script type="text/javascript" id="<?php echo $key; ?>ti-logger-js">
203
- (function ($) {
204
- $(document).ready(function () {
205
- $('.<?php echo $key; ?>-ti-logger').on('click', function (e) {
206
-
207
- $.ajax({
208
- url: ajaxurl,
209
- method: "post",
210
- data: {
211
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
212
- 'action': '<?php echo $this->product->get_key() . __CLASS__; ?>',
213
- 'enable': $(this).attr('data-ti-log-enable')
214
- },
215
- success: function () {
216
- $('#<?php echo $key; ?>-logger-notification').hide();
217
- }
218
- });
219
- });
220
- });
221
- })(jQuery);
222
- </script>
223
- <?php
224
- }
225
-
226
- }
227
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-notification-manager.php DELETED
@@ -1,105 +0,0 @@
1
- <?php
2
- /**
3
- * The notification manager class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Notification
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Notification_Manager' ) ) :
16
- /**
17
- * Notification manager model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Notification_Manager {
20
- /**
21
- * Time between notifications.
22
- */
23
- const NOTIFICATION_INTERVAL_HOURS = 100;
24
- /**
25
- * @var array Notifications for the current product.
26
- */
27
- static private $notifications = array();
28
- /**
29
- * @var ThemeIsle_SDK_Product Current product.
30
- */
31
- private $product;
32
- /**
33
- * @var array ThemeIsle_SDK_Feedback Feedbacks available.
34
- */
35
- private $callbacks = array();
36
-
37
- /**
38
- * ThemeIsle_SDK_Notification_Manager constructor.
39
- *
40
- * @param ThemeIsle_SDK_Product $product_object Product Object.
41
- * @param array $callbacks the objects that will be called when a notification is due.
42
- */
43
- public function __construct( $product_object, $callbacks ) {
44
- $this->product = $product_object;
45
- $this->callbacks = $callbacks;
46
- $this->setup_hooks();
47
- }
48
-
49
- /**
50
- * Setup the notifications.
51
- */
52
- function setup_notifications() {
53
- if ( ! current_user_can( 'manage_options' ) ) {
54
- return;
55
- }
56
- // Load the notifications only if we have it installed after the required interval.
57
- if ( ( time() - $this->product->get_install_time() ) > self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) {
58
- if ( $this->product instanceof ThemeIsle_SDK_Product && $this->callbacks && is_array( $this->callbacks ) ) {
59
- foreach ( $this->callbacks as $instance ) {
60
- self::$notifications[ $this->product->get_key() . get_class( $instance ) ] = $instance;
61
- }
62
- }
63
- }
64
- }
65
-
66
- /**
67
- * Setup the internal hooks
68
- */
69
- private function setup_hooks() {
70
- add_action( 'admin_head', array( $this, 'show_notification' ) );
71
- add_action( 'admin_init', array( $this, 'setup_notifications' ) );
72
- }
73
-
74
- /**
75
- * Shows the notification
76
- */
77
- function show_notification() {
78
- $instances = self::$notifications;
79
- if ( empty( $instances ) ) {
80
- return;
81
- }
82
-
83
- $available = array_keys( $instances );
84
- $active = get_option( 'themeisle_sdk_active_notification', array() );
85
-
86
- foreach ( $available as $key ) {
87
- $instance = $instances[ $key ];
88
- if ( $instance->can_notify() ) {
89
-
90
- // Detect notification switch.
91
- if ( empty( $active['key'] ) || ( $active['key'] != $key ) ) {
92
- $active['key'] = $key;
93
- $active['time'] = time();
94
- update_option( 'themeisle_sdk_active_notification', $active );
95
- }
96
- if ( ( time() - $active['time'] ) > ( self::NOTIFICATION_INTERVAL_HOURS * HOUR_IN_SECONDS ) ) {
97
- $instance->show_notification();
98
- }
99
- break;
100
- }
101
- }
102
-
103
- }
104
- }
105
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-product.php DELETED
@@ -1,635 +0,0 @@
1
- <?php
2
- /**
3
- * The product model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Product
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Product' ) ) :
16
- /**
17
- * Product model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Product {
20
- /**
21
- * @var string $slug THe product slug.
22
- */
23
- private $slug;
24
- /**
25
- * @var string $basefile The file with headers.
26
- */
27
- private $basefile;
28
- /**
29
- * @var string $type The product type ( plugin | theme ).
30
- */
31
- private $type;
32
- /**
33
- * @var string $file The file name.
34
- */
35
- private $file;
36
- /**
37
- * @var string $name The product name.
38
- */
39
- private $name;
40
- /**
41
- * @var string $key The product ready key.
42
- */
43
- private $key;
44
- /**
45
- * @var string $author_url The url of the author.
46
- */
47
- private $author_url;
48
- /**
49
- * @var string $store_url The store url.
50
- */
51
- private $store_url;
52
- /**
53
- * @var int $install The date of install.
54
- */
55
- private $install;
56
- /**
57
- * @var string $store_name The store name.
58
- */
59
- private $store_name;
60
- /**
61
- * @var array $allowed_authors The allowed authors.
62
- */
63
- private $allowed_authors = array(
64
- 'proteusthemes.com',
65
- 'anarieldesign.com',
66
- 'prothemedesign.com',
67
- 'cssigniter.com',
68
- );
69
- /**
70
- * @var array $allowed_external_products The allowed external_products.
71
- */
72
- private $allowed_products = array(
73
- 'zermatt',
74
- 'neto',
75
- 'olsen',
76
- 'benson',
77
- 'romero',
78
- 'carmack',
79
- 'puzzle',
80
- 'broadsheet',
81
- 'girlywp',
82
- 'veggie',
83
- 'zeko',
84
- 'maishawp',
85
- 'didi',
86
- 'liber',
87
- 'medicpress-pt',
88
- 'adrenaline-pt',
89
- 'consultpress-pt',
90
- 'legalpress-pt',
91
- 'gympress-pt',
92
- 'readable-pt',
93
- 'bolts-pt',
94
- );
95
- /**
96
- * @var bool $requires_license Either user needs to activate it with license.
97
- */
98
- private $requires_license;
99
- /**
100
- * @var bool $wordpress_available Either is available on WordPress or not.
101
- */
102
- private $wordpress_available;
103
- /**
104
- * @var string $version The product version.
105
- */
106
- private $version;
107
- /**
108
- * @var string $logger_option Logger option key.
109
- */
110
- public $logger_option;
111
- /**
112
- * @var string $pro_slug Pro slug, if available.
113
- */
114
- public $pro_slug;
115
- /**
116
- * @var string $feedback_types All the feedback types the product supports
117
- */
118
- private $feedback_types = array();
119
-
120
- /**
121
- * @var string $widget_types All the widget types the product supports
122
- */
123
- private $widget_types = array( 'dashboard_blog' );
124
-
125
- /**
126
- * ThemeIsle_SDK_Product constructor.
127
- *
128
- * @param string $basefile Product basefile.
129
- */
130
- public function __construct( $basefile ) {
131
- if ( ! empty( $basefile ) ) {
132
- if ( is_readable( $basefile ) ) {
133
- $this->basefile = $basefile;
134
- $this->setup_from_path();
135
- $this->setup_from_fileheaders();
136
- }
137
- }
138
- $install = get_option( $this->get_key() . '_install', 0 );
139
- if ( $install === 0 ) {
140
- $install = time();
141
- update_option( $this->get_key() . '_install', time() );
142
- }
143
- $this->install = $install;
144
-
145
- $this->logger_option = $this->get_key() . '_logger_flag';
146
-
147
- }
148
-
149
- /**
150
- * Setup props from fileheaders.
151
- */
152
- public function setup_from_fileheaders() {
153
- $file_headers = array(
154
- 'Requires License' => 'Requires License',
155
- 'WordPress Available' => 'WordPress Available',
156
- 'Pro Slug' => 'Pro Slug',
157
- 'Version' => 'Version',
158
- );
159
- if ( $this->type == 'plugin' ) {
160
- $file_headers['Name'] = 'Plugin Name';
161
- $file_headers['AuthorName'] = 'Author';
162
- $file_headers['AuthorURI'] = 'Author URI';
163
- }
164
- if ( $this->type == 'theme' ) {
165
- $file_headers['Name'] = 'Theme Name';
166
- $file_headers['AuthorName'] = 'Author';
167
- $file_headers['AuthorURI'] = 'Author URI';
168
- }
169
- $file_headers = get_file_data( $this->basefile, $file_headers );
170
-
171
- $this->name = $file_headers['Name'];
172
- $this->store_name = $file_headers['AuthorName'];
173
- $this->author_url = $file_headers['AuthorURI'];
174
- $this->store_url = $file_headers['AuthorURI'];
175
- if ( $this->is_external_author() ) {
176
- $this->store_url = 'https://themeisle.com';
177
- $this->store_name = 'ThemeIsle';
178
- }
179
- $this->requires_license = ( $file_headers['Requires License'] == 'yes' ) ? true : false;
180
- $this->wordpress_available = ( $file_headers['WordPress Available'] == 'yes' ) ? true : false;
181
- $this->pro_slug = ! empty( $file_headers['Pro Slug'] ) ? $file_headers['Pro Slug'] : '';
182
- $this->version = $file_headers['Version'];
183
- if ( $this->require_uninstall_feedback() ) {
184
- $this->feedback_types[] = 'deactivate';
185
- }
186
- if ( $this->is_wordpress_available() ) {
187
- $this->feedback_types[] = 'review';
188
- $this->feedback_types[] = 'translate';
189
- }
190
- }
191
-
192
- /**
193
- * Check if the product is by external author or not.
194
- *
195
- * @return bool Either is external author or no.
196
- */
197
- public function is_external_author() {
198
- foreach ( $this->allowed_authors as $author ) {
199
- if ( strpos( $this->author_url, $author ) !== false ) {
200
- return true;
201
- }
202
- if ( in_array( $this->get_slug(), $this->allowed_products ) ) {
203
- return true;
204
- }
205
- }
206
-
207
- return false;
208
- }
209
-
210
- /**
211
- * The magic var_dump info method.
212
- *
213
- * @return array Debug info.
214
- */
215
- public function __debugInfo() {
216
- return array(
217
- 'name' => $this->name,
218
- 'slug' => $this->slug,
219
- 'version' => $this->version,
220
- 'basefile' => $this->basefile,
221
- 'key' => $this->key,
222
- 'type' => $this->type,
223
- 'store_name' => $this->store_name,
224
- 'store_url' => $this->store_url,
225
- 'wordpress_available' => $this->wordpress_available,
226
- 'requires_license' => $this->requires_license,
227
- );
228
-
229
- }
230
-
231
- /**
232
- * Setup props from path.
233
- */
234
- public function setup_from_path() {
235
- $this->file = basename( $this->basefile );
236
- $dir = dirname( $this->basefile );
237
- $this->slug = basename( $dir );
238
- $exts = explode( '.', $this->basefile );
239
- $ext = $exts[ count( $exts ) - 1 ];
240
- if ( $ext == 'css' ) {
241
- $this->type = 'theme';
242
- }
243
- if ( $ext == 'php' ) {
244
- $this->type = 'plugin';
245
- }
246
- $this->key = self::key_ready_name( $this->slug );
247
- }
248
-
249
- /**
250
- * @param string $string the String to be normalized for cron handler.
251
- *
252
- * @return string $name The normalized string.
253
- */
254
- static function key_ready_name( $string ) {
255
- return str_replace( '-', '_', strtolower( trim( $string ) ) );
256
- }
257
-
258
- /**
259
- * Getter for product name.
260
- *
261
- * @return string The product name.
262
- */
263
- public function get_name() {
264
- return $this->name;
265
- }
266
-
267
- /**
268
- * Getter for product version.
269
- *
270
- * @return string The product version.
271
- */
272
- public function get_version() {
273
- return $this->version;
274
- }
275
-
276
- /**
277
- * If product is available on wordpress.org or not.
278
- *
279
- * @return bool Either is wp available or not.
280
- */
281
- public function is_wordpress_available() {
282
- return $this->wordpress_available;
283
- }
284
-
285
- /**
286
- * @return array Array of available versions.
287
- */
288
- private function get_plugin_versions() {
289
-
290
- $url = sprintf( 'https://api.wordpress.org/plugins/info/1.0/%s', $this->get_slug() );
291
- $response = wp_remote_get( $url );
292
- if ( is_wp_error( $response ) ) {
293
- return array();
294
- }
295
- $response = wp_remote_retrieve_body( $response );
296
- $response = maybe_unserialize( $response );
297
-
298
- if ( ! is_object( $response ) ) {
299
- return array();
300
- }
301
- if ( ! isset( $response->versions ) ) {
302
- return array();
303
- }
304
- $versions = array();
305
- foreach ( $response->versions as $version => $zip ) {
306
- $versions[] = array(
307
- 'version' => $version,
308
- 'url' => $zip,
309
- );
310
- }
311
-
312
- return $versions;
313
- }
314
-
315
- /**
316
- * @return string Return license key, if available.
317
- */
318
- private function get_license() {
319
- $license_data = get_option( $this->get_key() . '_license_data', '' );
320
-
321
- if ( empty( $license_data ) ) {
322
- return '';
323
- }
324
- if ( ! isset( $license_data->key ) ) {
325
- return '';
326
- }
327
-
328
- return $license_data->key;
329
- }
330
-
331
- /**
332
- * @return array Array of available versions.
333
- */
334
- private function get_pro_versions() {
335
- $license = $this->get_license();
336
- $store_url = trailingslashit( $this->store_url );
337
- $url = sprintf( '%s?edd_action=get_versions&name=%s&url=%s&license=%s', $store_url, urlencode( $this->get_name() ), urlencode( get_site_url() ), $license );
338
- $response = wp_remote_get( $url );
339
- if ( is_wp_error( $response ) ) {
340
- return array();
341
- }
342
- $response = wp_remote_retrieve_body( $response );
343
- $response = json_decode( $response );
344
- if ( ! is_object( $response ) ) {
345
- return array();
346
- }
347
- if ( ! isset( $response->versions ) ) {
348
- return array();
349
- }
350
- $versions = array();
351
- foreach ( $response->versions as $key => $version ) {
352
- $versions[] = array(
353
- 'version' => $version->version,
354
- 'url' => $version->file,
355
- );
356
- }
357
-
358
- return $versions;
359
- }
360
-
361
- /**
362
- * Return theme versions.
363
- *
364
- * @return array Theme versions array.
365
- */
366
- public function get_theme_versions() {
367
- $url = sprintf( 'https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=%s&request[fields][versions]=true', $this->get_slug() );
368
- $response = wp_remote_get( $url );
369
- if ( is_wp_error( $response ) ) {
370
- return array();
371
- }
372
- $response = wp_remote_retrieve_body( $response );
373
- $response = json_decode( $response );
374
-
375
- if ( ! is_object( $response ) ) {
376
- return array();
377
- }
378
- if ( ! isset( $response->versions ) ) {
379
- return array();
380
- }
381
- $versions = array();
382
- foreach ( $response->versions as $version => $zip ) {
383
- $versions[] = array(
384
- 'version' => $version,
385
- 'url' => $zip,
386
- );
387
- }
388
-
389
- return $versions;
390
- }
391
-
392
- /**
393
- * Get versions array from wp.org
394
- *
395
- * @return array Array of versions.
396
- */
397
- private function get_api_versions() {
398
-
399
- $cache_key = $this->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->version ) . 'versions';
400
- $cache_versions = get_transient( $cache_key );
401
- if ( false === $cache_versions ) {
402
- $versions = array();
403
- if ( ! $this->is_wordpress_available() ) {
404
- $versions = $this->get_pro_versions();
405
- } else {
406
- if ( $this->get_type() === 'plugin' ) {
407
- $versions = $this->get_plugin_versions();
408
- }
409
- if ( $this->get_type() === 'theme' ) {
410
- $versions = $this->get_theme_versions();
411
- }
412
- }
413
- set_transient( $cache_key, $versions, 5 * DAY_IN_SECONDS );
414
- } else {
415
- $versions = is_array( $cache_versions ) ? $cache_versions : array();
416
- }
417
-
418
- return $versions;
419
- }
420
-
421
- /**
422
- * Get the last rollback for this product.
423
- *
424
- * @return array The rollback version.
425
- */
426
- public function get_rollback() {
427
- $rollback = array();
428
- $versions = $this->get_api_versions();
429
- $versions = apply_filters( $this->get_key() . '_rollbacks', $versions );
430
-
431
- if ( $versions ) {
432
- usort( $versions, array( $this, 'sort_rollback_array' ) );
433
- foreach ( $versions as $version ) {
434
- if ( isset( $version['version'] ) && isset( $version['url'] ) && version_compare( $this->version, $version['version'], '>' ) ) {
435
- $rollback = $version;
436
- break;
437
- }
438
- }
439
- }
440
-
441
- return $rollback;
442
- }
443
-
444
- /**
445
- * Sort the rollbacks array in descending order.
446
- */
447
- public function sort_rollback_array( $a, $b ) {
448
- return version_compare( $a['version'], $b['version'], '<' ) > 0;
449
- }
450
-
451
- /**
452
- * If product can be rolled back.
453
- *
454
- * @return bool Can the product be rolled back or not.
455
- */
456
- public function can_rollback() {
457
- if ( $this->get_type() === 'theme' ) {
458
- if ( ! current_user_can( 'switch_themes' ) ) {
459
- return false;
460
- }
461
- }
462
- if ( $this->get_type() === 'plugin' ) {
463
- if ( ! current_user_can( 'install_plugins' ) ) {
464
- return false;
465
- }
466
- }
467
- $rollback = $this->get_rollback();
468
-
469
- return ! empty( $rollback );
470
- }
471
-
472
- /**
473
- * Return the product key.
474
- *
475
- * @return string The product key.
476
- */
477
- public function get_key() {
478
- return $this->key;
479
- }
480
-
481
- /**
482
- * Return friendly name.
483
- *
484
- * @return string Friendly name.
485
- */
486
- public function get_friendly_name() {
487
- $name = apply_filters( $this->get_key() . '_friendly_name', trim( str_replace( 'Lite', '', $this->get_name() ) ) );
488
- $name = rtrim( $name, '- ' );
489
-
490
- return $name;
491
- }
492
-
493
- /**
494
- * Either the product requires license or not.
495
- *
496
- * @return bool Either requires license or not.
497
- */
498
- public function requires_license() {
499
- return $this->requires_license;
500
- }
501
-
502
- /**
503
- * Check if the product is either theme or plugin.
504
- *
505
- * @return string Product type.
506
- */
507
- public function get_type() {
508
- return $this->type;
509
- }
510
-
511
- /**
512
- * Returns the Store name.
513
- *
514
- * @return string Store name.
515
- */
516
- public function get_store_name() {
517
- return $this->store_name;
518
- }
519
-
520
- /**
521
- * Returns the store url.
522
- *
523
- * @return string The store url.
524
- */
525
- public function get_store_url() {
526
- return $this->store_url;
527
- }
528
-
529
- /**
530
- * Returns the product slug.
531
- *
532
- * @return string The product slug.
533
- */
534
- public function get_slug() {
535
- return $this->slug;
536
- }
537
-
538
- /**
539
- * Returns product basefile, which holds the metaheaders.
540
- *
541
- * @return string The product basefile.
542
- */
543
- public function get_basefile() {
544
- return $this->basefile;
545
- }
546
-
547
- /**
548
- * Returns product filename.
549
- *
550
- * @return string The product filename.
551
- */
552
- public function get_file() {
553
- return $this->file;
554
- }
555
-
556
- /**
557
- * Returns feedback types
558
- *
559
- * @return array The feedback types.
560
- */
561
- public function get_feedback_types() {
562
- return apply_filters( $this->get_key() . '_feedback_types', $this->feedback_types );
563
- }
564
-
565
- /**
566
- * Returns widget types
567
- *
568
- * @return array The widget types.
569
- */
570
- public function get_widget_types() {
571
- return apply_filters( $this->get_key() . '_widget_types', $this->widget_types );
572
- }
573
-
574
- /**
575
- * We log the user website and product version.
576
- *
577
- * @return bool Either we log the data or not.
578
- */
579
- public function is_logger_active() {
580
- // If is not available on WordPress log this automatically.
581
- if ( ! $this->is_wordpress_available() ) {
582
- return true;
583
- } else {
584
- $pro_slug = $this->get_pro_slug();
585
- if ( ! empty( $pro_slug ) ) {
586
-
587
- $all_products = ThemeIsle_SDK_Loader::get_products();
588
- if ( isset( $all_products[ $pro_slug ] ) ) {
589
- return true;
590
- }
591
- }
592
-
593
- return ( get_option( $this->get_key() . '_logger_flag', 'no' ) === 'yes' );
594
-
595
- }
596
- }
597
-
598
- /**
599
- * Returns the pro slug, if available.
600
- *
601
- * @return string The pro slug.
602
- */
603
- public function get_pro_slug() {
604
- return $this->pro_slug;
605
- }
606
-
607
- /**
608
- * Return the install timestamp.
609
- *
610
- * @return int The install timestamp.
611
- */
612
- public function get_install_time() {
613
- return $this->install;
614
- }
615
-
616
- /**
617
- * We require feedback on uninstall.
618
- *
619
- * @return bool Either we should require feedback on uninstall or not.
620
- */
621
- public function require_uninstall_feedback() {
622
- if ( $this->get_type() == 'theme' && ! $this->is_external_author() ) {
623
- return ! get_transient( 'ti_sdk_pause_' . $this->get_key(), false );
624
- }
625
-
626
- if ( $this->get_type() == 'plugin' ) {
627
-
628
- return true;
629
- }
630
-
631
- return false;
632
- }
633
-
634
- }
635
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-rollback.php DELETED
@@ -1,223 +0,0 @@
1
- <?php
2
- /**
3
- * The rollback class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Rollback
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Rollback' ) ) :
16
- /**
17
- * Rollback for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Rollback {
20
-
21
- /**
22
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
23
- */
24
- protected $product;
25
-
26
-
27
- /**
28
- * ThemeIsle_SDK_Rollback constructor.
29
- *
30
- * @param ThemeIsle_SDK_Product $product_object Product Object.
31
- */
32
- public function __construct( $product_object ) {
33
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
34
- $this->product = $product_object;
35
- }
36
- if ( $this->product->can_rollback() ) {
37
- $this->show_link();
38
- $this->add_hooks();
39
-
40
- }
41
- }
42
-
43
- /**
44
- * Add js scripts for themes rollback.
45
- */
46
- public function add_footer() {
47
- $screen = get_current_screen();
48
- if ( ! isset( $screen->parent_file ) ) {
49
- return;
50
- }
51
- if ( $screen->parent_file !== 'themes.php' ) {
52
- return;
53
- }
54
- if ( $this->product->get_type() === 'plugin' ) {
55
- return;
56
- }
57
-
58
- $version = $this->product->get_rollback();
59
- ?>
60
- <script type="text/javascript">
61
- jQuery(document).ready(function ($) {
62
- setInterval(checkTheme, 500);
63
-
64
- function checkTheme() {
65
- var theme = '<?php echo esc_attr( $this->product->get_slug() ); ?>-action';
66
-
67
- if (jQuery('#' + theme).length > 0) {
68
- if (jQuery('.theme-overlay.active').is(':visible')) {
69
- if (jQuery('#' + theme + '-rollback').length === 0) {
70
- jQuery('.theme-actions .active-theme').prepend('<a class="button" style="float:left" id="' + theme + '-rollback" href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) ); ?>">Rollback to v<?php echo esc_attr( $version['version'] ); ?></a>')
71
- }
72
- }
73
-
74
- }
75
- }
76
- })
77
-
78
- </script>
79
- <?php
80
-
81
- }
82
-
83
- /**
84
- * Set the rollback hook. Strangely, this does not work if placed in the ThemeIsle_SDK_Rollback class, so it is being called from there instead.
85
- */
86
- public function add_hooks() {
87
- add_action( 'admin_post_' . $this->product->get_key() . '_rollback', array( $this, 'start_rollback' ) );
88
- add_action( 'admin_footer', array( $this, 'add_footer' ) );
89
- }
90
-
91
- /**
92
- * If product can be rolled back, show the link to rollback.
93
- */
94
- private function show_link() {
95
- add_filter(
96
- 'plugin_action_links_' . plugin_basename( $this->product->get_basefile() ), array(
97
- $this,
98
- 'add_rollback_link',
99
- )
100
- );
101
- }
102
-
103
- /**
104
- * Show the rollback links in the plugin page.
105
- *
106
- * @return array The links.
107
- */
108
- public function add_rollback_link( $links ) {
109
- $version = $this->product->get_rollback();
110
- $links[] = '<a href="' . wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) . '">' . sprintf( apply_filters( $this->product->get_key() . '_rollback_label', 'Rollback to v%s' ), $version['version'] ) . '</a>';
111
-
112
- return $links;
113
- }
114
-
115
- /**
116
- * Start the rollback operation.
117
- */
118
- public function start_rollback() {
119
- if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], $this->product->get_key() . '_rollback' ) ) {
120
- wp_nonce_ays( '' );
121
- }
122
-
123
- if ( $this->product->get_type() === 'plugin' ) {
124
- $this->start_rollback_plugin();
125
- } elseif ( $this->product->get_type() === 'theme' ) {
126
- $this->start_rollback_theme();
127
- }
128
- }
129
-
130
- /**
131
- * Alter links and remove duplicate customize message.
132
- *
133
- * @param array $links Array of old links.
134
- *
135
- * @return mixed Array of links.
136
- */
137
- public function alter_links_theme_upgrade( $links ) {
138
- if ( isset( $links['preview'] ) ) {
139
- $links['preview'] = str_replace( '<span aria-hidden="true">Customize</span>', '', $links['preview'] );
140
- }
141
-
142
- return $links;
143
- }
144
-
145
- /**
146
- * Start the rollback operation for the theme.
147
- */
148
- private function start_rollback_theme() {
149
- add_filter( 'update_theme_complete_actions', array( $this, 'alter_links_theme_upgrade' ) );
150
- $rollback = $this->product->get_rollback();
151
- $transient = get_site_transient( 'update_themes' );
152
- $folder = $this->product->get_slug();
153
- $version = $rollback['version'];
154
- $temp_array = array(
155
- 'new_version' => $version,
156
- 'package' => $rollback['url'],
157
- );
158
-
159
- $transient->response[ $folder . '/style.css' ] = $temp_array;
160
- set_site_transient( 'update_themes', $transient );
161
-
162
- $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
163
-
164
- if ( false === $transient ) {
165
- set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
166
- require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
167
- $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
168
- $theme = $folder . '/style.css';
169
- $nonce = 'upgrade-theme_' . $theme;
170
- $url = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme );
171
-
172
- $upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'theme' ) ) );
173
- $upgrader->upgrade( $theme );
174
- delete_transient( $this->product->get_key() . '_warning_rollback' );
175
- wp_die(
176
- '', $title, array(
177
- 'response' => 200,
178
- )
179
- );
180
- }
181
- }
182
-
183
- /**
184
- * Start the rollback operation for the plugin.
185
- */
186
- private function start_rollback_plugin() {
187
- $rollback = $this->product->get_rollback();
188
- $plugin_transient = get_site_transient( 'update_plugins' );
189
- $plugin_folder = $this->product->get_slug();
190
- $plugin_file = $this->product->get_file();
191
- $version = $rollback['version'];
192
- $temp_array = array(
193
- 'slug' => $plugin_folder,
194
- 'new_version' => $version,
195
- 'package' => $rollback['url'],
196
- );
197
-
198
- $temp_object = (object) $temp_array;
199
- $plugin_transient->response[ $plugin_folder . '/' . $plugin_file ] = $temp_object;
200
- set_site_transient( 'update_plugins', $plugin_transient );
201
-
202
- $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
203
-
204
- if ( false === $transient ) {
205
- set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
206
- require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
207
- $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
208
- $plugin = $plugin_folder . '/' . $plugin_file;
209
- $nonce = 'upgrade-plugin_' . $plugin;
210
- $url = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin );
211
- $upgrader_skin = new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) );
212
- $upgrader = new Plugin_Upgrader( $upgrader_skin );
213
- $upgrader->upgrade( $plugin );
214
- delete_transient( $this->product->get_key() . '_warning_rollback' );
215
- wp_die(
216
- '', $title, array(
217
- 'response' => 200,
218
- )
219
- );
220
- }
221
- }
222
- }
223
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget-dashboard-blog.php DELETED
@@ -1,412 +0,0 @@
1
- <?php
2
- /**
3
- * The blog dashboard model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widget_Dashboard_Blog' ) ) :
16
- /**
17
- * Blog dashboard widget model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Widget_Dashboard_Blog extends ThemeIsle_SDK_Widget {
20
-
21
- /**
22
- * @var array instance The instances.
23
- */
24
- protected $product;
25
- /**
26
- * @var array Feed items.
27
- */
28
- private $items = array();
29
-
30
- /**
31
- * ThemeIsle_SDK_Widget_Dashboard_Blog constructor.
32
- *
33
- * @param ThemeIsle_SDK_Product $product_object The product object.
34
- */
35
- public function __construct( $product_object ) {
36
- $this->product = $product_object;
37
- parent::__construct( $product_object );
38
- }
39
-
40
- /**
41
- * Registers the hooks
42
- */
43
- public function setup_hooks_child() {
44
- $this->setup_vars();
45
- add_action( 'wp_dashboard_setup', array( &$this, 'add_widget' ) );
46
- add_action( 'wp_network_dashboard_setup', array( &$this, 'add_widget' ) );
47
- add_filter( 'themeisle_sdk_recommend_plugin_or_theme', array( &$this, 'recommend_plugin_or_theme' ) );
48
- }
49
-
50
- /**
51
- * Setup class variables
52
- */
53
- function setup_vars() {
54
- $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
55
- $this->feeds = apply_filters(
56
- 'themeisle_sdk_dashboard_widget_feeds', array(
57
- 'https://themeisle.com/blog/feed',
58
- )
59
- );
60
- }
61
-
62
- /**
63
- * Add widget to the dashboard
64
- *
65
- * @return string|void
66
- */
67
- function add_widget() {
68
- global $wp_meta_boxes;
69
- if ( isset( $wp_meta_boxes['dashboard']['normal']['core']['themeisle'] ) ) {
70
- return;
71
- }
72
- wp_add_dashboard_widget(
73
- 'themeisle', $this->dashboard_name, array(
74
- &$this,
75
- 'render_dashboard_widget',
76
- )
77
- );
78
- }
79
-
80
- /**
81
- * Setup feed items.
82
- */
83
- private function setup_feeds() {
84
- $items_normalized = array();
85
- if ( false === ( $items_normalized = get_transient( 'themeisle_sdk_feed_items' ) ) ) {
86
- // Load SimplePie Instance
87
- $feed = fetch_feed( $this->feeds );
88
- // TODO report error when is an error loading the feed
89
- if ( is_wp_error( $feed ) ) {
90
- return;
91
- }
92
-
93
- $items = $feed->get_items( 0, 5 );
94
- foreach ( (array) $items as $item ) {
95
- $items_normalized[] = array(
96
- 'title' => $item->get_title(),
97
- 'date' => $item->get_date( 'U' ),
98
- 'link' => $item->get_permalink(),
99
- );
100
- }
101
- set_transient( 'themeisle_sdk_feed_items', $items_normalized, 48 * HOUR_IN_SECONDS );
102
- }
103
- $this->items = $items_normalized;
104
- }
105
-
106
- /**
107
- * Render widget content
108
- */
109
- function render_dashboard_widget() {
110
- $this->setup_feeds();
111
- if ( empty( $this->items ) || ! is_array( $this->items ) ) {
112
- return;
113
- }
114
- ?>
115
- <style type="text/css">
116
- #themeisle ul li.ti-dw-recommend-item {
117
- padding-left: 7px;
118
- border-top: 1px solid #eee;
119
- margin-bottom: 0px;
120
- padding-top: 6px;
121
- }
122
-
123
- #themeisle h2.hndle {
124
- background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4xMiA3Ny4xMiI+PHRpdGxlPkFzc2V0IDM8L3RpdGxlPjxwYXRoIGQ9Ik03NS43Niw0Ny42cS0xLjUsNi40Ni00LjA3LDkuMjZBMzYuMjIsMzYuMjIsMCwwLDEsNjMuMjYsNjNhNTEsNTEsMCwwLDEtOS43OSw0LjZoLS4xNXY0LjgyQTQuNjYsNC42NiwwLDAsMSw1Miw3NS43Niw0LjA3LDQuMDcsMCwwLDEsNDksNzcuMTJhNCw0LDAsMCwxLTIuMTgtLjYxQTQuOTQsNC45NCwwLDAsMSw0NS4xOSw3NWE0LjQyLDQuNDIsMCwwLDEtNy41NCwwLDQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSwzLjc1LDMuNzUsMCwwLDEtMiwuNjFBNC4yNyw0LjI3LDAsMCwxLDMwLjI3LDc1YTQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSw0LDQsMCwwLDEtMi4xOC42MSwzLjkzLDMuOTMsMCwwLDEtMy4xNi0xLjQzLDUuMyw1LjMsMCwwLDEtMS4yMS0zLjU0LDEzLjgxLDEzLjgxLDAsMCwxLTguNTgsMywxMy4yMywxMy4yMywwLDAsMS05LTMuNDdBMTguMjEsMTguMjEsMCwwLDAsOSw3MC43OWExNC4yNiwxNC4yNiwwLDAsMS03LjgzLTUuNDIsMTYuMTIsMTYuMTIsMCwwLDAsNS4xOS4wNywxMi44OSwxMi44OSwwLDAsMCw0LjktMS43M1EzLjE1LDU1LjQzLDEuMDUsNTAuNDZhMTgsMTgsMCwwLDEtMS02LjkzQTQwLDQwLDAsMCwxLDEuMjEsMzQsMjYuNTksMjYuNTksMCwwLDEsNS4yNywyNC4xUTguNDQsMTkuNDMsMTMsMTkuNDNhMy40MSwzLjQxLDAsMCwxLDMuNDcsMi4yNmMuNi0uOCwxLjItMS41NiwxLjgxLTIuMjZsLjQ1LS40NS43NS0uNzUsMS4wNS0xLjgxYTM1LjIsMzUuMiwwLDAsMSwyLjExLTMuMzIsMjguNTcsMjguNTcsMCwwLDEsOS4xMi03LjY4QTIzLjQsMjMuNCwwLDAsMSw0Mi45MywyLjU2YTIyLjIyLDIyLjIyLDAsMCwxLDIuNzEuMTVBOC4xNiw4LjE2LDAsMCwxLDUxLjgxLDAsOC42OSw4LjY5LDAsMCwxLDU4LDIuNDFhMS41MSwxLjUxLDAsMCwxLC4xNS42OGMwLC4yNS0uNTUuOTMtMS42NiwybC0uMy4zYTkuNjksOS42OSwwLDAsMSwxLjU4LjgzYy41NS4zNS44My42NS44My45YTEuNjIsMS42MiwwLDAsMS0uNiwxbC0uMTUuMTVxNi43OCw2LDguNTgsMTYuMjdBMy4zLDMuMywwLDAsMSw2OSwyMy4zNWE2LjQ4LDYuNDgsMCwwLDEsNC4yMiwyLjFxMy45MiwzLjMyLDMuOTIsMTEuOUE0Mi4wNSw0Mi4wNSwwLDAsMSw3NS43Niw0Ny42Wk01My42Miw1NC4wN2EyNCwyNCwwLDAsMS0xNCw0LjUyQTIxLjQxLDIxLjQxLDAsMCwxLDI3LDU0LjY3LDI0LjI4LDI0LjI4LDAsMCwxLDE4LjUzLDQ1YTI5LDI5LDAsMCwxLTMtMTMsMzEuNzgsMzEuNzgsMCwwLDEsLjkxLTcuNTNBMzIuMTcsMzIuMTcsMCwwLDAsMTEuOSw0MS4yN2EzMy41LDMzLjUsMCwwLDAsMi43OSwxMy40LDI5LjEsMjkuMSwwLDAsMCw3LjksMTAuODUsNC42OCw0LjY4LDAsMCwxLDEuNjYtMS44OCw0LjE3LDQuMTcsMCwwLDEsNC40NC0uMDgsNC41LDQuNSwwLDAsMSwxLjU4LDEuNjZBNC4yLDQuMiwwLDAsMSwzNCw2M2EzLjgzLDMuODMsMCwwLDEsMiwuNiw0LjUsNC41LDAsMCwxLDEuNTgsMS42Niw0LjI3LDQuMjcsMCwwLDEsNy41NCwwLDQuNSw0LjUsMCwwLDEsMS41OC0xLjY2LDQuMTcsNC4xNywwLDAsMSw0LjQ0LjA4LDMuODYsMy44NiwwLDAsMSwxLjUxLDEuNzMsMzAuMTcsMzAuMTcsMCwwLDAsNy42OC05Ljk0LDMxLjE4LDMxLjE4LDAsMCwwLDMuMTYtMTIuMzVBMjguMzksMjguMzksMCwwLDEsNTMuNjIsNTQuMDdaTTI4Ljc3LDY1LjM3YTMuMSwzLjEsMCwwLDAtNC4zNywwLDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi45MywyLjkzLDAsMCwwLDQuMzcsMCwzLjMyLDMuMzIsMCwwLDAsLjktMi4zM1Y2Ny42M0EzLjA2LDMuMDYsMCwwLDAsMjguNzcsNjUuMzdabS45LTQ4YTQuMjQsNC4yNCwwLDAsMCwzLjQ3LDEuNzMsNC40NSw0LjQ1LDAsMCwwLDMuNTQtMS43Myw2LDYsMCwwLDAsMS40My0zLjkyLDUuNyw1LjcsMCwwLDAtMS40My0zLjg0QTQuNTMsNC41MywwLDAsMCwzMy4xNCw4YTQuMzEsNC4zMSwwLDAsMC0zLjQ3LDEuNjYsNS43OSw1Ljc5LDAsMCwwLTEuMzUsMy43N0E2LjMzLDYuMzMsMCwwLDAsMjkuNjcsMTcuNFptNi40OCw0OGEzLjEsMy4xLDAsMCwwLTQuMzcsMCwzLjA2LDMuMDYsMCwwLDAtLjksMi4yNnY0LjgyYTMuMzIsMy4zMiwwLDAsMCwuOSwyLjMzLDIuOTMsMi45MywwLDAsMCw0LjM3LDAsMy4zMiwzLjMyLDAsMCwwLC45LTIuMzNWNjcuNjNBMy4wNiwzLjA2LDAsMCwwLDM2LjE1LDY1LjM3Wm0tNC4wNy01NC4zYTIuMzcsMi4zNywwLDAsMSwyLTEsMi4xNywyLjE3LDAsMCwxLDEuODgsMSw0LjEsNC4xLDAsMCwxLDAsNC41MiwyLjE3LDIuMTcsMCwwLDEtMS44OCwxLDIuMzcsMi4zNywwLDAsMS0yLTEsMy43MiwzLjcyLDAsMCwxLS43NS0yLjM0QTMuNDksMy40OSwwLDAsMSwzMi4wOCwxMS4wN1ptNSw5LjQxYTIwLjYxLDIwLjYxLDAsMCwwLTMuNTQsMTIuMjgsMTcuMTUsMTcuMTUsMCwwLDAsNC4wNywxMSwxMi40MywxMi40MywwLDAsMCw5Ljg3LDQuNDUsMTUuMywxNS4zLDAsMCwwLDktMywxMywxMywwLDAsMCwuNi0zLjMycTAtMy4zMi0zLjE2LTMuMzFhOC41OCw4LjU4LDAsMCwwLTIsLjNxLTcuODMsMS41LTExLjU5LS4zLTQuNTMtMi4xMi00LjUyLTkuMzRBMzcuOTIsMzcuOTIsMCwwLDEsMzcuMDUsMjAuNDhaTTYxLjQ1LDE3QTEyLjg0LDEyLjg0LDAsMCwwLDUxLjIxLDEyLjJhMTUuMTEsMTUuMTEsMCwwLDAtNi40LDEuNDMsMTcuODMsMTcuODMsMCwwLDAtNS41LDRxLTYuMTgsMjAuNjQsNi4xOCwyMC42NEEyNC43NSwyNC43NSwwLDAsMCw0OSwzNy44MWEzOC45MiwzOC45MiwwLDAsMSw0LjgyLS40NmMxLjgxLDAsMy4wNi40NiwzLjc3LDEuMzZxMS4zNSwxLjUuNzUsNS4xMmEyMS43MiwyMS43MiwwLDAsMCw1LTcuMTVBMjEuMzgsMjEuMzgsMCwwLDAsNjUuMDcsMjgsMTcuNDQsMTcuNDQsMCwwLDAsNjEuNDUsMTdaTTQzLjYsNjUuMzdhMi43MiwyLjcyLDAsMCwwLTIuMS0uOSwzLDMsMCwwLDAtMi4xOS45LDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi44NCwyLjg0LDAsMCwwLDIuMTksMSwyLjYxLDIuNjEsMCwwLDAsMi4xLTEsMy40NSwzLjQ1LDAsMCwwLC44My0yLjMzVjY3LjYzQTMuMTcsMy4xNywwLDAsMCw0My42LDY1LjM3Wm03LjQ2LDBhMywzLDAsMCwwLTIuMTgtLjksMi43MywyLjczLDAsMCwwLTIuMTEuOSwzLjE3LDMuMTcsMCwwLDAtLjgzLDIuMjZ2NC44MmEzLjQ1LDMuNDUsMCwwLDAsLjgzLDIuMzMsMi42MSwyLjYxLDAsMCwwLDIuMTEsMSwyLjgzLDIuODMsMCwwLDAsMi4xOC0xLDMuMzIsMy4zMiwwLDAsMCwuOS0yLjMzVjY3LjYzQTMuMDYsMy4wNiwwLDAsMCw1MS4wNiw2NS4zN1oiLz48L3N2Zz4=');
125
- background-repeat: no-repeat;
126
- background-position: 92% 50%;
127
- background-size: 30px;
128
- }
129
-
130
- #themeisle .inside {
131
- padding: 0;
132
- }
133
-
134
- .ti-feed-list {
135
- padding: 0 12px 5px;
136
- margin-bottom: 10px;
137
- border-bottom: 1px solid #eee;
138
- }
139
-
140
- .ti-dw-feed-item a {
141
- display: flex;
142
- align-items: center;
143
- margin-bottom: 5px;
144
- padding: 5px;
145
- transition: .2s ease;
146
- border-radius: 3px;
147
- }
148
-
149
- .ti-dw-feed-item a:hover {
150
- background-color: #f8f8f8;
151
- }
152
-
153
- .ti-dw-feed-item a:hover .ti-dw-date-container {
154
- opacity: .9;
155
- }
156
-
157
- .ti-dw-feed-item .ti-dw-month-container {
158
- margin-top: -5px;
159
- text-transform: uppercase;
160
- font-size: 10px;
161
- letter-spacing: 1px;
162
- font-weight: 700;
163
- }
164
-
165
- .ti-dw-feed-item .ti-dw-date-container {
166
- border-radius: 3px;
167
- transition: .2s ease;
168
- min-height: 35px;
169
- margin-right: 5px;
170
- min-width: 35px;
171
- text-align: center;
172
- border: 1px solid #2a6f97;
173
- color: #fff;
174
- background: #2ea2cc;
175
- display: flex;
176
- flex-direction: column;
177
- justify-content: center;
178
- }
179
-
180
- .ti-dw-footer {
181
- padding: 0 12px 5px;
182
- text-align: center;
183
- }
184
-
185
- .ti-dw-recommend-item {
186
- display: block;
187
- }
188
-
189
- .ti-dw-recommend-item span {
190
- color: #72777c;
191
- }
192
-
193
- .ti-dw-powered-by {
194
- font-size: 11px;
195
- margin-top: 3px;
196
- display: block;
197
- color: #72777c;
198
- }
199
-
200
- .ti-dw-powered-by span {
201
- font-weight: 600;
202
- }
203
-
204
- </style>
205
- <ul class="ti-feed-list">
206
- <?php
207
- foreach ( $this->items as $item ) {
208
- ?>
209
- <li class="ti-dw-feed-item">
210
- <a href="
211
- <?php
212
- echo add_query_arg(
213
- array(
214
- 'utm_campaign' => 'feed',
215
- 'utm_medium' => 'dashboard_widget',
216
- ), $item['link']
217
- );
218
- ?>
219
- " target="_blank">
220
- <span class="ti-dw-date-container"><span
221
- class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
222
- class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><?php echo $item['title']; ?>
223
- </a>
224
- </li>
225
- <?php
226
- }
227
- ?>
228
- </ul>
229
- <?php
230
- $recommend = apply_filters( 'themeisle_sdk_recommend_plugin_or_theme', array() );
231
- if ( is_array( $recommend ) && ! empty( $recommend ) ) {
232
-
233
- $type = $recommend['type'];
234
- if ( ( $type == 'theme' && current_user_can( 'install_themes' ) ) || ( $type == 'plugin' && current_user_can( 'install_plugins' ) ) ) {
235
- add_thickbox();
236
- $url = add_query_arg(
237
- array(
238
- 'theme' => $recommend['slug'],
239
- ), network_admin_url( 'theme-install.php' )
240
- );
241
-
242
- if ( 'plugin' === $type ) {
243
-
244
- $url = add_query_arg(
245
- array(
246
- 'tab' => 'plugin-information',
247
- 'plugin' => $recommend['slug'],
248
- ), network_admin_url( 'plugin-install.php' )
249
- );
250
- }
251
- ?>
252
- <div class="ti-dw-footer">
253
- <span class="ti-dw-recommend-item ">
254
- <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
255
- : </span>
256
- <?php
257
- echo trim(
258
- str_replace(
259
- array(
260
- 'lite',
261
- 'Lite',
262
- ), '', $recommend['name']
263
- )
264
- );
265
- ?>
266
- (<a class="thickbox open-plugin-details-modal"
267
- href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
268
- </span>
269
- <span class="ti-dw-powered-by">
270
- Powered by <span><?php echo esc_attr( $this->product->get_friendly_name() ); ?></span>
271
- </span>
272
- </div>
273
-
274
- <?php
275
- }
276
- }
277
- ?>
278
-
279
- <?php
280
-
281
- }
282
-
283
- /**
284
- * Either the current product is installed or not.
285
- *
286
- * @param array $val The current recommended product.
287
- *
288
- * @return bool Either we should exclude the plugin or not.
289
- */
290
- public function remove_current_products( $val ) {
291
- if ( $val['type'] === 'theme' ) {
292
- $exist = wp_get_theme( $val['slug'] );
293
-
294
- return ! $exist->exists();
295
- } else {
296
- $all_plugins = array_keys( get_plugins() );
297
- foreach ( $all_plugins as $slug ) {
298
- if ( strpos( $slug, $val['slug'] ) !== false ) {
299
- return false;
300
- }
301
- }
302
-
303
- return true;
304
- }
305
- }
306
-
307
- /**
308
- * Fetch themes from wporg api.
309
- *
310
- * @param string $author The author name.
311
- *
312
- * @return array The list of themes.
313
- */
314
- function get_themes_from_wporg( $author ) {
315
- $products = wp_remote_get(
316
- 'https://api.wordpress.org/themes/info/1.1/?action=query_themes&request[author]=' . $author . '&request[per_page]=30&request[fields][active_installs]=true'
317
- );
318
- $products = json_decode( wp_remote_retrieve_body( $products ) );
319
- if ( is_object( $products ) ) {
320
- $products = isset( $products->themes ) ? $products->themes : array();
321
- } else {
322
- $products = array();
323
- }
324
-
325
- return $products;
326
- }
327
-
328
- /**
329
- * Fetch plugin from wporg api.
330
- *
331
- * @param string $author The author slug.
332
- *
333
- * @return array The list of plugins for the selected author.
334
- */
335
- function get_plugins_from_wporg( $author ) {
336
- $products = wp_remote_get(
337
- 'https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[author]=' . $author . '&request[author]=codeinwp&request[per_page]=20&request[fields][active_installs]=true'
338
- );
339
- $products = json_decode( wp_remote_retrieve_body( $products ) );
340
- if ( is_object( $products ) ) {
341
- $products = isset( $products->plugins ) ? $products->plugins : array();
342
- } else {
343
- $products = array();
344
- }
345
-
346
- return $products;
347
- }
348
-
349
- /**
350
- * Fetch products from the recomended section.
351
- *
352
- * @return array|mixed The list of products to use in recomended section.
353
- */
354
- function get_product_from_api() {
355
- if ( false === ( $products = get_transient( 'themeisle_sdk_products' ) ) ) {
356
- $products = array();
357
- $themeisle_themes = $this->get_themes_from_wporg( 'themeisle' );
358
- $codeinwp_themes = $this->get_themes_from_wporg( 'codeinwp' );
359
-
360
- $themeisle_plugins = $this->get_plugins_from_wporg( 'themeisle' );
361
- $codeinwp_plugins = $this->get_plugins_from_wporg( 'codeinwp' );
362
-
363
- $all_themes = array_merge( $themeisle_themes, $codeinwp_themes );
364
- foreach ( $all_themes as $theme ) {
365
- if ( $theme->active_installs < 4999 ) {
366
- continue;
367
- }
368
- $products[] = array(
369
- 'name' => $theme->name,
370
- 'type' => 'theme',
371
- 'slug' => $theme->slug,
372
- 'installs' => $theme->active_installs,
373
- );
374
- }
375
- $all_plugins = array_merge( $themeisle_plugins, $codeinwp_plugins );
376
- foreach ( $all_plugins as $plugin ) {
377
- if ( $plugin->active_installs < 5999 ) {
378
- continue;
379
- }
380
- $products[] = array(
381
- 'name' => $plugin->name,
382
- 'type' => 'plugin',
383
- 'slug' => $plugin->slug,
384
- 'installs' => $plugin->active_installs,
385
- );
386
- }
387
- set_transient( 'themeisle_sdk_products', $products, 6 * HOUR_IN_SECONDS );
388
- }
389
-
390
- return $products;
391
- }
392
-
393
- /**
394
- * Contact the API and fetch the recommended plugins/themes
395
- */
396
- function recommend_plugin_or_theme() {
397
- $products = $this->get_product_from_api();
398
- if ( ! is_array( $products ) ) {
399
- $products = array();
400
- }
401
- $products = array_filter( $products, array( $this, 'remove_current_products' ) );
402
- $products = array_merge( $products );
403
- if ( count( $products ) > 1 ) {
404
- shuffle( $products );
405
- $products = array_slice( $products, 0, 1 );
406
- }
407
- $to_recommend = isset( $products[0] ) ? $products[0] : $products;
408
-
409
- return $to_recommend;
410
- }
411
- }
412
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widget.php DELETED
@@ -1,50 +0,0 @@
1
- <?php
2
- /**
3
- * The widget model class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widget' ) ) :
16
- /**
17
- * Widget model for ThemeIsle SDK.
18
- */
19
- abstract class ThemeIsle_SDK_Widget {
20
- /**
21
- * @var ThemeIsle_SDK_Product $product Themeisle Product.
22
- */
23
- protected $product;
24
-
25
- /**
26
- * ThemeIsle_SDK_Widget constructor.
27
- *
28
- * @param ThemeIsle_SDK_Product $product_object Product Object.
29
- */
30
- public function __construct( $product_object ) {
31
- if ( $product_object instanceof ThemeIsle_SDK_Product ) {
32
- $this->product = $product_object;
33
- }
34
- $this->setup_hooks();
35
- }
36
-
37
- /**
38
- * Registers the hooks and then delegates to the child
39
- */
40
- public function setup_hooks() {
41
- $this->setup_hooks_child();
42
- }
43
-
44
- /**
45
- * Abstract function for delegating to the child
46
- */
47
- protected abstract function setup_hooks_child();
48
-
49
- }
50
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/class-themeisle-sdk-widgets-factory.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
- /**
3
- * The widgets factory class for ThemeIsle SDK
4
- *
5
- * @package ThemeIsleSDK
6
- * @subpackage Widgets
7
- * @copyright Copyright (c) 2017, Marius Cristea
8
- * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
- * @since 1.0.0
10
- */
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
- if ( ! class_exists( 'ThemeIsle_SDK_Widgets_Factory' ) ) :
16
- /**
17
- * Widgets factory model for ThemeIsle SDK.
18
- */
19
- class ThemeIsle_SDK_Widgets_Factory {
20
-
21
- /**
22
- * ThemeIsle_SDK_Widgets_Factory constructor.
23
- *
24
- * @param ThemeIsle_SDK_Product $product_object Product Object.
25
- * @param array $widgets the widgets.
26
- */
27
- public function __construct( $product_object, $widgets ) {
28
- if ( $product_object instanceof ThemeIsle_SDK_Product && $widgets && is_array( $widgets ) ) {
29
- foreach ( $widgets as $widget ) {
30
- $class = 'ThemeIsle_SDK_Widget_' . str_replace( ' ', '_', ucwords( str_replace( '_', ' ', $widget ) ) );
31
- $instance = new $class( $product_object );
32
- $instance->setup_hooks();
33
- }
34
- }
35
- }
36
- }
37
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/codeinwp/themeisle-sdk/composer.json CHANGED
@@ -1,6 +1,7 @@
1
  {
2
  "name": "codeinwp/themeisle-sdk",
3
- "description": "ThemeIsle SDK ",
 
4
  "keywords": [
5
  "wordpress"
6
  ],
@@ -13,10 +14,15 @@
13
  "homepage": "https://themeisle.com"
14
  }
15
  ],
16
- "autoload": {
17
- "files": [
18
- "load.php"
19
- ]
 
 
 
 
 
20
  },
21
  "support": {
22
  "issues": "https://github.com/Codeinwp/themeisle-sdk/issues"
1
  {
2
  "name": "codeinwp/themeisle-sdk",
3
+ "description": "ThemeIsle SDK.",
4
+ "type": "library",
5
  "keywords": [
6
  "wordpress"
7
  ],
14
  "homepage": "https://themeisle.com"
15
  }
16
  ],
17
+ "version": "3.0.4",
18
+ "require-dev": {
19
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
20
+ "squizlabs/php_codesniffer": "^3.1",
21
+ "wp-coding-standards/wpcs": "^1.0.0"
22
+ },
23
+ "scripts": {
24
+ "format": "phpcbf --standard=phpcs.xml --report-summary --report-source",
25
+ "lint": "phpcs --standard=phpcs.xml"
26
  },
27
  "support": {
28
  "issues": "https://github.com/Codeinwp/themeisle-sdk/issues"
vendor/codeinwp/themeisle-sdk/composer.lock ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "836b37c9484505643ee34c575a736209",
8
+ "packages": [],
9
+ "packages-dev": [
10
+ {
11
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
12
+ "version": "v0.4.4",
13
+ "source": {
14
+ "type": "git",
15
+ "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
16
+ "reference": "2e41850d5f7797cbb1af7b030d245b3b24e63a08"
17
+ },
18
+ "dist": {
19
+ "type": "zip",
20
+ "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/2e41850d5f7797cbb1af7b030d245b3b24e63a08",
21
+ "reference": "2e41850d5f7797cbb1af7b030d245b3b24e63a08",
22
+ "shasum": ""
23
+ },
24
+ "require": {
25
+ "composer-plugin-api": "^1.0",
26
+ "php": "^5.3|^7",
27
+ "squizlabs/php_codesniffer": "*"
28
+ },
29
+ "require-dev": {
30
+ "composer/composer": "*",
31
+ "wimg/php-compatibility": "^8.0"
32
+ },
33
+ "suggest": {
34
+ "dealerdirect/qa-tools": "All the PHP QA tools you'll need"
35
+ },
36
+ "type": "composer-plugin",
37
+ "extra": {
38
+ "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
39
+ },
40
+ "autoload": {
41
+ "psr-4": {
42
+ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
43
+ }
44
+ },
45
+ "notification-url": "https://packagist.org/downloads/",
46
+ "license": [
47
+ "MIT"
48
+ ],
49
+ "authors": [
50
+ {
51
+ "name": "Franck Nijhof",
52
+ "email": "f.nijhof@dealerdirect.nl",
53
+ "homepage": "http://workingatdealerdirect.eu",
54
+ "role": "Developer"
55
+ }
56
+ ],
57
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
58
+ "homepage": "http://workingatdealerdirect.eu",
59
+ "keywords": [
60
+ "PHPCodeSniffer",
61
+ "PHP_CodeSniffer",
62
+ "code quality",
63
+ "codesniffer",
64
+ "composer",
65
+ "installer",
66
+ "phpcs",
67
+ "plugin",
68
+ "qa",
69
+ "quality",
70
+ "standard",
71
+ "standards",
72
+ "style guide",
73
+ "stylecheck",
74
+ "tests"
75
+ ],
76
+ "time": "2017-12-06T16:27:17+00:00"
77
+ },
78
+ {
79
+ "name": "squizlabs/php_codesniffer",
80
+ "version": "3.4.0",
81
+ "source": {
82
+ "type": "git",
83
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
84
+ "reference": "379deb987e26c7cd103a7b387aea178baec96e48"
85
+ },
86
+ "dist": {
87
+ "type": "zip",
88
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/379deb987e26c7cd103a7b387aea178baec96e48",
89
+ "reference": "379deb987e26c7cd103a7b387aea178baec96e48",
90
+ "shasum": ""
91
+ },
92
+ "require": {
93
+ "ext-simplexml": "*",
94
+ "ext-tokenizer": "*",
95
+ "ext-xmlwriter": "*",
96
+ "php": ">=5.4.0"
97
+ },
98
+ "require-dev": {
99
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
100
+ },
101
+ "bin": [
102
+ "bin/phpcs",
103
+ "bin/phpcbf"
104
+ ],
105
+ "type": "library",
106
+ "extra": {
107
+ "branch-alias": {
108
+ "dev-master": "3.x-dev"
109
+ }
110
+ },
111
+ "notification-url": "https://packagist.org/downloads/",
112
+ "license": [
113
+ "BSD-3-Clause"
114
+ ],
115
+ "authors": [
116
+ {
117
+ "name": "Greg Sherwood",
118
+ "role": "lead"
119
+ }
120
+ ],
121
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
122
+ "homepage": "http://www.squizlabs.com/php-codesniffer",
123
+ "keywords": [
124
+ "phpcs",
125
+ "standards"
126
+ ],
127
+ "time": "2018-12-19T23:57:18+00:00"
128
+ },
129
+ {
130
+ "name": "wp-coding-standards/wpcs",
131
+ "version": "1.2.1",
132
+ "source": {
133
+ "type": "git",
134
+ "url": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git",
135
+ "reference": "f328bcafd97377e8e5e5d7b244d5ddbf301a3a5c"
136
+ },
137
+ "dist": {
138
+ "type": "zip",
139
+ "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/f328bcafd97377e8e5e5d7b244d5ddbf301a3a5c",
140
+ "reference": "f328bcafd97377e8e5e5d7b244d5ddbf301a3a5c",
141
+ "shasum": ""
142
+ },
143
+ "require": {
144
+ "php": ">=5.3",
145
+ "squizlabs/php_codesniffer": "^2.9.0 || ^3.0.2"
146
+ },
147
+ "require-dev": {
148
+ "phpcompatibility/php-compatibility": "^9.0"
149
+ },
150
+ "suggest": {
151
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
152
+ },
153
+ "type": "phpcodesniffer-standard",
154
+ "notification-url": "https://packagist.org/downloads/",
155
+ "license": [
156
+ "MIT"
157
+ ],
158
+ "authors": [
159
+ {
160
+ "name": "Contributors",
161
+ "homepage": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/graphs/contributors"
162
+ }
163
+ ],
164
+ "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions",
165
+ "keywords": [
166
+ "phpcs",
167
+ "standards",
168
+ "wordpress"
169
+ ],
170
+ "time": "2018-12-18T09:43:51+00:00"
171
+ }
172
+ ],
173
+ "aliases": [],
174
+ "minimum-stability": "stable",
175
+ "stability-flags": [],
176
+ "prefer-stable": false,
177
+ "prefer-lowest": false,
178
+ "platform": [],
179
+ "platform-dev": []
180
+ }
vendor/codeinwp/themeisle-sdk/docker-compose.local.yml ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ version: '3.1'
2
+
3
+ services:
4
+ wordpress:
5
+ depends_on:
6
+ - mysql
7
+ image: hardeepasrani/pirate-brewery
8
+ ports:
9
+ - 999:80
10
+ volumes:
11
+ - ./:/var/www/html/wp-content/plugins/themeisle-sdk-sample
12
+ restart: always
13
+ environment:
14
+ WORDPRESS_DB_NAME: wordpress
15
+ WORDPRESS_DB_USER: wordpress
16
+ WORDPRESS_DB_PASSWORD: wordpress
17
+ WORDPRESS_DB_ROOT_PASSWORD: wordpress
18
+ mysql:
19
+ image: mysql:5.7
20
+ volumes:
21
+ - ~/db_data:/var/lib/mysql
22
+ restart: always
23
+ environment:
24
+ MYSQL_ROOT_PASSWORD: wordpress
25
+ MYSQL_DATABASE: wordpress
26
+ MYSQL_USER: wordpress
27
+ MYSQL_PASSWORD: wordpress
vendor/codeinwp/themeisle-sdk/index.php CHANGED
@@ -1,5 +1,3 @@
1
  <?php
2
- /**
3
- * @package ThemeIsleSDK
4
- * Ignore this.
5
- */
1
  <?php
2
+ // phpcs:ignoreFile
3
+ // Nothing here.
 
 
vendor/codeinwp/themeisle-sdk/load.php CHANGED
@@ -10,24 +10,38 @@
10
  * @since 1.1.0
11
  */
12
 
 
 
 
13
  // Current SDK version and path.
14
- $themeisle_sdk_version = '2.2.8';
15
  $themeisle_sdk_path = dirname( __FILE__ );
16
 
17
  global $themeisle_sdk_max_version;
18
  global $themeisle_sdk_max_path;
19
 
20
- if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_version ) >= 0 ) {
 
 
 
 
 
21
  $themeisle_sdk_max_version = $themeisle_sdk_version;
22
  $themeisle_sdk_max_path = $themeisle_sdk_path;
23
  }
24
 
25
- // load the latest sdk version from the active Themeisle products
26
  if ( ! function_exists( 'themeisle_sdk_load_latest' ) ) :
27
  /**
28
  * Always load the latest sdk version.
29
  */
30
  function themeisle_sdk_load_latest() {
 
 
 
 
 
 
31
  global $themeisle_sdk_max_path;
32
  require_once $themeisle_sdk_max_path . '/start.php';
33
  }
10
  * @since 1.1.0
11
  */
12
 
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ return;
15
+ }
16
  // Current SDK version and path.
17
+ $themeisle_sdk_version = '3.0.4';
18
  $themeisle_sdk_path = dirname( __FILE__ );
19
 
20
  global $themeisle_sdk_max_version;
21
  global $themeisle_sdk_max_path;
22
 
23
+ if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_path ) == 0 &&
24
+ apply_filters( 'themeisle_sdk_should_overwrite_path', false, $themeisle_sdk_path, $themeisle_sdk_max_path ) ) {
25
+ $themeisle_sdk_max_path = $themeisle_sdk_path;
26
+ }
27
+
28
+ if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_version ) > 0 ) {
29
  $themeisle_sdk_max_version = $themeisle_sdk_version;
30
  $themeisle_sdk_max_path = $themeisle_sdk_path;
31
  }
32
 
33
+ // load the latest sdk version from the active Themeisle products.
34
  if ( ! function_exists( 'themeisle_sdk_load_latest' ) ) :
35
  /**
36
  * Always load the latest sdk version.
37
  */
38
  function themeisle_sdk_load_latest() {
39
+ /**
40
+ * Don't load the library if we are on < 5.4.
41
+ */
42
+ if ( version_compare( PHP_VERSION, '5.4.32', '<' ) ) {
43
+ return;
44
+ }
45
  global $themeisle_sdk_max_path;
46
  require_once $themeisle_sdk_max_path . '/start.php';
47
  }
vendor/codeinwp/themeisle-sdk/package-lock.json ADDED
@@ -0,0 +1,7312 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "themeisle-sdk",
3
+ "version": "3.0.3",
4
+ "lockfileVersion": 1,
5
+ "requires": true,
6
+ "dependencies": {
7
+ "@mrmlnc/readdir-enhanced": {
8
+ "version": "2.2.1",
9
+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
10
+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
11
+ "dev": true,
12
+ "requires": {
13
+ "call-me-maybe": "^1.0.1",
14
+ "glob-to-regexp": "^0.3.0"
15
+ }
16
+ },
17
+ "@nodelib/fs.stat": {
18
+ "version": "1.1.3",
19
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
20
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
21
+ "dev": true
22
+ },
23
+ "@octokit/endpoint": {
24
+ "version": "3.1.1",
25
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-3.1.1.tgz",
26
+ "integrity": "sha512-KPkoTvKwCTetu/UqonLs1pfwFO5HAqTv/Ksp9y4NAg//ZgUCpvJsT4Hrst85uEzJvkB8+LxKyR4Bfv2X8O4cmQ==",
27
+ "dev": true,
28
+ "requires": {
29
+ "deepmerge": "3.0.0",
30
+ "is-plain-object": "^2.0.4",
31
+ "universal-user-agent": "^2.0.1",
32
+ "url-template": "^2.0.8"
33
+ }
34
+ },
35
+ "@octokit/request": {
36
+ "version": "2.2.0",
37
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-2.2.0.tgz",
38
+ "integrity": "sha512-4P9EbwKZ4xfyupVMb3KVuHmM+aO2fye3nufjGKz/qDssvdJj9Rlx44O0FdFvUp4kIzToy3AHLTOulEIDAL+dpg==",
39
+ "dev": true,
40
+ "requires": {
41
+ "@octokit/endpoint": "^3.0.0",
42
+ "is-plain-object": "^2.0.4",
43
+ "node-fetch": "^2.3.0",
44
+ "universal-user-agent": "^2.0.1"
45
+ }
46
+ },
47
+ "@octokit/rest": {
48
+ "version": "16.3.0",
49
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.3.0.tgz",
50
+ "integrity": "sha512-u0HkROLB0nOSfJhkF5FKMg6I12m6cN5S3S73Lwtfgrs9u4LhgUCZN2hC2KDyIaT7nhvNe9Kx0PgxhhD6li6QsA==",
51
+ "dev": true,
52
+ "requires": {
53
+ "@octokit/request": "2.2.0",
54
+ "before-after-hook": "^1.2.0",
55
+ "btoa-lite": "^1.0.0",
56
+ "lodash.get": "^4.4.2",
57
+ "lodash.pick": "^4.4.0",
58
+ "lodash.set": "^4.3.2",
59
+ "lodash.uniq": "^4.5.0",
60
+ "octokit-pagination-methods": "^1.1.0",
61
+ "universal-user-agent": "^2.0.0",
62
+ "url-template": "^2.0.8"
63
+ }
64
+ },
65
+ "@semantic-release/changelog": {
66
+ "version": "3.0.1",
67
+ "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-3.0.1.tgz",
68
+ "integrity": "sha512-N3lWwS3SUQmjBI/IoxwfQwPHAeQgYkvM63nzBpYkp2DXQ9zdLs5ZYpD1oln//wWCKVSIY2tPDs7KD4LVVh6u5Q==",
69
+ "dev": true,
70
+ "requires": {
71
+ "@semantic-release/error": "^2.1.0",
72
+ "aggregate-error": "^1.0.0",
73
+ "fs-extra": "^7.0.0",
74
+ "lodash": "^4.17.4"
75
+ }
76
+ },
77
+ "@semantic-release/commit-analyzer": {
78
+ "version": "6.1.0",
79
+ "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-6.1.0.tgz",
80
+ "integrity": "sha512-2lb+t6muGenI86mYGpZYOgITx9L3oZYF697tJoqXeQEk0uw0fm+OkkOuDTBA3Oax9ftoNIrCKv9bwgYvxrbM6w==",
81
+ "dev": true,
82
+ "requires": {
83
+ "conventional-changelog-angular": "^5.0.0",
84
+ "conventional-commits-filter": "^2.0.0",
85
+ "conventional-commits-parser": "^3.0.0",
86
+ "debug": "^4.0.0",
87
+ "import-from": "^2.1.0",
88
+ "lodash": "^4.17.4"
89
+ }
90
+ },
91
+ "@semantic-release/error": {
92
+ "version": "2.2.0",
93
+ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-2.2.0.tgz",
94
+ "integrity": "sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==",
95
+ "dev": true
96
+ },
97
+ "@semantic-release/exec": {
98
+ "version": "3.3.1",
99
+ "resolved": "https://registry.npmjs.org/@semantic-release/exec/-/exec-3.3.1.tgz",
100
+ "integrity": "sha512-dyktNa5cpV9TqQjxBIfCJKpDlKyYJ5OzL/04uBr9qUDXcDgaczGip3M/In/Ff/KGZSzkvrx+m96LVpng9+g5Tw==",
101
+ "dev": true,
102
+ "requires": {
103
+ "@semantic-release/error": "^2.1.0",
104
+ "aggregate-error": "^1.0.0",
105
+ "debug": "^4.0.0",
106
+ "execa": "^1.0.0",
107
+ "lodash": "^4.17.4",
108
+ "parse-json": "^4.0.0"
109
+ }
110
+ },
111
+ "@semantic-release/git": {
112
+ "version": "7.0.6",
113
+ "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-7.0.6.tgz",
114
+ "integrity": "sha512-Uyi/RFBYv8jecMo7vJfjsr9rweJkOPuY6CJOITbOzhHmJjZssVOf7sS+zuqEQQsVzU+PPYIjx86HkIzbve/Evg==",
115
+ "dev": true,
116
+ "requires": {
117
+ "@semantic-release/error": "^2.1.0",
118
+ "aggregate-error": "^1.0.0",
119
+ "debug": "^4.0.0",
120
+ "dir-glob": "^2.0.0",
121
+ "execa": "^1.0.0",
122
+ "fs-extra": "^7.0.0",
123
+ "globby": "^8.0.1",
124
+ "lodash": "^4.17.4",
125
+ "micromatch": "^3.1.4",
126
+ "p-reduce": "^1.0.0"
127
+ }
128
+ },
129
+ "@semantic-release/github": {
130
+ "version": "5.2.7",
131
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-5.2.7.tgz",
132
+ "integrity": "sha512-cWQhM9bdBv8KAwClmwM64Mo3vsOHVM2aJAGI6K3qbJfJ3GsLJLh1hTi+rMd5EkZ2DA8zUUHCiAJZ3ujMvUB0yg==",
133
+ "dev": true,
134
+ "requires": {
135
+ "@octokit/rest": "^16.0.1",
136
+ "@semantic-release/error": "^2.2.0",
137
+ "aggregate-error": "^1.0.0",
138
+ "bottleneck": "^2.0.1",
139
+ "debug": "^4.0.0",
140
+ "dir-glob": "^2.0.0",
141
+ "fs-extra": "^7.0.0",
142
+ "globby": "^8.0.0",
143
+ "http-proxy-agent": "^2.1.0",
144
+ "https-proxy-agent": "^2.2.1",
145
+ "issue-parser": "^3.0.0",
146
+ "lodash": "^4.17.4",
147
+ "mime": "^2.0.3",
148
+ "p-filter": "^1.0.0",
149
+ "p-retry": "^3.0.0",
150
+ "parse-github-url": "^1.0.1",
151
+ "url-join": "^4.0.0"
152
+ }
153
+ },
154
+ "@semantic-release/npm": {
155
+ "version": "5.1.2",
156
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-5.1.2.tgz",
157
+ "integrity": "sha512-hAt8Q86jjp0AiykihhZ7vuCFKYz0j8v3W6Jae8b+RCLi8IUofrPF1ZImx3oY0rRu8ZZSb4aU9uxtFmeOYZebjg==",
158
+ "dev": true,
159
+ "requires": {
160
+ "@semantic-release/error": "^2.2.0",
161
+ "aggregate-error": "^1.0.0",
162
+ "execa": "^1.0.0",
163
+ "fs-extra": "^7.0.0",
164
+ "lodash": "^4.17.4",
165
+ "nerf-dart": "^1.0.0",
166
+ "normalize-url": "^4.0.0",
167
+ "npm": "^6.3.0",
168
+ "rc": "^1.2.8",
169
+ "read-pkg": "^4.0.0",
170
+ "registry-auth-token": "^3.3.1"
171
+ },
172
+ "dependencies": {
173
+ "read-pkg": {
174
+ "version": "4.0.1",
175
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz",
176
+ "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=",
177
+ "dev": true,
178
+ "requires": {
179
+ "normalize-package-data": "^2.3.2",
180
+ "parse-json": "^4.0.0",
181
+ "pify": "^3.0.0"
182
+ }
183
+ }
184
+ }
185
+ },
186
+ "@semantic-release/release-notes-generator": {
187
+ "version": "7.1.4",
188
+ "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-7.1.4.tgz",
189
+ "integrity": "sha512-pWPouZujddgb6t61t9iA9G3yIfp3TeQ7bPbV1ixYSeP6L7gI1+Du82fY/OHfEwyifpymLUQW0XnIKgKct5IMMw==",
190
+ "dev": true,
191
+ "requires": {
192
+ "conventional-changelog-angular": "^5.0.0",
193
+ "conventional-changelog-writer": "^4.0.0",
194
+ "conventional-commits-filter": "^2.0.0",
195
+ "conventional-commits-parser": "^3.0.0",
196
+ "debug": "^4.0.0",
197
+ "get-stream": "^4.0.0",
198
+ "import-from": "^2.1.0",
199
+ "into-stream": "^4.0.0",
200
+ "lodash": "^4.17.4"
201
+ }
202
+ },
203
+ "JSONStream": {
204
+ "version": "1.3.5",
205
+ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
206
+ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
207
+ "dev": true,
208
+ "requires": {
209
+ "jsonparse": "^1.2.0",
210
+ "through": ">=2.2.7 <3"
211
+ }
212
+ },
213
+ "abbrev": {
214
+ "version": "1.1.1",
215
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
216
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
217
+ "dev": true
218
+ },
219
+ "agent-base": {
220
+ "version": "4.2.1",
221
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
222
+ "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
223
+ "dev": true,
224
+ "requires": {
225
+ "es6-promisify": "^5.0.0"
226
+ }
227
+ },
228
+ "aggregate-error": {
229
+ "version": "1.0.0",
230
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz",
231
+ "integrity": "sha1-iINE2tAiCnLjr1CQYRf0h3GSX6w=",
232
+ "dev": true,
233
+ "requires": {
234
+ "clean-stack": "^1.0.0",
235
+ "indent-string": "^3.0.0"
236
+ }
237
+ },
238
+ "ansi-regex": {
239
+ "version": "3.0.0",
240
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
241
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
242
+ "dev": true
243
+ },
244
+ "ansi-styles": {
245
+ "version": "3.2.1",
246
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
247
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
248
+ "dev": true,
249
+ "requires": {
250
+ "color-convert": "^1.9.0"
251
+ }
252
+ },
253
+ "ansicolors": {
254
+ "version": "0.3.2",
255
+ "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
256
+ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=",
257
+ "dev": true
258
+ },
259
+ "argparse": {
260
+ "version": "1.0.10",
261
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
262
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
263
+ "dev": true,
264
+ "requires": {
265
+ "sprintf-js": "~1.0.2"
266
+ },
267
+ "dependencies": {
268
+ "sprintf-js": {
269
+ "version": "1.0.3",
270
+ "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
271
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
272
+ "dev": true
273
+ }
274
+ }
275
+ },
276
+ "argv-formatter": {
277
+ "version": "1.0.0",
278
+ "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz",
279
+ "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=",
280
+ "dev": true
281
+ },
282
+ "arr-diff": {
283
+ "version": "4.0.0",
284
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
285
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
286
+ "dev": true
287
+ },
288
+ "arr-flatten": {
289
+ "version": "1.1.0",
290
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
291
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
292
+ "dev": true
293
+ },
294
+ "arr-union": {
295
+ "version": "3.1.0",
296
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
297
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
298
+ "dev": true
299
+ },
300
+ "array-find-index": {
301
+ "version": "1.0.2",
302
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
303
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
304
+ "dev": true
305
+ },
306
+ "array-ify": {
307
+ "version": "1.0.0",
308
+ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz",
309
+ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=",
310
+ "dev": true
311
+ },
312
+ "array-union": {
313
+ "version": "1.0.2",
314
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
315
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
316
+ "dev": true,
317
+ "requires": {
318
+ "array-uniq": "^1.0.1"
319
+ }
320
+ },
321
+ "array-uniq": {
322
+ "version": "1.0.3",
323
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
324
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
325
+ "dev": true
326
+ },
327
+ "array-unique": {
328
+ "version": "0.3.2",
329
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
330
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
331
+ "dev": true
332
+ },
333
+ "arrify": {
334
+ "version": "1.0.1",
335
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
336
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
337
+ "dev": true
338
+ },
339
+ "assign-symbols": {
340
+ "version": "1.0.0",
341
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
342
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
343
+ "dev": true
344
+ },
345
+ "async": {
346
+ "version": "1.5.2",
347
+ "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
348
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
349
+ "dev": true
350
+ },
351
+ "atob": {
352
+ "version": "2.1.2",
353
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
354
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
355
+ "dev": true
356
+ },
357
+ "balanced-match": {
358
+ "version": "1.0.0",
359
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
360
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
361
+ "dev": true
362
+ },
363
+ "base": {
364
+ "version": "0.11.2",
365
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
366
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
367
+ "dev": true,
368
+ "requires": {
369
+ "cache-base": "^1.0.1",
370
+ "class-utils": "^0.3.5",
371
+ "component-emitter": "^1.2.1",
372
+ "define-property": "^1.0.0",
373
+ "isobject": "^3.0.1",
374
+ "mixin-deep": "^1.2.0",
375
+ "pascalcase": "^0.1.1"
376
+ },
377
+ "dependencies": {
378
+ "define-property": {
379
+ "version": "1.0.0",
380
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
381
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
382
+ "dev": true,
383
+ "requires": {
384
+ "is-descriptor": "^1.0.0"
385
+ }
386
+ },
387
+ "is-accessor-descriptor": {
388
+ "version": "1.0.0",
389
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
390
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
391
+ "dev": true,
392
+ "requires": {
393
+ "kind-of": "^6.0.0"
394
+ }
395
+ },
396
+ "is-data-descriptor": {
397
+ "version": "1.0.0",
398
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
399
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
400
+ "dev": true,
401
+ "requires": {
402
+ "kind-of": "^6.0.0"
403
+ }
404
+ },
405
+ "is-descriptor": {
406
+ "version": "1.0.2",
407
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
408
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
409
+ "dev": true,
410
+ "requires": {
411
+ "is-accessor-descriptor": "^1.0.0",
412
+ "is-data-descriptor": "^1.0.0",
413
+ "kind-of": "^6.0.2"
414
+ }
415
+ }
416
+ }
417
+ },
418
+ "before-after-hook": {
419
+ "version": "1.2.0",
420
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.2.0.tgz",
421
+ "integrity": "sha512-wI3QtdLppHNkmM1VgRVLCrlWCKk/YexlPicYbXPs4eYdd1InrUCTFsx5bX1iUQzzMsoRXXPpM1r+p7JEJJydag==",
422
+ "dev": true
423
+ },
424
+ "bottleneck": {
425
+ "version": "2.14.0",
426
+ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.14.0.tgz",
427
+ "integrity": "sha512-hM5zQPPpIe2/pn8rornETr2x7/HOBGJ5u1RW1js6zvE5453bRMMbtbZl0ojB8yNj7w2xNWddpNukrhOikHb7BQ==",
428
+ "dev": true
429
+ },
430
+ "brace-expansion": {
431
+ "version": "1.1.11",
432
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
433
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
434
+ "dev": true,
435
+ "requires": {
436
+ "balanced-match": "^1.0.0",
437
+ "concat-map": "0.0.1"
438
+ }
439
+ },
440
+ "braces": {
441
+ "version": "2.3.2",
442
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
443
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
444
+ "dev": true,
445
+ "requires": {
446
+ "arr-flatten": "^1.1.0",
447
+ "array-unique": "^0.3.2",
448
+ "extend-shallow": "^2.0.1",
449
+ "fill-range": "^4.0.0",
450
+ "isobject": "^3.0.1",
451
+ "repeat-element": "^1.1.2",
452
+ "snapdragon": "^0.8.1",
453
+ "snapdragon-node": "^2.0.1",
454
+ "split-string": "^3.0.2",
455
+ "to-regex": "^3.0.1"
456
+ },
457
+ "dependencies": {
458
+ "extend-shallow": {
459
+ "version": "2.0.1",
460
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
461
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
462
+ "dev": true,
463
+ "requires": {
464
+ "is-extendable": "^0.1.0"
465
+ }
466
+ }
467
+ }
468
+ },
469
+ "btoa-lite": {
470
+ "version": "1.0.0",
471
+ "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz",
472
+ "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=",
473
+ "dev": true
474
+ },
475
+ "builtin-modules": {
476
+ "version": "1.1.1",
477
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
478
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
479
+ "dev": true
480
+ },
481
+ "cache-base": {
482
+ "version": "1.0.1",
483
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
484
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
485
+ "dev": true,
486
+ "requires": {
487
+ "collection-visit": "^1.0.0",
488
+ "component-emitter": "^1.2.1",
489
+ "get-value": "^2.0.6",
490
+ "has-value": "^1.0.0",
491
+ "isobject": "^3.0.1",
492
+ "set-value": "^2.0.0",
493
+ "to-object-path": "^0.3.0",
494
+ "union-value": "^1.0.0",
495
+ "unset-value": "^1.0.0"
496
+ }
497
+ },
498
+ "call-me-maybe": {
499
+ "version": "1.0.1",
500
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
501
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
502
+ "dev": true
503
+ },
504
+ "caller-callsite": {
505
+ "version": "2.0.0",
506
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
507
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
508
+ "dev": true,
509
+ "requires": {
510
+ "callsites": "^2.0.0"
511
+ }
512
+ },
513
+ "caller-path": {
514
+ "version": "2.0.0",
515
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
516
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
517
+ "dev": true,
518
+ "requires": {
519
+ "caller-callsite": "^2.0.0"
520
+ }
521
+ },
522
+ "callsites": {
523
+ "version": "2.0.0",
524
+ "resolved": "http://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
525
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
526
+ "dev": true
527
+ },
528
+ "camelcase": {
529
+ "version": "2.1.1",
530
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
531
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
532
+ "dev": true
533
+ },
534
+ "camelcase-keys": {
535
+ "version": "2.1.0",
536
+ "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
537
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
538
+ "dev": true,
539
+ "requires": {
540
+ "camelcase": "^2.0.0",
541
+ "map-obj": "^1.0.0"
542
+ }
543
+ },
544
+ "cardinal": {
545
+ "version": "2.1.1",
546
+ "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
547
+ "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=",
548
+ "dev": true,
549
+ "requires": {
550
+ "ansicolors": "~0.3.2",
551
+ "redeyed": "~2.1.0"
552
+ }
553
+ },
554
+ "chalk": {
555
+ "version": "2.4.1",
556
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
557
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
558
+ "dev": true,
559
+ "requires": {
560
+ "ansi-styles": "^3.2.1",
561
+ "escape-string-regexp": "^1.0.5",
562
+ "supports-color": "^5.3.0"
563
+ }
564
+ },
565
+ "class-utils": {
566
+ "version": "0.3.6",
567
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
568
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
569
+ "dev": true,
570
+ "requires": {
571
+ "arr-union": "^3.1.0",
572
+ "define-property": "^0.2.5",
573
+ "isobject": "^3.0.0",
574
+ "static-extend": "^0.1.1"
575
+ },
576
+ "dependencies": {
577
+ "define-property": {
578
+ "version": "0.2.5",
579
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
580
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
581
+ "dev": true,
582
+ "requires": {
583
+ "is-descriptor": "^0.1.0"
584
+ }
585
+ }
586
+ }
587
+ },
588
+ "clean-stack": {
589
+ "version": "1.3.0",
590
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz",
591
+ "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=",
592
+ "dev": true
593
+ },
594
+ "cli-table": {
595
+ "version": "0.3.1",
596
+ "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
597
+ "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
598
+ "dev": true,
599
+ "requires": {
600
+ "colors": "1.0.3"
601
+ },
602
+ "dependencies": {
603
+ "colors": {
604
+ "version": "1.0.3",
605
+ "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
606
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
607
+ "dev": true
608
+ }
609
+ }
610
+ },
611
+ "cliui": {
612
+ "version": "4.1.0",
613
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
614
+ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
615
+ "dev": true,
616
+ "requires": {
617
+ "string-width": "^2.1.1",
618
+ "strip-ansi": "^4.0.0",
619
+ "wrap-ansi": "^2.0.0"
620
+ }
621
+ },
622
+ "code-point-at": {
623
+ "version": "1.1.0",
624
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
625
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
626
+ "dev": true
627
+ },
628
+ "coffeescript": {
629
+ "version": "1.10.0",
630
+ "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
631
+ "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=",
632
+ "dev": true
633
+ },
634
+ "collection-visit": {
635
+ "version": "1.0.0",
636
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
637
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
638
+ "dev": true,
639
+ "requires": {
640
+ "map-visit": "^1.0.0",
641
+ "object-visit": "^1.0.0"
642
+ }
643
+ },
644
+ "color-convert": {
645
+ "version": "1.9.3",
646
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
647
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
648
+ "dev": true,
649
+ "requires": {
650
+ "color-name": "1.1.3"
651
+ }
652
+ },
653
+ "color-name": {
654
+ "version": "1.1.3",
655
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
656
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
657
+ "dev": true
658
+ },
659
+ "colors": {
660
+ "version": "1.1.2",
661
+ "resolved": "http://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
662
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
663
+ "dev": true
664
+ },
665
+ "commander": {
666
+ "version": "2.17.1",
667
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
668
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
669
+ "dev": true,
670
+ "optional": true
671
+ },
672
+ "compare-func": {
673
+ "version": "1.3.2",
674
+ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz",
675
+ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=",
676
+ "dev": true,
677
+ "requires": {
678
+ "array-ify": "^1.0.0",
679
+ "dot-prop": "^3.0.0"
680
+ }
681
+ },
682
+ "component-emitter": {
683
+ "version": "1.2.1",
684
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
685
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
686
+ "dev": true
687
+ },
688
+ "concat-map": {
689
+ "version": "0.0.1",
690
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
691
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
692
+ "dev": true
693
+ },
694
+ "conventional-changelog-angular": {
695
+ "version": "5.0.2",
696
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.2.tgz",
697
+ "integrity": "sha512-yx7m7lVrXmt4nKWQgWZqxSALEiAKZhOAcbxdUaU9575mB0CzXVbgrgpfSnSP7OqWDUTYGD0YVJ0MSRdyOPgAwA==",
698
+ "dev": true,
699
+ "requires": {
700
+ "compare-func": "^1.3.1",
701
+ "q": "^1.5.1"
702
+ }
703
+ },
704
+ "conventional-changelog-writer": {
705
+ "version": "4.0.2",
706
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.2.tgz",
707
+ "integrity": "sha512-d8/FQY/fix2xXEBUhOo8u3DCbyEw3UOQgYHxLsPDw+wHUDma/GQGAGsGtoH876WyNs32fViHmTOUrgRKVLvBug==",
708
+ "dev": true,
709
+ "requires": {
710
+ "compare-func": "^1.3.1",
711
+ "conventional-commits-filter": "^2.0.1",
712
+ "dateformat": "^3.0.0",
713
+ "handlebars": "^4.0.2",
714
+ "json-stringify-safe": "^5.0.1",
715
+ "lodash": "^4.2.1",
716
+ "meow": "^4.0.0",
717
+ "semver": "^5.5.0",
718
+ "split": "^1.0.0",
719
+ "through2": "^2.0.0"
720
+ },
721
+ "dependencies": {
722
+ "camelcase": {
723
+ "version": "4.1.0",
724
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
725
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
726
+ "dev": true
727
+ },
728
+ "camelcase-keys": {
729
+ "version": "4.2.0",
730
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
731
+ "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
732
+ "dev": true,
733
+ "requires": {
734
+ "camelcase": "^4.1.0",
735
+ "map-obj": "^2.0.0",
736
+ "quick-lru": "^1.0.0"
737
+ }
738
+ },
739
+ "dateformat": {
740
+ "version": "3.0.3",
741
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
742
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
743
+ "dev": true
744
+ },
745
+ "find-up": {
746
+ "version": "2.1.0",
747
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
748
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
749
+ "dev": true,
750
+ "requires": {
751
+ "locate-path": "^2.0.0"
752
+ }
753
+ },
754
+ "load-json-file": {
755
+ "version": "4.0.0",
756
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
757
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
758
+ "dev": true,
759
+ "requires": {
760
+ "graceful-fs": "^4.1.2",
761
+ "parse-json": "^4.0.0",
762
+ "pify": "^3.0.0",
763
+ "strip-bom": "^3.0.0"
764
+ }
765
+ },
766
+ "map-obj": {
767
+ "version": "2.0.0",
768
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
769
+ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
770
+ "dev": true
771
+ },
772
+ "meow": {
773
+ "version": "4.0.1",
774
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
775
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
776
+ "dev": true,
777
+ "requires": {
778
+ "camelcase-keys": "^4.0.0",
779
+ "decamelize-keys": "^1.0.0",
780
+ "loud-rejection": "^1.0.0",
781
+ "minimist": "^1.1.3",
782
+ "minimist-options": "^3.0.1",
783
+ "normalize-package-data": "^2.3.4",
784
+ "read-pkg-up": "^3.0.0",
785
+ "redent": "^2.0.0",
786
+ "trim-newlines": "^2.0.0"
787
+ }
788
+ },
789
+ "read-pkg": {
790
+ "version": "3.0.0",
791
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
792
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
793
+ "dev": true,
794
+ "requires": {
795
+ "load-json-file": "^4.0.0",
796
+ "normalize-package-data": "^2.3.2",
797
+ "path-type": "^3.0.0"
798
+ }
799
+ },
800
+ "read-pkg-up": {
801
+ "version": "3.0.0",
802
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
803
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
804
+ "dev": true,
805
+ "requires": {
806
+ "find-up": "^2.0.0",
807
+ "read-pkg": "^3.0.0"
808
+ }
809
+ },
810
+ "redent": {
811
+ "version": "2.0.0",
812
+ "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
813
+ "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
814
+ "dev": true,
815
+ "requires": {
816
+ "indent-string": "^3.0.0",
817
+ "strip-indent": "^2.0.0"
818
+ }
819
+ },
820
+ "strip-bom": {
821
+ "version": "3.0.0",
822
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
823
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
824
+ "dev": true
825
+ },
826
+ "strip-indent": {
827
+ "version": "2.0.0",
828
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
829
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
830
+ "dev": true
831
+ },
832
+ "trim-newlines": {
833
+ "version": "2.0.0",
834
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
835
+ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
836
+ "dev": true
837
+ }
838
+ }
839
+ },
840
+ "conventional-commits-filter": {
841
+ "version": "2.0.1",
842
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.1.tgz",
843
+ "integrity": "sha512-92OU8pz/977udhBjgPEbg3sbYzIxMDFTlQT97w7KdhR9igNqdJvy8smmedAAgn4tPiqseFloKkrVfbXCVd+E7A==",
844
+ "dev": true,
845
+ "requires": {
846
+ "is-subset": "^0.1.1",
847
+ "modify-values": "^1.0.0"
848
+ }
849
+ },
850
+ "conventional-commits-parser": {
851
+ "version": "3.0.1",
852
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.1.tgz",
853
+ "integrity": "sha512-P6U5UOvDeidUJ8ebHVDIoXzI7gMlQ1OF/id6oUvp8cnZvOXMt1n8nYl74Ey9YMn0uVQtxmCtjPQawpsssBWtGg==",
854
+ "dev": true,
855
+ "requires": {
856
+ "JSONStream": "^1.0.4",
857
+ "is-text-path": "^1.0.0",
858
+ "lodash": "^4.2.1",
859
+ "meow": "^4.0.0",
860
+ "split2": "^2.0.0",
861
+ "through2": "^2.0.0",
862
+ "trim-off-newlines": "^1.0.0"
863
+ },
864
+ "dependencies": {
865
+ "camelcase": {
866
+ "version": "4.1.0",
867
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
868
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
869
+ "dev": true
870
+ },
871
+ "camelcase-keys": {
872
+ "version": "4.2.0",
873
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
874
+ "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
875
+ "dev": true,
876
+ "requires": {
877
+ "camelcase": "^4.1.0",
878
+ "map-obj": "^2.0.0",
879
+ "quick-lru": "^1.0.0"
880
+ }
881
+ },
882
+ "find-up": {
883
+ "version": "2.1.0",
884
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
885
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
886
+ "dev": true,
887
+ "requires": {
888
+ "locate-path": "^2.0.0"
889
+ }
890
+ },
891
+ "load-json-file": {
892
+ "version": "4.0.0",
893
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
894
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
895
+ "dev": true,
896
+ "requires": {
897
+ "graceful-fs": "^4.1.2",
898
+ "parse-json": "^4.0.0",
899
+ "pify": "^3.0.0",
900
+ "strip-bom": "^3.0.0"
901
+ }
902
+ },
903
+ "map-obj": {
904
+ "version": "2.0.0",
905
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
906
+ "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
907
+ "dev": true
908
+ },
909
+ "meow": {
910
+ "version": "4.0.1",
911
+ "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz",
912
+ "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==",
913
+ "dev": true,
914
+ "requires": {
915
+ "camelcase-keys": "^4.0.0",
916
+ "decamelize-keys": "^1.0.0",
917
+ "loud-rejection": "^1.0.0",
918
+ "minimist": "^1.1.3",
919
+ "minimist-options": "^3.0.1",
920
+ "normalize-package-data": "^2.3.4",
921
+ "read-pkg-up": "^3.0.0",
922
+ "redent": "^2.0.0",
923
+ "trim-newlines": "^2.0.0"
924
+ }
925
+ },
926
+ "read-pkg": {
927
+ "version": "3.0.0",
928
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
929
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
930
+ "dev": true,
931
+ "requires": {
932
+ "load-json-file": "^4.0.0",
933
+ "normalize-package-data": "^2.3.2",
934
+ "path-type": "^3.0.0"
935
+ }
936
+ },
937
+ "read-pkg-up": {
938
+ "version": "3.0.0",
939
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
940
+ "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
941
+ "dev": true,
942
+ "requires": {
943
+ "find-up": "^2.0.0",
944
+ "read-pkg": "^3.0.0"
945
+ }
946
+ },
947
+ "redent": {
948
+ "version": "2.0.0",
949
+ "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
950
+ "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
951
+ "dev": true,
952
+ "requires": {
953
+ "indent-string": "^3.0.0",
954
+ "strip-indent": "^2.0.0"
955
+ }
956
+ },
957
+ "strip-bom": {
958
+ "version": "3.0.0",
959
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
960
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
961
+ "dev": true
962
+ },
963
+ "strip-indent": {
964
+ "version": "2.0.0",
965
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
966
+ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
967
+ "dev": true
968
+ },
969
+ "trim-newlines": {
970
+ "version": "2.0.0",
971
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
972
+ "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
973
+ "dev": true
974
+ }
975
+ }
976
+ },
977
+ "copy-descriptor": {
978
+ "version": "0.1.1",
979
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
980
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
981
+ "dev": true
982
+ },
983
+ "core-util-is": {
984
+ "version": "1.0.2",
985
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
986
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
987
+ "dev": true
988
+ },
989
+ "cosmiconfig": {
990
+ "version": "5.0.7",
991
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz",
992
+ "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==",
993
+ "dev": true,
994
+ "requires": {
995
+ "import-fresh": "^2.0.0",
996
+ "is-directory": "^0.3.1",
997
+ "js-yaml": "^3.9.0",
998
+ "parse-json": "^4.0.0"
999
+ },
1000
+ "dependencies": {
1001
+ "esprima": {
1002
+ "version": "4.0.1",
1003
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1004
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1005
+ "dev": true
1006
+ },
1007
+ "js-yaml": {
1008
+ "version": "3.12.0",
1009
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
1010
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
1011
+ "dev": true,
1012
+ "requires": {
1013
+ "argparse": "^1.0.7",
1014
+ "esprima": "^4.0.0"
1015
+ }
1016
+ }
1017
+ }
1018
+ },
1019
+ "cross-spawn": {
1020
+ "version": "6.0.5",
1021
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1022
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1023
+ "dev": true,
1024
+ "requires": {
1025
+ "nice-try": "^1.0.4",
1026
+ "path-key": "^2.0.1",
1027
+ "semver": "^5.5.0",
1028
+ "shebang-command": "^1.2.0",
1029
+ "which": "^1.2.9"
1030
+ }
1031
+ },
1032
+ "currently-unhandled": {
1033
+ "version": "0.4.1",
1034
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
1035
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
1036
+ "dev": true,
1037
+ "requires": {
1038
+ "array-find-index": "^1.0.1"
1039
+ }
1040
+ },
1041
+ "dateformat": {
1042
+ "version": "1.0.12",
1043
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
1044
+ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
1045
+ "dev": true,
1046
+ "requires": {
1047
+ "get-stdin": "^4.0.1",
1048
+ "meow": "^3.3.0"
1049
+ }
1050
+ },
1051
+ "debug": {
1052
+ "version": "4.1.0",
1053
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
1054
+ "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
1055
+ "dev": true,
1056
+ "requires": {
1057
+ "ms": "^2.1.1"
1058
+ }
1059
+ },
1060
+ "decamelize": {
1061
+ "version": "1.2.0",
1062
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1063
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
1064
+ "dev": true
1065
+ },
1066
+ "decamelize-keys": {
1067
+ "version": "1.1.0",
1068
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
1069
+ "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
1070
+ "dev": true,
1071
+ "requires": {
1072
+ "decamelize": "^1.1.0",
1073
+ "map-obj": "^1.0.0"
1074
+ }
1075
+ },
1076
+ "decode-uri-component": {
1077
+ "version": "0.2.0",
1078
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
1079
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
1080
+ "dev": true
1081
+ },
1082
+ "deep-extend": {
1083
+ "version": "0.6.0",
1084
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
1085
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
1086
+ "dev": true
1087
+ },
1088
+ "deepmerge": {
1089
+ "version": "3.0.0",
1090
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.0.0.tgz",
1091
+ "integrity": "sha512-a8z8bkgHsAML+uHLqmMS83HHlpy3PvZOOuiTQqaa3wu8ZVg3h0hqHk6aCsGdOnZV2XMM/FRimNGjUh0KCcmHBw==",
1092
+ "dev": true
1093
+ },
1094
+ "define-property": {
1095
+ "version": "2.0.2",
1096
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
1097
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
1098
+ "dev": true,
1099
+ "requires": {
1100
+ "is-descriptor": "^1.0.2",
1101
+ "isobject": "^3.0.1"
1102
+ },
1103
+ "dependencies": {
1104
+ "is-accessor-descriptor": {
1105
+ "version": "1.0.0",
1106
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1107
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1108
+ "dev": true,
1109
+ "requires": {
1110
+ "kind-of": "^6.0.0"
1111
+ }
1112
+ },
1113
+ "is-data-descriptor": {
1114
+ "version": "1.0.0",
1115
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1116
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1117
+ "dev": true,
1118
+ "requires": {
1119
+ "kind-of": "^6.0.0"
1120
+ }
1121
+ },
1122
+ "is-descriptor": {
1123
+ "version": "1.0.2",
1124
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1125
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1126
+ "dev": true,
1127
+ "requires": {
1128
+ "is-accessor-descriptor": "^1.0.0",
1129
+ "is-data-descriptor": "^1.0.0",
1130
+ "kind-of": "^6.0.2"
1131
+ }
1132
+ }
1133
+ }
1134
+ },
1135
+ "dir-glob": {
1136
+ "version": "2.0.0",
1137
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
1138
+ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
1139
+ "dev": true,
1140
+ "requires": {
1141
+ "arrify": "^1.0.1",
1142
+ "path-type": "^3.0.0"
1143
+ }
1144
+ },
1145
+ "dot-prop": {
1146
+ "version": "3.0.0",
1147
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
1148
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
1149
+ "dev": true,
1150
+ "requires": {
1151
+ "is-obj": "^1.0.0"
1152
+ }
1153
+ },
1154
+ "duplexer2": {
1155
+ "version": "0.1.4",
1156
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
1157
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
1158
+ "dev": true,
1159
+ "requires": {
1160
+ "readable-stream": "^2.0.2"
1161
+ }
1162
+ },
1163
+ "end-of-stream": {
1164
+ "version": "1.4.1",
1165
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
1166
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
1167
+ "dev": true,
1168
+ "requires": {
1169
+ "once": "^1.4.0"
1170
+ }
1171
+ },
1172
+ "env-ci": {
1173
+ "version": "3.1.3",
1174
+ "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-3.1.3.tgz",
1175
+ "integrity": "sha512-4NudFu3oUCNprsGkt/LmvqAwJlzX9QT8289AavXiDH1pBJuEd4n0ty98yUOWN3uFtjOhOGrmt1/FDKFxCewejw==",
1176
+ "dev": true,
1177
+ "requires": {
1178
+ "execa": "^1.0.0",
1179
+ "java-properties": "^0.2.9"
1180
+ }
1181
+ },
1182
+ "error-ex": {
1183
+ "version": "1.3.2",
1184
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
1185
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
1186
+ "dev": true,
1187
+ "requires": {
1188
+ "is-arrayish": "^0.2.1"
1189
+ }
1190
+ },
1191
+ "es6-promise": {
1192
+ "version": "4.2.5",
1193
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
1194
+ "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
1195
+ "dev": true
1196
+ },
1197
+ "es6-promisify": {
1198
+ "version": "5.0.0",
1199
+ "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
1200
+ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
1201
+ "dev": true,
1202
+ "requires": {
1203
+ "es6-promise": "^4.0.3"
1204
+ }
1205
+ },
1206
+ "escape-string-regexp": {
1207
+ "version": "1.0.5",
1208
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1209
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1210
+ "dev": true
1211
+ },
1212
+ "esprima": {
1213
+ "version": "2.7.3",
1214
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
1215
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
1216
+ "dev": true
1217
+ },
1218
+ "eventemitter2": {
1219
+ "version": "0.4.14",
1220
+ "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
1221
+ "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
1222
+ "dev": true
1223
+ },
1224
+ "execa": {
1225
+ "version": "1.0.0",
1226
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
1227
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
1228
+ "dev": true,
1229
+ "requires": {
1230
+ "cross-spawn": "^6.0.0",
1231
+ "get-stream": "^4.0.0",
1232
+ "is-stream": "^1.1.0",
1233
+ "npm-run-path": "^2.0.0",
1234
+ "p-finally": "^1.0.0",
1235
+ "signal-exit": "^3.0.0",
1236
+ "strip-eof": "^1.0.0"
1237
+ }
1238
+ },
1239
+ "exit": {
1240
+ "version": "0.1.2",
1241
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
1242
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
1243
+ "dev": true
1244
+ },
1245
+ "expand-brackets": {
1246
+ "version": "2.1.4",
1247
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
1248
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
1249
+ "dev": true,
1250
+ "requires": {
1251
+ "debug": "^2.3.3",
1252
+ "define-property": "^0.2.5",
1253
+ "extend-shallow": "^2.0.1",
1254
+ "posix-character-classes": "^0.1.0",
1255
+ "regex-not": "^1.0.0",
1256
+ "snapdragon": "^0.8.1",
1257
+ "to-regex": "^3.0.1"
1258
+ },
1259
+ "dependencies": {
1260
+ "debug": {
1261
+ "version": "2.6.9",
1262
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1263
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1264
+ "dev": true,
1265
+ "requires": {
1266
+ "ms": "2.0.0"
1267
+ }
1268
+ },
1269
+ "define-property": {
1270
+ "version": "0.2.5",
1271
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1272
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1273
+ "dev": true,
1274
+ "requires": {
1275
+ "is-descriptor": "^0.1.0"
1276
+ }
1277
+ },
1278
+ "extend-shallow": {
1279
+ "version": "2.0.1",
1280
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1281
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1282
+ "dev": true,
1283
+ "requires": {
1284
+ "is-extendable": "^0.1.0"
1285
+ }
1286
+ },
1287
+ "ms": {
1288
+ "version": "2.0.0",
1289
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1290
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1291
+ "dev": true
1292
+ }
1293
+ }
1294
+ },
1295
+ "extend-shallow": {
1296
+ "version": "3.0.2",
1297
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
1298
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
1299
+ "dev": true,
1300
+ "requires": {
1301
+ "assign-symbols": "^1.0.0",
1302
+ "is-extendable": "^1.0.1"
1303
+ },
1304
+ "dependencies": {
1305
+ "is-extendable": {
1306
+ "version": "1.0.1",
1307
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1308
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1309
+ "dev": true,
1310
+ "requires": {
1311
+ "is-plain-object": "^2.0.4"
1312
+ }
1313
+ }
1314
+ }
1315
+ },
1316
+ "extglob": {
1317
+ "version": "2.0.4",
1318
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
1319
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
1320
+ "dev": true,
1321
+ "requires": {
1322
+ "array-unique": "^0.3.2",
1323
+ "define-property": "^1.0.0",
1324
+ "expand-brackets": "^2.1.4",
1325
+ "extend-shallow": "^2.0.1",
1326
+ "fragment-cache": "^0.2.1",
1327
+ "regex-not": "^1.0.0",
1328
+ "snapdragon": "^0.8.1",
1329
+ "to-regex": "^3.0.1"
1330
+ },
1331
+ "dependencies": {
1332
+ "define-property": {
1333
+ "version": "1.0.0",
1334
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1335
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1336
+ "dev": true,
1337
+ "requires": {
1338
+ "is-descriptor": "^1.0.0"
1339
+ }
1340
+ },
1341
+ "extend-shallow": {
1342
+ "version": "2.0.1",
1343
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1344
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1345
+ "dev": true,
1346
+ "requires": {
1347
+ "is-extendable": "^0.1.0"
1348
+ }
1349
+ },
1350
+ "is-accessor-descriptor": {
1351
+ "version": "1.0.0",
1352
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1353
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1354
+ "dev": true,
1355
+ "requires": {
1356
+ "kind-of": "^6.0.0"
1357
+ }
1358
+ },
1359
+ "is-data-descriptor": {
1360
+ "version": "1.0.0",
1361
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1362
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1363
+ "dev": true,
1364
+ "requires": {
1365
+ "kind-of": "^6.0.0"
1366
+ }
1367
+ },
1368
+ "is-descriptor": {
1369
+ "version": "1.0.2",
1370
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1371
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1372
+ "dev": true,
1373
+ "requires": {
1374
+ "is-accessor-descriptor": "^1.0.0",
1375
+ "is-data-descriptor": "^1.0.0",
1376
+ "kind-of": "^6.0.2"
1377
+ }
1378
+ }
1379
+ }
1380
+ },
1381
+ "fast-glob": {
1382
+ "version": "2.2.4",
1383
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.4.tgz",
1384
+ "integrity": "sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==",
1385
+ "dev": true,
1386
+ "requires": {
1387
+ "@mrmlnc/readdir-enhanced": "^2.2.1",
1388
+ "@nodelib/fs.stat": "^1.1.2",
1389
+ "glob-parent": "^3.1.0",
1390
+ "is-glob": "^4.0.0",
1391
+ "merge2": "^1.2.3",
1392
+ "micromatch": "^3.1.10"
1393
+ }
1394
+ },
1395
+ "figures": {
1396
+ "version": "2.0.0",
1397
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
1398
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
1399
+ "dev": true,
1400
+ "requires": {
1401
+ "escape-string-regexp": "^1.0.5"
1402
+ }
1403
+ },
1404
+ "fill-range": {
1405
+ "version": "4.0.0",
1406
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
1407
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
1408
+ "dev": true,
1409
+ "requires": {
1410
+ "extend-shallow": "^2.0.1",
1411
+ "is-number": "^3.0.0",
1412
+ "repeat-string": "^1.6.1",
1413
+ "to-regex-range": "^2.1.0"
1414
+ },
1415
+ "dependencies": {
1416
+ "extend-shallow": {
1417
+ "version": "2.0.1",
1418
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1419
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1420
+ "dev": true,
1421
+ "requires": {
1422
+ "is-extendable": "^0.1.0"
1423
+ }
1424
+ }
1425
+ }
1426
+ },
1427
+ "find-up": {
1428
+ "version": "1.1.2",
1429
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
1430
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
1431
+ "dev": true,
1432
+ "requires": {
1433
+ "path-exists": "^2.0.0",
1434
+ "pinkie-promise": "^2.0.0"
1435
+ }
1436
+ },
1437
+ "find-versions": {
1438
+ "version": "3.0.0",
1439
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.0.0.tgz",
1440
+ "integrity": "sha512-IUvtItVFNmTtKoB0PRfbkR0zR9XMG5rWNO3qI1S8L0zdv+v2gqzM0pAunloxqbqAfT8w7bg8n/5gHzTXte8H5A==",
1441
+ "dev": true,
1442
+ "requires": {
1443
+ "array-uniq": "^2.0.0",
1444
+ "semver-regex": "^2.0.0"
1445
+ },
1446
+ "dependencies": {
1447
+ "array-uniq": {
1448
+ "version": "2.0.0",
1449
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-2.0.0.tgz",
1450
+ "integrity": "sha512-O3QZEr+3wDj7otzF7PjNGs6CA3qmYMLvt5xGkjY/V0VxS+ovvqVo/5wKM/OVOAyuX4DTh9H31zE/yKtO66hTkg==",
1451
+ "dev": true
1452
+ }
1453
+ }
1454
+ },
1455
+ "findup-sync": {
1456
+ "version": "0.3.0",
1457
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
1458
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
1459
+ "dev": true,
1460
+ "requires": {
1461
+ "glob": "~5.0.0"
1462
+ },
1463
+ "dependencies": {
1464
+ "glob": {
1465
+ "version": "5.0.15",
1466
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
1467
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
1468
+ "dev": true,
1469
+ "requires": {
1470
+ "inflight": "^1.0.4",
1471
+ "inherits": "2",
1472
+ "minimatch": "2 || 3",
1473
+ "once": "^1.3.0",
1474
+ "path-is-absolute": "^1.0.0"
1475
+ }
1476
+ }
1477
+ }
1478
+ },
1479
+ "for-in": {
1480
+ "version": "1.0.2",
1481
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1482
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1483
+ "dev": true
1484
+ },
1485
+ "fragment-cache": {
1486
+ "version": "0.2.1",
1487
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
1488
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
1489
+ "dev": true,
1490
+ "requires": {
1491
+ "map-cache": "^0.2.2"
1492
+ }
1493
+ },
1494
+ "from2": {
1495
+ "version": "2.3.0",
1496
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
1497
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
1498
+ "dev": true,
1499
+ "requires": {
1500
+ "inherits": "^2.0.1",
1501
+ "readable-stream": "^2.0.0"
1502
+ }
1503
+ },
1504
+ "fs-extra": {
1505
+ "version": "7.0.1",
1506
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
1507
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
1508
+ "dev": true,
1509
+ "requires": {
1510
+ "graceful-fs": "^4.1.2",
1511
+ "jsonfile": "^4.0.0",
1512
+ "universalify": "^0.1.0"
1513
+ }
1514
+ },
1515
+ "fs.realpath": {
1516
+ "version": "1.0.0",
1517
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1518
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1519
+ "dev": true
1520
+ },
1521
+ "get-caller-file": {
1522
+ "version": "1.0.3",
1523
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
1524
+ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
1525
+ "dev": true
1526
+ },
1527
+ "get-stdin": {
1528
+ "version": "4.0.1",
1529
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
1530
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
1531
+ "dev": true
1532
+ },
1533
+ "get-stream": {
1534
+ "version": "4.1.0",
1535
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
1536
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
1537
+ "dev": true,
1538
+ "requires": {
1539
+ "pump": "^3.0.0"
1540
+ }
1541
+ },
1542
+ "get-value": {
1543
+ "version": "2.0.6",
1544
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
1545
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
1546
+ "dev": true
1547
+ },
1548
+ "getobject": {
1549
+ "version": "0.1.0",
1550
+ "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
1551
+ "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
1552
+ "dev": true
1553
+ },
1554
+ "git-log-parser": {
1555
+ "version": "1.2.0",
1556
+ "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz",
1557
+ "integrity": "sha1-LmpMGxP8AAKCB7p5WnrDFme5/Uo=",
1558
+ "dev": true,
1559
+ "requires": {
1560
+ "argv-formatter": "~1.0.0",
1561
+ "spawn-error-forwarder": "~1.0.0",
1562
+ "split2": "~1.0.0",
1563
+ "stream-combiner2": "~1.1.1",
1564
+ "through2": "~2.0.0",
1565
+ "traverse": "~0.6.6"
1566
+ },
1567
+ "dependencies": {
1568
+ "split2": {
1569
+ "version": "1.0.0",
1570
+ "resolved": "http://registry.npmjs.org/split2/-/split2-1.0.0.tgz",
1571
+ "integrity": "sha1-UuLiIdiMdfmnP5BVbiY/+WdysxQ=",
1572
+ "dev": true,
1573
+ "requires": {
1574
+ "through2": "~2.0.0"
1575
+ }
1576
+ }
1577
+ }
1578
+ },
1579
+ "glob": {
1580
+ "version": "7.1.3",
1581
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1582
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1583
+ "dev": true,
1584
+ "requires": {
1585
+ "fs.realpath": "^1.0.0",
1586
+ "inflight": "^1.0.4",
1587
+ "inherits": "2",
1588
+ "minimatch": "^3.0.4",
1589
+ "once": "^1.3.0",
1590
+ "path-is-absolute": "^1.0.0"
1591
+ }
1592
+ },
1593
+ "glob-parent": {
1594
+ "version": "3.1.0",
1595
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
1596
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
1597
+ "dev": true,
1598
+ "requires": {
1599
+ "is-glob": "^3.1.0",
1600
+ "path-dirname": "^1.0.0"
1601
+ },
1602
+ "dependencies": {
1603
+ "is-glob": {
1604
+ "version": "3.1.0",
1605
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
1606
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
1607
+ "dev": true,
1608
+ "requires": {
1609
+ "is-extglob": "^2.1.0"
1610
+ }
1611
+ }
1612
+ }
1613
+ },
1614
+ "glob-to-regexp": {
1615
+ "version": "0.3.0",
1616
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
1617
+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
1618
+ "dev": true
1619
+ },
1620
+ "globby": {
1621
+ "version": "8.0.1",
1622
+ "resolved": "http://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
1623
+ "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
1624
+ "dev": true,
1625
+ "requires": {
1626
+ "array-union": "^1.0.1",
1627
+ "dir-glob": "^2.0.0",
1628
+ "fast-glob": "^2.0.2",
1629
+ "glob": "^7.1.2",
1630
+ "ignore": "^3.3.5",
1631
+ "pify": "^3.0.0",
1632
+ "slash": "^1.0.0"
1633
+ }
1634
+ },
1635
+ "graceful-fs": {
1636
+ "version": "4.1.15",
1637
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
1638
+ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
1639
+ "dev": true
1640
+ },
1641
+ "grunt": {
1642
+ "version": "1.0.3",
1643
+ "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.3.tgz",
1644
+ "integrity": "sha512-/JzmZNPfKorlCrrmxWqQO4JVodO+DVd5XX4DkocL/1WlLlKVLE9+SdEIempOAxDhWPysLle6afvn/hg7Ck2k9g==",
1645
+ "dev": true,
1646
+ "requires": {
1647
+ "coffeescript": "~1.10.0",
1648
+ "dateformat": "~1.0.12",
1649
+ "eventemitter2": "~0.4.13",
1650
+ "exit": "~0.1.1",
1651
+ "findup-sync": "~0.3.0",
1652
+ "glob": "~7.0.0",
1653
+ "grunt-cli": "~1.2.0",
1654
+ "grunt-known-options": "~1.1.0",
1655
+ "grunt-legacy-log": "~2.0.0",
1656
+ "grunt-legacy-util": "~1.1.1",
1657
+ "iconv-lite": "~0.4.13",
1658
+ "js-yaml": "~3.5.2",
1659
+ "minimatch": "~3.0.2",
1660
+ "mkdirp": "~0.5.1",
1661
+ "nopt": "~3.0.6",
1662
+ "path-is-absolute": "~1.0.0",
1663
+ "rimraf": "~2.6.2"
1664
+ },
1665
+ "dependencies": {
1666
+ "glob": {
1667
+ "version": "7.0.6",
1668
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
1669
+ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
1670
+ "dev": true,
1671
+ "requires": {
1672
+ "fs.realpath": "^1.0.0",
1673
+ "inflight": "^1.0.4",
1674
+ "inherits": "2",
1675
+ "minimatch": "^3.0.2",
1676
+ "once": "^1.3.0",
1677
+ "path-is-absolute": "^1.0.0"
1678
+ }
1679
+ },
1680
+ "grunt-cli": {
1681
+ "version": "1.2.0",
1682
+ "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
1683
+ "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
1684
+ "dev": true,
1685
+ "requires": {
1686
+ "findup-sync": "~0.3.0",
1687
+ "grunt-known-options": "~1.1.0",
1688
+ "nopt": "~3.0.6",
1689
+ "resolve": "~1.1.0"
1690
+ }
1691
+ }
1692
+ }
1693
+ },
1694
+ "grunt-known-options": {
1695
+ "version": "1.1.1",
1696
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
1697
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
1698
+ "dev": true
1699
+ },
1700
+ "grunt-legacy-log": {
1701
+ "version": "2.0.0",
1702
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz",
1703
+ "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==",
1704
+ "dev": true,
1705
+ "requires": {
1706
+ "colors": "~1.1.2",
1707
+ "grunt-legacy-log-utils": "~2.0.0",
1708
+ "hooker": "~0.2.3",
1709
+ "lodash": "~4.17.5"
1710
+ }
1711
+ },
1712
+ "grunt-legacy-log-utils": {
1713
+ "version": "2.0.1",
1714
+ "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz",
1715
+ "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==",
1716
+ "dev": true,
1717
+ "requires": {
1718
+ "chalk": "~2.4.1",
1719
+ "lodash": "~4.17.10"
1720
+ }
1721
+ },
1722
+ "grunt-legacy-util": {
1723
+ "version": "1.1.1",
1724
+ "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz",
1725
+ "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==",
1726
+ "dev": true,
1727
+ "requires": {
1728
+ "async": "~1.5.2",
1729
+ "exit": "~0.1.1",
1730
+ "getobject": "~0.1.0",
1731
+ "hooker": "~0.2.3",
1732
+ "lodash": "~4.17.10",
1733
+ "underscore.string": "~3.3.4",
1734
+ "which": "~1.3.0"
1735
+ }
1736
+ },
1737
+ "grunt-version": {
1738
+ "version": "1.3.0",
1739
+ "resolved": "https://registry.npmjs.org/grunt-version/-/grunt-version-1.3.0.tgz",
1740
+ "integrity": "sha512-sHXaI20enfemESU2r/mrJd8eEFr8qSJSwzzIyau2IaxKwez0ojr5wg93x74K7PqSBKmVxumJ6TTscvGIfygRbA==",
1741
+ "dev": true,
1742
+ "requires": {
1743
+ "grunt": "0.4.5 - 1",
1744
+ "semver": "^4.0.0"
1745
+ },
1746
+ "dependencies": {
1747
+ "semver": {
1748
+ "version": "4.3.6",
1749
+ "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
1750
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
1751
+ "dev": true
1752
+ }
1753
+ }
1754
+ },
1755
+ "handlebars": {
1756
+ "version": "4.0.12",
1757
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
1758
+ "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
1759
+ "dev": true,
1760
+ "requires": {
1761
+ "async": "^2.5.0",
1762
+ "optimist": "^0.6.1",
1763
+ "source-map": "^0.6.1",
1764
+ "uglify-js": "^3.1.4"
1765
+ },
1766
+ "dependencies": {
1767
+ "async": {
1768
+ "version": "2.6.1",
1769
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
1770
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
1771
+ "dev": true,
1772
+ "requires": {
1773
+ "lodash": "^4.17.10"
1774
+ }
1775
+ },
1776
+ "source-map": {
1777
+ "version": "0.6.1",
1778
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1779
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1780
+ "dev": true
1781
+ }
1782
+ }
1783
+ },
1784
+ "has-flag": {
1785
+ "version": "3.0.0",
1786
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1787
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1788
+ "dev": true
1789
+ },
1790
+ "has-value": {
1791
+ "version": "1.0.0",
1792
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
1793
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
1794
+ "dev": true,
1795
+ "requires": {
1796
+ "get-value": "^2.0.6",
1797
+ "has-values": "^1.0.0",
1798
+ "isobject": "^3.0.0"
1799
+ }
1800
+ },
1801
+ "has-values": {
1802
+ "version": "1.0.0",
1803
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
1804
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
1805
+ "dev": true,
1806
+ "requires": {
1807
+ "is-number": "^3.0.0",
1808
+ "kind-of": "^4.0.0"
1809
+ },
1810
+ "dependencies": {
1811
+ "kind-of": {
1812
+ "version": "4.0.0",
1813
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
1814
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
1815
+ "dev": true,
1816
+ "requires": {
1817
+ "is-buffer": "^1.1.5"
1818
+ }
1819
+ }
1820
+ }
1821
+ },
1822
+ "hook-std": {
1823
+ "version": "1.2.0",
1824
+ "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-1.2.0.tgz",
1825
+ "integrity": "sha512-yntre2dbOAjgQ5yoRykyON0D9T96BfshR8IuiL/r3celeHD8I/76w4qo8m3z99houR4Z678jakV3uXrQdSvW/w==",
1826
+ "dev": true
1827
+ },
1828
+ "hooker": {
1829
+ "version": "0.2.3",
1830
+ "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
1831
+ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=",
1832
+ "dev": true
1833
+ },
1834
+ "hosted-git-info": {
1835
+ "version": "2.7.1",
1836
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
1837
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
1838
+ "dev": true
1839
+ },
1840
+ "http-proxy-agent": {
1841
+ "version": "2.1.0",
1842
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
1843
+ "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
1844
+ "dev": true,
1845
+ "requires": {
1846
+ "agent-base": "4",
1847
+ "debug": "3.1.0"
1848
+ },
1849
+ "dependencies": {
1850
+ "debug": {
1851
+ "version": "3.1.0",
1852
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1853
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1854
+ "dev": true,
1855
+ "requires": {
1856
+ "ms": "2.0.0"
1857
+ }
1858
+ },
1859
+ "ms": {
1860
+ "version": "2.0.0",
1861
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1862
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1863
+ "dev": true
1864
+ }
1865
+ }
1866
+ },
1867
+ "https-proxy-agent": {
1868
+ "version": "2.2.1",
1869
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
1870
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
1871
+ "dev": true,
1872
+ "requires": {
1873
+ "agent-base": "^4.1.0",
1874
+ "debug": "^3.1.0"
1875
+ },
1876
+ "dependencies": {
1877
+ "debug": {
1878
+ "version": "3.2.6",
1879
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1880
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1881
+ "dev": true,
1882
+ "requires": {
1883
+ "ms": "^2.1.1"
1884
+ }
1885
+ }
1886
+ }
1887
+ },
1888
+ "iconv-lite": {
1889
+ "version": "0.4.24",
1890
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1891
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1892
+ "dev": true,
1893
+ "requires": {
1894
+ "safer-buffer": ">= 2.1.2 < 3"
1895
+ }
1896
+ },
1897
+ "ignore": {
1898
+ "version": "3.3.10",
1899
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
1900
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
1901
+ "dev": true
1902
+ },
1903
+ "import-fresh": {
1904
+ "version": "2.0.0",
1905
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
1906
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
1907
+ "dev": true,
1908
+ "requires": {
1909
+ "caller-path": "^2.0.0",
1910
+ "resolve-from": "^3.0.0"
1911
+ },
1912
+ "dependencies": {
1913
+ "resolve-from": {
1914
+ "version": "3.0.0",
1915
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
1916
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
1917
+ "dev": true
1918
+ }
1919
+ }
1920
+ },
1921
+ "import-from": {
1922
+ "version": "2.1.0",
1923
+ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
1924
+ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
1925
+ "dev": true,
1926
+ "requires": {
1927
+ "resolve-from": "^3.0.0"
1928
+ },
1929
+ "dependencies": {
1930
+ "resolve-from": {
1931
+ "version": "3.0.0",
1932
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
1933
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
1934
+ "dev": true
1935
+ }
1936
+ }
1937
+ },
1938
+ "indent-string": {
1939
+ "version": "3.2.0",
1940
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
1941
+ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
1942
+ "dev": true
1943
+ },
1944
+ "inflight": {
1945
+ "version": "1.0.6",
1946
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1947
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1948
+ "dev": true,
1949
+ "requires": {
1950
+ "once": "^1.3.0",
1951
+ "wrappy": "1"
1952
+ }
1953
+ },
1954
+ "inherits": {
1955
+ "version": "2.0.3",
1956
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1957
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1958
+ "dev": true
1959
+ },
1960
+ "ini": {
1961
+ "version": "1.3.5",
1962
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1963
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1964
+ "dev": true
1965
+ },
1966
+ "into-stream": {
1967
+ "version": "4.0.0",
1968
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-4.0.0.tgz",
1969
+ "integrity": "sha512-i29KNyE5r0Y/UQzcQ0IbZO1MYJ53Jn0EcFRZPj5FzWKYH17kDFEOwuA+3jroymOI06SW1dEDnly9A1CAreC5dg==",
1970
+ "dev": true,
1971
+ "requires": {
1972
+ "from2": "^2.1.1",
1973
+ "p-is-promise": "^2.0.0"
1974
+ }
1975
+ },
1976
+ "invert-kv": {
1977
+ "version": "2.0.0",
1978
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
1979
+ "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
1980
+ "dev": true
1981
+ },
1982
+ "is-accessor-descriptor": {
1983
+ "version": "0.1.6",
1984
+ "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
1985
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
1986
+ "dev": true,
1987
+ "requires": {
1988
+ "kind-of": "^3.0.2"
1989
+ },
1990
+ "dependencies": {
1991
+ "kind-of": {
1992
+ "version": "3.2.2",
1993
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1994
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1995
+ "dev": true,
1996
+ "requires": {
1997
+ "is-buffer": "^1.1.5"
1998
+ }
1999
+ }
2000
+ }
2001
+ },
2002
+ "is-arrayish": {
2003
+ "version": "0.2.1",
2004
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
2005
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
2006
+ "dev": true
2007
+ },
2008
+ "is-buffer": {
2009
+ "version": "1.1.6",
2010
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
2011
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
2012
+ "dev": true
2013
+ },
2014
+ "is-builtin-module": {
2015
+ "version": "1.0.0",
2016
+ "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
2017
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
2018
+ "dev": true,
2019
+ "requires": {
2020
+ "builtin-modules": "^1.0.0"
2021
+ }
2022
+ },
2023
+ "is-data-descriptor": {
2024
+ "version": "0.1.4",
2025
+ "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
2026
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
2027
+ "dev": true,
2028
+ "requires": {
2029
+ "kind-of": "^3.0.2"
2030
+ },
2031
+ "dependencies": {
2032
+ "kind-of": {
2033
+ "version": "3.2.2",
2034
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2035
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2036
+ "dev": true,
2037
+ "requires": {
2038
+ "is-buffer": "^1.1.5"
2039
+ }
2040
+ }
2041
+ }
2042
+ },
2043
+ "is-descriptor": {
2044
+ "version": "0.1.6",
2045
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
2046
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
2047
+ "dev": true,
2048
+ "requires": {
2049
+ "is-accessor-descriptor": "^0.1.6",
2050
+ "is-data-descriptor": "^0.1.4",
2051
+ "kind-of": "^5.0.0"
2052
+ },
2053
+ "dependencies": {
2054
+ "kind-of": {
2055
+ "version": "5.1.0",
2056
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
2057
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
2058
+ "dev": true
2059
+ }
2060
+ }
2061
+ },
2062
+ "is-directory": {
2063
+ "version": "0.3.1",
2064
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
2065
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
2066
+ "dev": true
2067
+ },
2068
+ "is-extendable": {
2069
+ "version": "0.1.1",
2070
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2071
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2072
+ "dev": true
2073
+ },
2074
+ "is-extglob": {
2075
+ "version": "2.1.1",
2076
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2077
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
2078
+ "dev": true
2079
+ },
2080
+ "is-finite": {
2081
+ "version": "1.0.2",
2082
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
2083
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
2084
+ "dev": true,
2085
+ "requires": {
2086
+ "number-is-nan": "^1.0.0"
2087
+ }
2088
+ },
2089
+ "is-fullwidth-code-point": {
2090
+ "version": "2.0.0",
2091
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2092
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2093
+ "dev": true
2094
+ },
2095
+ "is-glob": {
2096
+ "version": "4.0.0",
2097
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
2098
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
2099
+ "dev": true,
2100
+ "requires": {
2101
+ "is-extglob": "^2.1.1"
2102
+ }
2103
+ },
2104
+ "is-number": {
2105
+ "version": "3.0.0",
2106
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
2107
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
2108
+ "dev": true,
2109
+ "requires": {
2110
+ "kind-of": "^3.0.2"
2111
+ },
2112
+ "dependencies": {
2113
+ "kind-of": {
2114
+ "version": "3.2.2",
2115
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2116
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2117
+ "dev": true,
2118
+ "requires": {
2119
+ "is-buffer": "^1.1.5"
2120
+ }
2121
+ }
2122
+ }
2123
+ },
2124
+ "is-obj": {
2125
+ "version": "1.0.1",
2126
+ "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
2127
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
2128
+ "dev": true
2129
+ },
2130
+ "is-plain-obj": {
2131
+ "version": "1.1.0",
2132
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
2133
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
2134
+ "dev": true
2135
+ },
2136
+ "is-plain-object": {
2137
+ "version": "2.0.4",
2138
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
2139
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
2140
+ "dev": true,
2141
+ "requires": {
2142
+ "isobject": "^3.0.1"
2143
+ }
2144
+ },
2145
+ "is-stream": {
2146
+ "version": "1.1.0",
2147
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
2148
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
2149
+ "dev": true
2150
+ },
2151
+ "is-subset": {
2152
+ "version": "0.1.1",
2153
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
2154
+ "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
2155
+ "dev": true
2156
+ },
2157
+ "is-text-path": {
2158
+ "version": "1.0.1",
2159
+ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
2160
+ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=",
2161
+ "dev": true,
2162
+ "requires": {
2163
+ "text-extensions": "^1.0.0"
2164
+ }
2165
+ },
2166
+ "is-utf8": {
2167
+ "version": "0.2.1",
2168
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
2169
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
2170
+ "dev": true
2171
+ },
2172
+ "is-windows": {
2173
+ "version": "1.0.2",
2174
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
2175
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
2176
+ "dev": true
2177
+ },
2178
+ "isarray": {
2179
+ "version": "1.0.0",
2180
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2181
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2182
+ "dev": true
2183
+ },
2184
+ "isexe": {
2185
+ "version": "2.0.0",
2186
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2187
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2188
+ "dev": true
2189
+ },
2190
+ "isobject": {
2191
+ "version": "3.0.1",
2192
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
2193
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
2194
+ "dev": true
2195
+ },
2196
+ "issue-parser": {
2197
+ "version": "3.0.1",
2198
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-3.0.1.tgz",
2199
+ "integrity": "sha512-5wdT3EE8Kq38x/hJD8QZCJ9scGoOZ5QnzwXyClkviSWTS+xOCE6hJ0qco3H5n5jCsFqpbofZCcMWqlXJzF72VQ==",
2200
+ "dev": true,
2201
+ "requires": {
2202
+ "lodash.capitalize": "^4.2.1",
2203
+ "lodash.escaperegexp": "^4.1.2",
2204
+ "lodash.isplainobject": "^4.0.6",
2205
+ "lodash.isstring": "^4.0.1",
2206
+ "lodash.uniqby": "^4.7.0"
2207
+ }
2208
+ },
2209
+ "java-properties": {
2210
+ "version": "0.2.10",
2211
+ "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-0.2.10.tgz",
2212
+ "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==",
2213
+ "dev": true
2214
+ },
2215
+ "js-yaml": {
2216
+ "version": "3.5.5",
2217
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
2218
+ "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=",
2219
+ "dev": true,
2220
+ "requires": {
2221
+ "argparse": "^1.0.2",
2222
+ "esprima": "^2.6.0"
2223
+ }
2224
+ },
2225
+ "json-parse-better-errors": {
2226
+ "version": "1.0.2",
2227
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
2228
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
2229
+ "dev": true
2230
+ },
2231
+ "json-stringify-safe": {
2232
+ "version": "5.0.1",
2233
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2234
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
2235
+ "dev": true
2236
+ },
2237
+ "jsonfile": {
2238
+ "version": "4.0.0",
2239
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
2240
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
2241
+ "dev": true,
2242
+ "requires": {
2243
+ "graceful-fs": "^4.1.6"
2244
+ }
2245
+ },
2246
+ "jsonparse": {
2247
+ "version": "1.3.1",
2248
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
2249
+ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
2250
+ "dev": true
2251
+ },
2252
+ "kind-of": {
2253
+ "version": "6.0.2",
2254
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
2255
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
2256
+ "dev": true
2257
+ },
2258
+ "lcid": {
2259
+ "version": "2.0.0",
2260
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
2261
+ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
2262
+ "dev": true,
2263
+ "requires": {
2264
+ "invert-kv": "^2.0.0"
2265
+ }
2266
+ },
2267
+ "load-json-file": {
2268
+ "version": "1.1.0",
2269
+ "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
2270
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
2271
+ "dev": true,
2272
+ "requires": {
2273
+ "graceful-fs": "^4.1.2",
2274
+ "parse-json": "^2.2.0",
2275
+ "pify": "^2.0.0",
2276
+ "pinkie-promise": "^2.0.0",
2277
+ "strip-bom": "^2.0.0"
2278
+ },
2279
+ "dependencies": {
2280
+ "parse-json": {
2281
+ "version": "2.2.0",
2282
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2283
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2284
+ "dev": true,
2285
+ "requires": {
2286
+ "error-ex": "^1.2.0"
2287
+ }
2288
+ },
2289
+ "pify": {
2290
+ "version": "2.3.0",
2291
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2292
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2293
+ "dev": true
2294
+ }
2295
+ }
2296
+ },
2297
+ "locate-path": {
2298
+ "version": "2.0.0",
2299
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
2300
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2301
+ "dev": true,
2302
+ "requires": {
2303
+ "p-locate": "^2.0.0",
2304
+ "path-exists": "^3.0.0"
2305
+ },
2306
+ "dependencies": {
2307
+ "p-locate": {
2308
+ "version": "2.0.0",
2309
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
2310
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
2311
+ "dev": true,
2312
+ "requires": {
2313
+ "p-limit": "^1.1.0"
2314
+ }
2315
+ },
2316
+ "path-exists": {
2317
+ "version": "3.0.0",
2318
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2319
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2320
+ "dev": true
2321
+ }
2322
+ }
2323
+ },
2324
+ "lodash": {
2325
+ "version": "4.17.11",
2326
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
2327
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
2328
+ "dev": true
2329
+ },
2330
+ "lodash.assign": {
2331
+ "version": "4.2.0",
2332
+ "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
2333
+ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
2334
+ "dev": true
2335
+ },
2336
+ "lodash.capitalize": {
2337
+ "version": "4.2.1",
2338
+ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
2339
+ "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=",
2340
+ "dev": true
2341
+ },
2342
+ "lodash.escaperegexp": {
2343
+ "version": "4.1.2",
2344
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
2345
+ "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=",
2346
+ "dev": true
2347
+ },
2348
+ "lodash.get": {
2349
+ "version": "4.4.2",
2350
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
2351
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
2352
+ "dev": true
2353
+ },
2354
+ "lodash.isplainobject": {
2355
+ "version": "4.0.6",
2356
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
2357
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
2358
+ "dev": true
2359
+ },
2360
+ "lodash.isstring": {
2361
+ "version": "4.0.1",
2362
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
2363
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
2364
+ "dev": true
2365
+ },
2366
+ "lodash.pick": {
2367
+ "version": "4.4.0",
2368
+ "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
2369
+ "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
2370
+ "dev": true
2371
+ },
2372
+ "lodash.set": {
2373
+ "version": "4.3.2",
2374
+ "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
2375
+ "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
2376
+ "dev": true
2377
+ },
2378
+ "lodash.toarray": {
2379
+ "version": "4.4.0",
2380
+ "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
2381
+ "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=",
2382
+ "dev": true
2383
+ },
2384
+ "lodash.uniq": {
2385
+ "version": "4.5.0",
2386
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
2387
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
2388
+ "dev": true
2389
+ },
2390
+ "lodash.uniqby": {
2391
+ "version": "4.7.0",
2392
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
2393
+ "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=",
2394
+ "dev": true
2395
+ },
2396
+ "loud-rejection": {
2397
+ "version": "1.6.0",
2398
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
2399
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
2400
+ "dev": true,
2401
+ "requires": {
2402
+ "currently-unhandled": "^0.4.1",
2403
+ "signal-exit": "^3.0.0"
2404
+ }
2405
+ },
2406
+ "macos-release": {
2407
+ "version": "2.0.0",
2408
+ "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.0.0.tgz",
2409
+ "integrity": "sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A==",
2410
+ "dev": true
2411
+ },
2412
+ "map-age-cleaner": {
2413
+ "version": "0.1.3",
2414
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
2415
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
2416
+ "dev": true,
2417
+ "requires": {
2418
+ "p-defer": "^1.0.0"
2419
+ }
2420
+ },
2421
+ "map-cache": {
2422
+ "version": "0.2.2",
2423
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
2424
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
2425
+ "dev": true
2426
+ },
2427
+ "map-obj": {
2428
+ "version": "1.0.1",
2429
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
2430
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
2431
+ "dev": true
2432
+ },
2433
+ "map-visit": {
2434
+ "version": "1.0.0",
2435
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
2436
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
2437
+ "dev": true,
2438
+ "requires": {
2439
+ "object-visit": "^1.0.0"
2440
+ }
2441
+ },
2442
+ "marked": {
2443
+ "version": "0.5.2",
2444
+ "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz",
2445
+ "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==",
2446
+ "dev": true
2447
+ },
2448
+ "marked-terminal": {
2449
+ "version": "3.1.1",
2450
+ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz",
2451
+ "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==",
2452
+ "dev": true,
2453
+ "requires": {
2454
+ "cardinal": "^2.1.1",
2455
+ "chalk": "^2.4.1",
2456
+ "cli-table": "^0.3.1",
2457
+ "lodash.assign": "^4.2.0",
2458
+ "node-emoji": "^1.4.1"
2459
+ }
2460
+ },
2461
+ "mem": {
2462
+ "version": "4.0.0",
2463
+ "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz",
2464
+ "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==",
2465
+ "dev": true,
2466
+ "requires": {
2467
+ "map-age-cleaner": "^0.1.1",
2468
+ "mimic-fn": "^1.0.0",
2469
+ "p-is-promise": "^1.1.0"
2470
+ },
2471
+ "dependencies": {
2472
+ "p-is-promise": {
2473
+ "version": "1.1.0",
2474
+ "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
2475
+ "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
2476
+ "dev": true
2477
+ }
2478
+ }
2479
+ },
2480
+ "meow": {
2481
+ "version": "3.7.0",
2482
+ "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
2483
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
2484
+ "dev": true,
2485
+ "requires": {
2486
+ "camelcase-keys": "^2.0.0",
2487
+ "decamelize": "^1.1.2",
2488
+ "loud-rejection": "^1.0.0",
2489
+ "map-obj": "^1.0.1",
2490
+ "minimist": "^1.1.3",
2491
+ "normalize-package-data": "^2.3.4",
2492
+ "object-assign": "^4.0.1",
2493
+ "read-pkg-up": "^1.0.1",
2494
+ "redent": "^1.0.0",
2495
+ "trim-newlines": "^1.0.0"
2496
+ }
2497
+ },
2498
+ "merge2": {
2499
+ "version": "1.2.3",
2500
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
2501
+ "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==",
2502
+ "dev": true
2503
+ },
2504
+ "micromatch": {
2505
+ "version": "3.1.10",
2506
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
2507
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
2508
+ "dev": true,
2509
+ "requires": {
2510
+ "arr-diff": "^4.0.0",
2511
+ "array-unique": "^0.3.2",
2512
+ "braces": "^2.3.1",
2513
+ "define-property": "^2.0.2",
2514
+ "extend-shallow": "^3.0.2",
2515
+ "extglob": "^2.0.4",
2516
+ "fragment-cache": "^0.2.1",
2517
+ "kind-of": "^6.0.2",
2518
+ "nanomatch": "^1.2.9",
2519
+ "object.pick": "^1.3.0",
2520
+ "regex-not": "^1.0.0",
2521
+ "snapdragon": "^0.8.1",
2522
+ "to-regex": "^3.0.2"
2523
+ }
2524
+ },
2525
+ "mime": {
2526
+ "version": "2.4.0",
2527
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
2528
+ "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==",
2529
+ "dev": true
2530
+ },
2531
+ "mimic-fn": {
2532
+ "version": "1.2.0",
2533
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2534
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2535
+ "dev": true
2536
+ },
2537
+ "minimatch": {
2538
+ "version": "3.0.4",
2539
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2540
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2541
+ "dev": true,
2542
+ "requires": {
2543
+ "brace-expansion": "^1.1.7"
2544
+ }
2545
+ },
2546
+ "minimist": {
2547
+ "version": "1.2.0",
2548
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2549
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2550
+ "dev": true
2551
+ },
2552
+ "minimist-options": {
2553
+ "version": "3.0.2",
2554
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
2555
+ "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
2556
+ "dev": true,
2557
+ "requires": {
2558
+ "arrify": "^1.0.1",
2559
+ "is-plain-obj": "^1.1.0"
2560
+ }
2561
+ },
2562
+ "mixin-deep": {
2563
+ "version": "1.3.1",
2564
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
2565
+ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
2566
+ "dev": true,
2567
+ "requires": {
2568
+ "for-in": "^1.0.2",
2569
+ "is-extendable": "^1.0.1"
2570
+ },
2571
+ "dependencies": {
2572
+ "is-extendable": {
2573
+ "version": "1.0.1",
2574
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
2575
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
2576
+ "dev": true,
2577
+ "requires": {
2578
+ "is-plain-object": "^2.0.4"
2579
+ }
2580
+ }
2581
+ }
2582
+ },
2583
+ "mkdirp": {
2584
+ "version": "0.5.1",
2585
+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2586
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2587
+ "dev": true,
2588
+ "requires": {
2589
+ "minimist": "0.0.8"
2590
+ },
2591
+ "dependencies": {
2592
+ "minimist": {
2593
+ "version": "0.0.8",
2594
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2595
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2596
+ "dev": true
2597
+ }
2598
+ }
2599
+ },
2600
+ "modify-values": {
2601
+ "version": "1.0.1",
2602
+ "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
2603
+ "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
2604
+ "dev": true
2605
+ },
2606
+ "ms": {
2607
+ "version": "2.1.1",
2608
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
2609
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
2610
+ "dev": true
2611
+ },
2612
+ "nanomatch": {
2613
+ "version": "1.2.13",
2614
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
2615
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
2616
+ "dev": true,
2617
+ "requires": {
2618
+ "arr-diff": "^4.0.0",
2619
+ "array-unique": "^0.3.2",
2620
+ "define-property": "^2.0.2",
2621
+ "extend-shallow": "^3.0.2",
2622
+ "fragment-cache": "^0.2.1",
2623
+ "is-windows": "^1.0.2",
2624
+ "kind-of": "^6.0.2",
2625
+ "object.pick": "^1.3.0",
2626
+ "regex-not": "^1.0.0",
2627
+ "snapdragon": "^0.8.1",
2628
+ "to-regex": "^3.0.1"
2629
+ }
2630
+ },
2631
+ "nerf-dart": {
2632
+ "version": "1.0.0",
2633
+ "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz",
2634
+ "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=",
2635
+ "dev": true
2636
+ },
2637
+ "nice-try": {
2638
+ "version": "1.0.5",
2639
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
2640
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
2641
+ "dev": true
2642
+ },
2643
+ "node-emoji": {
2644
+ "version": "1.8.1",
2645
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz",
2646
+ "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==",
2647
+ "dev": true,
2648
+ "requires": {
2649
+ "lodash.toarray": "^4.4.0"
2650
+ }
2651
+ },
2652
+ "node-fetch": {
2653
+ "version": "2.3.0",
2654
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
2655
+ "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==",
2656
+ "dev": true
2657
+ },
2658
+ "nopt": {
2659
+ "version": "3.0.6",
2660
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
2661
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
2662
+ "dev": true,
2663
+ "requires": {
2664
+ "abbrev": "1"
2665
+ }
2666
+ },
2667
+ "normalize-package-data": {
2668
+ "version": "2.4.0",
2669
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2670
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2671
+ "dev": true,
2672
+ "requires": {
2673
+ "hosted-git-info": "^2.1.4",
2674
+ "is-builtin-module": "^1.0.0",
2675
+ "semver": "2 || 3 || 4 || 5",
2676
+ "validate-npm-package-license": "^3.0.1"
2677
+ }
2678
+ },
2679
+ "normalize-url": {
2680
+ "version": "4.1.0",
2681
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.1.0.tgz",
2682
+ "integrity": "sha512-X781mkWeK6PDMAZJfGn/wnwil4dV6pIdF9euiNqtA89uJvZuNDJO2YyJxiwpPhTQcF5pYUU1v+kcOxzYV6rZlA==",
2683
+ "dev": true
2684
+ },
2685
+ "npm": {
2686
+ "version": "6.5.0",
2687
+ "resolved": "https://registry.npmjs.org/npm/-/npm-6.5.0.tgz",
2688
+ "integrity": "sha512-SPq8zG2Kto+Xrq55E97O14Jla13PmQT5kSnvwBj88BmJZ5Nvw++OmlWfhjkB67pcgP5UEXljEtnGFKZtOgt6MQ==",
2689
+ "dev": true,
2690
+ "requires": {
2691
+ "JSONStream": "^1.3.4",
2692
+ "abbrev": "~1.1.1",
2693
+ "ansicolors": "~0.3.2",
2694
+ "ansistyles": "~0.1.3",
2695
+ "aproba": "~1.2.0",
2696
+ "archy": "~1.0.0",
2697
+ "bin-links": "^1.1.2",
2698
+ "bluebird": "^3.5.3",
2699
+ "byte-size": "^4.0.3",
2700
+ "cacache": "^11.2.0",
2701
+ "call-limit": "~1.1.0",
2702
+ "chownr": "~1.0.1",
2703
+ "ci-info": "^1.6.0",
2704
+ "cli-columns": "^3.1.2",
2705
+ "cli-table3": "^0.5.0",
2706
+ "cmd-shim": "~2.0.2",
2707
+ "columnify": "~1.5.4",
2708
+ "config-chain": "^1.1.12",
2709
+ "debuglog": "*",
2710
+ "detect-indent": "~5.0.0",
2711
+ "detect-newline": "^2.1.0",
2712
+ "dezalgo": "~1.0.3",
2713
+ "editor": "~1.0.0",
2714
+ "figgy-pudding": "^3.5.1",
2715
+ "find-npm-prefix": "^1.0.2",
2716
+ "fs-vacuum": "~1.2.10",
2717
+ "fs-write-stream-atomic": "~1.0.10",
2718
+ "gentle-fs": "^2.0.1",
2719
+ "glob": "^7.1.3",
2720
+ "graceful-fs": "^4.1.15",
2721
+ "has-unicode": "~2.0.1",
2722
+ "hosted-git-info": "^2.7.1",
2723
+ "iferr": "^1.0.2",
2724
+ "imurmurhash": "*",
2725
+ "inflight": "~1.0.6",
2726
+ "inherits": "~2.0.3",
2727
+ "ini": "^1.3.5",
2728
+ "init-package-json": "^1.10.3",
2729
+ "is-cidr": "^2.0.6",
2730
+ "json-parse-better-errors": "^1.0.2",
2731
+ "lazy-property": "~1.0.0",
2732
+ "libcipm": "^2.0.2",
2733
+ "libnpmhook": "^4.0.1",
2734
+ "libnpx": "^10.2.0",
2735
+ "lock-verify": "^2.0.2",
2736
+ "lockfile": "^1.0.4",
2737
+ "lodash._baseindexof": "*",
2738
+ "lodash._baseuniq": "~4.6.0",
2739
+ "lodash._bindcallback": "*",
2740
+ "lodash._cacheindexof": "*",
2741
+ "lodash._createcache": "*",
2742
+ "lodash._getnative": "*",
2743
+ "lodash.clonedeep": "~4.5.0",
2744
+ "lodash.restparam": "*",
2745
+ "lodash.union": "~4.6.0",
2746
+ "lodash.uniq": "~4.5.0",
2747
+ "lodash.without": "~4.4.0",
2748
+ "lru-cache": "^4.1.3",
2749
+ "meant": "~1.0.1",
2750
+ "mississippi": "^3.0.0",
2751
+ "mkdirp": "~0.5.1",
2752
+ "move-concurrently": "^1.0.1",
2753
+ "node-gyp": "^3.8.0",
2754
+ "nopt": "~4.0.1",
2755
+ "normalize-package-data": "~2.4.0",
2756
+ "npm-audit-report": "^1.3.1",
2757
+ "npm-cache-filename": "~1.0.2",
2758
+ "npm-install-checks": "~3.0.0",
2759
+ "npm-lifecycle": "^2.1.0",
2760
+ "npm-package-arg": "^6.1.0",
2761
+ "npm-packlist": "^1.1.12",
2762
+ "npm-pick-manifest": "^2.1.0",
2763
+ "npm-profile": "^3.0.2",
2764
+ "npm-registry-client": "^8.6.0",
2765
+ "npm-registry-fetch": "^1.1.0",
2766
+ "npm-user-validate": "~1.0.0",
2767
+ "npmlog": "~4.1.2",
2768
+ "once": "~1.4.0",
2769
+ "opener": "^1.5.1",
2770
+ "osenv": "^0.1.5",
2771
+ "pacote": "^8.1.6",
2772
+ "path-is-inside": "~1.0.2",
2773
+ "promise-inflight": "~1.0.1",
2774
+ "qrcode-terminal": "^0.12.0",
2775
+ "query-string": "^6.1.0",
2776
+ "qw": "~1.0.1",
2777
+ "read": "~1.0.7",
2778
+ "read-cmd-shim": "~1.0.1",
2779
+ "read-installed": "~4.0.3",
2780
+ "read-package-json": "^2.0.13",
2781
+ "read-package-tree": "^5.2.1",
2782
+ "readable-stream": "^2.3.6",
2783
+ "readdir-scoped-modules": "*",
2784
+ "request": "^2.88.0",
2785
+ "retry": "^0.12.0",
2786
+ "rimraf": "~2.6.2",
2787
+ "safe-buffer": "^5.1.2",
2788
+ "semver": "^5.5.1",
2789
+ "sha": "~2.0.1",
2790
+ "slide": "~1.1.6",
2791
+ "sorted-object": "~2.0.1",
2792
+ "sorted-union-stream": "~2.1.3",
2793
+ "ssri": "^6.0.1",
2794
+ "stringify-package": "^1.0.0",
2795
+ "tar": "^4.4.8",
2796
+ "text-table": "~0.2.0",
2797
+ "tiny-relative-date": "^1.3.0",
2798
+ "uid-number": "0.0.6",
2799
+ "umask": "~1.1.0",
2800
+ "unique-filename": "~1.1.0",
2801
+ "unpipe": "~1.0.0",
2802
+ "update-notifier": "^2.5.0",
2803
+ "uuid": "^3.3.2",
2804
+ "validate-npm-package-license": "^3.0.4",
2805
+ "validate-npm-package-name": "~3.0.0",
2806
+ "which": "^1.3.1",
2807
+ "worker-farm": "^1.6.0",
2808
+ "write-file-atomic": "^2.3.0"
2809
+ },
2810
+ "dependencies": {
2811
+ "JSONStream": {
2812
+ "version": "1.3.4",
2813
+ "bundled": true,
2814
+ "dev": true,
2815
+ "requires": {
2816
+ "jsonparse": "^1.2.0",
2817
+ "through": ">=2.2.7 <3"
2818
+ }
2819
+ },
2820
+ "abbrev": {
2821
+ "version": "1.1.1",
2822
+ "bundled": true,
2823
+ "dev": true
2824
+ },
2825
+ "agent-base": {
2826
+ "version": "4.2.0",
2827
+ "bundled": true,
2828
+ "dev": true,
2829
+ "requires": {
2830
+ "es6-promisify": "^5.0.0"
2831
+ }
2832
+ },
2833
+ "agentkeepalive": {
2834
+ "version": "3.4.1",
2835
+ "bundled": true,
2836
+ "dev": true,
2837
+ "requires": {
2838
+ "humanize-ms": "^1.2.1"
2839
+ }
2840
+ },
2841
+ "ajv": {
2842
+ "version": "5.5.2",
2843
+ "bundled": true,
2844
+ "dev": true,
2845
+ "requires": {
2846
+ "co": "^4.6.0",
2847
+ "fast-deep-equal": "^1.0.0",
2848
+ "fast-json-stable-stringify": "^2.0.0",
2849
+ "json-schema-traverse": "^0.3.0"
2850
+ }
2851
+ },
2852
+ "ansi-align": {
2853
+ "version": "2.0.0",
2854
+ "bundled": true,
2855
+ "dev": true,
2856
+ "requires": {
2857
+ "string-width": "^2.0.0"
2858
+ }
2859
+ },
2860
+ "ansi-regex": {
2861
+ "version": "2.1.1",
2862
+ "bundled": true,
2863
+ "dev": true
2864
+ },
2865
+ "ansi-styles": {
2866
+ "version": "3.2.1",
2867
+ "bundled": true,
2868
+ "dev": true,
2869
+ "requires": {
2870
+ "color-convert": "^1.9.0"
2871
+ }
2872
+ },
2873
+ "ansicolors": {
2874
+ "version": "0.3.2",
2875
+ "bundled": true,
2876
+ "dev": true
2877
+ },
2878
+ "ansistyles": {
2879
+ "version": "0.1.3",
2880
+ "bundled": true,
2881
+ "dev": true
2882
+ },
2883
+ "aproba": {
2884
+ "version": "1.2.0",
2885
+ "bundled": true,
2886
+ "dev": true
2887
+ },
2888
+ "archy": {
2889
+ "version": "1.0.0",
2890
+ "bundled": true,
2891
+ "dev": true
2892
+ },
2893
+ "are-we-there-yet": {
2894
+ "version": "1.1.4",
2895
+ "bundled": true,
2896
+ "dev": true,
2897
+ "requires": {
2898
+ "delegates": "^1.0.0",
2899
+ "readable-stream": "^2.0.6"
2900
+ }
2901
+ },
2902
+ "asap": {
2903
+ "version": "2.0.6",
2904
+ "bundled": true,
2905
+ "dev": true
2906
+ },
2907
+ "asn1": {
2908
+ "version": "0.2.4",
2909
+ "bundled": true,
2910
+ "dev": true,
2911
+ "requires": {
2912
+ "safer-buffer": "~2.1.0"
2913
+ }
2914
+ },
2915
+ "assert-plus": {
2916
+ "version": "1.0.0",
2917
+ "bundled": true,
2918
+ "dev": true
2919
+ },
2920
+ "asynckit": {
2921
+ "version": "0.4.0",
2922
+ "bundled": true,
2923
+ "dev": true
2924
+ },
2925
+ "aws-sign2": {
2926
+ "version": "0.7.0",
2927
+ "bundled": true,
2928
+ "dev": true
2929
+ },
2930
+ "aws4": {
2931
+ "version": "1.8.0",
2932
+ "bundled": true,
2933
+ "dev": true
2934
+ },
2935
+ "balanced-match": {
2936
+ "version": "1.0.0",
2937
+ "bundled": true,
2938
+ "dev": true
2939
+ },
2940
+ "bcrypt-pbkdf": {
2941
+ "version": "1.0.2",
2942
+ "bundled": true,
2943
+ "dev": true,
2944
+ "optional": true,
2945
+ "requires": {
2946
+ "tweetnacl": "^0.14.3"
2947
+ }
2948
+ },
2949
+ "bin-links": {
2950
+ "version": "1.1.2",
2951
+ "bundled": true,
2952
+ "dev": true,
2953
+ "requires": {
2954
+ "bluebird": "^3.5.0",
2955
+ "cmd-shim": "^2.0.2",
2956
+ "gentle-fs": "^2.0.0",
2957
+ "graceful-fs": "^4.1.11",
2958
+ "write-file-atomic": "^2.3.0"
2959
+ }
2960
+ },
2961
+ "block-stream": {
2962
+ "version": "0.0.9",
2963
+ "bundled": true,
2964
+ "dev": true,
2965
+ "requires": {
2966
+ "inherits": "~2.0.0"
2967
+ }
2968
+ },
2969
+ "bluebird": {
2970
+ "version": "3.5.3",
2971
+ "bundled": true,
2972
+ "dev": true
2973
+ },
2974
+ "boxen": {
2975
+ "version": "1.3.0",
2976
+ "bundled": true,
2977
+ "dev": true,
2978
+ "requires": {
2979
+ "ansi-align": "^2.0.0",
2980
+ "camelcase": "^4.0.0",
2981
+ "chalk": "^2.0.1",
2982
+ "cli-boxes": "^1.0.0",
2983
+ "string-width": "^2.0.0",
2984
+ "term-size": "^1.2.0",
2985
+ "widest-line": "^2.0.0"
2986
+ }
2987
+ },
2988
+ "brace-expansion": {
2989
+ "version": "1.1.11",
2990
+ "bundled": true,
2991
+ "dev": true,
2992
+ "requires": {
2993
+ "balanced-match": "^1.0.0",
2994
+ "concat-map": "0.0.1"
2995
+ }
2996
+ },
2997
+ "buffer-from": {
2998
+ "version": "1.0.0",
2999
+ "bundled": true,
3000
+ "dev": true
3001
+ },
3002
+ "builtin-modules": {
3003
+ "version": "1.1.1",
3004
+ "bundled": true,
3005
+ "dev": true
3006
+ },
3007
+ "builtins": {
3008
+ "version": "1.0.3",
3009
+ "bundled": true,
3010
+ "dev": true
3011
+ },
3012
+ "byline": {
3013
+ "version": "5.0.0",
3014
+ "bundled": true,
3015
+ "dev": true
3016
+ },
3017
+ "byte-size": {
3018
+ "version": "4.0.3",
3019
+ "bundled": true,
3020
+ "dev": true
3021
+ },
3022
+ "cacache": {
3023
+ "version": "11.2.0",
3024
+ "bundled": true,
3025
+ "dev": true,
3026
+ "requires": {
3027
+ "bluebird": "^3.5.1",
3028
+ "chownr": "^1.0.1",
3029
+ "figgy-pudding": "^3.1.0",
3030
+ "glob": "^7.1.2",
3031
+ "graceful-fs": "^4.1.11",
3032
+ "lru-cache": "^4.1.3",
3033
+ "mississippi": "^3.0.0",
3034
+ "mkdirp": "^0.5.1",
3035
+ "move-concurrently": "^1.0.1",
3036
+ "promise-inflight": "^1.0.1",
3037
+ "rimraf": "^2.6.2",
3038
+ "ssri": "^6.0.0",
3039
+ "unique-filename": "^1.1.0",
3040
+ "y18n": "^4.0.0"
3041
+ }
3042
+ },
3043
+ "call-limit": {
3044
+ "version": "1.1.0",
3045
+ "bundled": true,
3046
+ "dev": true
3047
+ },
3048
+ "camelcase": {
3049
+ "version": "4.1.0",
3050
+ "bundled": true,
3051
+ "dev": true
3052
+ },
3053
+ "capture-stack-trace": {
3054
+ "version": "1.0.0",
3055
+ "bundled": true,
3056
+ "dev": true
3057
+ },
3058
+ "caseless": {
3059
+ "version": "0.12.0",
3060
+ "bundled": true,
3061
+ "dev": true
3062
+ },
3063
+ "chalk": {
3064
+ "version": "2.4.1",
3065
+ "bundled": true,
3066
+ "dev": true,
3067
+ "requires": {
3068
+ "ansi-styles": "^3.2.1",
3069
+ "escape-string-regexp": "^1.0.5",
3070
+ "supports-color": "^5.3.0"
3071
+ }
3072
+ },
3073
+ "chownr": {
3074
+ "version": "1.0.1",
3075
+ "bundled": true,
3076
+ "dev": true
3077
+ },
3078
+ "ci-info": {
3079
+ "version": "1.6.0",
3080
+ "bundled": true,
3081
+ "dev": true
3082
+ },
3083
+ "cidr-regex": {
3084
+ "version": "2.0.9",
3085
+ "bundled": true,
3086
+ "dev": true,
3087
+ "requires": {
3088
+ "ip-regex": "^2.1.0"
3089
+ }
3090
+ },
3091
+ "cli-boxes": {
3092
+ "version": "1.0.0",
3093
+ "bundled": true,
3094
+ "dev": true
3095
+ },
3096
+ "cli-columns": {
3097
+ "version": "3.1.2",
3098
+ "bundled": true,
3099
+ "dev": true,
3100
+ "requires": {
3101
+ "string-width": "^2.0.0",
3102
+ "strip-ansi": "^3.0.1"
3103
+ }
3104
+ },
3105
+ "cli-table3": {
3106
+ "version": "0.5.0",
3107
+ "bundled": true,
3108
+ "dev": true,
3109
+ "requires": {
3110
+ "colors": "^1.1.2",
3111
+ "object-assign": "^4.1.0",
3112
+ "string-width": "^2.1.1"
3113
+ }
3114
+ },
3115
+ "cliui": {
3116
+ "version": "4.1.0",
3117
+ "bundled": true,
3118
+ "dev": true,
3119
+ "requires": {
3120
+ "string-width": "^2.1.1",
3121
+ "strip-ansi": "^4.0.0",
3122
+ "wrap-ansi": "^2.0.0"
3123
+ },
3124
+ "dependencies": {
3125
+ "ansi-regex": {
3126
+ "version": "3.0.0",
3127
+ "bundled": true,
3128
+ "dev": true
3129
+ },
3130
+ "strip-ansi": {
3131
+ "version": "4.0.0",
3132
+ "bundled": true,
3133
+ "dev": true,
3134
+ "requires": {
3135
+ "ansi-regex": "^3.0.0"
3136
+ }
3137
+ }
3138
+ }
3139
+ },
3140
+ "clone": {
3141
+ "version": "1.0.4",
3142
+ "bundled": true,
3143
+ "dev": true
3144
+ },
3145
+ "cmd-shim": {
3146
+ "version": "2.0.2",
3147
+ "bundled": true,
3148
+ "dev": true,
3149
+ "requires": {
3150
+ "graceful-fs": "^4.1.2",
3151
+ "mkdirp": "~0.5.0"
3152
+ }
3153
+ },
3154
+ "co": {
3155
+ "version": "4.6.0",
3156
+ "bundled": true,
3157
+ "dev": true
3158
+ },
3159
+ "code-point-at": {
3160
+ "version": "1.1.0",
3161
+ "bundled": true,
3162
+ "dev": true
3163
+ },
3164
+ "color-convert": {
3165
+ "version": "1.9.1",
3166
+ "bundled": true,
3167
+ "dev": true,
3168
+ "requires": {
3169
+ "color-name": "^1.1.1"
3170
+ }
3171
+ },
3172
+ "color-name": {
3173
+ "version": "1.1.3",
3174
+ "bundled": true,
3175
+ "dev": true
3176
+ },
3177
+ "colors": {
3178
+ "version": "1.1.2",
3179
+ "bundled": true,
3180
+ "dev": true,
3181
+ "optional": true
3182
+ },
3183
+ "columnify": {
3184
+ "version": "1.5.4",
3185
+ "bundled": true,
3186
+ "dev": true,
3187
+ "requires": {
3188
+ "strip-ansi": "^3.0.0",
3189
+ "wcwidth": "^1.0.0"
3190
+ }
3191
+ },
3192
+ "combined-stream": {
3193
+ "version": "1.0.6",
3194
+ "bundled": true,
3195
+ "dev": true,
3196
+ "requires": {
3197
+ "delayed-stream": "~1.0.0"
3198
+ }
3199
+ },
3200
+ "concat-map": {
3201
+ "version": "0.0.1",
3202
+ "bundled": true,
3203
+ "dev": true
3204
+ },
3205
+ "concat-stream": {
3206
+ "version": "1.6.2",
3207
+ "bundled": true,
3208
+ "dev": true,
3209
+ "requires": {
3210
+ "buffer-from": "^1.0.0",
3211
+ "inherits": "^2.0.3",
3212
+ "readable-stream": "^2.2.2",
3213
+ "typedarray": "^0.0.6"
3214
+ }
3215
+ },
3216
+ "config-chain": {
3217
+ "version": "1.1.12",
3218
+ "bundled": true,
3219
+ "dev": true,
3220
+ "requires": {
3221
+ "ini": "^1.3.4",
3222
+ "proto-list": "~1.2.1"
3223
+ }
3224
+ },
3225
+ "configstore": {
3226
+ "version": "3.1.2",
3227
+ "bundled": true,
3228
+ "dev": true,
3229
+ "requires": {
3230
+ "dot-prop": "^4.1.0",
3231
+ "graceful-fs": "^4.1.2",
3232
+ "make-dir": "^1.0.0",
3233
+ "unique-string": "^1.0.0",
3234
+ "write-file-atomic": "^2.0.0",
3235
+ "xdg-basedir": "^3.0.0"
3236
+ }
3237
+ },
3238
+ "console-control-strings": {
3239
+ "version": "1.1.0",
3240
+ "bundled": true,
3241
+ "dev": true
3242
+ },
3243
+ "copy-concurrently": {
3244
+ "version": "1.0.5",
3245
+ "bundled": true,
3246
+ "dev": true,
3247
+ "requires": {
3248
+ "aproba": "^1.1.1",
3249
+ "fs-write-stream-atomic": "^1.0.8",
3250
+ "iferr": "^0.1.5",
3251
+ "mkdirp": "^0.5.1",
3252
+ "rimraf": "^2.5.4",
3253
+ "run-queue": "^1.0.0"
3254
+ },
3255
+ "dependencies": {
3256
+ "iferr": {
3257
+ "version": "0.1.5",
3258
+ "bundled": true,
3259
+ "dev": true
3260
+ }
3261
+ }
3262
+ },
3263
+ "core-util-is": {
3264
+ "version": "1.0.2",
3265
+ "bundled": true,
3266
+ "dev": true
3267
+ },
3268
+ "create-error-class": {
3269
+ "version": "3.0.2",
3270
+ "bundled": true,
3271
+ "dev": true,
3272
+ "requires": {
3273
+ "capture-stack-trace": "^1.0.0"
3274
+ }
3275
+ },
3276
+ "cross-spawn": {
3277
+ "version": "5.1.0",
3278
+ "bundled": true,
3279
+ "dev": true,
3280
+ "requires": {
3281
+ "lru-cache": "^4.0.1",
3282
+ "shebang-command": "^1.2.0",
3283
+ "which": "^1.2.9"
3284
+ }
3285
+ },
3286
+ "crypto-random-string": {
3287
+ "version": "1.0.0",
3288
+ "bundled": true,
3289
+ "dev": true
3290
+ },
3291
+ "cyclist": {
3292
+ "version": "0.2.2",
3293
+ "bundled": true,
3294
+ "dev": true
3295
+ },
3296
+ "dashdash": {
3297
+ "version": "1.14.1",
3298
+ "bundled": true,
3299
+ "dev": true,
3300
+ "requires": {
3301
+ "assert-plus": "^1.0.0"
3302
+ }
3303
+ },
3304
+ "debug": {
3305
+ "version": "3.1.0",
3306
+ "bundled": true,
3307
+ "dev": true,
3308
+ "requires": {
3309
+ "ms": "2.0.0"
3310
+ },
3311
+ "dependencies": {
3312
+ "ms": {
3313
+ "version": "2.0.0",
3314
+ "bundled": true,
3315
+ "dev": true
3316
+ }
3317
+ }
3318
+ },
3319
+ "debuglog": {
3320
+ "version": "1.0.1",
3321
+ "bundled": true,
3322
+ "dev": true
3323
+ },
3324
+ "decamelize": {
3325
+ "version": "1.2.0",
3326
+ "bundled": true,
3327
+ "dev": true
3328
+ },
3329
+ "decode-uri-component": {
3330
+ "version": "0.2.0",
3331
+ "bundled": true,
3332
+ "dev": true
3333
+ },
3334
+ "deep-extend": {
3335
+ "version": "0.5.1",
3336
+ "bundled": true,
3337
+ "dev": true
3338
+ },
3339
+ "defaults": {
3340
+ "version": "1.0.3",
3341
+ "bundled": true,
3342
+ "dev": true,
3343
+ "requires": {
3344
+ "clone": "^1.0.2"
3345
+ }
3346
+ },
3347
+ "delayed-stream": {
3348
+ "version": "1.0.0",
3349
+ "bundled": true,
3350
+ "dev": true
3351
+ },
3352
+ "delegates": {
3353
+ "version": "1.0.0",
3354
+ "bundled": true,
3355
+ "dev": true
3356
+ },
3357
+ "detect-indent": {
3358
+ "version": "5.0.0",
3359
+ "bundled": true,
3360
+ "dev": true
3361
+ },
3362
+ "detect-newline": {
3363
+ "version": "2.1.0",
3364
+ "bundled": true,
3365
+ "dev": true
3366
+ },
3367
+ "dezalgo": {
3368
+ "version": "1.0.3",
3369
+ "bundled": true,
3370
+ "dev": true,
3371
+ "requires": {
3372
+ "asap": "^2.0.0",
3373
+ "wrappy": "1"
3374
+ }
3375
+ },
3376
+ "dot-prop": {
3377
+ "version": "4.2.0",
3378
+ "bundled": true,
3379
+ "dev": true,
3380
+ "requires": {
3381
+ "is-obj": "^1.0.0"
3382
+ }
3383
+ },
3384
+ "dotenv": {
3385
+ "version": "5.0.1",
3386
+ "bundled": true,
3387
+ "dev": true
3388
+ },
3389
+ "duplexer3": {
3390
+ "version": "0.1.4",
3391
+ "bundled": true,
3392
+ "dev": true
3393
+ },
3394
+ "duplexify": {
3395
+ "version": "3.6.0",
3396
+ "bundled": true,
3397
+ "dev": true,
3398
+ "requires": {
3399
+ "end-of-stream": "^1.0.0",
3400
+ "inherits": "^2.0.1",
3401
+ "readable-stream": "^2.0.0",
3402
+ "stream-shift": "^1.0.0"
3403
+ }
3404
+ },
3405
+ "ecc-jsbn": {
3406
+ "version": "0.1.2",
3407
+ "bundled": true,
3408
+ "dev": true,
3409
+ "optional": true,
3410
+ "requires": {
3411
+ "jsbn": "~0.1.0",
3412
+ "safer-buffer": "^2.1.0"
3413
+ }
3414
+ },
3415
+ "editor": {
3416
+ "version": "1.0.0",
3417
+ "bundled": true,
3418
+ "dev": true
3419
+ },
3420
+ "encoding": {
3421
+ "version": "0.1.12",
3422
+ "bundled": true,
3423
+ "dev": true,
3424
+ "requires": {
3425
+ "iconv-lite": "~0.4.13"
3426
+ }
3427
+ },
3428
+ "end-of-stream": {
3429
+ "version": "1.4.1",
3430
+ "bundled": true,
3431
+ "dev": true,
3432
+ "requires": {
3433
+ "once": "^1.4.0"
3434
+ }
3435
+ },
3436
+ "err-code": {
3437
+ "version": "1.1.2",
3438
+ "bundled": true,
3439
+ "dev": true
3440
+ },
3441
+ "errno": {
3442
+ "version": "0.1.7",
3443
+ "bundled": true,
3444
+ "dev": true,
3445
+ "requires": {
3446
+ "prr": "~1.0.1"
3447
+ }
3448
+ },
3449
+ "es6-promise": {
3450
+ "version": "4.2.4",
3451
+ "bundled": true,
3452
+ "dev": true
3453
+ },
3454
+ "es6-promisify": {
3455
+ "version": "5.0.0",
3456
+ "bundled": true,
3457
+ "dev": true,
3458
+ "requires": {
3459
+ "es6-promise": "^4.0.3"
3460
+ }
3461
+ },
3462
+ "escape-string-regexp": {
3463
+ "version": "1.0.5",
3464
+ "bundled": true,
3465
+ "dev": true
3466
+ },
3467
+ "execa": {
3468
+ "version": "0.7.0",
3469
+ "bundled": true,
3470
+ "dev": true,
3471
+ "requires": {
3472
+ "cross-spawn": "^5.0.1",
3473
+ "get-stream": "^3.0.0",
3474
+ "is-stream": "^1.1.0",
3475
+ "npm-run-path": "^2.0.0",
3476
+ "p-finally": "^1.0.0",
3477
+ "signal-exit": "^3.0.0",
3478
+ "strip-eof": "^1.0.0"
3479
+ }
3480
+ },
3481
+ "extend": {
3482
+ "version": "3.0.2",
3483
+ "bundled": true,
3484
+ "dev": true
3485
+ },
3486
+ "extsprintf": {
3487
+ "version": "1.3.0",
3488
+ "bundled": true,
3489
+ "dev": true
3490
+ },
3491
+ "fast-deep-equal": {
3492
+ "version": "1.1.0",
3493
+ "bundled": true,
3494
+ "dev": true
3495
+ },
3496
+ "fast-json-stable-stringify": {
3497
+ "version": "2.0.0",
3498
+ "bundled": true,
3499
+ "dev": true
3500
+ },
3501
+ "figgy-pudding": {
3502
+ "version": "3.5.1",
3503
+ "bundled": true,
3504
+ "dev": true
3505
+ },
3506
+ "find-npm-prefix": {
3507
+ "version": "1.0.2",
3508
+ "bundled": true,
3509
+ "dev": true
3510
+ },
3511
+ "find-up": {
3512
+ "version": "2.1.0",
3513
+ "bundled": true,
3514
+ "dev": true,
3515
+ "requires": {
3516
+ "locate-path": "^2.0.0"
3517
+ }
3518
+ },
3519
+ "flush-write-stream": {
3520
+ "version": "1.0.3",
3521
+ "bundled": true,
3522
+ "dev": true,
3523
+ "requires": {
3524
+ "inherits": "^2.0.1",
3525
+ "readable-stream": "^2.0.4"
3526
+ }
3527
+ },
3528
+ "forever-agent": {
3529
+ "version": "0.6.1",
3530
+ "bundled": true,
3531
+ "dev": true
3532
+ },
3533
+ "form-data": {
3534
+ "version": "2.3.2",
3535
+ "bundled": true,
3536
+ "dev": true,
3537
+ "requires": {
3538
+ "asynckit": "^0.4.0",
3539
+ "combined-stream": "1.0.6",
3540
+ "mime-types": "^2.1.12"
3541
+ }
3542
+ },
3543
+ "from2": {
3544
+ "version": "2.3.0",
3545
+ "bundled": true,
3546
+ "dev": true,
3547
+ "requires": {
3548
+ "inherits": "^2.0.1",
3549
+ "readable-stream": "^2.0.0"
3550
+ }
3551
+ },
3552
+ "fs-minipass": {
3553
+ "version": "1.2.5",
3554
+ "bundled": true,
3555
+ "dev": true,
3556
+ "requires": {
3557
+ "minipass": "^2.2.1"
3558
+ }
3559
+ },
3560
+ "fs-vacuum": {
3561
+ "version": "1.2.10",
3562
+ "bundled": true,
3563
+ "dev": true,
3564
+ "requires": {
3565
+ "graceful-fs": "^4.1.2",
3566
+ "path-is-inside": "^1.0.1",
3567
+ "rimraf": "^2.5.2"
3568
+ }
3569
+ },
3570
+ "fs-write-stream-atomic": {
3571
+ "version": "1.0.10",
3572
+ "bundled": true,
3573
+ "dev": true,
3574
+ "requires": {
3575
+ "graceful-fs": "^4.1.2",
3576
+ "iferr": "^0.1.5",
3577
+ "imurmurhash": "^0.1.4",
3578
+ "readable-stream": "1 || 2"
3579
+ },
3580
+ "dependencies": {
3581
+ "iferr": {
3582
+ "version": "0.1.5",
3583
+ "bundled": true,
3584
+ "dev": true
3585
+ }
3586
+ }
3587
+ },
3588
+ "fs.realpath": {
3589
+ "version": "1.0.0",
3590
+ "bundled": true,
3591
+ "dev": true
3592
+ },
3593
+ "fstream": {
3594
+ "version": "1.0.11",
3595
+ "bundled": true,
3596
+ "dev": true,
3597
+ "requires": {
3598
+ "graceful-fs": "^4.1.2",
3599
+ "inherits": "~2.0.0",
3600
+ "mkdirp": ">=0.5 0",
3601
+ "rimraf": "2"
3602
+ }
3603
+ },
3604
+ "gauge": {
3605
+ "version": "2.7.4",
3606
+ "bundled": true,
3607
+ "dev": true,
3608
+ "requires": {
3609
+ "aproba": "^1.0.3",
3610
+ "console-control-strings": "^1.0.0",
3611
+ "has-unicode": "^2.0.0",
3612
+ "object-assign": "^4.1.0",
3613
+ "signal-exit": "^3.0.0",
3614
+ "string-width": "^1.0.1",
3615
+ "strip-ansi": "^3.0.1",
3616
+ "wide-align": "^1.1.0"
3617
+ },
3618
+ "dependencies": {
3619
+ "string-width": {
3620
+ "version": "1.0.2",
3621
+ "bundled": true,
3622
+ "dev": true,
3623
+ "requires": {
3624
+ "code-point-at": "^1.0.0",
3625
+ "is-fullwidth-code-point": "^1.0.0",
3626
+ "strip-ansi": "^3.0.0"
3627
+ }
3628
+ }
3629
+ }
3630
+ },
3631
+ "genfun": {
3632
+ "version": "4.0.1",
3633
+ "bundled": true,
3634
+ "dev": true
3635
+ },
3636
+ "gentle-fs": {
3637
+ "version": "2.0.1",
3638
+ "bundled": true,
3639
+ "dev": true,
3640
+ "requires": {
3641
+ "aproba": "^1.1.2",
3642
+ "fs-vacuum": "^1.2.10",
3643
+ "graceful-fs": "^4.1.11",
3644
+ "iferr": "^0.1.5",
3645
+ "mkdirp": "^0.5.1",
3646
+ "path-is-inside": "^1.0.2",
3647
+ "read-cmd-shim": "^1.0.1",
3648
+ "slide": "^1.1.6"
3649
+ },
3650
+ "dependencies": {
3651
+ "iferr": {
3652
+ "version": "0.1.5",
3653
+ "bundled": true,
3654
+ "dev": true
3655
+ }
3656
+ }
3657
+ },
3658
+ "get-caller-file": {
3659
+ "version": "1.0.2",
3660
+ "bundled": true,
3661
+ "dev": true
3662
+ },
3663
+ "get-stream": {
3664
+ "version": "3.0.0",
3665
+ "bundled": true,
3666
+ "dev": true
3667
+ },
3668
+ "getpass": {
3669
+ "version": "0.1.7",
3670
+ "bundled": true,
3671
+ "dev": true,
3672
+ "requires": {
3673
+ "assert-plus": "^1.0.0"
3674
+ }
3675
+ },
3676
+ "glob": {
3677
+ "version": "7.1.3",
3678
+ "bundled": true,
3679
+ "dev": true,
3680
+ "requires": {
3681
+ "fs.realpath": "^1.0.0",
3682
+ "inflight": "^1.0.4",
3683
+ "inherits": "2",
3684
+ "minimatch": "^3.0.4",
3685
+ "once": "^1.3.0",
3686
+ "path-is-absolute": "^1.0.0"
3687
+ }
3688
+ },
3689
+ "global-dirs": {
3690
+ "version": "0.1.1",
3691
+ "bundled": true,
3692
+ "dev": true,
3693
+ "requires": {
3694
+ "ini": "^1.3.4"
3695
+ }
3696
+ },
3697
+ "got": {
3698
+ "version": "6.7.1",
3699
+ "bundled": true,
3700
+ "dev": true,
3701
+ "requires": {
3702
+ "create-error-class": "^3.0.0",
3703
+ "duplexer3": "^0.1.4",
3704
+ "get-stream": "^3.0.0",
3705
+ "is-redirect": "^1.0.0",
3706
+ "is-retry-allowed": "^1.0.0",
3707
+ "is-stream": "^1.0.0",
3708
+ "lowercase-keys": "^1.0.0",
3709
+ "safe-buffer": "^5.0.1",
3710
+ "timed-out": "^4.0.0",
3711
+ "unzip-response": "^2.0.1",
3712
+ "url-parse-lax": "^1.0.0"
3713
+ }
3714
+ },
3715
+ "graceful-fs": {
3716
+ "version": "4.1.15",
3717
+ "bundled": true,
3718
+ "dev": true
3719
+ },
3720
+ "har-schema": {
3721
+ "version": "2.0.0",
3722
+ "bundled": true,
3723
+ "dev": true
3724
+ },
3725
+ "har-validator": {
3726
+ "version": "5.1.0",
3727
+ "bundled": true,
3728
+ "dev": true,
3729
+ "requires": {
3730
+ "ajv": "^5.3.0",
3731
+ "har-schema": "^2.0.0"
3732
+ }
3733
+ },
3734
+ "has-flag": {
3735
+ "version": "3.0.0",
3736
+ "bundled": true,
3737
+ "dev": true
3738
+ },
3739
+ "has-unicode": {
3740
+ "version": "2.0.1",
3741
+ "bundled": true,
3742
+ "dev": true
3743
+ },
3744
+ "hosted-git-info": {
3745
+ "version": "2.7.1",
3746
+ "bundled": true,
3747
+ "dev": true
3748
+ },
3749
+ "http-cache-semantics": {
3750
+ "version": "3.8.1",
3751
+ "bundled": true,
3752
+ "dev": true
3753
+ },
3754
+ "http-proxy-agent": {
3755
+ "version": "2.1.0",
3756
+ "bundled": true,
3757
+ "dev": true,
3758
+ "requires": {
3759
+ "agent-base": "4",
3760
+ "debug": "3.1.0"
3761
+ }
3762
+ },
3763
+ "http-signature": {
3764
+ "version": "1.2.0",
3765
+ "bundled": true,
3766
+ "dev": true,
3767
+ "requires": {
3768
+ "assert-plus": "^1.0.0",
3769
+ "jsprim": "^1.2.2",
3770
+ "sshpk": "^1.7.0"
3771
+ }
3772
+ },
3773
+ "https-proxy-agent": {
3774
+ "version": "2.2.1",
3775
+ "bundled": true,
3776
+ "dev": true,
3777
+ "requires": {
3778
+ "agent-base": "^4.1.0",
3779
+ "debug": "^3.1.0"
3780
+ }
3781
+ },
3782
+ "humanize-ms": {
3783
+ "version": "1.2.1",
3784
+ "bundled": true,
3785
+ "dev": true,
3786
+ "requires": {
3787
+ "ms": "^2.0.0"
3788
+ }
3789
+ },
3790
+ "iconv-lite": {
3791
+ "version": "0.4.23",
3792
+ "bundled": true,
3793
+ "dev": true,
3794
+ "requires": {
3795
+ "safer-buffer": ">= 2.1.2 < 3"
3796
+ }
3797
+ },
3798
+ "iferr": {
3799
+ "version": "1.0.2",
3800
+ "bundled": true,
3801
+ "dev": true
3802
+ },
3803
+ "ignore-walk": {
3804
+ "version": "3.0.1",
3805
+ "bundled": true,
3806
+ "dev": true,
3807
+ "requires": {
3808
+ "minimatch": "^3.0.4"
3809
+ }
3810
+ },
3811
+ "import-lazy": {
3812
+ "version": "2.1.0",
3813
+ "bundled": true,
3814
+ "dev": true
3815
+ },
3816
+ "imurmurhash": {
3817
+ "version": "0.1.4",
3818
+ "bundled": true,
3819
+ "dev": true
3820
+ },
3821
+ "inflight": {
3822
+ "version": "1.0.6",
3823
+ "bundled": true,
3824
+ "dev": true,
3825
+ "requires": {
3826
+ "once": "^1.3.0",
3827
+ "wrappy": "1"
3828
+ }
3829
+ },
3830
+ "inherits": {
3831
+ "version": "2.0.3",
3832
+ "bundled": true,
3833
+ "dev": true
3834
+ },
3835
+ "ini": {
3836
+ "version": "1.3.5",
3837
+ "bundled": true,
3838
+ "dev": true
3839
+ },
3840
+ "init-package-json": {
3841
+ "version": "1.10.3",
3842
+ "bundled": true,
3843
+ "dev": true,
3844
+ "requires": {
3845
+ "glob": "^7.1.1",
3846
+ "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0",
3847
+ "promzard": "^0.3.0",
3848
+ "read": "~1.0.1",
3849
+ "read-package-json": "1 || 2",
3850
+ "semver": "2.x || 3.x || 4 || 5",
3851
+ "validate-npm-package-license": "^3.0.1",
3852
+ "validate-npm-package-name": "^3.0.0"
3853
+ }
3854
+ },
3855
+ "invert-kv": {
3856
+ "version": "1.0.0",
3857
+ "bundled": true,
3858
+ "dev": true
3859
+ },
3860
+ "ip": {
3861
+ "version": "1.1.5",
3862
+ "bundled": true,
3863
+ "dev": true
3864
+ },
3865
+ "ip-regex": {
3866
+ "version": "2.1.0",
3867
+ "bundled": true,
3868
+ "dev": true
3869
+ },
3870
+ "is-builtin-module": {
3871
+ "version": "1.0.0",
3872
+ "bundled": true,
3873
+ "dev": true,
3874
+ "requires": {
3875
+ "builtin-modules": "^1.0.0"
3876
+ }
3877
+ },
3878
+ "is-ci": {
3879
+ "version": "1.1.0",
3880
+ "bundled": true,
3881
+ "dev": true,
3882
+ "requires": {
3883
+ "ci-info": "^1.0.0"
3884
+ }
3885
+ },
3886
+ "is-cidr": {
3887
+ "version": "2.0.6",
3888
+ "bundled": true,
3889
+ "dev": true,
3890
+ "requires": {
3891
+ "cidr-regex": "^2.0.8"
3892
+ }
3893
+ },
3894
+ "is-fullwidth-code-point": {
3895
+ "version": "1.0.0",
3896
+ "bundled": true,
3897
+ "dev": true,
3898
+ "requires": {
3899
+ "number-is-nan": "^1.0.0"
3900
+ }
3901
+ },
3902
+ "is-installed-globally": {
3903
+ "version": "0.1.0",
3904
+ "bundled": true,
3905
+ "dev": true,
3906
+ "requires": {
3907
+ "global-dirs": "^0.1.0",
3908
+ "is-path-inside": "^1.0.0"
3909
+ }
3910
+ },
3911
+ "is-npm": {
3912
+ "version": "1.0.0",
3913
+ "bundled": true,
3914
+ "dev": true
3915
+ },
3916
+ "is-obj": {
3917
+ "version": "1.0.1",
3918
+ "bundled": true,
3919
+ "dev": true
3920
+ },
3921
+ "is-path-inside": {
3922
+ "version": "1.0.1",
3923
+ "bundled": true,
3924
+ "dev": true,
3925
+ "requires": {
3926
+ "path-is-inside": "^1.0.1"
3927
+ }
3928
+ },
3929
+ "is-redirect": {
3930
+ "version": "1.0.0",
3931
+ "bundled": true,
3932
+ "dev": true
3933
+ },
3934
+ "is-retry-allowed": {
3935
+ "version": "1.1.0",
3936
+ "bundled": true,
3937
+ "dev": true
3938
+ },
3939
+ "is-stream": {
3940
+ "version": "1.1.0",
3941
+ "bundled": true,
3942
+ "dev": true
3943
+ },
3944
+ "is-typedarray": {
3945
+ "version": "1.0.0",
3946
+ "bundled": true,
3947
+ "dev": true
3948
+ },
3949
+ "isarray": {
3950
+ "version": "1.0.0",
3951
+ "bundled": true,
3952
+ "dev": true
3953
+ },
3954
+ "isexe": {
3955
+ "version": "2.0.0",
3956
+ "bundled": true,
3957
+ "dev": true
3958
+ },
3959
+ "isstream": {
3960
+ "version": "0.1.2",
3961
+ "bundled": true,
3962
+ "dev": true
3963
+ },
3964
+ "jsbn": {
3965
+ "version": "0.1.1",
3966
+ "bundled": true,
3967
+ "dev": true,
3968
+ "optional": true
3969
+ },
3970
+ "json-parse-better-errors": {
3971
+ "version": "1.0.2",
3972
+ "bundled": true,
3973
+ "dev": true
3974
+ },
3975
+ "json-schema": {
3976
+ "version": "0.2.3",
3977
+ "bundled": true,
3978
+ "dev": true
3979
+ },
3980
+ "json-schema-traverse": {
3981
+ "version": "0.3.1",
3982
+ "bundled": true,
3983
+ "dev": true
3984
+ },
3985
+ "json-stringify-safe": {
3986
+ "version": "5.0.1",
3987
+ "bundled": true,
3988
+ "dev": true
3989
+ },
3990
+ "jsonparse": {
3991
+ "version": "1.3.1",
3992
+ "bundled": true,
3993
+ "dev": true
3994
+ },
3995
+ "jsprim": {
3996
+ "version": "1.4.1",
3997
+ "bundled": true,
3998
+ "dev": true,
3999
+ "requires": {
4000
+ "assert-plus": "1.0.0",
4001
+ "extsprintf": "1.3.0",
4002
+ "json-schema": "0.2.3",
4003
+ "verror": "1.10.0"
4004
+ }
4005
+ },
4006
+ "latest-version": {
4007
+ "version": "3.1.0",
4008
+ "bundled": true,
4009
+ "dev": true,
4010
+ "requires": {
4011
+ "package-json": "^4.0.0"
4012
+ }
4013
+ },
4014
+ "lazy-property": {
4015
+ "version": "1.0.0",
4016
+ "bundled": true,
4017
+ "dev": true
4018
+ },
4019
+ "lcid": {
4020
+ "version": "1.0.0",
4021
+ "bundled": true,
4022
+ "dev": true,
4023
+ "requires": {
4024
+ "invert-kv": "^1.0.0"
4025
+ }
4026
+ },
4027
+ "libcipm": {
4028
+ "version": "2.0.2",
4029
+ "bundled": true,
4030
+ "dev": true,
4031
+ "requires": {
4032
+ "bin-links": "^1.1.2",
4033
+ "bluebird": "^3.5.1",
4034
+ "find-npm-prefix": "^1.0.2",
4035
+ "graceful-fs": "^4.1.11",
4036
+ "lock-verify": "^2.0.2",
4037
+ "mkdirp": "^0.5.1",
4038
+ "npm-lifecycle": "^2.0.3",
4039
+ "npm-logical-tree": "^1.2.1",
4040
+ "npm-package-arg": "^6.1.0",
4041
+ "pacote": "^8.1.6",
4042
+ "protoduck": "^5.0.0",
4043
+ "read-package-json": "^2.0.13",
4044
+ "rimraf": "^2.6.2",
4045
+ "worker-farm": "^1.6.0"
4046
+ }
4047
+ },
4048
+ "libnpmhook": {
4049
+ "version": "4.0.1",
4050
+ "bundled": true,
4051
+ "dev": true,
4052
+ "requires": {
4053
+ "figgy-pudding": "^3.1.0",
4054
+ "npm-registry-fetch": "^3.0.0"
4055
+ },
4056
+ "dependencies": {
4057
+ "npm-registry-fetch": {
4058
+ "version": "3.1.1",
4059
+ "bundled": true,
4060
+ "dev": true,
4061
+ "requires": {
4062
+ "bluebird": "^3.5.1",
4063
+ "figgy-pudding": "^3.1.0",
4064
+ "lru-cache": "^4.1.2",
4065
+ "make-fetch-happen": "^4.0.0",
4066
+ "npm-package-arg": "^6.0.0"
4067
+ }
4068
+ }
4069
+ }
4070
+ },
4071
+ "libnpx": {
4072
+ "version": "10.2.0",
4073
+ "bundled": true,
4074
+ "dev": true,
4075
+ "requires": {
4076
+ "dotenv": "^5.0.1",
4077
+ "npm-package-arg": "^6.0.0",
4078
+ "rimraf": "^2.6.2",
4079
+ "safe-buffer": "^5.1.0",
4080
+ "update-notifier": "^2.3.0",
4081
+ "which": "^1.3.0",
4082
+ "y18n": "^4.0.0",
4083
+ "yargs": "^11.0.0"
4084
+ }
4085
+ },
4086
+ "locate-path": {
4087
+ "version": "2.0.0",
4088
+ "bundled": true,
4089
+ "dev": true,
4090
+ "requires": {
4091
+ "p-locate": "^2.0.0",
4092
+ "path-exists": "^3.0.0"
4093
+ }
4094
+ },
4095
+ "lock-verify": {
4096
+ "version": "2.0.2",
4097
+ "bundled": true,
4098
+ "dev": true,
4099
+ "requires": {
4100
+ "npm-package-arg": "^5.1.2 || 6",
4101
+ "semver": "^5.4.1"
4102
+ }
4103
+ },
4104
+ "lockfile": {
4105
+ "version": "1.0.4",
4106
+ "bundled": true,
4107
+ "dev": true,
4108
+ "requires": {
4109
+ "signal-exit": "^3.0.2"
4110
+ }
4111
+ },
4112
+ "lodash._baseindexof": {
4113
+ "version": "3.1.0",
4114
+ "bundled": true,
4115
+ "dev": true
4116
+ },
4117
+ "lodash._baseuniq": {
4118
+ "version": "4.6.0",
4119
+ "bundled": true,
4120
+ "dev": true,
4121
+ "requires": {
4122
+ "lodash._createset": "~4.0.0",
4123
+ "lodash._root": "~3.0.0"
4124
+ }
4125
+ },
4126
+ "lodash._bindcallback": {
4127
+ "version": "3.0.1",
4128
+ "bundled": true,
4129
+ "dev": true
4130
+ },
4131
+ "lodash._cacheindexof": {
4132
+ "version": "3.0.2",
4133
+ "bundled": true,
4134
+ "dev": true
4135
+ },
4136
+ "lodash._createcache": {
4137
+ "version": "3.1.2",
4138
+ "bundled": true,
4139
+ "dev": true,
4140
+ "requires": {
4141
+ "lodash._getnative": "^3.0.0"
4142
+ }
4143
+ },
4144
+ "lodash._createset": {
4145
+ "version": "4.0.3",
4146
+ "bundled": true,
4147
+ "dev": true
4148
+ },
4149
+ "lodash._getnative": {
4150
+ "version": "3.9.1",
4151
+ "bundled": true,
4152
+ "dev": true
4153
+ },
4154
+ "lodash._root": {
4155
+ "version": "3.0.1",
4156
+ "bundled": true,
4157
+ "dev": true
4158
+ },
4159
+ "lodash.clonedeep": {
4160
+ "version": "4.5.0",
4161
+ "bundled": true,
4162
+ "dev": true
4163
+ },
4164
+ "lodash.restparam": {
4165
+ "version": "3.6.1",
4166
+ "bundled": true,
4167
+ "dev": true
4168
+ },
4169
+ "lodash.union": {
4170
+ "version": "4.6.0",
4171
+ "bundled": true,
4172
+ "dev": true
4173
+ },
4174
+ "lodash.uniq": {
4175
+ "version": "4.5.0",
4176
+ "bundled": true,
4177
+ "dev": true
4178
+ },
4179
+ "lodash.without": {
4180
+ "version": "4.4.0",
4181
+ "bundled": true,
4182
+ "dev": true
4183
+ },
4184
+ "lowercase-keys": {
4185
+ "version": "1.0.1",
4186
+ "bundled": true,
4187
+ "dev": true
4188
+ },
4189
+ "lru-cache": {
4190
+ "version": "4.1.3",
4191
+ "bundled": true,
4192
+ "dev": true,
4193
+ "requires": {
4194
+ "pseudomap": "^1.0.2",
4195
+ "yallist": "^2.1.2"
4196
+ }
4197
+ },
4198
+ "make-dir": {
4199
+ "version": "1.3.0",
4200
+ "bundled": true,
4201
+ "dev": true,
4202
+ "requires": {
4203
+ "pify": "^3.0.0"
4204
+ }
4205
+ },
4206
+ "make-fetch-happen": {
4207
+ "version": "4.0.1",
4208
+ "bundled": true,
4209
+ "dev": true,
4210
+ "requires": {
4211
+ "agentkeepalive": "^3.4.1",
4212
+ "cacache": "^11.0.1",
4213
+ "http-cache-semantics": "^3.8.1",
4214
+ "http-proxy-agent": "^2.1.0",
4215
+ "https-proxy-agent": "^2.2.1",
4216
+ "lru-cache": "^4.1.2",
4217
+ "mississippi": "^3.0.0",
4218
+ "node-fetch-npm": "^2.0.2",
4219
+ "promise-retry": "^1.1.1",
4220
+ "socks-proxy-agent": "^4.0.0",
4221
+ "ssri": "^6.0.0"
4222
+ }
4223
+ },
4224
+ "meant": {
4225
+ "version": "1.0.1",
4226
+ "bundled": true,
4227
+ "dev": true
4228
+ },
4229
+ "mem": {
4230
+ "version": "1.1.0",
4231
+ "bundled": true,
4232
+ "dev": true,
4233
+ "requires": {
4234
+ "mimic-fn": "^1.0.0"
4235
+ }
4236
+ },
4237
+ "mime-db": {
4238
+ "version": "1.35.0",
4239
+ "bundled": true,
4240
+ "dev": true
4241
+ },
4242
+ "mime-types": {
4243
+ "version": "2.1.19",
4244
+ "bundled": true,
4245
+ "dev": true,
4246
+ "requires": {
4247
+ "mime-db": "~1.35.0"
4248
+ }
4249
+ },
4250
+ "mimic-fn": {
4251
+ "version": "1.2.0",
4252
+ "bundled": true,
4253
+ "dev": true
4254
+ },
4255
+ "minimatch": {
4256
+ "version": "3.0.4",
4257
+ "bundled": true,
4258
+ "dev": true,
4259
+ "requires": {
4260
+ "brace-expansion": "^1.1.7"
4261
+ }
4262
+ },
4263
+ "minimist": {
4264
+ "version": "0.0.8",
4265
+ "bundled": true,
4266
+ "dev": true
4267
+ },
4268
+ "minipass": {
4269
+ "version": "2.3.3",
4270
+ "bundled": true,
4271
+ "dev": true,
4272
+ "requires": {
4273
+ "safe-buffer": "^5.1.2",
4274
+ "yallist": "^3.0.0"
4275
+ },
4276
+ "dependencies": {
4277
+ "yallist": {
4278
+ "version": "3.0.2",
4279
+ "bundled": true,
4280
+ "dev": true
4281
+ }
4282
+ }
4283
+ },
4284
+ "minizlib": {
4285
+ "version": "1.1.1",
4286
+ "bundled": true,
4287
+ "dev": true,
4288
+ "requires": {
4289
+ "minipass": "^2.2.1"
4290
+ }
4291
+ },
4292
+ "mississippi": {
4293
+ "version": "3.0.0",
4294
+ "bundled": true,
4295
+ "dev": true,
4296
+ "requires": {
4297
+ "concat-stream": "^1.5.0",
4298
+ "duplexify": "^3.4.2",
4299
+ "end-of-stream": "^1.1.0",
4300
+ "flush-write-stream": "^1.0.0",
4301
+ "from2": "^2.1.0",
4302
+ "parallel-transform": "^1.1.0",
4303
+ "pump": "^3.0.0",
4304
+ "pumpify": "^1.3.3",
4305
+ "stream-each": "^1.1.0",
4306
+ "through2": "^2.0.0"
4307
+ }
4308
+ },
4309
+ "mkdirp": {
4310
+ "version": "0.5.1",
4311
+ "bundled": true,
4312
+ "dev": true,
4313
+ "requires": {
4314
+ "minimist": "0.0.8"
4315
+ }
4316
+ },
4317
+ "move-concurrently": {
4318
+ "version": "1.0.1",
4319
+ "bundled": true,
4320
+ "dev": true,
4321
+ "requires": {
4322
+ "aproba": "^1.1.1",
4323
+ "copy-concurrently": "^1.0.0",
4324
+ "fs-write-stream-atomic": "^1.0.8",
4325
+ "mkdirp": "^0.5.1",
4326
+ "rimraf": "^2.5.4",
4327
+ "run-queue": "^1.0.3"
4328
+ }
4329
+ },
4330
+ "ms": {
4331
+ "version": "2.1.1",
4332
+ "bundled": true,
4333
+ "dev": true
4334
+ },
4335
+ "mute-stream": {
4336
+ "version": "0.0.7",
4337
+ "bundled": true,
4338
+ "dev": true
4339
+ },
4340
+ "node-fetch-npm": {
4341
+ "version": "2.0.2",
4342
+ "bundled": true,
4343
+ "dev": true,
4344
+ "requires": {
4345
+ "encoding": "^0.1.11",
4346
+ "json-parse-better-errors": "^1.0.0",
4347
+ "safe-buffer": "^5.1.1"
4348
+ }
4349
+ },
4350
+ "node-gyp": {
4351
+ "version": "3.8.0",
4352
+ "bundled": true,
4353
+ "dev": true,
4354
+ "requires": {
4355
+ "fstream": "^1.0.0",
4356
+ "glob": "^7.0.3",
4357
+ "graceful-fs": "^4.1.2",
4358
+ "mkdirp": "^0.5.0",
4359
+ "nopt": "2 || 3",
4360
+ "npmlog": "0 || 1 || 2 || 3 || 4",
4361
+ "osenv": "0",
4362
+ "request": "^2.87.0",
4363
+ "rimraf": "2",
4364
+ "semver": "~5.3.0",
4365
+ "tar": "^2.0.0",
4366
+ "which": "1"
4367
+ },
4368
+ "dependencies": {
4369
+ "nopt": {
4370
+ "version": "3.0.6",
4371
+ "bundled": true,
4372
+ "dev": true,
4373
+ "requires": {
4374
+ "abbrev": "1"
4375
+ }
4376
+ },
4377
+ "semver": {
4378
+ "version": "5.3.0",
4379
+ "bundled": true,
4380
+ "dev": true
4381
+ },
4382
+ "tar": {
4383
+ "version": "2.2.1",
4384
+ "bundled": true,
4385
+ "dev": true,
4386
+ "requires": {
4387
+ "block-stream": "*",
4388
+ "fstream": "^1.0.2",
4389
+ "inherits": "2"
4390
+ }
4391
+ }
4392
+ }
4393
+ },
4394
+ "nopt": {
4395
+ "version": "4.0.1",
4396
+ "bundled": true,
4397
+ "dev": true,
4398
+ "requires": {
4399
+ "abbrev": "1",
4400
+ "osenv": "^0.1.4"
4401
+ }
4402
+ },
4403
+ "normalize-package-data": {
4404
+ "version": "2.4.0",
4405
+ "bundled": true,
4406
+ "dev": true,
4407
+ "requires": {
4408
+ "hosted-git-info": "^2.1.4",
4409
+ "is-builtin-module": "^1.0.0",
4410
+ "semver": "2 || 3 || 4 || 5",
4411
+ "validate-npm-package-license": "^3.0.1"
4412
+ }
4413
+ },
4414
+ "npm-audit-report": {
4415
+ "version": "1.3.1",
4416
+ "bundled": true,
4417
+ "dev": true,
4418
+ "requires": {
4419
+ "cli-table3": "^0.5.0",
4420
+ "console-control-strings": "^1.1.0"
4421
+ }
4422
+ },
4423
+ "npm-bundled": {
4424
+ "version": "1.0.5",
4425
+ "bundled": true,
4426
+ "dev": true
4427
+ },
4428
+ "npm-cache-filename": {
4429
+ "version": "1.0.2",
4430
+ "bundled": true,
4431
+ "dev": true
4432
+ },
4433
+ "npm-install-checks": {
4434
+ "version": "3.0.0",
4435
+ "bundled": true,
4436
+ "dev": true,
4437
+ "requires": {
4438
+ "semver": "^2.3.0 || 3.x || 4 || 5"
4439
+ }
4440
+ },
4441
+ "npm-lifecycle": {
4442
+ "version": "2.1.0",
4443
+ "bundled": true,
4444
+ "dev": true,
4445
+ "requires": {
4446
+ "byline": "^5.0.0",
4447
+ "graceful-fs": "^4.1.11",
4448
+ "node-gyp": "^3.8.0",
4449
+ "resolve-from": "^4.0.0",
4450
+ "slide": "^1.1.6",
4451
+ "uid-number": "0.0.6",
4452
+ "umask": "^1.1.0",
4453
+ "which": "^1.3.1"
4454
+ }
4455
+ },
4456
+ "npm-logical-tree": {
4457
+ "version": "1.2.1",
4458
+ "bundled": true,
4459
+ "dev": true
4460
+ },
4461
+ "npm-package-arg": {
4462
+ "version": "6.1.0",
4463
+ "bundled": true,
4464
+ "dev": true,
4465
+ "requires": {
4466
+ "hosted-git-info": "^2.6.0",
4467
+ "osenv": "^0.1.5",
4468
+ "semver": "^5.5.0",
4469
+ "validate-npm-package-name": "^3.0.0"
4470
+ }
4471
+ },
4472
+ "npm-packlist": {
4473
+ "version": "1.1.12",
4474
+ "bundled": true,
4475
+ "dev": true,
4476
+ "requires": {
4477
+ "ignore-walk": "^3.0.1",
4478
+ "npm-bundled": "^1.0.1"
4479
+ }
4480
+ },
4481
+ "npm-pick-manifest": {
4482
+ "version": "2.1.0",
4483
+ "bundled": true,
4484
+ "dev": true,
4485
+ "requires": {
4486
+ "npm-package-arg": "^6.0.0",
4487
+ "semver": "^5.4.1"
4488
+ }
4489
+ },
4490
+ "npm-profile": {
4491
+ "version": "3.0.2",
4492
+ "bundled": true,
4493
+ "dev": true,
4494
+ "requires": {
4495
+ "aproba": "^1.1.2 || 2",
4496
+ "make-fetch-happen": "^2.5.0 || 3 || 4"
4497
+ }
4498
+ },
4499
+ "npm-registry-client": {
4500
+ "version": "8.6.0",
4501
+ "bundled": true,
4502
+ "dev": true,
4503
+ "requires": {
4504
+ "concat-stream": "^1.5.2",
4505
+ "graceful-fs": "^4.1.6",
4506
+ "normalize-package-data": "~1.0.1 || ^2.0.0",
4507
+ "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0",
4508
+ "npmlog": "2 || ^3.1.0 || ^4.0.0",
4509
+ "once": "^1.3.3",
4510
+ "request": "^2.74.0",
4511
+ "retry": "^0.10.0",
4512
+ "safe-buffer": "^5.1.1",
4513
+ "semver": "2 >=2.2.1 || 3.x || 4 || 5",
4514
+ "slide": "^1.1.3",
4515
+ "ssri": "^5.2.4"
4516
+ },
4517
+ "dependencies": {
4518
+ "retry": {
4519
+ "version": "0.10.1",
4520
+ "bundled": true,
4521
+ "dev": true
4522
+ },
4523
+ "ssri": {
4524
+ "version": "5.3.0",
4525
+ "bundled": true,
4526
+ "dev": true,
4527
+ "requires": {
4528
+ "safe-buffer": "^5.1.1"
4529
+ }
4530
+ }
4531
+ }
4532
+ },
4533
+ "npm-registry-fetch": {
4534
+ "version": "1.1.0",
4535
+ "bundled": true,
4536
+ "dev": true,
4537
+ "requires": {
4538
+ "bluebird": "^3.5.1",
4539
+ "figgy-pudding": "^2.0.1",
4540
+ "lru-cache": "^4.1.2",
4541
+ "make-fetch-happen": "^3.0.0",
4542
+ "npm-package-arg": "^6.0.0",
4543
+ "safe-buffer": "^5.1.1"
4544
+ },
4545
+ "dependencies": {
4546
+ "cacache": {
4547
+ "version": "10.0.4",
4548
+ "bundled": true,
4549
+ "dev": true,
4550
+ "requires": {
4551
+ "bluebird": "^3.5.1",
4552
+ "chownr": "^1.0.1",
4553
+ "glob": "^7.1.2",
4554
+ "graceful-fs": "^4.1.11",
4555
+ "lru-cache": "^4.1.1",
4556
+ "mississippi": "^2.0.0",
4557
+ "mkdirp": "^0.5.1",
4558
+ "move-concurrently": "^1.0.1",
4559
+ "promise-inflight": "^1.0.1",
4560
+ "rimraf": "^2.6.2",
4561
+ "ssri": "^5.2.4",
4562
+ "unique-filename": "^1.1.0",
4563
+ "y18n": "^4.0.0"
4564
+ },
4565
+ "dependencies": {
4566
+ "mississippi": {
4567
+ "version": "2.0.0",
4568
+ "bundled": true,
4569
+ "dev": true,
4570
+ "requires": {
4571
+ "concat-stream": "^1.5.0",
4572
+ "duplexify": "^3.4.2",
4573
+ "end-of-stream": "^1.1.0",
4574
+ "flush-write-stream": "^1.0.0",
4575
+ "from2": "^2.1.0",
4576
+ "parallel-transform": "^1.1.0",
4577
+ "pump": "^2.0.1",
4578
+ "pumpify": "^1.3.3",
4579
+ "stream-each": "^1.1.0",
4580
+ "through2": "^2.0.0"
4581
+ }
4582
+ }
4583
+ }
4584
+ },
4585
+ "figgy-pudding": {
4586
+ "version": "2.0.1",
4587
+ "bundled": true,
4588
+ "dev": true
4589
+ },
4590
+ "make-fetch-happen": {
4591
+ "version": "3.0.0",
4592
+ "bundled": true,
4593
+ "dev": true,
4594
+ "requires": {
4595
+ "agentkeepalive": "^3.4.1",
4596
+ "cacache": "^10.0.4",
4597
+ "http-cache-semantics": "^3.8.1",
4598
+ "http-proxy-agent": "^2.1.0",
4599
+ "https-proxy-agent": "^2.2.0",
4600
+ "lru-cache": "^4.1.2",
4601
+ "mississippi": "^3.0.0",
4602
+ "node-fetch-npm": "^2.0.2",
4603
+ "promise-retry": "^1.1.1",
4604
+ "socks-proxy-agent": "^3.0.1",
4605
+ "ssri": "^5.2.4"
4606
+ }
4607
+ },
4608
+ "pump": {
4609
+ "version": "2.0.1",
4610
+ "bundled": true,
4611
+ "dev": true,
4612
+ "requires": {
4613
+ "end-of-stream": "^1.1.0",
4614
+ "once": "^1.3.1"
4615
+ }
4616
+ },
4617
+ "smart-buffer": {
4618
+ "version": "1.1.15",
4619
+ "bundled": true,
4620
+ "dev": true
4621
+ },
4622
+ "socks": {
4623
+ "version": "1.1.10",
4624
+ "bundled": true,
4625
+ "dev": true,
4626
+ "requires": {
4627
+ "ip": "^1.1.4",
4628
+ "smart-buffer": "^1.0.13"
4629
+ }
4630
+ },
4631
+ "socks-proxy-agent": {
4632
+ "version": "3.0.1",
4633
+ "bundled": true,
4634
+ "dev": true,
4635
+ "requires": {
4636
+ "agent-base": "^4.1.0",
4637
+ "socks": "^1.1.10"
4638
+ }
4639
+ },
4640
+ "ssri": {
4641
+ "version": "5.3.0",
4642
+ "bundled": true,
4643
+ "dev": true,
4644
+ "requires": {
4645
+ "safe-buffer": "^5.1.1"
4646
+ }
4647
+ }
4648
+ }
4649
+ },
4650
+ "npm-run-path": {
4651
+ "version": "2.0.2",
4652
+ "bundled": true,
4653
+ "dev": true,
4654
+ "requires": {
4655
+ "path-key": "^2.0.0"
4656
+ }
4657
+ },
4658
+ "npm-user-validate": {
4659
+ "version": "1.0.0",
4660
+ "bundled": true,
4661
+ "dev": true
4662
+ },
4663
+ "npmlog": {
4664
+ "version": "4.1.2",
4665
+ "bundled": true,
4666
+ "dev": true,
4667
+ "requires": {
4668
+ "are-we-there-yet": "~1.1.2",
4669
+ "console-control-strings": "~1.1.0",
4670
+ "gauge": "~2.7.3",
4671
+ "set-blocking": "~2.0.0"
4672
+ }
4673
+ },
4674
+ "number-is-nan": {
4675
+ "version": "1.0.1",
4676
+ "bundled": true,
4677
+ "dev": true
4678
+ },
4679
+ "oauth-sign": {
4680
+ "version": "0.9.0",
4681
+ "bundled": true,
4682
+ "dev": true
4683
+ },
4684
+ "object-assign": {
4685
+ "version": "4.1.1",
4686
+ "bundled": true,
4687
+ "dev": true
4688
+ },
4689
+ "once": {
4690
+ "version": "1.4.0",
4691
+ "bundled": true,
4692
+ "dev": true,
4693
+ "requires": {
4694
+ "wrappy": "1"
4695
+ }
4696
+ },
4697
+ "opener": {
4698
+ "version": "1.5.1",
4699
+ "bundled": true,
4700
+ "dev": true
4701
+ },
4702
+ "os-homedir": {
4703
+ "version": "1.0.2",
4704
+ "bundled": true,
4705
+ "dev": true
4706
+ },
4707
+ "os-locale": {
4708
+ "version": "2.1.0",
4709
+ "bundled": true,
4710
+ "dev": true,
4711
+ "requires": {
4712
+ "execa": "^0.7.0",
4713
+ "lcid": "^1.0.0",
4714
+ "mem": "^1.1.0"
4715
+ }
4716
+ },
4717
+ "os-tmpdir": {
4718
+ "version": "1.0.2",
4719
+ "bundled": true,
4720
+ "dev": true
4721
+ },
4722
+ "osenv": {
4723
+ "version": "0.1.5",
4724
+ "bundled": true,
4725
+ "dev": true,
4726
+ "requires": {
4727
+ "os-homedir": "^1.0.0",
4728
+ "os-tmpdir": "^1.0.0"
4729
+ }
4730
+ },
4731
+ "p-finally": {
4732
+ "version": "1.0.0",
4733
+ "bundled": true,
4734
+ "dev": true
4735
+ },
4736
+ "p-limit": {
4737
+ "version": "1.2.0",
4738
+ "bundled": true,
4739
+ "dev": true,
4740
+ "requires": {
4741
+ "p-try": "^1.0.0"
4742
+ }
4743
+ },
4744
+ "p-locate": {
4745
+ "version": "2.0.0",
4746
+ "bundled": true,
4747
+ "dev": true,
4748
+ "requires": {
4749
+ "p-limit": "^1.1.0"
4750
+ }
4751
+ },
4752
+ "p-try": {
4753
+ "version": "1.0.0",
4754
+ "bundled": true,
4755
+ "dev": true
4756
+ },
4757
+ "package-json": {
4758
+ "version": "4.0.1",
4759
+ "bundled": true,
4760
+ "dev": true,
4761
+ "requires": {
4762
+ "got": "^6.7.1",
4763
+ "registry-auth-token": "^3.0.1",
4764
+ "registry-url": "^3.0.3",
4765
+ "semver": "^5.1.0"
4766
+ }
4767
+ },
4768
+ "pacote": {
4769
+ "version": "8.1.6",
4770
+ "bundled": true,
4771
+ "dev": true,
4772
+ "requires": {
4773
+ "bluebird": "^3.5.1",
4774
+ "cacache": "^11.0.2",
4775
+ "get-stream": "^3.0.0",
4776
+ "glob": "^7.1.2",
4777
+ "lru-cache": "^4.1.3",
4778
+ "make-fetch-happen": "^4.0.1",
4779
+ "minimatch": "^3.0.4",
4780
+ "minipass": "^2.3.3",
4781
+ "mississippi": "^3.0.0",
4782
+ "mkdirp": "^0.5.1",
4783
+ "normalize-package-data": "^2.4.0",
4784
+ "npm-package-arg": "^6.1.0",
4785
+ "npm-packlist": "^1.1.10",
4786
+ "npm-pick-manifest": "^2.1.0",
4787
+ "osenv": "^0.1.5",
4788
+ "promise-inflight": "^1.0.1",
4789
+ "promise-retry": "^1.1.1",
4790
+ "protoduck": "^5.0.0",
4791
+ "rimraf": "^2.6.2",
4792
+ "safe-buffer": "^5.1.2",
4793
+ "semver": "^5.5.0",
4794
+ "ssri": "^6.0.0",
4795
+ "tar": "^4.4.3",
4796
+ "unique-filename": "^1.1.0",
4797
+ "which": "^1.3.0"
4798
+ }
4799
+ },
4800
+ "parallel-transform": {
4801
+ "version": "1.1.0",
4802
+ "bundled": true,
4803
+ "dev": true,
4804
+ "requires": {
4805
+ "cyclist": "~0.2.2",
4806
+ "inherits": "^2.0.3",
4807
+ "readable-stream": "^2.1.5"
4808
+ }
4809
+ },
4810
+ "path-exists": {
4811
+ "version": "3.0.0",
4812
+ "bundled": true,
4813
+ "dev": true
4814
+ },
4815
+ "path-is-absolute": {
4816
+ "version": "1.0.1",
4817
+ "bundled": true,
4818
+ "dev": true
4819
+ },
4820
+ "path-is-inside": {
4821
+ "version": "1.0.2",
4822
+ "bundled": true,
4823
+ "dev": true
4824
+ },
4825
+ "path-key": {
4826
+ "version": "2.0.1",
4827
+ "bundled": true,
4828
+ "dev": true
4829
+ },
4830
+ "performance-now": {
4831
+ "version": "2.1.0",
4832
+ "bundled": true,
4833
+ "dev": true
4834
+ },
4835
+ "pify": {
4836
+ "version": "3.0.0",
4837
+ "bundled": true,
4838
+ "dev": true
4839
+ },
4840
+ "prepend-http": {
4841
+ "version": "1.0.4",
4842
+ "bundled": true,
4843
+ "dev": true
4844
+ },
4845
+ "process-nextick-args": {
4846
+ "version": "2.0.0",
4847
+ "bundled": true,
4848
+ "dev": true
4849
+ },
4850
+ "promise-inflight": {
4851
+ "version": "1.0.1",
4852
+ "bundled": true,
4853
+ "dev": true
4854
+ },
4855
+ "promise-retry": {
4856
+ "version": "1.1.1",
4857
+ "bundled": true,
4858
+ "dev": true,
4859
+ "requires": {
4860
+ "err-code": "^1.0.0",
4861
+ "retry": "^0.10.0"
4862
+ },
4863
+ "dependencies": {
4864
+ "retry": {
4865
+ "version": "0.10.1",
4866
+ "bundled": true,
4867
+ "dev": true
4868
+ }
4869
+ }
4870
+ },
4871
+ "promzard": {
4872
+ "version": "0.3.0",
4873
+ "bundled": true,
4874
+ "dev": true,
4875
+ "requires": {
4876
+ "read": "1"
4877
+ }
4878
+ },
4879
+ "proto-list": {
4880
+ "version": "1.2.4",
4881
+ "bundled": true,
4882
+ "dev": true
4883
+ },
4884
+ "protoduck": {
4885
+ "version": "5.0.0",
4886
+ "bundled": true,
4887
+ "dev": true,
4888
+ "requires": {
4889
+ "genfun": "^4.0.1"
4890
+ }
4891
+ },
4892
+ "prr": {
4893
+ "version": "1.0.1",
4894
+ "bundled": true,
4895
+ "dev": true
4896
+ },
4897
+ "pseudomap": {
4898
+ "version": "1.0.2",
4899
+ "bundled": true,
4900
+ "dev": true
4901
+ },
4902
+ "psl": {
4903
+ "version": "1.1.29",
4904
+ "bundled": true,
4905
+ "dev": true
4906
+ },
4907
+ "pump": {
4908
+ "version": "3.0.0",
4909
+ "bundled": true,
4910
+ "dev": true,
4911
+ "requires": {
4912
+ "end-of-stream": "^1.1.0",
4913
+ "once": "^1.3.1"
4914
+ }
4915
+ },
4916
+ "pumpify": {
4917
+ "version": "1.5.1",
4918
+ "bundled": true,
4919
+ "dev": true,
4920
+ "requires": {
4921
+ "duplexify": "^3.6.0",
4922
+ "inherits": "^2.0.3",
4923
+ "pump": "^2.0.0"
4924
+ },
4925
+ "dependencies": {
4926
+ "pump": {
4927
+ "version": "2.0.1",
4928
+ "bundled": true,
4929
+ "dev": true,
4930
+ "requires": {
4931
+ "end-of-stream": "^1.1.0",
4932
+ "once": "^1.3.1"
4933
+ }
4934
+ }
4935
+ }
4936
+ },
4937
+ "punycode": {
4938
+ "version": "1.4.1",
4939
+ "bundled": true,
4940
+ "dev": true
4941
+ },
4942
+ "qrcode-terminal": {
4943
+ "version": "0.12.0",
4944
+ "bundled": true,
4945
+ "dev": true
4946
+ },
4947
+ "qs": {
4948
+ "version": "6.5.2",
4949
+ "bundled": true,
4950
+ "dev": true
4951
+ },
4952
+ "query-string": {
4953
+ "version": "6.1.0",
4954
+ "bundled": true,
4955
+ "dev": true,
4956
+ "requires": {
4957
+ "decode-uri-component": "^0.2.0",
4958
+ "strict-uri-encode": "^2.0.0"
4959
+ }
4960
+ },
4961
+ "qw": {
4962
+ "version": "1.0.1",
4963
+ "bundled": true,
4964
+ "dev": true
4965
+ },
4966
+ "rc": {
4967
+ "version": "1.2.7",
4968
+ "bundled": true,
4969
+ "dev": true,
4970
+ "requires": {
4971
+ "deep-extend": "^0.5.1",
4972
+ "ini": "~1.3.0",
4973
+ "minimist": "^1.2.0",
4974
+ "strip-json-comments": "~2.0.1"
4975
+ },
4976
+ "dependencies": {
4977
+ "minimist": {
4978
+ "version": "1.2.0",
4979
+ "bundled": true,
4980
+ "dev": true
4981
+ }
4982
+ }
4983
+ },
4984
+ "read": {
4985
+ "version": "1.0.7",
4986
+ "bundled": true,
4987
+ "dev": true,
4988
+ "requires": {
4989
+ "mute-stream": "~0.0.4"
4990
+ }
4991
+ },
4992
+ "read-cmd-shim": {
4993
+ "version": "1.0.1",
4994
+ "bundled": true,
4995
+ "dev": true,
4996
+ "requires": {
4997
+ "graceful-fs": "^4.1.2"
4998
+ }
4999
+ },
5000
+ "read-installed": {
5001
+ "version": "4.0.3",
5002
+ "bundled": true,
5003
+ "dev": true,
5004
+ "requires": {
5005
+ "debuglog": "^1.0.1",
5006
+ "graceful-fs": "^4.1.2",
5007
+ "read-package-json": "^2.0.0",
5008
+ "readdir-scoped-modules": "^1.0.0",
5009
+ "semver": "2 || 3 || 4 || 5",
5010
+ "slide": "~1.1.3",
5011
+ "util-extend": "^1.0.1"
5012
+ }
5013
+ },
5014
+ "read-package-json": {
5015
+ "version": "2.0.13",
5016
+ "bundled": true,
5017
+ "dev": true,
5018
+ "requires": {
5019
+ "glob": "^7.1.1",
5020
+ "graceful-fs": "^4.1.2",
5021
+ "json-parse-better-errors": "^1.0.1",
5022
+ "normalize-package-data": "^2.0.0",
5023
+ "slash": "^1.0.0"
5024
+ }
5025
+ },
5026
+ "read-package-tree": {
5027
+ "version": "5.2.1",
5028
+ "bundled": true,
5029
+ "dev": true,
5030
+ "requires": {
5031
+ "debuglog": "^1.0.1",
5032
+ "dezalgo": "^1.0.0",
5033
+ "once": "^1.3.0",
5034
+ "read-package-json": "^2.0.0",
5035
+ "readdir-scoped-modules": "^1.0.0"
5036
+ }
5037
+ },
5038
+ "readable-stream": {
5039
+ "version": "2.3.6",
5040
+ "bundled": true,
5041
+ "dev": true,
5042
+ "requires": {
5043
+ "core-util-is": "~1.0.0",
5044
+ "inherits": "~2.0.3",
5045
+ "isarray": "~1.0.0",
5046
+ "process-nextick-args": "~2.0.0",
5047
+ "safe-buffer": "~5.1.1",
5048
+ "string_decoder": "~1.1.1",
5049
+ "util-deprecate": "~1.0.1"
5050
+ }
5051
+ },
5052
+ "readdir-scoped-modules": {
5053
+ "version": "1.0.2",
5054
+ "bundled": true,
5055
+ "dev": true,
5056
+ "requires": {
5057
+ "debuglog": "^1.0.1",
5058
+ "dezalgo": "^1.0.0",
5059
+ "graceful-fs": "^4.1.2",
5060
+ "once": "^1.3.0"
5061
+ }
5062
+ },
5063
+ "registry-auth-token": {
5064
+ "version": "3.3.2",
5065
+ "bundled": true,
5066
+ "dev": true,
5067
+ "requires": {
5068
+ "rc": "^1.1.6",
5069
+ "safe-buffer": "^5.0.1"
5070
+ }
5071
+ },
5072
+ "registry-url": {
5073
+ "version": "3.1.0",
5074
+ "bundled": true,
5075
+ "dev": true,
5076
+ "requires": {
5077
+ "rc": "^1.0.1"
5078
+ }
5079
+ },
5080
+ "request": {
5081
+ "version": "2.88.0",
5082
+ "bundled": true,
5083
+ "dev": true,
5084
+ "requires": {
5085
+ "aws-sign2": "~0.7.0",
5086
+ "aws4": "^1.8.0",
5087
+ "caseless": "~0.12.0",
5088
+ "combined-stream": "~1.0.6",
5089
+ "extend": "~3.0.2",
5090
+ "forever-agent": "~0.6.1",
5091
+ "form-data": "~2.3.2",
5092
+ "har-validator": "~5.1.0",
5093
+ "http-signature": "~1.2.0",
5094
+ "is-typedarray": "~1.0.0",
5095
+ "isstream": "~0.1.2",
5096
+ "json-stringify-safe": "~5.0.1",
5097
+ "mime-types": "~2.1.19",
5098
+ "oauth-sign": "~0.9.0",
5099
+ "performance-now": "^2.1.0",
5100
+ "qs": "~6.5.2",
5101
+ "safe-buffer": "^5.1.2",
5102
+ "tough-cookie": "~2.4.3",
5103
+ "tunnel-agent": "^0.6.0",
5104
+ "uuid": "^3.3.2"
5105
+ }
5106
+ },
5107
+ "require-directory": {
5108
+ "version": "2.1.1",
5109
+ "bundled": true,
5110
+ "dev": true
5111
+ },
5112
+ "require-main-filename": {
5113
+ "version": "1.0.1",
5114
+ "bundled": true,
5115
+ "dev": true
5116
+ },
5117
+ "resolve-from": {
5118
+ "version": "4.0.0",
5119
+ "bundled": true,
5120
+ "dev": true
5121
+ },
5122
+ "retry": {
5123
+ "version": "0.12.0",
5124
+ "bundled": true,
5125
+ "dev": true
5126
+ },
5127
+ "rimraf": {
5128
+ "version": "2.6.2",
5129
+ "bundled": true,
5130
+ "dev": true,
5131
+ "requires": {
5132
+ "glob": "^7.0.5"
5133
+ }
5134
+ },
5135
+ "run-queue": {
5136
+ "version": "1.0.3",
5137
+ "bundled": true,
5138
+ "dev": true,
5139
+ "requires": {
5140
+ "aproba": "^1.1.1"
5141
+ }
5142
+ },
5143
+ "safe-buffer": {
5144
+ "version": "5.1.2",
5145
+ "bundled": true,
5146
+ "dev": true
5147
+ },
5148
+ "safer-buffer": {
5149
+ "version": "2.1.2",
5150
+ "bundled": true,
5151
+ "dev": true
5152
+ },
5153
+ "semver": {
5154
+ "version": "5.5.1",
5155
+ "bundled": true,
5156
+ "dev": true
5157
+ },
5158
+ "semver-diff": {
5159
+ "version": "2.1.0",
5160
+ "bundled": true,
5161
+ "dev": true,
5162
+ "requires": {
5163
+ "semver": "^5.0.3"
5164
+ }
5165
+ },
5166
+ "set-blocking": {
5167
+ "version": "2.0.0",
5168
+ "bundled": true,
5169
+ "dev": true
5170
+ },
5171
+ "sha": {
5172
+ "version": "2.0.1",
5173
+ "bundled": true,
5174
+ "dev": true,
5175
+ "requires": {
5176
+ "graceful-fs": "^4.1.2",
5177
+ "readable-stream": "^2.0.2"
5178
+ }
5179
+ },
5180
+ "shebang-command": {
5181
+ "version": "1.2.0",
5182
+ "bundled": true,
5183
+ "dev": true,
5184
+ "requires": {
5185
+ "shebang-regex": "^1.0.0"
5186
+ }
5187
+ },
5188
+ "shebang-regex": {
5189
+ "version": "1.0.0",
5190
+ "bundled": true,
5191
+ "dev": true
5192
+ },
5193
+ "signal-exit": {
5194
+ "version": "3.0.2",
5195
+ "bundled": true,
5196
+ "dev": true
5197
+ },
5198
+ "slash": {
5199
+ "version": "1.0.0",
5200
+ "bundled": true,
5201
+ "dev": true
5202
+ },
5203
+ "slide": {
5204
+ "version": "1.1.6",
5205
+ "bundled": true,
5206
+ "dev": true
5207
+ },
5208
+ "smart-buffer": {
5209
+ "version": "4.0.1",
5210
+ "bundled": true,
5211
+ "dev": true
5212
+ },
5213
+ "socks": {
5214
+ "version": "2.2.0",
5215
+ "bundled": true,
5216
+ "dev": true,
5217
+ "requires": {
5218
+ "ip": "^1.1.5",
5219
+ "smart-buffer": "^4.0.1"
5220
+ }
5221
+ },
5222
+ "socks-proxy-agent": {
5223
+ "version": "4.0.1",
5224
+ "bundled": true,
5225
+ "dev": true,
5226
+ "requires": {
5227
+ "agent-base": "~4.2.0",
5228
+ "socks": "~2.2.0"
5229
+ }
5230
+ },
5231
+ "sorted-object": {
5232
+ "version": "2.0.1",
5233
+ "bundled": true,
5234
+ "dev": true
5235
+ },
5236
+ "sorted-union-stream": {
5237
+ "version": "2.1.3",
5238
+ "bundled": true,
5239
+ "dev": true,
5240
+ "requires": {
5241
+ "from2": "^1.3.0",
5242
+ "stream-iterate": "^1.1.0"
5243
+ },
5244
+ "dependencies": {
5245
+ "from2": {
5246
+ "version": "1.3.0",
5247
+ "bundled": true,
5248
+ "dev": true,
5249
+ "requires": {
5250
+ "inherits": "~2.0.1",
5251
+ "readable-stream": "~1.1.10"
5252
+ }
5253
+ },
5254
+ "isarray": {
5255
+ "version": "0.0.1",
5256
+ "bundled": true,
5257
+ "dev": true
5258
+ },
5259
+ "readable-stream": {
5260
+ "version": "1.1.14",
5261
+ "bundled": true,
5262
+ "dev": true,
5263
+ "requires": {
5264
+ "core-util-is": "~1.0.0",
5265
+ "inherits": "~2.0.1",
5266
+ "isarray": "0.0.1",
5267
+ "string_decoder": "~0.10.x"
5268
+ }
5269
+ },
5270
+ "string_decoder": {
5271
+ "version": "0.10.31",
5272
+ "bundled": true,
5273
+ "dev": true
5274
+ }
5275
+ }
5276
+ },
5277
+ "spdx-correct": {
5278
+ "version": "3.0.0",
5279
+ "bundled": true,
5280
+ "dev": true,
5281
+ "requires": {
5282
+ "spdx-expression-parse": "^3.0.0",
5283
+ "spdx-license-ids": "^3.0.0"
5284
+ }
5285
+ },
5286
+ "spdx-exceptions": {
5287
+ "version": "2.1.0",
5288
+ "bundled": true,
5289
+ "dev": true
5290
+ },
5291
+ "spdx-expression-parse": {
5292
+ "version": "3.0.0",
5293
+ "bundled": true,
5294
+ "dev": true,
5295
+ "requires": {
5296
+ "spdx-exceptions": "^2.1.0",
5297
+ "spdx-license-ids": "^3.0.0"
5298
+ }
5299
+ },
5300
+ "spdx-license-ids": {
5301
+ "version": "3.0.0",
5302
+ "bundled": true,
5303
+ "dev": true
5304
+ },
5305
+ "sshpk": {
5306
+ "version": "1.14.2",
5307
+ "bundled": true,
5308
+ "dev": true,
5309
+ "requires": {
5310
+ "asn1": "~0.2.3",
5311
+ "assert-plus": "^1.0.0",
5312
+ "bcrypt-pbkdf": "^1.0.0",
5313
+ "dashdash": "^1.12.0",
5314
+ "ecc-jsbn": "~0.1.1",
5315
+ "getpass": "^0.1.1",
5316
+ "jsbn": "~0.1.0",
5317
+ "safer-buffer": "^2.0.2",
5318
+ "tweetnacl": "~0.14.0"
5319
+ }
5320
+ },
5321
+ "ssri": {
5322
+ "version": "6.0.1",
5323
+ "bundled": true,
5324
+ "dev": true,
5325
+ "requires": {
5326
+ "figgy-pudding": "^3.5.1"
5327
+ }
5328
+ },
5329
+ "stream-each": {
5330
+ "version": "1.2.2",
5331
+ "bundled": true,
5332
+ "dev": true,
5333
+ "requires": {
5334
+ "end-of-stream": "^1.1.0",
5335
+ "stream-shift": "^1.0.0"
5336
+ }
5337
+ },
5338
+ "stream-iterate": {
5339
+ "version": "1.2.0",
5340
+ "bundled": true,
5341
+ "dev": true,
5342
+ "requires": {
5343
+ "readable-stream": "^2.1.5",
5344
+ "stream-shift": "^1.0.0"
5345
+ }
5346
+ },
5347
+ "stream-shift": {
5348
+ "version": "1.0.0",
5349
+ "bundled": true,
5350
+ "dev": true
5351
+ },
5352
+ "strict-uri-encode": {
5353
+ "version": "2.0.0",
5354
+ "bundled": true,
5355
+ "dev": true
5356
+ },
5357
+ "string-width": {
5358
+ "version": "2.1.1",
5359
+ "bundled": true,
5360
+ "dev": true,
5361
+ "requires": {
5362
+ "is-fullwidth-code-point": "^2.0.0",
5363
+ "strip-ansi": "^4.0.0"
5364
+ },
5365
+ "dependencies": {
5366
+ "ansi-regex": {
5367
+ "version": "3.0.0",
5368
+ "bundled": true,
5369
+ "dev": true
5370
+ },
5371
+ "is-fullwidth-code-point": {
5372
+ "version": "2.0.0",
5373
+ "bundled": true,
5374
+ "dev": true
5375
+ },
5376
+ "strip-ansi": {
5377
+ "version": "4.0.0",
5378
+ "bundled": true,
5379
+ "dev": true,
5380
+ "requires": {
5381
+ "ansi-regex": "^3.0.0"
5382
+ }
5383
+ }
5384
+ }
5385
+ },
5386
+ "string_decoder": {
5387
+ "version": "1.1.1",
5388
+ "bundled": true,
5389
+ "dev": true,
5390
+ "requires": {
5391
+ "safe-buffer": "~5.1.0"
5392
+ }
5393
+ },
5394
+ "stringify-package": {
5395
+ "version": "1.0.0",
5396
+ "bundled": true,
5397
+ "dev": true
5398
+ },
5399
+ "strip-ansi": {
5400
+ "version": "3.0.1",
5401
+ "bundled": true,
5402
+ "dev": true,
5403
+ "requires": {
5404
+ "ansi-regex": "^2.0.0"
5405
+ }
5406
+ },
5407
+ "strip-eof": {
5408
+ "version": "1.0.0",
5409
+ "bundled": true,
5410
+ "dev": true
5411
+ },
5412
+ "strip-json-comments": {
5413
+ "version": "2.0.1",
5414
+ "bundled": true,
5415
+ "dev": true
5416
+ },
5417
+ "supports-color": {
5418
+ "version": "5.4.0",
5419
+ "bundled": true,
5420
+ "dev": true,
5421
+ "requires": {
5422
+ "has-flag": "^3.0.0"
5423
+ }
5424
+ },
5425
+ "tar": {
5426
+ "version": "4.4.8",
5427
+ "bundled": true,
5428
+ "dev": true,
5429
+ "requires": {
5430
+ "chownr": "^1.1.1",
5431
+ "fs-minipass": "^1.2.5",
5432
+ "minipass": "^2.3.4",
5433
+ "minizlib": "^1.1.1",
5434
+ "mkdirp": "^0.5.0",
5435
+ "safe-buffer": "^5.1.2",
5436
+ "yallist": "^3.0.2"
5437
+ },
5438
+ "dependencies": {
5439
+ "chownr": {
5440
+ "version": "1.1.1",
5441
+ "bundled": true,
5442
+ "dev": true
5443
+ },
5444
+ "minipass": {
5445
+ "version": "2.3.5",
5446
+ "bundled": true,
5447
+ "dev": true,
5448
+ "requires": {
5449
+ "safe-buffer": "^5.1.2",
5450
+ "yallist": "^3.0.0"
5451
+ }
5452
+ },
5453
+ "yallist": {
5454
+ "version": "3.0.3",
5455
+ "bundled": true,
5456
+ "dev": true
5457
+ }
5458
+ }
5459
+ },
5460
+ "term-size": {
5461
+ "version": "1.2.0",
5462
+ "bundled": true,
5463
+ "dev": true,
5464
+ "requires": {
5465
+ "execa": "^0.7.0"
5466
+ }
5467
+ },
5468
+ "text-table": {
5469
+ "version": "0.2.0",
5470
+ "bundled": true,
5471
+ "dev": true
5472
+ },
5473
+ "through": {
5474
+ "version": "2.3.8",
5475
+ "bundled": true,
5476
+ "dev": true
5477
+ },
5478
+ "through2": {
5479
+ "version": "2.0.3",
5480
+ "bundled": true,
5481
+ "dev": true,
5482
+ "requires": {
5483
+ "readable-stream": "^2.1.5",
5484
+ "xtend": "~4.0.1"
5485
+ }
5486
+ },
5487
+ "timed-out": {
5488
+ "version": "4.0.1",
5489
+ "bundled": true,
5490
+ "dev": true
5491
+ },
5492
+ "tiny-relative-date": {
5493
+ "version": "1.3.0",
5494
+ "bundled": true,
5495
+ "dev": true
5496
+ },
5497
+ "tough-cookie": {
5498
+ "version": "2.4.3",
5499
+ "bundled": true,
5500
+ "dev": true,
5501
+ "requires": {
5502
+ "psl": "^1.1.24",
5503
+ "punycode": "^1.4.1"
5504
+ }
5505
+ },
5506
+ "tunnel-agent": {
5507
+ "version": "0.6.0",
5508
+ "bundled": true,
5509
+ "dev": true,
5510
+ "requires": {
5511
+ "safe-buffer": "^5.0.1"
5512
+ }
5513
+ },
5514
+ "tweetnacl": {
5515
+ "version": "0.14.5",
5516
+ "bundled": true,
5517
+ "dev": true,
5518
+ "optional": true
5519
+ },
5520
+ "typedarray": {
5521
+ "version": "0.0.6",
5522
+ "bundled": true,
5523
+ "dev": true
5524
+ },
5525
+ "uid-number": {
5526
+ "version": "0.0.6",
5527
+ "bundled": true,
5528
+ "dev": true
5529
+ },
5530
+ "umask": {
5531
+ "version": "1.1.0",
5532
+ "bundled": true,
5533
+ "dev": true
5534
+ },
5535
+ "unique-filename": {
5536
+ "version": "1.1.0",
5537
+ "bundled": true,
5538
+ "dev": true,
5539
+ "requires": {
5540
+ "unique-slug": "^2.0.0"
5541
+ }
5542
+ },
5543
+ "unique-slug": {
5544
+ "version": "2.0.0",
5545
+ "bundled": true,
5546
+ "dev": true,
5547
+ "requires": {
5548
+ "imurmurhash": "^0.1.4"
5549
+ }
5550
+ },
5551
+ "unique-string": {
5552
+ "version": "1.0.0",
5553
+ "bundled": true,
5554
+ "dev": true,
5555
+ "requires": {
5556
+ "crypto-random-string": "^1.0.0"
5557
+ }
5558
+ },
5559
+ "unpipe": {
5560
+ "version": "1.0.0",
5561
+ "bundled": true,
5562
+ "dev": true
5563
+ },
5564
+ "unzip-response": {
5565
+ "version": "2.0.1",
5566
+ "bundled": true,
5567
+ "dev": true
5568
+ },
5569
+ "update-notifier": {
5570
+ "version": "2.5.0",
5571
+ "bundled": true,
5572
+ "dev": true,
5573
+ "requires": {
5574
+ "boxen": "^1.2.1",
5575
+ "chalk": "^2.0.1",
5576
+ "configstore": "^3.0.0",
5577
+ "import-lazy": "^2.1.0",
5578
+ "is-ci": "^1.0.10",
5579
+ "is-installed-globally": "^0.1.0",
5580
+ "is-npm": "^1.0.0",
5581
+ "latest-version": "^3.0.0",
5582
+ "semver-diff": "^2.0.0",
5583
+ "xdg-basedir": "^3.0.0"
5584
+ }
5585
+ },
5586
+ "url-parse-lax": {
5587
+ "version": "1.0.0",
5588
+ "bundled": true,
5589
+ "dev": true,
5590
+ "requires": {
5591
+ "prepend-http": "^1.0.1"
5592
+ }
5593
+ },
5594
+ "util-deprecate": {
5595
+ "version": "1.0.2",
5596
+ "bundled": true,
5597
+ "dev": true
5598
+ },
5599
+ "util-extend": {
5600
+ "version": "1.0.3",
5601
+ "bundled": true,
5602
+ "dev": true
5603
+ },
5604
+ "uuid": {
5605
+ "version": "3.3.2",
5606
+ "bundled": true,
5607
+ "dev": true
5608
+ },
5609
+ "validate-npm-package-license": {
5610
+ "version": "3.0.4",
5611
+ "bundled": true,
5612
+ "dev": true,
5613
+ "requires": {
5614
+ "spdx-correct": "^3.0.0",
5615
+ "spdx-expression-parse": "^3.0.0"
5616
+ }
5617
+ },
5618
+ "validate-npm-package-name": {
5619
+ "version": "3.0.0",
5620
+ "bundled": true,
5621
+ "dev": true,
5622
+ "requires": {
5623
+ "builtins": "^1.0.3"
5624
+ }
5625
+ },
5626
+ "verror": {
5627
+ "version": "1.10.0",
5628
+ "bundled": true,
5629
+ "dev": true,
5630
+ "requires": {
5631
+ "assert-plus": "^1.0.0",
5632
+ "core-util-is": "1.0.2",
5633
+ "extsprintf": "^1.2.0"
5634
+ }
5635
+ },
5636
+ "wcwidth": {
5637
+ "version": "1.0.1",
5638
+ "bundled": true,
5639
+ "dev": true,
5640
+ "requires": {
5641
+ "defaults": "^1.0.3"
5642
+ }
5643
+ },
5644
+ "which": {
5645
+ "version": "1.3.1",
5646
+ "bundled": true,
5647
+ "dev": true,
5648
+ "requires": {
5649
+ "isexe": "^2.0.0"
5650
+ }
5651
+ },
5652
+ "which-module": {
5653
+ "version": "2.0.0",
5654
+ "bundled": true,
5655
+ "dev": true
5656
+ },
5657
+ "wide-align": {
5658
+ "version": "1.1.2",
5659
+ "bundled": true,
5660
+ "dev": true,
5661
+ "requires": {
5662
+ "string-width": "^1.0.2"
5663
+ },
5664
+ "dependencies": {
5665
+ "string-width": {
5666
+ "version": "1.0.2",
5667
+ "bundled": true,
5668
+ "dev": true,
5669
+ "requires": {
5670
+ "code-point-at": "^1.0.0",
5671
+ "is-fullwidth-code-point": "^1.0.0",
5672
+ "strip-ansi": "^3.0.0"
5673
+ }
5674
+ }
5675
+ }
5676
+ },
5677
+ "widest-line": {
5678
+ "version": "2.0.0",
5679
+ "bundled": true,
5680
+ "dev": true,
5681
+ "requires": {
5682
+ "string-width": "^2.1.1"
5683
+ }
5684
+ },
5685
+ "worker-farm": {
5686
+ "version": "1.6.0",
5687
+ "bundled": true,
5688
+ "dev": true,
5689
+ "requires": {
5690
+ "errno": "~0.1.7"
5691
+ }
5692
+ },
5693
+ "wrap-ansi": {
5694
+ "version": "2.1.0",
5695
+ "bundled": true,
5696
+ "dev": true,
5697
+ "requires": {
5698
+ "string-width": "^1.0.1",
5699
+ "strip-ansi": "^3.0.1"
5700
+ },
5701
+ "dependencies": {
5702
+ "string-width": {
5703
+ "version": "1.0.2",
5704
+ "bundled": true,
5705
+ "dev": true,
5706
+ "requires": {
5707
+ "code-point-at": "^1.0.0",
5708
+ "is-fullwidth-code-point": "^1.0.0",
5709
+ "strip-ansi": "^3.0.0"
5710
+ }
5711
+ }
5712
+ }
5713
+ },
5714
+ "wrappy": {
5715
+ "version": "1.0.2",
5716
+ "bundled": true,
5717
+ "dev": true
5718
+ },
5719
+ "write-file-atomic": {
5720
+ "version": "2.3.0",
5721
+ "bundled": true,
5722
+ "dev": true,
5723
+ "requires": {
5724
+ "graceful-fs": "^4.1.11",
5725
+ "imurmurhash": "^0.1.4",
5726
+ "signal-exit": "^3.0.2"
5727
+ }
5728
+ },
5729
+ "xdg-basedir": {
5730
+ "version": "3.0.0",
5731
+ "bundled": true,
5732
+ "dev": true
5733
+ },
5734
+ "xtend": {
5735
+ "version": "4.0.1",
5736
+ "bundled": true,
5737
+ "dev": true
5738
+ },
5739
+ "y18n": {
5740
+ "version": "4.0.0",
5741
+ "bundled": true,
5742
+ "dev": true
5743
+ },
5744
+ "yallist": {
5745
+ "version": "2.1.2",
5746
+ "bundled": true,
5747
+ "dev": true
5748
+ },
5749
+ "yargs": {
5750
+ "version": "11.0.0",
5751
+ "bundled": true,
5752
+ "dev": true,
5753
+ "requires": {
5754
+ "cliui": "^4.0.0",
5755
+ "decamelize": "^1.1.1",
5756
+ "find-up": "^2.1.0",
5757
+ "get-caller-file": "^1.0.1",
5758
+ "os-locale": "^2.0.0",
5759
+ "require-directory": "^2.1.1",
5760
+ "require-main-filename": "^1.0.1",
5761
+ "set-blocking": "^2.0.0",
5762
+ "string-width": "^2.0.0",
5763
+ "which-module": "^2.0.0",
5764
+ "y18n": "^3.2.1",
5765
+ "yargs-parser": "^9.0.2"
5766
+ },
5767
+ "dependencies": {
5768
+ "y18n": {
5769
+ "version": "3.2.1",
5770
+ "bundled": true,
5771
+ "dev": true
5772
+ }
5773
+ }
5774
+ },
5775
+ "yargs-parser": {
5776
+ "version": "9.0.2",
5777
+ "bundled": true,
5778
+ "dev": true,
5779
+ "requires": {
5780
+ "camelcase": "^4.1.0"
5781
+ }
5782
+ }
5783
+ }
5784
+ },
5785
+ "npm-run-path": {
5786
+ "version": "2.0.2",
5787
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
5788
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
5789
+ "dev": true,
5790
+ "requires": {
5791
+ "path-key": "^2.0.0"
5792
+ }
5793
+ },
5794
+ "number-is-nan": {
5795
+ "version": "1.0.1",
5796
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
5797
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
5798
+ "dev": true
5799
+ },
5800
+ "object-assign": {
5801
+ "version": "4.1.1",
5802
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
5803
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
5804
+ "dev": true
5805
+ },
5806
+ "object-copy": {
5807
+ "version": "0.1.0",
5808
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
5809
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
5810
+ "dev": true,
5811
+ "requires": {
5812
+ "copy-descriptor": "^0.1.0",
5813
+ "define-property": "^0.2.5",
5814
+ "kind-of": "^3.0.3"
5815
+ },
5816
+ "dependencies": {
5817
+ "define-property": {
5818
+ "version": "0.2.5",
5819
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
5820
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
5821
+ "dev": true,
5822
+ "requires": {
5823
+ "is-descriptor": "^0.1.0"
5824
+ }
5825
+ },
5826
+ "kind-of": {
5827
+ "version": "3.2.2",
5828
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5829
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5830
+ "dev": true,
5831
+ "requires": {
5832
+ "is-buffer": "^1.1.5"
5833
+ }
5834
+ }
5835
+ }
5836
+ },
5837
+ "object-visit": {
5838
+ "version": "1.0.1",
5839
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
5840
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
5841
+ "dev": true,
5842
+ "requires": {
5843
+ "isobject": "^3.0.0"
5844
+ }
5845
+ },
5846
+ "object.pick": {
5847
+ "version": "1.3.0",
5848
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
5849
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
5850
+ "dev": true,
5851
+ "requires": {
5852
+ "isobject": "^3.0.1"
5853
+ }
5854
+ },
5855
+ "octokit-pagination-methods": {
5856
+ "version": "1.1.0",
5857
+ "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz",
5858
+ "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==",
5859
+ "dev": true
5860
+ },
5861
+ "once": {
5862
+ "version": "1.4.0",
5863
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
5864
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
5865
+ "dev": true,
5866
+ "requires": {
5867
+ "wrappy": "1"
5868
+ }
5869
+ },
5870
+ "optimist": {
5871
+ "version": "0.6.1",
5872
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
5873
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
5874
+ "dev": true,
5875
+ "requires": {
5876
+ "minimist": "~0.0.1",
5877
+ "wordwrap": "~0.0.2"
5878
+ },
5879
+ "dependencies": {
5880
+ "minimist": {
5881
+ "version": "0.0.10",
5882
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
5883
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
5884
+ "dev": true
5885
+ }
5886
+ }
5887
+ },
5888
+ "os-locale": {
5889
+ "version": "3.0.1",
5890
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz",
5891
+ "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==",
5892
+ "dev": true,
5893
+ "requires": {
5894
+ "execa": "^0.10.0",
5895
+ "lcid": "^2.0.0",
5896
+ "mem": "^4.0.0"
5897
+ },
5898
+ "dependencies": {
5899
+ "execa": {
5900
+ "version": "0.10.0",
5901
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
5902
+ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
5903
+ "dev": true,
5904
+ "requires": {
5905
+ "cross-spawn": "^6.0.0",
5906
+ "get-stream": "^3.0.0",
5907
+ "is-stream": "^1.1.0",
5908
+ "npm-run-path": "^2.0.0",
5909
+ "p-finally": "^1.0.0",
5910
+ "signal-exit": "^3.0.0",
5911
+ "strip-eof": "^1.0.0"
5912
+ }
5913
+ },
5914
+ "get-stream": {
5915
+ "version": "3.0.0",
5916
+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
5917
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
5918
+ "dev": true
5919
+ }
5920
+ }
5921
+ },
5922
+ "os-name": {
5923
+ "version": "3.0.0",
5924
+ "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.0.0.tgz",
5925
+ "integrity": "sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g==",
5926
+ "dev": true,
5927
+ "requires": {
5928
+ "macos-release": "^2.0.0",
5929
+ "windows-release": "^3.1.0"
5930
+ }
5931
+ },
5932
+ "p-defer": {
5933
+ "version": "1.0.0",
5934
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
5935
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
5936
+ "dev": true
5937
+ },
5938
+ "p-filter": {
5939
+ "version": "1.0.0",
5940
+ "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-1.0.0.tgz",
5941
+ "integrity": "sha1-Yp0xcVAgnI/VCLoTdxPvS7kg6ds=",
5942
+ "dev": true,
5943
+ "requires": {
5944
+ "p-map": "^1.0.0"
5945
+ }
5946
+ },
5947
+ "p-finally": {
5948
+ "version": "1.0.0",
5949
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
5950
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
5951
+ "dev": true
5952
+ },
5953
+ "p-is-promise": {
5954
+ "version": "2.0.0",
5955
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz",
5956
+ "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==",
5957
+ "dev": true
5958
+ },
5959
+ "p-limit": {
5960
+ "version": "1.3.0",
5961
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
5962
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
5963
+ "dev": true,
5964
+ "requires": {
5965
+ "p-try": "^1.0.0"
5966
+ }
5967
+ },
5968
+ "p-locate": {
5969
+ "version": "3.0.0",
5970
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
5971
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
5972
+ "dev": true,
5973
+ "requires": {
5974
+ "p-limit": "^2.0.0"
5975
+ },
5976
+ "dependencies": {
5977
+ "p-limit": {
5978
+ "version": "2.0.0",
5979
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz",
5980
+ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==",
5981
+ "dev": true,
5982
+ "requires": {
5983
+ "p-try": "^2.0.0"
5984
+ }
5985
+ },
5986
+ "p-try": {
5987
+ "version": "2.0.0",
5988
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz",
5989
+ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==",
5990
+ "dev": true
5991
+ }
5992
+ }
5993
+ },
5994
+ "p-map": {
5995
+ "version": "1.2.0",
5996
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
5997
+ "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
5998
+ "dev": true
5999
+ },
6000
+ "p-reduce": {
6001
+ "version": "1.0.0",
6002
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
6003
+ "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
6004
+ "dev": true
6005
+ },
6006
+ "p-retry": {
6007
+ "version": "3.0.0",
6008
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.0.tgz",
6009
+ "integrity": "sha512-fAB7bebxaj8nylNAsxPNkwPZ/48bXFdFnWrz0v2sV+H5BsGfVL7Ap7KgONqy7rOK4ZI1I+SU+lmettO3hM+2HQ==",
6010
+ "dev": true,
6011
+ "requires": {
6012
+ "retry": "^0.12.0"
6013
+ }
6014
+ },
6015
+ "p-try": {
6016
+ "version": "1.0.0",
6017
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
6018
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
6019
+ "dev": true
6020
+ },
6021
+ "parse-github-url": {
6022
+ "version": "1.0.2",
6023
+ "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz",
6024
+ "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==",
6025
+ "dev": true
6026
+ },
6027
+ "parse-json": {
6028
+ "version": "4.0.0",
6029
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
6030
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
6031
+ "dev": true,
6032
+ "requires": {
6033
+ "error-ex": "^1.3.1",
6034
+ "json-parse-better-errors": "^1.0.1"
6035
+ }
6036
+ },
6037
+ "pascalcase": {
6038
+ "version": "0.1.1",
6039
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
6040
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
6041
+ "dev": true
6042
+ },
6043
+ "path-dirname": {
6044
+ "version": "1.0.2",
6045
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
6046
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
6047
+ "dev": true
6048
+ },
6049
+ "path-exists": {
6050
+ "version": "2.1.0",
6051
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
6052
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
6053
+ "dev": true,
6054
+ "requires": {
6055
+ "pinkie-promise": "^2.0.0"
6056
+ }
6057
+ },
6058
+ "path-is-absolute": {
6059
+ "version": "1.0.1",
6060
+ "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
6061
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
6062
+ "dev": true
6063
+ },
6064
+ "path-key": {
6065
+ "version": "2.0.1",
6066
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
6067
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
6068
+ "dev": true
6069
+ },
6070
+ "path-type": {
6071
+ "version": "3.0.0",
6072
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
6073
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
6074
+ "dev": true,
6075
+ "requires": {
6076
+ "pify": "^3.0.0"
6077
+ }
6078
+ },
6079
+ "pify": {
6080
+ "version": "3.0.0",
6081
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
6082
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
6083
+ "dev": true
6084
+ },
6085
+ "pinkie": {
6086
+ "version": "2.0.4",
6087
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
6088
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
6089
+ "dev": true
6090
+ },
6091
+ "pinkie-promise": {
6092
+ "version": "2.0.1",
6093
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
6094
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
6095
+ "dev": true,
6096
+ "requires": {
6097
+ "pinkie": "^2.0.0"
6098
+ }
6099
+ },
6100
+ "pkg-conf": {
6101
+ "version": "2.1.0",
6102
+ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
6103
+ "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=",
6104
+ "dev": true,
6105
+ "requires": {
6106
+ "find-up": "^2.0.0",
6107
+ "load-json-file": "^4.0.0"
6108
+ },
6109
+ "dependencies": {
6110
+ "find-up": {
6111
+ "version": "2.1.0",
6112
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
6113
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
6114
+ "dev": true,
6115
+ "requires": {
6116
+ "locate-path": "^2.0.0"
6117
+ }
6118
+ },
6119
+ "load-json-file": {
6120
+ "version": "4.0.0",
6121
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
6122
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
6123
+ "dev": true,
6124
+ "requires": {
6125
+ "graceful-fs": "^4.1.2",
6126
+ "parse-json": "^4.0.0",
6127
+ "pify": "^3.0.0",
6128
+ "strip-bom": "^3.0.0"
6129
+ }
6130
+ },
6131
+ "strip-bom": {
6132
+ "version": "3.0.0",
6133
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
6134
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
6135
+ "dev": true
6136
+ }
6137
+ }
6138
+ },
6139
+ "posix-character-classes": {
6140
+ "version": "0.1.1",
6141
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
6142
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
6143
+ "dev": true
6144
+ },
6145
+ "process-nextick-args": {
6146
+ "version": "2.0.0",
6147
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
6148
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
6149
+ "dev": true
6150
+ },
6151
+ "pump": {
6152
+ "version": "3.0.0",
6153
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
6154
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
6155
+ "dev": true,
6156
+ "requires": {
6157
+ "end-of-stream": "^1.1.0",
6158
+ "once": "^1.3.1"
6159
+ }
6160
+ },
6161
+ "q": {
6162
+ "version": "1.5.1",
6163
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
6164
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
6165
+ "dev": true
6166
+ },
6167
+ "quick-lru": {
6168
+ "version": "1.1.0",
6169
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
6170
+ "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
6171
+ "dev": true
6172
+ },
6173
+ "rc": {
6174
+ "version": "1.2.8",
6175
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
6176
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
6177
+ "dev": true,
6178
+ "requires": {
6179
+ "deep-extend": "^0.6.0",
6180
+ "ini": "~1.3.0",
6181
+ "minimist": "^1.2.0",
6182
+ "strip-json-comments": "~2.0.1"
6183
+ }
6184
+ },
6185
+ "read-pkg": {
6186
+ "version": "1.1.0",
6187
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
6188
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
6189
+ "dev": true,
6190
+ "requires": {
6191
+ "load-json-file": "^1.0.0",
6192
+ "normalize-package-data": "^2.3.2",
6193
+ "path-type": "^1.0.0"
6194
+ },
6195
+ "dependencies": {
6196
+ "path-type": {
6197
+ "version": "1.1.0",
6198
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
6199
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
6200
+ "dev": true,
6201
+ "requires": {
6202
+ "graceful-fs": "^4.1.2",
6203
+ "pify": "^2.0.0",
6204
+ "pinkie-promise": "^2.0.0"
6205
+ }
6206
+ },
6207
+ "pify": {
6208
+ "version": "2.3.0",
6209
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
6210
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
6211
+ "dev": true
6212
+ }
6213
+ }
6214
+ },
6215
+ "read-pkg-up": {
6216
+ "version": "1.0.1",
6217
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
6218
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
6219
+ "dev": true,
6220
+ "requires": {
6221
+ "find-up": "^1.0.0",
6222
+ "read-pkg": "^1.0.0"
6223
+ }
6224
+ },
6225
+ "readable-stream": {
6226
+ "version": "2.3.6",
6227
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
6228
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
6229
+ "dev": true,
6230
+ "requires": {
6231
+ "core-util-is": "~1.0.0",
6232
+ "inherits": "~2.0.3",
6233
+ "isarray": "~1.0.0",
6234
+ "process-nextick-args": "~2.0.0",
6235
+ "safe-buffer": "~5.1.1",
6236
+ "string_decoder": "~1.1.1",
6237
+ "util-deprecate": "~1.0.1"
6238
+ }
6239
+ },
6240
+ "redent": {
6241
+ "version": "1.0.0",
6242
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
6243
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
6244
+ "dev": true,
6245
+ "requires": {
6246
+ "indent-string": "^2.1.0",
6247
+ "strip-indent": "^1.0.1"
6248
+ },
6249
+ "dependencies": {
6250
+ "indent-string": {
6251
+ "version": "2.1.0",
6252
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
6253
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
6254
+ "dev": true,
6255
+ "requires": {
6256
+ "repeating": "^2.0.0"
6257
+ }
6258
+ }
6259
+ }
6260
+ },
6261
+ "redeyed": {
6262
+ "version": "2.1.1",
6263
+ "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
6264
+ "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
6265
+ "dev": true,
6266
+ "requires": {
6267
+ "esprima": "~4.0.0"
6268
+ },
6269
+ "dependencies": {
6270
+ "esprima": {
6271
+ "version": "4.0.1",
6272
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
6273
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
6274
+ "dev": true
6275
+ }
6276
+ }
6277
+ },
6278
+ "regex-not": {
6279
+ "version": "1.0.2",
6280
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
6281
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
6282
+ "dev": true,
6283
+ "requires": {
6284
+ "extend-shallow": "^3.0.2",
6285
+ "safe-regex": "^1.1.0"
6286
+ }
6287
+ },
6288
+ "registry-auth-token": {
6289
+ "version": "3.3.2",
6290
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
6291
+ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
6292
+ "dev": true,
6293
+ "requires": {
6294
+ "rc": "^1.1.6",
6295
+ "safe-buffer": "^5.0.1"
6296
+ }
6297
+ },
6298
+ "repeat-element": {
6299
+ "version": "1.1.3",
6300
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
6301
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
6302
+ "dev": true
6303
+ },
6304
+ "repeat-string": {
6305
+ "version": "1.6.1",
6306
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
6307
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
6308
+ "dev": true
6309
+ },
6310
+ "repeating": {
6311
+ "version": "2.0.1",
6312
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
6313
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
6314
+ "dev": true,
6315
+ "requires": {
6316
+ "is-finite": "^1.0.0"
6317
+ }
6318
+ },
6319
+ "require-directory": {
6320
+ "version": "2.1.1",
6321
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
6322
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
6323
+ "dev": true
6324
+ },
6325
+ "require-main-filename": {
6326
+ "version": "1.0.1",
6327
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
6328
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
6329
+ "dev": true
6330
+ },
6331
+ "resolve": {
6332
+ "version": "1.1.7",
6333
+ "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
6334
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
6335
+ "dev": true
6336
+ },
6337
+ "resolve-from": {
6338
+ "version": "4.0.0",
6339
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
6340
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
6341
+ "dev": true
6342
+ },
6343
+ "resolve-url": {
6344
+ "version": "0.2.1",
6345
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
6346
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
6347
+ "dev": true
6348
+ },
6349
+ "ret": {
6350
+ "version": "0.1.15",
6351
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
6352
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
6353
+ "dev": true
6354
+ },
6355
+ "retry": {
6356
+ "version": "0.12.0",
6357
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
6358
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
6359
+ "dev": true
6360
+ },
6361
+ "rimraf": {
6362
+ "version": "2.6.2",
6363
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
6364
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
6365
+ "dev": true,
6366
+ "requires": {
6367
+ "glob": "^7.0.5"
6368
+ }
6369
+ },
6370
+ "safe-buffer": {
6371
+ "version": "5.1.2",
6372
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
6373
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
6374
+ "dev": true
6375
+ },
6376
+ "safe-regex": {
6377
+ "version": "1.1.0",
6378
+ "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
6379
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
6380
+ "dev": true,
6381
+ "requires": {
6382
+ "ret": "~0.1.10"
6383
+ }
6384
+ },
6385
+ "safer-buffer": {
6386
+ "version": "2.1.2",
6387
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
6388
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
6389
+ "dev": true
6390
+ },
6391
+ "semantic-release": {
6392
+ "version": "15.13.1",
6393
+ "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.1.tgz",
6394
+ "integrity": "sha512-bkrfQ10BhbJRMeq/Ih9DZ9FO4ffDwFYsRR134JP9JvQSf8GVX4sg3SnFFd7Q10C6pKwjKqMZ4+ZNB5uQYMLPEg==",
6395
+ "dev": true,
6396
+ "requires": {
6397
+ "@semantic-release/commit-analyzer": "^6.1.0",
6398
+ "@semantic-release/error": "^2.2.0",
6399
+ "@semantic-release/github": "^5.1.0",
6400
+ "@semantic-release/npm": "^5.0.5",
6401
+ "@semantic-release/release-notes-generator": "^7.1.2",
6402
+ "aggregate-error": "^1.0.0",
6403
+ "cosmiconfig": "^5.0.1",
6404
+ "debug": "^4.0.0",
6405
+ "env-ci": "^3.0.0",
6406
+ "execa": "^1.0.0",
6407
+ "figures": "^2.0.0",
6408
+ "find-versions": "^3.0.0",
6409
+ "get-stream": "^4.0.0",
6410
+ "git-log-parser": "^1.2.0",
6411
+ "hook-std": "^1.1.0",
6412
+ "hosted-git-info": "^2.7.1",
6413
+ "lodash": "^4.17.4",
6414
+ "marked": "^0.5.0",
6415
+ "marked-terminal": "^3.0.0",
6416
+ "p-locate": "^3.0.0",
6417
+ "p-reduce": "^1.0.0",
6418
+ "read-pkg-up": "^4.0.0",
6419
+ "resolve-from": "^4.0.0",
6420
+ "semver": "^5.4.1",
6421
+ "signale": "^1.2.1",
6422
+ "yargs": "^12.0.0"
6423
+ },
6424
+ "dependencies": {
6425
+ "find-up": {
6426
+ "version": "3.0.0",
6427
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
6428
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
6429
+ "dev": true,
6430
+ "requires": {
6431
+ "locate-path": "^3.0.0"
6432
+ }
6433
+ },
6434
+ "load-json-file": {
6435
+ "version": "4.0.0",
6436
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
6437
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
6438
+ "dev": true,
6439
+ "requires": {
6440
+ "graceful-fs": "^4.1.2",
6441
+ "parse-json": "^4.0.0",
6442
+ "pify": "^3.0.0",
6443
+ "strip-bom": "^3.0.0"
6444
+ }
6445
+ },
6446
+ "locate-path": {
6447
+ "version": "3.0.0",
6448
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
6449
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
6450
+ "dev": true,
6451
+ "requires": {
6452
+ "p-locate": "^3.0.0",
6453
+ "path-exists": "^3.0.0"
6454
+ }
6455
+ },
6456
+ "path-exists": {
6457
+ "version": "3.0.0",
6458
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
6459
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
6460
+ "dev": true
6461
+ },
6462
+ "read-pkg": {
6463
+ "version": "3.0.0",
6464
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
6465
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
6466
+ "dev": true,
6467
+ "requires": {
6468
+ "load-json-file": "^4.0.0",
6469
+ "normalize-package-data": "^2.3.2",
6470
+ "path-type": "^3.0.0"
6471
+ }
6472
+ },
6473
+ "read-pkg-up": {
6474
+ "version": "4.0.0",
6475
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
6476
+ "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
6477
+ "dev": true,
6478
+ "requires": {
6479
+ "find-up": "^3.0.0",
6480
+ "read-pkg": "^3.0.0"
6481
+ }
6482
+ },
6483
+ "strip-bom": {
6484
+ "version": "3.0.0",
6485
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
6486
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
6487
+ "dev": true
6488
+ }
6489
+ }
6490
+ },
6491
+ "semver": {
6492
+ "version": "5.6.0",
6493
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
6494
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
6495
+ "dev": true
6496
+ },
6497
+ "semver-regex": {
6498
+ "version": "2.0.0",
6499
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
6500
+ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
6501
+ "dev": true
6502
+ },
6503
+ "set-blocking": {
6504
+ "version": "2.0.0",
6505
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
6506
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
6507
+ "dev": true
6508
+ },
6509
+ "set-value": {
6510
+ "version": "2.0.0",
6511
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
6512
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
6513
+ "dev": true,
6514
+ "requires": {
6515
+ "extend-shallow": "^2.0.1",
6516
+ "is-extendable": "^0.1.1",
6517
+ "is-plain-object": "^2.0.3",
6518
+ "split-string": "^3.0.1"
6519
+ },
6520
+ "dependencies": {
6521
+ "extend-shallow": {
6522
+ "version": "2.0.1",
6523
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6524
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6525
+ "dev": true,
6526
+ "requires": {
6527
+ "is-extendable": "^0.1.0"
6528
+ }
6529
+ }
6530
+ }
6531
+ },
6532
+ "shebang-command": {
6533
+ "version": "1.2.0",
6534
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
6535
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
6536
+ "dev": true,
6537
+ "requires": {
6538
+ "shebang-regex": "^1.0.0"
6539
+ }
6540
+ },
6541
+ "shebang-regex": {
6542
+ "version": "1.0.0",
6543
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
6544
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
6545
+ "dev": true
6546
+ },
6547
+ "signal-exit": {
6548
+ "version": "3.0.2",
6549
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
6550
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
6551
+ "dev": true
6552
+ },
6553
+ "signale": {
6554
+ "version": "1.3.0",
6555
+ "resolved": "https://registry.npmjs.org/signale/-/signale-1.3.0.tgz",
6556
+ "integrity": "sha512-TyFhsQ9wZDYDfsPqWMyjCxsDoMwfpsT0130Mce7wDiVCSDdtWSg83dOqoj8aGpGCs3n1YPcam6sT1OFPuGT/OQ==",
6557
+ "dev": true,
6558
+ "requires": {
6559
+ "chalk": "^2.3.2",
6560
+ "figures": "^2.0.0",
6561
+ "pkg-conf": "^2.1.0"
6562
+ }
6563
+ },
6564
+ "slash": {
6565
+ "version": "1.0.0",
6566
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
6567
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
6568
+ "dev": true
6569
+ },
6570
+ "snapdragon": {
6571
+ "version": "0.8.2",
6572
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
6573
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
6574
+ "dev": true,
6575
+ "requires": {
6576
+ "base": "^0.11.1",
6577
+ "debug": "^2.2.0",
6578
+ "define-property": "^0.2.5",
6579
+ "extend-shallow": "^2.0.1",
6580
+ "map-cache": "^0.2.2",
6581
+ "source-map": "^0.5.6",
6582
+ "source-map-resolve": "^0.5.0",
6583
+ "use": "^3.1.0"
6584
+ },
6585
+ "dependencies": {
6586
+ "debug": {
6587
+ "version": "2.6.9",
6588
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
6589
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
6590
+ "dev": true,
6591
+ "requires": {
6592
+ "ms": "2.0.0"
6593
+ }
6594
+ },
6595
+ "define-property": {
6596
+ "version": "0.2.5",
6597
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
6598
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
6599
+ "dev": true,
6600
+ "requires": {
6601
+ "is-descriptor": "^0.1.0"
6602
+ }
6603
+ },
6604
+ "extend-shallow": {
6605
+ "version": "2.0.1",
6606
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6607
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6608
+ "dev": true,
6609
+ "requires": {
6610
+ "is-extendable": "^0.1.0"
6611
+ }
6612
+ },
6613
+ "ms": {
6614
+ "version": "2.0.0",
6615
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
6616
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
6617
+ "dev": true
6618
+ }
6619
+ }
6620
+ },
6621
+ "snapdragon-node": {
6622
+ "version": "2.1.1",
6623
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
6624
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
6625
+ "dev": true,
6626
+ "requires": {
6627
+ "define-property": "^1.0.0",
6628
+ "isobject": "^3.0.0",
6629
+ "snapdragon-util": "^3.0.1"
6630
+ },
6631
+ "dependencies": {
6632
+ "define-property": {
6633
+ "version": "1.0.0",
6634
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
6635
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
6636
+ "dev": true,
6637
+ "requires": {
6638
+ "is-descriptor": "^1.0.0"
6639
+ }
6640
+ },
6641
+ "is-accessor-descriptor": {
6642
+ "version": "1.0.0",
6643
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
6644
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
6645
+ "dev": true,
6646
+ "requires": {
6647
+ "kind-of": "^6.0.0"
6648
+ }
6649
+ },
6650
+ "is-data-descriptor": {
6651
+ "version": "1.0.0",
6652
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
6653
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
6654
+ "dev": true,
6655
+ "requires": {
6656
+ "kind-of": "^6.0.0"
6657
+ }
6658
+ },
6659
+ "is-descriptor": {
6660
+ "version": "1.0.2",
6661
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
6662
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
6663
+ "dev": true,
6664
+ "requires": {
6665
+ "is-accessor-descriptor": "^1.0.0",
6666
+ "is-data-descriptor": "^1.0.0",
6667
+ "kind-of": "^6.0.2"
6668
+ }
6669
+ }
6670
+ }
6671
+ },
6672
+ "snapdragon-util": {
6673
+ "version": "3.0.1",
6674
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
6675
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
6676
+ "dev": true,
6677
+ "requires": {
6678
+ "kind-of": "^3.2.0"
6679
+ },
6680
+ "dependencies": {
6681
+ "kind-of": {
6682
+ "version": "3.2.2",
6683
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6684
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6685
+ "dev": true,
6686
+ "requires": {
6687
+ "is-buffer": "^1.1.5"
6688
+ }
6689
+ }
6690
+ }
6691
+ },
6692
+ "source-map": {
6693
+ "version": "0.5.7",
6694
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
6695
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
6696
+ "dev": true
6697
+ },
6698
+ "source-map-resolve": {
6699
+ "version": "0.5.2",
6700
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
6701
+ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
6702
+ "dev": true,
6703
+ "requires": {
6704
+ "atob": "^2.1.1",
6705
+ "decode-uri-component": "^0.2.0",
6706
+ "resolve-url": "^0.2.1",
6707
+ "source-map-url": "^0.4.0",
6708
+ "urix": "^0.1.0"
6709
+ }
6710
+ },
6711
+ "source-map-url": {
6712
+ "version": "0.4.0",
6713
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
6714
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
6715
+ "dev": true
6716
+ },
6717
+ "spawn-error-forwarder": {
6718
+ "version": "1.0.0",
6719
+ "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
6720
+ "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=",
6721
+ "dev": true
6722
+ },
6723
+ "spdx-correct": {
6724
+ "version": "3.1.0",
6725
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
6726
+ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
6727
+ "dev": true,
6728
+ "requires": {
6729
+ "spdx-expression-parse": "^3.0.0",
6730
+ "spdx-license-ids": "^3.0.0"
6731
+ }
6732
+ },
6733
+ "spdx-exceptions": {
6734
+ "version": "2.2.0",
6735
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
6736
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
6737
+ "dev": true
6738
+ },
6739
+ "spdx-expression-parse": {
6740
+ "version": "3.0.0",
6741
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
6742
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
6743
+ "dev": true,
6744
+ "requires": {
6745
+ "spdx-exceptions": "^2.1.0",
6746
+ "spdx-license-ids": "^3.0.0"
6747
+ }
6748
+ },
6749
+ "spdx-license-ids": {
6750
+ "version": "3.0.2",
6751
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
6752
+ "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
6753
+ "dev": true
6754
+ },
6755
+ "split": {
6756
+ "version": "1.0.1",
6757
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
6758
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
6759
+ "dev": true,
6760
+ "requires": {
6761
+ "through": "2"
6762
+ }
6763
+ },
6764
+ "split-string": {
6765
+ "version": "3.1.0",
6766
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
6767
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
6768
+ "dev": true,
6769
+ "requires": {
6770
+ "extend-shallow": "^3.0.0"
6771
+ }
6772
+ },
6773
+ "split2": {
6774
+ "version": "2.2.0",
6775
+ "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
6776
+ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
6777
+ "dev": true,
6778
+ "requires": {
6779
+ "through2": "^2.0.2"
6780
+ }
6781
+ },
6782
+ "sprintf-js": {
6783
+ "version": "1.1.2",
6784
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
6785
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
6786
+ "dev": true
6787
+ },
6788
+ "static-extend": {
6789
+ "version": "0.1.2",
6790
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
6791
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
6792
+ "dev": true,
6793
+ "requires": {
6794
+ "define-property": "^0.2.5",
6795
+ "object-copy": "^0.1.0"
6796
+ },
6797
+ "dependencies": {
6798
+ "define-property": {
6799
+ "version": "0.2.5",
6800
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
6801
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
6802
+ "dev": true,
6803
+ "requires": {
6804
+ "is-descriptor": "^0.1.0"
6805
+ }
6806
+ }
6807
+ }
6808
+ },
6809
+ "stream-combiner2": {
6810
+ "version": "1.1.1",
6811
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
6812
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
6813
+ "dev": true,
6814
+ "requires": {
6815
+ "duplexer2": "~0.1.0",
6816
+ "readable-stream": "^2.0.2"
6817
+ }
6818
+ },
6819
+ "string-width": {
6820
+ "version": "2.1.1",
6821
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
6822
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
6823
+ "dev": true,
6824
+ "requires": {
6825
+ "is-fullwidth-code-point": "^2.0.0",
6826
+ "strip-ansi": "^4.0.0"
6827
+ }
6828
+ },
6829
+ "string_decoder": {
6830
+ "version": "1.1.1",
6831
+ "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
6832
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
6833
+ "dev": true,
6834
+ "requires": {
6835
+ "safe-buffer": "~5.1.0"
6836
+ }
6837
+ },
6838
+ "strip-ansi": {
6839
+ "version": "4.0.0",
6840
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
6841
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
6842
+ "dev": true,
6843
+ "requires": {
6844
+ "ansi-regex": "^3.0.0"
6845
+ }
6846
+ },
6847
+ "strip-bom": {
6848
+ "version": "2.0.0",
6849
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
6850
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
6851
+ "dev": true,
6852
+ "requires": {
6853
+ "is-utf8": "^0.2.0"
6854
+ }
6855
+ },
6856
+ "strip-eof": {
6857
+ "version": "1.0.0",
6858
+ "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
6859
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
6860
+ "dev": true
6861
+ },
6862
+ "strip-indent": {
6863
+ "version": "1.0.1",
6864
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
6865
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
6866
+ "dev": true,
6867
+ "requires": {
6868
+ "get-stdin": "^4.0.1"
6869
+ }
6870
+ },
6871
+ "strip-json-comments": {
6872
+ "version": "2.0.1",
6873
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
6874
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
6875
+ "dev": true
6876
+ },
6877
+ "supports-color": {
6878
+ "version": "5.5.0",
6879
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6880
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6881
+ "dev": true,
6882
+ "requires": {
6883
+ "has-flag": "^3.0.0"
6884
+ }
6885
+ },
6886
+ "text-extensions": {
6887
+ "version": "1.9.0",
6888
+ "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz",
6889
+ "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==",
6890
+ "dev": true
6891
+ },
6892
+ "through": {
6893
+ "version": "2.3.8",
6894
+ "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
6895
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
6896
+ "dev": true
6897
+ },
6898
+ "through2": {
6899
+ "version": "2.0.5",
6900
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
6901
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
6902
+ "dev": true,
6903
+ "requires": {
6904
+ "readable-stream": "~2.3.6",
6905
+ "xtend": "~4.0.1"
6906
+ }
6907
+ },
6908
+ "to-object-path": {
6909
+ "version": "0.3.0",
6910
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
6911
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
6912
+ "dev": true,
6913
+ "requires": {
6914
+ "kind-of": "^3.0.2"
6915
+ },
6916
+ "dependencies": {
6917
+ "kind-of": {
6918
+ "version": "3.2.2",
6919
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
6920
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
6921
+ "dev": true,
6922
+ "requires": {
6923
+ "is-buffer": "^1.1.5"
6924
+ }
6925
+ }
6926
+ }
6927
+ },
6928
+ "to-regex": {
6929
+ "version": "3.0.2",
6930
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
6931
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
6932
+ "dev": true,
6933
+ "requires": {
6934
+ "define-property": "^2.0.2",
6935
+ "extend-shallow": "^3.0.2",
6936
+ "regex-not": "^1.0.2",
6937
+ "safe-regex": "^1.1.0"
6938
+ }
6939
+ },
6940
+ "to-regex-range": {
6941
+ "version": "2.1.1",
6942
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
6943
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
6944
+ "dev": true,
6945
+ "requires": {
6946
+ "is-number": "^3.0.0",
6947
+ "repeat-string": "^1.6.1"
6948
+ }
6949
+ },
6950
+ "traverse": {
6951
+ "version": "0.6.6",
6952
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
6953
+ "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
6954
+ "dev": true
6955
+ },
6956
+ "trim-newlines": {
6957
+ "version": "1.0.0",
6958
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
6959
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
6960
+ "dev": true
6961
+ },
6962
+ "trim-off-newlines": {
6963
+ "version": "1.0.1",
6964
+ "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz",
6965
+ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
6966
+ "dev": true
6967
+ },
6968
+ "uglify-js": {
6969
+ "version": "3.4.9",
6970
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
6971
+ "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
6972
+ "dev": true,
6973
+ "optional": true,
6974
+ "requires": {
6975
+ "commander": "~2.17.1",
6976
+ "source-map": "~0.6.1"
6977
+ },
6978
+ "dependencies": {
6979
+ "source-map": {
6980
+ "version": "0.6.1",
6981
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
6982
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
6983
+ "dev": true,
6984
+ "optional": true
6985
+ }
6986
+ }
6987
+ },
6988
+ "underscore.string": {
6989
+ "version": "3.3.5",
6990
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
6991
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
6992
+ "dev": true,
6993
+ "requires": {
6994
+ "sprintf-js": "^1.0.3",
6995
+ "util-deprecate": "^1.0.2"
6996
+ }
6997
+ },
6998
+ "union-value": {
6999
+ "version": "1.0.0",
7000
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
7001
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
7002
+ "dev": true,
7003
+ "requires": {
7004
+ "arr-union": "^3.1.0",
7005
+ "get-value": "^2.0.6",
7006
+ "is-extendable": "^0.1.1",
7007
+ "set-value": "^0.4.3"
7008
+ },
7009
+ "dependencies": {
7010
+ "extend-shallow": {
7011
+ "version": "2.0.1",
7012
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
7013
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
7014
+ "dev": true,
7015
+ "requires": {
7016
+ "is-extendable": "^0.1.0"
7017
+ }
7018
+ },
7019
+ "set-value": {
7020
+ "version": "0.4.3",
7021
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
7022
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
7023
+ "dev": true,
7024
+ "requires": {
7025
+ "extend-shallow": "^2.0.1",
7026
+ "is-extendable": "^0.1.1",
7027
+ "is-plain-object": "^2.0.1",
7028
+ "to-object-path": "^0.3.0"
7029
+ }
7030
+ }
7031
+ }
7032
+ },
7033
+ "universal-user-agent": {
7034
+ "version": "2.0.2",
7035
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.0.2.tgz",
7036
+ "integrity": "sha512-nOwvHWLH3dBazyuzbECPA5uVFNd7AlgviXRHgR4yf48QqitIvpdncRrxMbZNMpPPEfgz30I9ubd1XmiJiqsTrg==",
7037
+ "dev": true,
7038
+ "requires": {
7039
+ "os-name": "^3.0.0"
7040
+ }
7041
+ },
7042
+ "universalify": {
7043
+ "version": "0.1.2",
7044
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
7045
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
7046
+ "dev": true
7047
+ },
7048
+ "unset-value": {
7049
+ "version": "1.0.0",
7050
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
7051
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
7052
+ "dev": true,
7053
+ "requires": {
7054
+ "has-value": "^0.3.1",
7055
+ "isobject": "^3.0.0"
7056
+ },
7057
+ "dependencies": {
7058
+ "has-value": {
7059
+ "version": "0.3.1",
7060
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
7061
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
7062
+ "dev": true,
7063
+ "requires": {
7064
+ "get-value": "^2.0.3",
7065
+ "has-values": "^0.1.4",
7066
+ "isobject": "^2.0.0"
7067
+ },
7068
+ "dependencies": {
7069
+ "isobject": {
7070
+ "version": "2.1.0",
7071
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
7072
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
7073
+ "dev": true,
7074
+ "requires": {
7075
+ "isarray": "1.0.0"
7076
+ }
7077
+ }
7078
+ }
7079
+ },
7080
+ "has-values": {
7081
+ "version": "0.1.4",
7082
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
7083
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
7084
+ "dev": true
7085
+ }
7086
+ }
7087
+ },
7088
+ "urix": {
7089
+ "version": "0.1.0",
7090
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
7091
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
7092
+ "dev": true
7093
+ },
7094
+ "url-join": {
7095
+ "version": "4.0.0",
7096
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz",
7097
+ "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=",
7098
+ "dev": true
7099
+ },
7100
+ "url-template": {
7101
+ "version": "2.0.8",
7102
+ "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz",
7103
+ "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=",
7104
+ "dev": true
7105
+ },
7106
+ "use": {
7107
+ "version": "3.1.1",
7108
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
7109
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
7110
+ "dev": true
7111
+ },
7112
+ "util-deprecate": {
7113
+ "version": "1.0.2",
7114
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
7115
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
7116
+ "dev": true
7117
+ },
7118
+ "validate-npm-package-license": {
7119
+ "version": "3.0.4",
7120
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
7121
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
7122
+ "dev": true,
7123
+ "requires": {
7124
+ "spdx-correct": "^3.0.0",
7125
+ "spdx-expression-parse": "^3.0.0"
7126
+ }
7127
+ },
7128
+ "which": {
7129
+ "version": "1.3.1",
7130
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
7131
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
7132
+ "dev": true,
7133
+ "requires": {
7134
+ "isexe": "^2.0.0"
7135
+ }
7136
+ },
7137
+ "which-module": {
7138
+ "version": "2.0.0",
7139
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
7140
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
7141
+ "dev": true
7142
+ },
7143
+ "windows-release": {
7144
+ "version": "3.1.0",
7145
+ "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.1.0.tgz",
7146
+ "integrity": "sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA==",
7147
+ "dev": true,
7148
+ "requires": {
7149
+ "execa": "^0.10.0"
7150
+ },
7151
+ "dependencies": {
7152
+ "execa": {
7153
+ "version": "0.10.0",
7154
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
7155
+ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
7156
+ "dev": true,
7157
+ "requires": {
7158
+ "cross-spawn": "^6.0.0",
7159
+ "get-stream": "^3.0.0",
7160
+ "is-stream": "^1.1.0",
7161
+ "npm-run-path": "^2.0.0",
7162
+ "p-finally": "^1.0.0",
7163
+ "signal-exit": "^3.0.0",
7164
+ "strip-eof": "^1.0.0"
7165
+ }
7166
+ },
7167
+ "get-stream": {
7168
+ "version": "3.0.0",
7169
+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
7170
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
7171
+ "dev": true
7172
+ }
7173
+ }
7174
+ },
7175
+ "wordwrap": {
7176
+ "version": "0.0.3",
7177
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
7178
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
7179
+ "dev": true
7180
+ },
7181
+ "wrap-ansi": {
7182
+ "version": "2.1.0",
7183
+ "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
7184
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
7185
+ "dev": true,
7186
+ "requires": {
7187
+ "string-width": "^1.0.1",
7188
+ "strip-ansi": "^3.0.1"
7189
+ },
7190
+ "dependencies": {
7191
+ "ansi-regex": {
7192
+ "version": "2.1.1",
7193
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
7194
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
7195
+ "dev": true
7196
+ },
7197
+ "is-fullwidth-code-point": {
7198
+ "version": "1.0.0",
7199
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
7200
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
7201
+ "dev": true,
7202
+ "requires": {
7203
+ "number-is-nan": "^1.0.0"
7204
+ }
7205
+ },
7206
+ "string-width": {
7207
+ "version": "1.0.2",
7208
+ "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
7209
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
7210
+ "dev": true,
7211
+ "requires": {
7212
+ "code-point-at": "^1.0.0",
7213
+ "is-fullwidth-code-point": "^1.0.0",
7214
+ "strip-ansi": "^3.0.0"
7215
+ }
7216
+ },
7217
+ "strip-ansi": {
7218
+ "version": "3.0.1",
7219
+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
7220
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
7221
+ "dev": true,
7222
+ "requires": {
7223
+ "ansi-regex": "^2.0.0"
7224
+ }
7225
+ }
7226
+ }
7227
+ },
7228
+ "wrappy": {
7229
+ "version": "1.0.2",
7230
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
7231
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
7232
+ "dev": true
7233
+ },
7234
+ "xtend": {
7235
+ "version": "4.0.1",
7236
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
7237
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
7238
+ "dev": true
7239
+ },
7240
+ "y18n": {
7241
+ "version": "4.0.0",
7242
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
7243
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
7244
+ "dev": true
7245
+ },
7246
+ "yargs": {
7247
+ "version": "12.0.5",
7248
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
7249
+ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
7250
+ "dev": true,
7251
+ "requires": {
7252
+ "cliui": "^4.0.0",
7253
+ "decamelize": "^1.2.0",
7254
+ "find-up": "^3.0.0",
7255
+ "get-caller-file": "^1.0.1",
7256
+ "os-locale": "^3.0.0",
7257
+ "require-directory": "^2.1.1",
7258
+ "require-main-filename": "^1.0.1",
7259
+ "set-blocking": "^2.0.0",
7260
+ "string-width": "^2.0.0",
7261
+ "which-module": "^2.0.0",
7262
+ "y18n": "^3.2.1 || ^4.0.0",
7263
+ "yargs-parser": "^11.1.1"
7264
+ },
7265
+ "dependencies": {
7266
+ "find-up": {
7267
+ "version": "3.0.0",
7268
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
7269
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
7270
+ "dev": true,
7271
+ "requires": {
7272
+ "locate-path": "^3.0.0"
7273
+ }
7274
+ },
7275
+ "locate-path": {
7276
+ "version": "3.0.0",
7277
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
7278
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
7279
+ "dev": true,
7280
+ "requires": {
7281
+ "p-locate": "^3.0.0",
7282
+ "path-exists": "^3.0.0"
7283
+ }
7284
+ },
7285
+ "path-exists": {
7286
+ "version": "3.0.0",
7287
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
7288
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
7289
+ "dev": true
7290
+ }
7291
+ }
7292
+ },
7293
+ "yargs-parser": {
7294
+ "version": "11.1.1",
7295
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
7296
+ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
7297
+ "dev": true,
7298
+ "requires": {
7299
+ "camelcase": "^5.0.0",
7300
+ "decamelize": "^1.2.0"
7301
+ },
7302
+ "dependencies": {
7303
+ "camelcase": {
7304
+ "version": "5.0.0",
7305
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
7306
+ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
7307
+ "dev": true
7308
+ }
7309
+ }
7310
+ }
7311
+ }
7312
+ }
vendor/codeinwp/themeisle-sdk/package.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "themeisle-sdk",
3
+ "version": "3.0.4",
4
+ "scripts": {
5
+ "semantic-release": "semantic-release --debug"
6
+ },
7
+ "author": "Themeisle",
8
+ "devDependencies": {
9
+ "@semantic-release/changelog": "^3.0.1",
10
+ "@semantic-release/exec": "^3.3.1",
11
+ "@semantic-release/git": "^7.0.6",
12
+ "grunt-version": "^1.3.0",
13
+ "semantic-release": "^15.13.1"
14
+ }
15
+ }
vendor/codeinwp/themeisle-sdk/phpcs.xml ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <ruleset name="Themeisle">
3
+ <description>Themeisle rules for PHP_CodeSnifferr</description>
4
+
5
+ <file>./</file>
6
+
7
+ <arg value="ps"/>
8
+ <arg name="extensions" value="php"/>
9
+
10
+ <exclude-pattern>./vendor</exclude-pattern>
11
+ <exclude-pattern>./old</exclude-pattern>
12
+ <exclude-pattern>./tests/sample_products</exclude-pattern>
13
+
14
+
15
+ <rule ref="WordPress-Core">
16
+
17
+ <exclude name="WordPress.Files.FileName.NotHyphenatedLowercase"/>
18
+ <exclude name="WordPress.Files.FileName.InvalidClassFileName"/>
19
+ <exclude name="Squiz.PHP.DisallowMultipleAssignments.Found"/>
20
+ </rule>
21
+ <rule ref="WordPress-Docs"/>
22
+ <rule ref="WordPress.WP.I18n"/>
23
+ <rule ref="Squiz.Commenting.FunctionComment.Missing">
24
+ <exclude-pattern>tests/*</exclude-pattern>
25
+ </rule>
26
+ <rule ref="Squiz.Commenting.FileComment.Missing">
27
+ <exclude-pattern>tests/*</exclude-pattern>
28
+ </rule>
29
+ <rule ref="Squiz.Commenting.ClassComment.Missing">
30
+ <exclude-pattern>tests/*</exclude-pattern>
31
+ </rule>
32
+ <rule ref="Squiz.Commenting.ClassComment.SpacingAfter">
33
+ <exclude-pattern>tests/*</exclude-pattern>
34
+ </rule>
35
+ <rule ref="Squiz.Commenting.FunctionComment.MissingParamTag">
36
+ <exclude-pattern>tests/*</exclude-pattern>
37
+ </rule>
38
+ <rule ref="Generic.Commenting.DocComment.MissingShort">
39
+ <exclude-pattern>tests/*</exclude-pattern>
40
+ </rule>
41
+ <rule ref="Squiz.Commenting.VariableComment.Missing">
42
+ <exclude-pattern>tests/*</exclude-pattern>
43
+ </rule>
44
+ <rule ref="Squiz.Commenting.FunctionCommentThrowTag.Missing">
45
+ <exclude-pattern>tests/*</exclude-pattern>
46
+ </rule>
47
+ <rule ref="WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid">
48
+ <exclude-pattern>tests/*</exclude-pattern>
49
+ </rule>
50
+ </ruleset>
vendor/codeinwp/themeisle-sdk/phpunit.xml ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <phpunit
2
+ bootstrap="tests/bootstrap.php"
3
+ backupGlobals="false"
4
+ colors="true"
5
+ convertErrorsToExceptions="true"
6
+ convertNoticesToExceptions="true"
7
+ convertWarningsToExceptions="true"
8
+ >
9
+ <testsuites name="General Unit tests ( Requires PHP 5.4) ">
10
+ <testsuite>
11
+ <directory phpVersion="5.4.0" phpVersionOperator=">=" suffix="-test.php">./tests/</directory>
12
+ <exclude>./tests/old/</exclude>
13
+ </testsuite>
14
+ </testsuites>
15
+ <testsuites name="Bail lower php versions( For PHP lower than 5.4) ">
16
+ <testsuite>
17
+ <directory phpVersion="5.4.0" phpVersionOperator="lt" suffix="-test.php">./tests/old/</directory>
18
+ </testsuite>
19
+ </testsuites>
20
+ </phpunit>
vendor/codeinwp/themeisle-sdk/src/Common/Abstract_module.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The abstract class for module definition.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Loader
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 3.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Common;
13
+
14
+ use ThemeisleSDK\Product;
15
+
16
+ if ( ! defined( 'ABSPATH' ) ) {
17
+ exit;
18
+ }
19
+
20
+ /**
21
+ * Class Abstract_Module.
22
+ *
23
+ * @package ThemeisleSDK\Common
24
+ */
25
+ abstract class Abstract_Module {
26
+ /**
27
+ * Product which use the module.
28
+ *
29
+ * @var Product $product Product object.
30
+ */
31
+ protected $product = null;
32
+
33
+ /**
34
+ * Can load the module for the selected product.
35
+ *
36
+ * @param Product $product Product data.
37
+ *
38
+ * @return bool Should load module?
39
+ */
40
+ public abstract function can_load( $product );
41
+
42
+ /**
43
+ * Bootstrap the module.
44
+ *
45
+ * @param Product $product Product object.
46
+ */
47
+ public abstract function load( $product );
48
+
49
+ /**
50
+ * Check if the product is from partner.
51
+ *
52
+ * @param Product $product Product data.
53
+ *
54
+ * @return bool Is product from partner.
55
+ */
56
+ public function is_from_partner( $product ) {
57
+
58
+ foreach ( Module_Factory::$domains as $partner_domain ) {
59
+ if ( strpos( $product->get_store_url(), $partner_domain ) !== false ) {
60
+ return true;
61
+ }
62
+ }
63
+
64
+ return array_key_exists( $product->get_slug(), Module_Factory::$slugs );
65
+ }
66
+ }
vendor/codeinwp/themeisle-sdk/src/Common/Module_factory.php ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The module factory class.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Loader
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 3.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Common;
13
+
14
+ use ThemeisleSDK\Product;
15
+
16
+ if ( ! defined( 'ABSPATH' ) ) {
17
+ exit;
18
+ }
19
+
20
+ /**
21
+ * Class Job_Factory
22
+ *
23
+ * @package ThemeisleSDK\Common
24
+ */
25
+ class Module_Factory {
26
+ /**
27
+ * Partners slugs.
28
+ *
29
+ * @var array $SLUGS Partners product slugs.
30
+ */
31
+ public static $slugs = [
32
+ 'zermatt' => true,
33
+ 'neto' => true,
34
+ 'olsen' => true,
35
+ 'benson' => true,
36
+ 'romero' => true,
37
+ 'carmack' => true,
38
+ 'puzzle' => true,
39
+ 'broadsheet' => true,
40
+ 'girlywp' => true,
41
+ 'veggie' => true,
42
+ 'zeko' => true,
43
+ 'maishawp' => true,
44
+ 'didi' => true,
45
+ 'liber' => true,
46
+ 'medicpress-pt' => true,
47
+ 'adrenaline-pt' => true,
48
+ 'consultpress-pt' => true,
49
+ 'legalpress-pt' => true,
50
+ 'gympress-pt' => true,
51
+ 'readable-pt' => true,
52
+ 'bolts-pt' => true,
53
+ ];
54
+ /**
55
+ * Partners domains.
56
+ *
57
+ * @var array $DOMAINS Partners domains.
58
+ */
59
+ public static $domains = [
60
+ 'proteusthemes.com',
61
+ 'anarieldesign.com',
62
+ 'prothemedesign.com',
63
+ 'cssigniter.com',
64
+ ];
65
+ /**
66
+ * Map which contains all the modules loaded for each product.
67
+ *
68
+ * @var array Mapping array.
69
+ */
70
+ private static $modules_attached = [];
71
+
72
+ /**
73
+ * Load availabe modules for the selected product.
74
+ *
75
+ * @param Product $product Loaded product.
76
+ * @param array $modules List of modules.
77
+ */
78
+ public static function attach( $product, $modules ) {
79
+
80
+ if ( ! isset( self::$modules_attached[ $product->get_slug() ] ) ) {
81
+ self::$modules_attached[ $product->get_slug() ] = [];
82
+ }
83
+
84
+ foreach ( $modules as $module ) {
85
+ $class = 'ThemeisleSDK\\Modules\\' . ucwords( $module, '_' );
86
+ /**
87
+ * Module object.
88
+ *
89
+ * @var Abstract_Module $module_object Module instance.
90
+ */
91
+ $module_object = new $class( $product );
92
+
93
+ if ( ! $module_object->can_load( $product ) ) {
94
+ continue;
95
+ }
96
+ self::$modules_attached[ $product->get_slug() ][ $module ] = $module_object->load( $product );
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Products/Modules loaded map.
102
+ *
103
+ * @return array Modules map.
104
+ */
105
+ public static function get_modules_map() {
106
+ return self::$modules_attached;
107
+ }
108
+ }
vendor/codeinwp/themeisle-sdk/src/Loader.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The main loader class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Loader
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK;
13
+
14
+ use ThemeisleSDK\Common\Module_Factory;
15
+
16
+ if ( ! defined( 'ABSPATH' ) ) {
17
+ exit;
18
+ }
19
+
20
+
21
+ /**
22
+ * Singleton loader for ThemeIsle SDK.
23
+ */
24
+ final class Loader {
25
+ /**
26
+ * Singleton instance.
27
+ *
28
+ * @var Loader instance The singleton instance
29
+ */
30
+ private static $instance;
31
+ /**
32
+ * Current loader version.
33
+ *
34
+ * @var string $version The class version.
35
+ */
36
+ private static $version = '2.0.0';
37
+ /**
38
+ * Holds registered products.
39
+ *
40
+ * @var array The products which use the SDK.
41
+ */
42
+ private static $products = [];
43
+ /**
44
+ * Holds available modules to load.
45
+ *
46
+ * @var array The modules which SDK will be using.
47
+ */
48
+ private static $available_modules = [
49
+ 'dashboard_widget',
50
+ 'rollback',
51
+ 'uninstall_feedback',
52
+ 'licenser',
53
+ 'endpoint',
54
+ 'notification',
55
+ 'logger',
56
+ 'translate',
57
+ 'review',
58
+
59
+ ];
60
+
61
+ /**
62
+ * Initialize the sdk logic.
63
+ */
64
+ public static function init() {
65
+ if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Loader ) ) {
66
+ self::$instance = new Loader();
67
+ $modules = array_merge( self::$available_modules, apply_filters( 'themeisle_sdk_modules', [] ) );
68
+ foreach ( $modules as $key => $module ) {
69
+ if ( ! class_exists( 'ThemeisleSDK\\Modules\\' . ucwords( $module, '_' ) ) ) {
70
+ unset( $modules[ $key ] );
71
+ }
72
+ }
73
+ self::$available_modules = $modules;
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Register product into SDK.
79
+ *
80
+ * @param string $base_file The product base file.
81
+ *
82
+ * @return Loader The singleton object.
83
+ */
84
+ public static function add_product( $base_file ) {
85
+
86
+ if ( ! is_readable( $base_file ) ) {
87
+ return self::$instance;
88
+ }
89
+ $product = new Product( $base_file );
90
+
91
+ Module_Factory::attach( $product, self::get_modules() );
92
+
93
+ self::$products[ $product->get_slug() ] = $product;
94
+
95
+ return self::$instance;
96
+ }
97
+
98
+ /**
99
+ * Get all registered modules by the SDK.
100
+ *
101
+ * @return array Modules available.
102
+ */
103
+ public static function get_modules() {
104
+ return self::$available_modules;
105
+ }
106
+
107
+ /**
108
+ * Get all products using the SDK.
109
+ *
110
+ * @return array Products available.
111
+ */
112
+ public static function get_products() {
113
+ return self::$products;
114
+ }
115
+
116
+
117
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php ADDED
@@ -0,0 +1,453 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The blog dashboard model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Product;
16
+
17
+ // Exit if accessed directly.
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Blog dashboard widget module for ThemeIsle SDK.
24
+ */
25
+ class Dashboard_Widget extends Abstract_Module {
26
+
27
+ /**
28
+ * Fetched feeds items.
29
+ *
30
+ * @var array Feed items.
31
+ */
32
+ private $items = array();
33
+
34
+ /**
35
+ * Dashboard widget title.
36
+ *
37
+ * @var string $dashboard_name Dashboard name.
38
+ */
39
+ private $dashboard_name = '';
40
+
41
+ /**
42
+ * Dashboard widget feed sources.
43
+ *
44
+ * @var array $feeds Feed url.
45
+ */
46
+ private $feeds = [];
47
+
48
+ /**
49
+ * Should we load this module.
50
+ *
51
+ * @param Product $product Product object.
52
+ *
53
+ * @return bool
54
+ */
55
+ public function can_load( $product ) {
56
+ if ( $this->is_from_partner( $product ) ) {
57
+ return false;
58
+ }
59
+
60
+ if ( ! apply_filters( $product->get_slug() . '_load_dashboard_widget', true ) ) {
61
+ return false;
62
+ }
63
+
64
+ return true;
65
+ }
66
+
67
+ /**
68
+ * Registers the hooks.
69
+ *
70
+ * @param Product $product Product to load.
71
+ *
72
+ * @return Dashboard_Widget Module instance.
73
+ */
74
+ public function load( $product ) {
75
+
76
+ $this->product = $product;
77
+ $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
78
+ $this->feeds = apply_filters(
79
+ 'themeisle_sdk_dashboard_widget_feeds',
80
+ [
81
+ 'https://themeisle.com/blog/feed',
82
+ ]
83
+ );
84
+ add_action( 'wp_dashboard_setup', array( &$this, 'add_widget' ) );
85
+ add_action( 'wp_network_dashboard_setup', array( &$this, 'add_widget' ) );
86
+ add_filter( 'themeisle_sdk_recommend_plugin_or_theme', array( &$this, 'recommend_plugin_or_theme' ) );
87
+
88
+ return $this;
89
+ }
90
+
91
+
92
+ /**
93
+ * Add widget to the dashboard
94
+ *
95
+ * @return string|void
96
+ */
97
+ function add_widget() {
98
+ global $wp_meta_boxes;
99
+ if ( isset( $wp_meta_boxes['dashboard']['normal']['core']['themeisle'] ) ) {
100
+ return;
101
+ }
102
+ wp_add_dashboard_widget(
103
+ 'themeisle',
104
+ $this->dashboard_name,
105
+ [
106
+ &$this,
107
+ 'render_dashboard_widget',
108
+ ]
109
+ );
110
+ }
111
+
112
+ /**
113
+ * Render widget content
114
+ */
115
+ function render_dashboard_widget() {
116
+ $this->setup_feeds();
117
+ if ( empty( $this->items ) || ! is_array( $this->items ) ) {
118
+ return;
119
+ }
120
+ ?>
121
+ <style type="text/css">
122
+ #themeisle ul li.ti-dw-recommend-item {
123
+ padding-left: 7px;
124
+ border-top: 1px solid #eee;
125
+ margin-bottom: 0px;
126
+ padding-top: 6px;
127
+ }
128
+
129
+ #themeisle h2.hndle {
130
+ background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4xMiA3Ny4xMiI+PHRpdGxlPkFzc2V0IDM8L3RpdGxlPjxwYXRoIGQ9Ik03NS43Niw0Ny42cS0xLjUsNi40Ni00LjA3LDkuMjZBMzYuMjIsMzYuMjIsMCwwLDEsNjMuMjYsNjNhNTEsNTEsMCwwLDEtOS43OSw0LjZoLS4xNXY0LjgyQTQuNjYsNC42NiwwLDAsMSw1Miw3NS43Niw0LjA3LDQuMDcsMCwwLDEsNDksNzcuMTJhNCw0LDAsMCwxLTIuMTgtLjYxQTQuOTQsNC45NCwwLDAsMSw0NS4xOSw3NWE0LjQyLDQuNDIsMCwwLDEtNy41NCwwLDQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSwzLjc1LDMuNzUsMCwwLDEtMiwuNjFBNC4yNyw0LjI3LDAsMCwxLDMwLjI3LDc1YTQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSw0LDQsMCwwLDEtMi4xOC42MSwzLjkzLDMuOTMsMCwwLDEtMy4xNi0xLjQzLDUuMyw1LjMsMCwwLDEtMS4yMS0zLjU0LDEzLjgxLDEzLjgxLDAsMCwxLTguNTgsMywxMy4yMywxMy4yMywwLDAsMS05LTMuNDdBMTguMjEsMTguMjEsMCwwLDAsOSw3MC43OWExNC4yNiwxNC4yNiwwLDAsMS03LjgzLTUuNDIsMTYuMTIsMTYuMTIsMCwwLDAsNS4xOS4wNywxMi44OSwxMi44OSwwLDAsMCw0LjktMS43M1EzLjE1LDU1LjQzLDEuMDUsNTAuNDZhMTgsMTgsMCwwLDEtMS02LjkzQTQwLDQwLDAsMCwxLDEuMjEsMzQsMjYuNTksMjYuNTksMCwwLDEsNS4yNywyNC4xUTguNDQsMTkuNDMsMTMsMTkuNDNhMy40MSwzLjQxLDAsMCwxLDMuNDcsMi4yNmMuNi0uOCwxLjItMS41NiwxLjgxLTIuMjZsLjQ1LS40NS43NS0uNzUsMS4wNS0xLjgxYTM1LjIsMzUuMiwwLDAsMSwyLjExLTMuMzIsMjguNTcsMjguNTcsMCwwLDEsOS4xMi03LjY4QTIzLjQsMjMuNCwwLDAsMSw0Mi45MywyLjU2YTIyLjIyLDIyLjIyLDAsMCwxLDIuNzEuMTVBOC4xNiw4LjE2LDAsMCwxLDUxLjgxLDAsOC42OSw4LjY5LDAsMCwxLDU4LDIuNDFhMS41MSwxLjUxLDAsMCwxLC4xNS42OGMwLC4yNS0uNTUuOTMtMS42NiwybC0uMy4zYTkuNjksOS42OSwwLDAsMSwxLjU4LjgzYy41NS4zNS44My42NS44My45YTEuNjIsMS42MiwwLDAsMS0uNiwxbC0uMTUuMTVxNi43OCw2LDguNTgsMTYuMjdBMy4zLDMuMywwLDAsMSw2OSwyMy4zNWE2LjQ4LDYuNDgsMCwwLDEsNC4yMiwyLjFxMy45MiwzLjMyLDMuOTIsMTEuOUE0Mi4wNSw0Mi4wNSwwLDAsMSw3NS43Niw0Ny42Wk01My42Miw1NC4wN2EyNCwyNCwwLDAsMS0xNCw0LjUyQTIxLjQxLDIxLjQxLDAsMCwxLDI3LDU0LjY3LDI0LjI4LDI0LjI4LDAsMCwxLDE4LjUzLDQ1YTI5LDI5LDAsMCwxLTMtMTMsMzEuNzgsMzEuNzgsMCwwLDEsLjkxLTcuNTNBMzIuMTcsMzIuMTcsMCwwLDAsMTEuOSw0MS4yN2EzMy41LDMzLjUsMCwwLDAsMi43OSwxMy40LDI5LjEsMjkuMSwwLDAsMCw3LjksMTAuODUsNC42OCw0LjY4LDAsMCwxLDEuNjYtMS44OCw0LjE3LDQuMTcsMCwwLDEsNC40NC0uMDgsNC41LDQuNSwwLDAsMSwxLjU4LDEuNjZBNC4yLDQuMiwwLDAsMSwzNCw2M2EzLjgzLDMuODMsMCwwLDEsMiwuNiw0LjUsNC41LDAsMCwxLDEuNTgsMS42Niw0LjI3LDQuMjcsMCwwLDEsNy41NCwwLDQuNSw0LjUsMCwwLDEsMS41OC0xLjY2LDQuMTcsNC4xNywwLDAsMSw0LjQ0LjA4LDMuODYsMy44NiwwLDAsMSwxLjUxLDEuNzMsMzAuMTcsMzAuMTcsMCwwLDAsNy42OC05Ljk0LDMxLjE4LDMxLjE4LDAsMCwwLDMuMTYtMTIuMzVBMjguMzksMjguMzksMCwwLDEsNTMuNjIsNTQuMDdaTTI4Ljc3LDY1LjM3YTMuMSwzLjEsMCwwLDAtNC4zNywwLDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi45MywyLjkzLDAsMCwwLDQuMzcsMCwzLjMyLDMuMzIsMCwwLDAsLjktMi4zM1Y2Ny42M0EzLjA2LDMuMDYsMCwwLDAsMjguNzcsNjUuMzdabS45LTQ4YTQuMjQsNC4yNCwwLDAsMCwzLjQ3LDEuNzMsNC40NSw0LjQ1LDAsMCwwLDMuNTQtMS43Myw2LDYsMCwwLDAsMS40My0zLjkyLDUuNyw1LjcsMCwwLDAtMS40My0zLjg0QTQuNTMsNC41MywwLDAsMCwzMy4xNCw4YTQuMzEsNC4zMSwwLDAsMC0zLjQ3LDEuNjYsNS43OSw1Ljc5LDAsMCwwLTEuMzUsMy43N0E2LjMzLDYuMzMsMCwwLDAsMjkuNjcsMTcuNFptNi40OCw0OGEzLjEsMy4xLDAsMCwwLTQuMzcsMCwzLjA2LDMuMDYsMCwwLDAtLjksMi4yNnY0LjgyYTMuMzIsMy4zMiwwLDAsMCwuOSwyLjMzLDIuOTMsMi45MywwLDAsMCw0LjM3LDAsMy4zMiwzLjMyLDAsMCwwLC45LTIuMzNWNjcuNjNBMy4wNiwzLjA2LDAsMCwwLDM2LjE1LDY1LjM3Wm0tNC4wNy01NC4zYTIuMzcsMi4zNywwLDAsMSwyLTEsMi4xNywyLjE3LDAsMCwxLDEuODgsMSw0LjEsNC4xLDAsMCwxLDAsNC41MiwyLjE3LDIuMTcsMCwwLDEtMS44OCwxLDIuMzcsMi4zNywwLDAsMS0yLTEsMy43MiwzLjcyLDAsMCwxLS43NS0yLjM0QTMuNDksMy40OSwwLDAsMSwzMi4wOCwxMS4wN1ptNSw5LjQxYTIwLjYxLDIwLjYxLDAsMCwwLTMuNTQsMTIuMjgsMTcuMTUsMTcuMTUsMCwwLDAsNC4wNywxMSwxMi40MywxMi40MywwLDAsMCw5Ljg3LDQuNDUsMTUuMywxNS4zLDAsMCwwLDktMywxMywxMywwLDAsMCwuNi0zLjMycTAtMy4zMi0zLjE2LTMuMzFhOC41OCw4LjU4LDAsMCwwLTIsLjNxLTcuODMsMS41LTExLjU5LS4zLTQuNTMtMi4xMi00LjUyLTkuMzRBMzcuOTIsMzcuOTIsMCwwLDEsMzcuMDUsMjAuNDhaTTYxLjQ1LDE3QTEyLjg0LDEyLjg0LDAsMCwwLDUxLjIxLDEyLjJhMTUuMTEsMTUuMTEsMCwwLDAtNi40LDEuNDMsMTcuODMsMTcuODMsMCwwLDAtNS41LDRxLTYuMTgsMjAuNjQsNi4xOCwyMC42NEEyNC43NSwyNC43NSwwLDAsMCw0OSwzNy44MWEzOC45MiwzOC45MiwwLDAsMSw0LjgyLS40NmMxLjgxLDAsMy4wNi40NiwzLjc3LDEuMzZxMS4zNSwxLjUuNzUsNS4xMmEyMS43MiwyMS43MiwwLDAsMCw1LTcuMTVBMjEuMzgsMjEuMzgsMCwwLDAsNjUuMDcsMjgsMTcuNDQsMTcuNDQsMCwwLDAsNjEuNDUsMTdaTTQzLjYsNjUuMzdhMi43MiwyLjcyLDAsMCwwLTIuMS0uOSwzLDMsMCwwLDAtMi4xOS45LDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi44NCwyLjg0LDAsMCwwLDIuMTksMSwyLjYxLDIuNjEsMCwwLDAsMi4xLTEsMy40NSwzLjQ1LDAsMCwwLC44My0yLjMzVjY3LjYzQTMuMTcsMy4xNywwLDAsMCw0My42LDY1LjM3Wm03LjQ2LDBhMywzLDAsMCwwLTIuMTgtLjksMi43MywyLjczLDAsMCwwLTIuMTEuOSwzLjE3LDMuMTcsMCwwLDAtLjgzLDIuMjZ2NC44MmEzLjQ1LDMuNDUsMCwwLDAsLjgzLDIuMzMsMi42MSwyLjYxLDAsMCwwLDIuMTEsMSwyLjgzLDIuODMsMCwwLDAsMi4xOC0xLDMuMzIsMy4zMiwwLDAsMCwuOS0yLjMzVjY3LjYzQTMuMDYsMy4wNiwwLDAsMCw1MS4wNiw2NS4zN1oiLz48L3N2Zz4=');
131
+ background-repeat: no-repeat;
132
+ background-position: 92% 50%;
133
+ background-size: 30px;
134
+ }
135
+
136
+ #themeisle .inside {
137
+ padding: 0;
138
+ }
139
+
140
+ .ti-feed-list {
141
+ padding: 0 12px 5px;
142
+ margin-bottom: 10px;
143
+ border-bottom: 1px solid #eee;
144
+ }
145
+
146
+ .ti-dw-feed-item a {
147
+ display: flex;
148
+ align-items: center;
149
+ margin-bottom: 5px;
150
+ padding: 5px;
151
+ transition: .2s ease;
152
+ border-radius: 3px;
153
+ }
154
+
155
+ .ti-dw-feed-item a:hover {
156
+ background-color: #f8f8f8;
157
+ }
158
+
159
+ .ti-dw-feed-item a:hover .ti-dw-date-container {
160
+ opacity: .9;
161
+ }
162
+
163
+ .ti-dw-feed-item .ti-dw-month-container {
164
+ margin-top: -5px;
165
+ text-transform: uppercase;
166
+ font-size: 10px;
167
+ letter-spacing: 1px;
168
+ font-weight: 700;
169
+ }
170
+
171
+ .ti-dw-feed-item .ti-dw-date-container {
172
+ border-radius: 3px;
173
+ transition: .2s ease;
174
+ min-height: 35px;
175
+ margin-right: 5px;
176
+ min-width: 35px;
177
+ text-align: center;
178
+ border: 1px solid #2a6f97;
179
+ color: #fff;
180
+ background: #2ea2cc;
181
+ display: flex;
182
+ flex-direction: column;
183
+ justify-content: center;
184
+ }
185
+
186
+ .ti-dw-footer {
187
+ padding: 0 12px 5px;
188
+ text-align: center;
189
+ }
190
+
191
+ .ti-dw-recommend-item {
192
+ display: block;
193
+ }
194
+
195
+ .ti-dw-recommend-item span {
196
+ color: #72777c;
197
+ }
198
+
199
+ .ti-dw-powered-by {
200
+ font-size: 11px;
201
+ margin-top: 3px;
202
+ display: block;
203
+ color: #72777c;
204
+ }
205
+
206
+ .ti-dw-powered-by span {
207
+ font-weight: 600;
208
+ }
209
+
210
+ </style>
211
+ <?php do_action( 'themeisle_sdk_dashboard_widget_before', $this->product ); ?>
212
+
213
+ <ul class="ti-feed-list">
214
+ <?php
215
+
216
+ foreach ( $this->items as $item ) {
217
+ ?>
218
+ <li class="ti-dw-feed-item">
219
+ <a href="
220
+ <?php
221
+ echo add_query_arg(
222
+ array(
223
+ 'utm_source' => 'wpadmin',
224
+ 'utm_campaign' => 'feed',
225
+ 'utm_medium' => 'dashboard_widget',
226
+ ),
227
+ $item['link']
228
+ );
229
+ ?>
230
+ " target="_blank">
231
+ <span class="ti-dw-date-container"><span
232
+ class="ti-dw-day-container"><?php echo date( 'd', $item['date'] ); ?></span> <span
233
+ class="ti-dw-month-container"><?php echo substr( date( 'M', $item['date'] ), 0, 3 ); ?></span></span><?php echo $item['title']; ?>
234
+ </a>
235
+ </li>
236
+ <?php
237
+ }
238
+ ?>
239
+ </ul>
240
+ <?php
241
+ $recommend = apply_filters( 'themeisle_sdk_recommend_plugin_or_theme', array() );
242
+ if ( ! is_array( $recommend ) || empty( $recommend ) ) {
243
+ return;
244
+ }
245
+
246
+ $type = $recommend['type'];
247
+
248
+ if ( ( 'theme' === $type && ! current_user_can( 'install_themes' ) ) ) {
249
+ return;
250
+ }
251
+ if ( ( 'plugin' === $type && ! current_user_can( 'install_plugins' ) ) ) {
252
+ return;
253
+ }
254
+
255
+ add_thickbox();
256
+ $url = add_query_arg(
257
+ [
258
+ 'theme' => $recommend['slug'],
259
+ ],
260
+ network_admin_url( 'theme-install.php' )
261
+ );
262
+
263
+ if ( 'plugin' === $type ) {
264
+
265
+ $url = add_query_arg(
266
+ array(
267
+ 'tab' => 'plugin-information',
268
+ 'plugin' => $recommend['slug'],
269
+ ),
270
+ network_admin_url( 'plugin-install.php' )
271
+ );
272
+ }
273
+ ?>
274
+ <div class="ti-dw-footer">
275
+ <span class="ti-dw-recommend-item ">
276
+ <span class="ti-dw-recommend"><?php echo apply_filters( 'themeisle_sdk_dashboard_popular_label', sprintf( 'Popular %s', ucwords( $type ) ) ); ?>
277
+ : </span>
278
+ <?php
279
+ echo trim(
280
+ str_replace(
281
+ array(
282
+ 'lite',
283
+ 'Lite',
284
+ ),
285
+ '',
286
+ $recommend['name']
287
+ )
288
+ );
289
+ ?>
290
+ (<a class="thickbox open-plugin-details-modal"
291
+ href="<?php echo $url . '&TB_iframe=true&width=600&height=500'; ?>"><?php echo apply_filters( 'themeisle_sdk_dashboard_install_label', 'Install' ); ?></a>)
292
+ </span>
293
+ <span class="ti-dw-powered-by"><span><?php echo apply_filters( 'themeisle_sdk_dashboard_widget_powered_by', esc_attr( sprintf( 'Powered by %s', $this->product->get_friendly_name() ) ) ); ?></span></span>
294
+ </div>
295
+
296
+ <?php
297
+
298
+ }
299
+
300
+ /**
301
+ * Setup feed items.
302
+ */
303
+ private function setup_feeds() {
304
+ if ( false === ( $items_normalized = get_transient( 'themeisle_sdk_feed_items' ) ) ) {
305
+ // Load SimplePie Instance.
306
+ $feed = fetch_feed( $this->feeds );
307
+ // TODO report error when is an error loading the feed.
308
+ if ( is_wp_error( $feed ) ) {
309
+ return;
310
+ }
311
+
312
+ $items = $feed->get_items( 0, 5 );
313
+ foreach ( (array) $items as $item ) {
314
+ $items_normalized[] = array(
315
+ 'title' => $item->get_title(),
316
+ 'date' => $item->get_date( 'U' ),
317
+ 'link' => $item->get_permalink(),
318
+ );
319
+ }
320
+ set_transient( 'themeisle_sdk_feed_items', $items_normalized, 48 * HOUR_IN_SECONDS );
321
+ }
322
+ $this->items = $items_normalized;
323
+ }
324
+
325
+ /**
326
+ * Either the current product is installed or not.
327
+ *
328
+ * @param array $val The current recommended product.
329
+ *
330
+ * @return bool Either we should exclude the plugin or not.
331
+ */
332
+ public function remove_current_products( $val ) {
333
+ if ( 'theme' === $val['type'] ) {
334
+ $exist = wp_get_theme( $val['slug'] );
335
+
336
+ return ! $exist->exists();
337
+ } else {
338
+ $all_plugins = array_keys( get_plugins() );
339
+ foreach ( $all_plugins as $slug ) {
340
+ if ( strpos( $slug, $val['slug'] ) !== false ) {
341
+ return false;
342
+ }
343
+ }
344
+
345
+ return true;
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Contact the API and fetch the recommended plugins/themes
351
+ */
352
+ function recommend_plugin_or_theme() {
353
+ $products = $this->get_product_from_api();
354
+ if ( ! is_array( $products ) ) {
355
+ $products = array();
356
+ }
357
+ $products = array_filter( $products, array( $this, 'remove_current_products' ) );
358
+ $products = array_merge( $products );
359
+ if ( count( $products ) > 1 ) {
360
+ shuffle( $products );
361
+ $products = array_slice( $products, 0, 1 );
362
+ }
363
+ $to_recommend = isset( $products[0] ) ? $products[0] : $products;
364
+
365
+ return $to_recommend;
366
+ }
367
+
368
+ /**
369
+ * Fetch products from the recomended section.
370
+ *
371
+ * @return array|mixed The list of products to use in recomended section.
372
+ */
373
+ function get_product_from_api() {
374
+ if ( false === ( $products = get_transient( 'themeisle_sdk_products' ) ) ) {
375
+ $products = array();
376
+ $themeisle_themes = $this->get_themes_from_wporg( 'themeisle' );
377
+ $codeinwp_themes = $this->get_themes_from_wporg( 'codeinwp' );
378
+
379
+ $themeisle_plugins = $this->get_plugins_from_wporg( 'themeisle' );
380
+ $codeinwp_plugins = $this->get_plugins_from_wporg( 'codeinwp' );
381
+
382
+ $all_themes = array_merge( $themeisle_themes, $codeinwp_themes );
383
+ foreach ( $all_themes as $theme ) {
384
+ if ( $theme->active_installs < 4999 ) {
385
+ continue;
386
+ }
387
+ $products[] = array(
388
+ 'name' => $theme->name,
389
+ 'type' => 'theme',
390
+ 'slug' => $theme->slug,
391
+ 'installs' => $theme->active_installs,
392
+ );
393
+ }
394
+ $all_plugins = array_merge( $themeisle_plugins, $codeinwp_plugins );
395
+ foreach ( $all_plugins as $plugin ) {
396
+ if ( $plugin->active_installs < 4999 ) {
397
+ continue;
398
+ }
399
+ $products[] = array(
400
+ 'name' => $plugin->name,
401
+ 'type' => 'plugin',
402
+ 'slug' => $plugin->slug,
403
+ 'installs' => $plugin->active_installs,
404
+ );
405
+ }
406
+ set_transient( 'themeisle_sdk_products', $products, 6 * HOUR_IN_SECONDS );
407
+ }
408
+
409
+ return $products;
410
+ }
411
+
412
+ /**
413
+ * Fetch themes from wporg api.
414
+ *
415
+ * @param string $author The author name.
416
+ *
417
+ * @return array The list of themes.
418
+ */
419
+ function get_themes_from_wporg( $author ) {
420
+ $products = wp_remote_get(
421
+ 'https://api.wordpress.org/themes/info/1.1/?action=query_themes&request[author]=' . $author . '&request[per_page]=30&request[fields][active_installs]=true'
422
+ );
423
+ $products = json_decode( wp_remote_retrieve_body( $products ) );
424
+ if ( is_object( $products ) ) {
425
+ $products = isset( $products->themes ) ? $products->themes : array();
426
+ } else {
427
+ $products = array();
428
+ }
429
+
430
+ return (array) $products;
431
+ }
432
+
433
+ /**
434
+ * Fetch plugin from wporg api.
435
+ *
436
+ * @param string $author The author slug.
437
+ *
438
+ * @return array The list of plugins for the selected author.
439
+ */
440
+ function get_plugins_from_wporg( $author ) {
441
+ $products = wp_remote_get(
442
+ 'https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[author]=' . $author . '&request[per_page]=20&request[fields][active_installs]=true'
443
+ );
444
+ $products = json_decode( wp_remote_retrieve_body( $products ) );
445
+ if ( is_object( $products ) ) {
446
+ $products = isset( $products->plugins ) ? $products->plugins : array();
447
+ } else {
448
+ $products = array();
449
+ }
450
+
451
+ return (array) $products;
452
+ }
453
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Endpoint.php ADDED
@@ -0,0 +1,358 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The class that exposes endpoints.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Rollback
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ // Exit if accessed directly.
15
+ use ThemeisleSDK\Common\Abstract_Module;
16
+ use ThemeisleSDK\Loader;
17
+ use ThemeisleSDK\Product;
18
+
19
+ if ( ! defined( 'ABSPATH' ) ) {
20
+ exit;
21
+ }
22
+
23
+ /**
24
+ * Expose endpoints for ThemeIsle SDK.
25
+ */
26
+ class Endpoint extends Abstract_Module {
27
+ /**
28
+ * Endpoint slug.
29
+ */
30
+ const SDK_ENDPOINT = 'themeisle-sdk';
31
+ /**
32
+ * Endpoint version.
33
+ */
34
+ const SDK_ENDPOINT_VERSION = 1;
35
+ /**
36
+ * Hash file which contains the checksum.
37
+ */
38
+ const HASH_FILE = 'themeisle-hash.json';
39
+
40
+ /*
41
+ * If true, the endpoint will expect a product slug and will return the value only for that.
42
+ */
43
+ const PRODUCT_SPECIFIC = false;
44
+
45
+ /**
46
+ * Registers the endpoints.
47
+ */
48
+ function rest_register() {
49
+ register_rest_route(
50
+ self::SDK_ENDPOINT . '/v' . self::SDK_ENDPOINT_VERSION,
51
+ '/checksum/' . ( self::PRODUCT_SPECIFIC ? '(?P<slug>.*)/' : '' ),
52
+ array(
53
+ 'methods' => 'GET',
54
+ 'callback' => array( $this, 'checksum' ),
55
+ )
56
+ );
57
+ }
58
+
59
+ /**
60
+ * The checksum endpoint.
61
+ *
62
+ * @param \WP_REST_Request $data the request.
63
+ *
64
+ * @return \WP_REST_Response Response or the error
65
+ */
66
+ function checksum( \WP_REST_Request $data ) {
67
+ $products = Loader::get_products();
68
+ if ( self::PRODUCT_SPECIFIC ) {
69
+ $params = $this->validate_params( $data, array( 'slug' ) );
70
+ foreach ( $products as $product ) {
71
+ if ( $params['slug'] === $product->get_slug() ) {
72
+ $products = array( $product );
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ $response = array();
78
+ $custom_css = $this->has_custom_css();
79
+ if ( is_bool( $custom_css ) ) {
80
+ $response['custom_css'] = $custom_css;
81
+ }
82
+
83
+ $response['child_theme'] = $this->get_theme_properties();
84
+
85
+ foreach ( $products as $product ) {
86
+ $files = array();
87
+ switch ( $product->get_type() ) {
88
+ case 'plugin':
89
+ $files = array();
90
+ break;
91
+ case 'theme':
92
+ $files = array( 'style.css', 'functions.php' );
93
+ break;
94
+ }
95
+
96
+ $error = '';
97
+
98
+ // if any element in the $files array contains a '/', this would imply recursion is required.
99
+ $diff = $this->generate_diff(
100
+ $product,
101
+ $files,
102
+ array_reduce(
103
+ $files,
104
+ array(
105
+ $this,
106
+ 'is_recursion_required',
107
+ ),
108
+ false
109
+ )
110
+ );
111
+ if ( is_wp_error( $diff ) ) {
112
+ /**
113
+ * Error returner by the diff checker method.
114
+ *
115
+ * @var \WP_Error $diff Error returned.
116
+ */
117
+ $error = $diff->get_error_message();
118
+ $diff = array();
119
+ }
120
+
121
+ $response['products'][] = array(
122
+ 'slug' => $product->get_slug(),
123
+ 'version' => $product->get_version(),
124
+ 'diffs' => $diff,
125
+ 'error' => $error,
126
+ );
127
+ }
128
+
129
+ return new \WP_REST_Response( array( 'checksum' => $response ) );
130
+ }
131
+
132
+ /**
133
+ * Validates the parameters to the API
134
+ *
135
+ * @param \WP_REST_Request $data the request.
136
+ * @param array $params the parameters to validate.
137
+ *
138
+ * @return array of parameter name=>value
139
+ */
140
+ private function validate_params( \WP_REST_Request $data, $params ) {
141
+ $collect = array();
142
+ foreach ( $params as $param ) {
143
+ $value = sanitize_text_field( $data[ $param ] );
144
+ if ( empty( $value ) ) {
145
+ return rest_ensure_response(
146
+ new \WP_Error(
147
+ 'themeisle_' . $param . '_invalid',
148
+ sprintf( 'Invalid %', $param ),
149
+ array(
150
+ 'status' => 403,
151
+ )
152
+ )
153
+ );
154
+ } else {
155
+ $collect[ $param ] = $value;
156
+ }
157
+ }
158
+
159
+ return $collect;
160
+ }
161
+
162
+ /**
163
+ * Check if custom css has been added to the theme.
164
+ *
165
+ * @return bool Whether custom css has been added to the theme.
166
+ */
167
+ private function has_custom_css() {
168
+ $query = new \WP_Query(
169
+ array(
170
+ 'post_type' => 'custom_css',
171
+ 'post_status' => 'publish',
172
+ 'numberposts' => 1,
173
+ 'update_post_meta_cache' => false,
174
+ 'update_post_term_cache' => false,
175
+ )
176
+ );
177
+
178
+ if ( $query->have_posts() ) {
179
+ $query->the_post();
180
+ $content = get_the_content();
181
+
182
+ // if the content contains a colon, a CSS rule has been added.
183
+ return strpos( $content, ':' ) === false ? false : true;
184
+ }
185
+
186
+ return false;
187
+ }
188
+
189
+ /**
190
+ * Get the current theme properties.
191
+ *
192
+ * @return mixed Properties of the current theme.
193
+ */
194
+ function get_theme_properties() {
195
+ if ( ! is_child_theme() ) {
196
+ return false;
197
+ }
198
+
199
+ $properties = array();
200
+ $theme = wp_get_theme();
201
+ // @codingStandardsIgnoreStart
202
+ $properties['name'] = $theme->Name;
203
+ // @codingStandardsIgnoreEnd
204
+
205
+ // get the files in the child theme.
206
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
207
+ WP_Filesystem();
208
+ global $wp_filesystem;
209
+ $path = str_replace( ABSPATH, $wp_filesystem->abspath(), get_stylesheet_directory() );
210
+ $list = $wp_filesystem->dirlist( $path, false, false );
211
+ if ( $list ) {
212
+ $list = array_keys( self::flatten_dirlist( $list ) );
213
+ $properties['files'] = $list;
214
+ }
215
+
216
+ return $properties;
217
+ }
218
+
219
+ /**
220
+ * Flatten the results of WP_Filesystem::dirlist() for iterating over.
221
+ *
222
+ * @access private
223
+ *
224
+ * @param array $nested_files Array of files as returned by WP_Filesystem::dirlist().
225
+ * @param string $path Relative path to prepend to child nodes. Optional.
226
+ *
227
+ * @return array $files A flattened array of the $nested_files specified.
228
+ */
229
+ private static function flatten_dirlist( $nested_files, $path = '' ) {
230
+ $files = array();
231
+ foreach ( $nested_files as $name => $details ) {
232
+ $files[ $path . $name ] = $details;
233
+ // Append children recursively.
234
+ if ( ! empty( $details['files'] ) ) {
235
+ $children = self::flatten_dirlist( $details['files'], $path . $name . '/' );
236
+ // Merge keeping possible numeric keys, which array_merge() will reindex from 0..n.
237
+ $files = $files + $children;
238
+ }
239
+ }
240
+
241
+ return $files;
242
+ }
243
+
244
+ /**
245
+ * Generate the diff of the files.
246
+ *
247
+ * @param Product $product Themeisle Product.
248
+ * @param array $files Array of files.
249
+ * @param bool $recurse Whether to recurse or not.
250
+ *
251
+ * @return mixed Diff data.
252
+ */
253
+ private function generate_diff( $product, $files, $recurse = false ) {
254
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
255
+ WP_Filesystem();
256
+ global $wp_filesystem;
257
+
258
+ $diff = array();
259
+ $path = str_replace( ABSPATH, $wp_filesystem->abspath(), plugin_dir_path( $product->get_basefile() ) );
260
+ $list = $wp_filesystem->dirlist( $path, false, $recurse );
261
+ // nothing found.
262
+ if ( ! $list ) {
263
+ return $diff;
264
+ }
265
+ $list = array_keys( self::flatten_dirlist( $list ) );
266
+
267
+ // now let's get the valid files that actually exist.
268
+ if ( empty( $files ) ) {
269
+ $files = $list;
270
+ } else {
271
+ $files = array_intersect( $files, $list );
272
+ }
273
+
274
+ // fetch the calculated hashes.
275
+ if ( ! $wp_filesystem->is_readable( $path . '/' . self::HASH_FILE ) ) {
276
+ return new WP_Error( 'themeisle_sdk_hash_not_found', sprintf( '%s not found', self::HASH_FILE ) );
277
+ }
278
+
279
+ $hashes = json_decode( $wp_filesystem->get_contents( $path . '/' . self::HASH_FILE ), true );
280
+ ksort( $hashes );
281
+
282
+ $diff = array();
283
+ foreach ( $files as $file ) {
284
+ // file does not exist in the hashes.
285
+ if ( ! array_key_exists( $file, $hashes ) ) {
286
+ continue;
287
+ }
288
+ $new = md5( $wp_filesystem->get_contents( $path . $file ) );
289
+ $old = $hashes[ $file ];
290
+
291
+ // same hash, bail.
292
+ if ( $new === $old ) {
293
+ continue;
294
+ }
295
+ $diff[] = $file;
296
+ }
297
+
298
+ return $diff;
299
+ }
300
+
301
+ /**
302
+ * Check if recursion needs to be enabled on the WP_Filesystem by reducing the array of files to a boolean.
303
+ *
304
+ * @param string $carry Value of the previous iteration.
305
+ * @param string $item Value of the current iteration.
306
+ *
307
+ * @return bool Whether to recurse or not.
308
+ */
309
+ function is_recursion_required( $carry, $item ) {
310
+ if ( ! $carry ) {
311
+ return ( strpos( $item, '/' ) !== false );
312
+ }
313
+
314
+ return $carry;
315
+ }
316
+
317
+ /**
318
+ * Load module for this product.
319
+ *
320
+ * @param Product $product Product to check.
321
+ *
322
+ * @return bool Should we load this?
323
+ */
324
+ public function can_load( $product ) {
325
+ return true;
326
+ }
327
+
328
+ /**
329
+ * Load module logic.
330
+ *
331
+ * @param Product $product Product to load.
332
+ */
333
+ public function load( $product ) {
334
+ $this->setup_endpoints();
335
+
336
+ return $this;
337
+ }
338
+
339
+ /**
340
+ * Setup endpoints.
341
+ */
342
+ private function setup_endpoints() {
343
+ global $wp_version;
344
+ if ( version_compare( $wp_version, '4.4', '<' ) ) {
345
+ // no REST support.
346
+ return;
347
+ }
348
+
349
+ $this->setup_rest();
350
+ }
351
+
352
+ /**
353
+ * Setup REST endpoints.
354
+ */
355
+ private function setup_rest() {
356
+ add_action( 'rest_api_init', array( $this, 'rest_register' ) );
357
+ }
358
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Licenser.php ADDED
@@ -0,0 +1,719 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The main loader class for license handling.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ // Exit if accessed directly.
15
+ use ThemeisleSDK\Common\Abstract_Module;
16
+ use ThemeisleSDK\Product;
17
+
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Licenser module for ThemeIsle SDK.
24
+ */
25
+ class Licenser extends Abstract_Module {
26
+
27
+ /**
28
+ * Number of max failed checks before showing the license message.
29
+ *
30
+ * @var int $max_failed Maximum failed checks allowed before show the notice
31
+ */
32
+ private static $max_failed = 5;
33
+ /**
34
+ * License key string.
35
+ *
36
+ * @var string $license_key The license key string
37
+ */
38
+ public $license_key;
39
+ /**
40
+ * This ensures that the custom API request only runs on the second time that WP fires the update check.
41
+ *
42
+ * @var bool $do_check Flag for request.
43
+ */
44
+ private $do_check = false;
45
+ /**
46
+ * Number of failed checks to the api endpoint.
47
+ *
48
+ * @var bool $failed_checks
49
+ */
50
+ private $failed_checks = 0;
51
+ /**
52
+ * The product update response key.
53
+ *
54
+ * @var string $product_key Product key.
55
+ */
56
+ private $product_key;
57
+
58
+ /**
59
+ * Disable wporg updates for premium products.
60
+ *
61
+ * @param string $r Update payload.
62
+ * @param string $url The api url.
63
+ *
64
+ * @return mixed List of themes to check for update.
65
+ */
66
+ function disable_wporg_update( $r, $url ) {
67
+
68
+ if ( 0 !== strpos( $url, 'https://api.wordpress.org/themes/update-check/' ) ) {
69
+ return $r;
70
+ }
71
+
72
+ // Decode the JSON response.
73
+ $themes = json_decode( $r['body']['themes'] );
74
+
75
+ unset( $themes->themes->{$this->product->get_slug()} );
76
+
77
+ // Encode the updated JSON response.
78
+ $r['body']['themes'] = json_encode( $themes );
79
+
80
+ return $r;
81
+ }
82
+
83
+ /**
84
+ * Register the setting for the license of the product.
85
+ *
86
+ * @return bool
87
+ */
88
+ public function register_settings() {
89
+ if ( ! is_admin() ) {
90
+ return false;
91
+ }
92
+ add_settings_field(
93
+ $this->product->get_key() . '_license',
94
+ $this->product->get_name() . ' license',
95
+ array( $this, 'license_view' ),
96
+ 'general'
97
+ );
98
+ }
99
+
100
+ /**
101
+ * The license view field.
102
+ */
103
+ public function license_view() {
104
+ $status = $this->get_license_status();
105
+ $value = $this->license_key;
106
+
107
+ $activate_string = apply_filters( $this->product->get_key() . '_lc_activate_string', 'Activate' );
108
+ $deactivate_string = apply_filters( $this->product->get_key() . '_lc_deactivate_string', 'Deactivate' );
109
+ $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
110
+ $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
111
+ $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
112
+
113
+ echo '<p ><input ' . ( ( 'valid' === $status ) ? ( 'style="border:1px solid #7ad03a; "' ) : '' ) . ' type="text" id="' . $this->product->get_key() . '_license" name="' . $this->product->get_key() . '_license" value="' . $value . '" /><a ' . ( ( 'valid' === $status ) ? ( 'style="color:#fff;background: #7ad03a; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $valid_string ) : ( 'style="color:#fff;background: #dd3d36; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $invalid_string ) ) . ' </a>&nbsp;&nbsp;&nbsp;<button name="' . $this->product->get_key() . '_btn_trigger" ' . ( ( 'valid' === $status ) ? ( ' class="button button-primary">' . $deactivate_string ) : ( ' class="button button-primary" value="yes" type="submit" >' . $activate_string ) ) . ' </button></p><p class="description">' . sprintf( $license_message, '<a href="' . $this->get_api_url() . '">' . $this->get_distributor_name() . '</a> ', $this->product->get_type() ) . '</p>';
114
+
115
+ }
116
+
117
+ /**
118
+ * Return the license status.
119
+ *
120
+ * @return string The License status.
121
+ */
122
+ public function get_license_status() {
123
+
124
+ $license_data = get_option( $this->product->get_key() . '_license_data', '' );
125
+
126
+ if ( '' === $license_data ) {
127
+ return get_option( $this->product->get_key() . '_license_status', 'not_active' );
128
+ }
129
+
130
+ return isset( $license_data->license ) ? $license_data->license : get_option( $this->product->get_key() . '_license_status', 'not_active' );
131
+
132
+ }
133
+
134
+ /**
135
+ * Get remote api url.
136
+ *
137
+ * @return string Remote api url.
138
+ */
139
+ public function get_api_url() {
140
+ if ( $this->is_from_partner( $this->product ) ) {
141
+ return 'https://themeisle.com';
142
+ }
143
+
144
+ return $this->product->get_store_url();
145
+ }
146
+
147
+ /**
148
+ * Get remote api url.
149
+ *
150
+ * @return string Remote api url.
151
+ */
152
+ public function get_distributor_name() {
153
+ if ( $this->is_from_partner( $this->product ) ) {
154
+ return 'ThemeIsle';
155
+ }
156
+
157
+ return $this->product->get_store_name();
158
+ }
159
+
160
+ /**
161
+ * Show the admin notice regarding the license status.
162
+ *
163
+ * @return bool Should we show the notice ?
164
+ */
165
+ function show_notice() {
166
+ if ( ! is_admin() ) {
167
+ return false;
168
+ }
169
+ $status = $this->get_license_status();
170
+ $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to upgrade your plan in order to use %s on more websites. Please ask the %s Staff for more details.' );
171
+ $no_valid_string = apply_filters( $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s, please add your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a href="%s">here</a>. ' );
172
+ $expiration_string = apply_filters( $this->product->get_key() . '_lc_expiration_string', 'Your license is about to expire for %s. You can go to %s and renew it ' );
173
+
174
+ // No activations left for this license.
175
+ if ( 'valid' != $status && $this->check_activation() ) {
176
+ ?>
177
+ <div class="error">
178
+ <p><strong>
179
+ <?php
180
+ echo sprintf(
181
+ $no_activations_string,
182
+ $this->product->get_name(),
183
+ $this->product->get_name(),
184
+ '<a href="' . $this->get_api_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
185
+ );
186
+ ?>
187
+ </strong>
188
+ </p>
189
+ </div>
190
+ <?php
191
+ return false;
192
+ }
193
+ // Invalid license key.
194
+ if ( 'valid' != $status ) {
195
+ ?>
196
+ <div class="error">
197
+ <p>
198
+ <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->get_api_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() ); ?> </strong>
199
+ </p>
200
+ </div>
201
+ <?php
202
+
203
+ return false;
204
+ }
205
+
206
+ // Expired and soon to expire license.
207
+ if ( 'valid' == $status && $this->check_expiration() ) {
208
+ ?>
209
+ <div class="update-nag">
210
+ <p>
211
+ <strong>
212
+ <?php
213
+ echo sprintf(
214
+ $expiration_string,
215
+ $this->product->get_name() . ' ' . $this->product->get_type(),
216
+ '<a href="' . $this->renew_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
217
+ );
218
+ ?>
219
+ </strong>
220
+ </p>
221
+ </div>
222
+ <?php
223
+ return false;
224
+ }
225
+
226
+ return true;
227
+ }
228
+
229
+ /**
230
+ * Check if the license is active or not.
231
+ *
232
+ * @return bool
233
+ */
234
+ public function check_activation() {
235
+ $license_data = get_option( $this->product->get_key() . '_license_data', '' );
236
+ if ( '' === $license_data ) {
237
+ return false;
238
+ }
239
+
240
+ return isset( $license_data->error ) ? ( 'no_activations_left' == $license_data->error ) : false;
241
+
242
+ }
243
+
244
+ /**
245
+ * Check if the license is about to expire in the next month.
246
+ *
247
+ * @return bool
248
+ */
249
+ function check_expiration() {
250
+ $license_data = get_option( $this->product->get_key() . '_license_data', '' );
251
+ if ( '' === $license_data ) {
252
+ return false;
253
+ }
254
+ if ( ! isset( $license_data->expires ) ) {
255
+ return false;
256
+ }
257
+ if ( strtotime( $license_data->expires ) - time() > 30 * 24 * 3600 ) {
258
+ return false;
259
+ }
260
+
261
+ return true;
262
+ }
263
+
264
+ /**
265
+ * Return the renew url from the store used.
266
+ *
267
+ * @return string The renew url.
268
+ */
269
+ function renew_url() {
270
+ $license_data = get_option( $this->product->get_key() . '_license_data', '' );
271
+ if ( '' === $license_data ) {
272
+ return $this->get_api_url();
273
+ }
274
+ if ( ! isset( $license_data->download_id ) || ! isset( $license_data->key ) ) {
275
+ return $this->get_api_url();
276
+ }
277
+
278
+ return $this->get_api_url() . '/checkout/?edd_license_key=' . $license_data->key . '&download_id=' . $license_data->download_id;
279
+ }
280
+
281
+ /**
282
+ * Run the license check call.
283
+ */
284
+ public function product_valid() {
285
+ if ( false !== ( $license = get_transient( $this->product->get_key() . '_license_data' ) ) ) {
286
+ return;
287
+ }
288
+ $license = $this->check_license();
289
+ set_transient( $this->product->get_key() . '_license_data', $license, 12 * HOUR_IN_SECONDS );
290
+ update_option( $this->product->get_key() . '_license_data', $license );
291
+ }
292
+
293
+ /**
294
+ * Check the license status.
295
+ *
296
+ * @return object The license data.
297
+ */
298
+ public function check_license() {
299
+ $status = $this->get_license_status();
300
+ if ( 'not_active' == $status ) {
301
+ $license_data = new \stdClass();
302
+ $license_data->license = 'not_active';
303
+
304
+ return $license_data;
305
+ }
306
+ $license = trim( $this->license_key );
307
+ $api_params = array(
308
+ 'edd_action' => 'check_license',
309
+ 'license' => $license,
310
+ 'item_name' => rawurlencode( $this->product->get_name() ),
311
+ 'url' => rawurlencode( home_url() ),
312
+ );
313
+ // Call the custom API.
314
+ $response = wp_remote_get(
315
+ add_query_arg( $api_params, $this->get_api_url() ),
316
+ array(
317
+ 'timeout' => 15,
318
+ 'sslverify' => false,
319
+ )
320
+ );
321
+ if ( is_wp_error( $response ) ) {
322
+ $license_data = new \stdClass();
323
+ $license_data->license = 'valid';
324
+
325
+ } else {
326
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
327
+ if ( ! is_object( $license_data ) ) {
328
+ $license_data = new \stdClass();
329
+ $license_data->license = 'valid';
330
+ }
331
+ }
332
+ $license_old = get_option( $this->product->get_key() . '_license_data', '' );
333
+ if ( 'valid' == $license_old->license && ( $license_data->license != $license_old->license ) ) {
334
+ $this->increment_failed_checks();
335
+ } else {
336
+ $this->reset_failed_checks();
337
+ }
338
+
339
+ if ( $this->failed_checks <= self::$max_failed ) {
340
+ return $license_old;
341
+ }
342
+
343
+ if ( isset( $license_old->hide_valid ) ) {
344
+ $license_data->hide_valid = true;
345
+ }
346
+
347
+ if ( ! isset( $license_data->key ) ) {
348
+ $license_data->key = isset( $license_old->key ) ? $license_old->key : '';
349
+ }
350
+
351
+ if ( isset( $license_old->hide_expiration ) ) {
352
+ $license_data->hide_expiration = true;
353
+ }
354
+
355
+ if ( isset( $license_old->hide_activation ) ) {
356
+ $license_data->hide_activation = true;
357
+ }
358
+
359
+ return $license_data;
360
+
361
+ }
362
+
363
+ /**
364
+ * Increment the failed checks.
365
+ */
366
+ private function increment_failed_checks() {
367
+ $this->failed_checks ++;
368
+ update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
369
+ }
370
+
371
+ /**
372
+ * Reset the failed checks
373
+ */
374
+ private function reset_failed_checks() {
375
+ $this->failed_checks = 1;
376
+ update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
377
+ }
378
+
379
+ /**
380
+ * Activate the license remotely.
381
+ */
382
+ function activate_license() {
383
+ // listen for our activate button to be clicked.
384
+ if ( ! isset( $_POST[ $this->product->get_key() . '_btn_trigger' ] ) ) {
385
+ return;
386
+ }
387
+ $status = $this->get_license_status();
388
+ // retrieve the license from the database.
389
+ $license = $_POST[ $this->product->get_key() . '_license' ];
390
+ $api_params = array(
391
+ 'license' => $license,
392
+ 'item_name' => rawurlencode( $this->product->get_name() ),
393
+ 'url' => rawurlencode( home_url() ),
394
+ );
395
+ if ( 'valid' != $status ) {
396
+ // data to send in our API request.
397
+ $api_params['edd_action'] = 'activate_license';
398
+ } else {
399
+ $api_params['edd_action'] = 'deactivate_license';
400
+ }
401
+ // Call the custom API.
402
+ $response = wp_remote_get( add_query_arg( $api_params, $this->get_api_url() ) );
403
+ // make sure the response came back okay.
404
+ if ( is_wp_error( $response ) ) {
405
+ $license_data = new \stdClass();
406
+ $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
407
+
408
+ } else {
409
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
410
+ if ( ! is_object( $license_data ) ) {
411
+ $license_data = new \stdClass();
412
+ $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
413
+ }
414
+ if ( ! isset( $license_data->license ) ) {
415
+ $license_data->license = 'invalid';
416
+ }
417
+ }
418
+ if ( ! isset( $license_data->key ) ) {
419
+ $license_data->key = $license;
420
+ }
421
+ if ( 'valid' == $license_data->license ) {
422
+ $this->reset_failed_checks();
423
+ }
424
+
425
+ if ( isset( $license_data->plan ) ) {
426
+ update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
427
+ }
428
+
429
+ update_option( $this->product->get_key() . '_license_data', $license_data );
430
+ set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
431
+
432
+ }
433
+
434
+ /**
435
+ * Load the Themes screen.
436
+ */
437
+ function load_themes_screen() {
438
+ add_thickbox();
439
+ add_action( 'admin_notices', array( &$this, 'update_nag' ) );
440
+ }
441
+
442
+ /**
443
+ * Alter the nag for themes update.
444
+ */
445
+ function update_nag() {
446
+ $theme = wp_get_theme( $this->product->get_slug() );
447
+ $api_response = get_transient( $this->product_key );
448
+ if ( false === $api_response ) {
449
+ return;
450
+ }
451
+ $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
452
+ $update_message = apply_filters( 'themeisle_sdk_license_update_message', 'Updating this theme will lose any customizations you have made. Cancel to stop, OK to update.' );
453
+ $update_onclick = ' onclick="if ( confirm(\'' . esc_js( $update_message ) . '\') ) {return true;}return false;"';
454
+ if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
455
+ echo '<div id="update-nag">';
456
+ printf(
457
+ '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
458
+ $theme->get( 'Name' ),
459
+ $api_response->new_version,
460
+ '#TB_inline?width=640&amp;inlineId=' . $this->product->get_version() . '_changelog',
461
+ $theme->get( 'Name' ),
462
+ $update_url,
463
+ $update_onclick
464
+ );
465
+ echo '</div>';
466
+ echo '<div id="' . $this->product->get_slug() . '_' . 'changelog" style="display:none;">';
467
+ echo wpautop( $api_response->sections['changelog'] );
468
+ echo '</div>';
469
+ }
470
+ }
471
+
472
+ /**
473
+ * Alter update transient.
474
+ *
475
+ * @param mixed $value The transient data.
476
+ *
477
+ * @return mixed
478
+ */
479
+ function theme_update_transient( $value ) {
480
+ $update_data = $this->check_for_update();
481
+ if ( $update_data ) {
482
+ $value->response[ $this->product->get_slug() ] = $update_data;
483
+ }
484
+
485
+ return $value;
486
+ }
487
+
488
+ /**
489
+ * Check for updates
490
+ *
491
+ * @return array|bool Either the update data or false in case of failure.
492
+ */
493
+ function check_for_update() {
494
+ $update_data = get_transient( $this->product_key );
495
+
496
+ if ( false === $update_data ) {
497
+ $failed = false;
498
+ $update_data = $this->get_version_data();
499
+ if ( empty( $update_data ) ) {
500
+ $failed = true;
501
+ }
502
+ // If the response failed, try again in 30 minutes.
503
+ if ( $failed ) {
504
+ $data = new \stdClass();
505
+ $data->new_version = $this->product->get_version();
506
+ set_transient( $this->product_key, $data, 30 * MINUTE_IN_SECONDS );
507
+
508
+ return false;
509
+ }
510
+ $update_data->sections = maybe_unserialize( $update_data->sections );
511
+
512
+ set_transient( $this->product_key, $update_data, 12 * HOUR_IN_SECONDS );
513
+ }
514
+ if ( ! isset( $update_data->new_version ) ) {
515
+ return false;
516
+ }
517
+ if ( version_compare( $this->product->get_version(), $update_data->new_version, '>=' ) ) {
518
+ return false;
519
+ }
520
+
521
+ return (array) $update_data;
522
+ }
523
+
524
+ /**
525
+ * Check remote api for latest version.
526
+ *
527
+ * @return bool|mixed Update api response.
528
+ */
529
+ private function get_version_data() {
530
+ $api_params = array(
531
+ 'edd_action' => 'get_version',
532
+ 'version' => $this->product->get_version(),
533
+ 'license' => $this->license_key,
534
+ 'name' => $this->product->get_name(),
535
+ 'slug' => $this->product->get_slug(),
536
+ 'author' => $this->get_distributor_name(),
537
+ 'url' => rawurlencode( home_url() ),
538
+ );
539
+ $response = wp_remote_get(
540
+ $this->get_api_url(),
541
+ array(
542
+ 'timeout' => 15,
543
+ 'sslverify' => false,
544
+ 'body' => $api_params,
545
+ )
546
+ );
547
+ if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
548
+ return false;
549
+ }
550
+ $update_data = json_decode( wp_remote_retrieve_body( $response ) );
551
+ if ( ! is_object( $update_data ) ) {
552
+ return false;
553
+ }
554
+
555
+ return $update_data;
556
+ }
557
+
558
+ /**
559
+ * Delete the update transient
560
+ */
561
+ function delete_theme_update_transient() {
562
+ delete_transient( $this->product_key );
563
+ }
564
+
565
+ /**
566
+ * Check for Updates at the defined API endpoint and modify the update array.
567
+ *
568
+ * @param array $_transient_data Update array build by WordPress.
569
+ *
570
+ * @return mixed Modified update array with custom plugin data.
571
+ */
572
+ public function pre_set_site_transient_update_plugins_filter( $_transient_data ) {
573
+ if ( empty( $_transient_data ) || ! $this->do_check ) {
574
+ $this->do_check = true;
575
+
576
+ return $_transient_data;
577
+ }
578
+ $api_response = $this->api_request();
579
+ if ( false !== $api_response && is_object( $api_response ) && isset( $api_response->new_version ) ) {
580
+ if ( version_compare( $this->product->get_version(), $api_response->new_version, '<' ) ) {
581
+ $_transient_data->response[ $this->product->get_slug() . '/' . $this->product->get_file() ] = $api_response;
582
+ }
583
+ }
584
+
585
+ return $_transient_data;
586
+ }
587
+
588
+ /**
589
+ * Calls the API and, if successfull, returns the object delivered by the API.
590
+ *
591
+ * @param string $_action The requested action.
592
+ * @param array $_data Parameters for the API action.
593
+ *
594
+ * @return false||object
595
+ */
596
+ private function api_request( $_action = '', $_data = '' ) {
597
+ $update_data = $this->get_version_data();
598
+ if ( empty( $update_data ) ) {
599
+ return false;
600
+ }
601
+ if ( $update_data && isset( $update_data->sections ) ) {
602
+ $update_data->sections = maybe_unserialize( $update_data->sections );
603
+ }
604
+
605
+ return $update_data;
606
+ }
607
+
608
+ /**
609
+ * Updates information on the "View version x.x details" page with custom data.
610
+ *
611
+ * @param mixed $_data Plugin data.
612
+ * @param string $_action Action to send.
613
+ * @param object $_args Arguments to use.
614
+ *
615
+ * @return object $_data
616
+ */
617
+ public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
618
+ if ( ( 'plugin_information' != $_action ) || ! isset( $_args->slug ) || ( $_args->slug != $this->product->get_slug() ) ) {
619
+ return $_data;
620
+ }
621
+ $api_response = $this->api_request();
622
+ if ( false !== $api_response ) {
623
+ $_data = $api_response;
624
+ }
625
+
626
+ return $_data;
627
+ }
628
+
629
+ /**
630
+ * Disable SSL verification in order to prevent download update failures.
631
+ *
632
+ * @param array $args Http args.
633
+ * @param string $url Url to check.
634
+ *
635
+ * @return array $array
636
+ */
637
+ function http_request_args( $args, $url ) {
638
+ // If it is an https request and we are performing a package download, disable ssl verification.
639
+ if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
640
+ $args['sslverify'] = false;
641
+ }
642
+
643
+ return $args;
644
+ }
645
+
646
+ /**
647
+ * Check if we should load the module for this product.
648
+ *
649
+ * @param Product $product Product data.
650
+ *
651
+ * @return bool Should we load the module?
652
+ */
653
+ public function can_load( $product ) {
654
+
655
+ if ( $product->is_wordpress_available() ) {
656
+ return false;
657
+ }
658
+
659
+ return ( apply_filters( $product->get_key() . '_enable_licenser', true ) === true );
660
+
661
+ }
662
+
663
+ /**
664
+ * Load module logic.
665
+ *
666
+ * @param Product $product Product to load the module for.
667
+ *
668
+ * @return Licenser Module object.
669
+ */
670
+ public function load( $product ) {
671
+ $this->product = $product;
672
+
673
+ $this->product_key = $this->product->get_key() . '-update-response';
674
+
675
+ $this->license_key = $this->product->get_license();
676
+ if ( $this->product->requires_license() ) {
677
+ $this->failed_checks = intval( get_option( $this->product->get_key() . '_failed_checks', 0 ) );
678
+ $this->register_license_hooks();
679
+ }
680
+
681
+ if ( $this->product->is_plugin() ) {
682
+ add_filter(
683
+ 'pre_set_site_transient_update_plugins',
684
+ [
685
+ $this,
686
+ 'pre_set_site_transient_update_plugins_filter',
687
+ ]
688
+ );
689
+ add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
690
+ add_filter( 'http_request_args', array( $this, 'http_request_args' ), 10, 2 );
691
+
692
+ return $this;
693
+ }
694
+ if ( $this->product->is_theme() ) {
695
+ add_filter( 'site_transient_update_themes', array( &$this, 'theme_update_transient' ) );
696
+ add_filter( 'delete_site_transient_update_themes', array( &$this, 'delete_theme_update_transient' ) );
697
+ add_action( 'load-update-core.php', array( &$this, 'delete_theme_update_transient' ) );
698
+ add_action( 'load-themes.php', array( &$this, 'delete_theme_update_transient' ) );
699
+ add_action( 'load-themes.php', array( &$this, 'load_themes_screen' ) );
700
+ add_filter( 'http_request_args', array( $this, 'disable_wporg_update' ), 5, 2 );
701
+
702
+ return $this;
703
+
704
+ }
705
+
706
+ return $this;
707
+ }
708
+
709
+ /**
710
+ * Register license fields for the products.
711
+ */
712
+ public function register_license_hooks() {
713
+ add_action( 'admin_init', array( $this, 'register_settings' ) );
714
+ add_action( 'admin_init', array( $this, 'activate_license' ) );
715
+ add_action( 'admin_init', array( $this, 'product_valid' ), 99999999 );
716
+ add_action( 'admin_notices', array( $this, 'show_notice' ) );
717
+ add_filter( $this->product->get_key() . '_license_status', array( $this, 'get_license_status' ) );
718
+ }
719
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Logger.php ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The logger model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Loader;
16
+ use ThemeisleSDK\Product;
17
+
18
+ // Exit if accessed directly.
19
+ if ( ! defined( 'ABSPATH' ) ) {
20
+ exit;
21
+ }
22
+
23
+ /**
24
+ * Logger module for ThemeIsle SDK.
25
+ */
26
+ class Logger extends Abstract_Module {
27
+ /**
28
+ * Endpoint where to collect logs.
29
+ */
30
+ const TRACKING_ENDPOINT = 'http://log.themeisle.com/wp-json/v1/logs/';
31
+
32
+
33
+ /**
34
+ * Check if we should load the module for this product.
35
+ *
36
+ * @param Product $product Product to load the module for.
37
+ *
38
+ * @return bool Should we load ?
39
+ */
40
+ public function can_load( $product ) {
41
+
42
+ return apply_filters( $product->get_slug() . '_sdk_enable_logger', true );
43
+ }
44
+
45
+ /**
46
+ * Load module logic.
47
+ *
48
+ * @param Product $product Product to load.
49
+ *
50
+ * @return Logger Module object.
51
+ */
52
+ public function load( $product ) {
53
+ $this->product = $product;
54
+ $this->setup_notification();
55
+ $this->setup_actions();
56
+
57
+ return $this;
58
+ }
59
+
60
+ /**
61
+ * Setup notification on admin.
62
+ */
63
+ public function setup_notification() {
64
+ if ( ! $this->product->is_wordpress_available() ) {
65
+ return;
66
+ }
67
+
68
+ add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
69
+
70
+ }
71
+
72
+ /**
73
+ * Setup tracking actions.
74
+ */
75
+ public function setup_actions() {
76
+ if ( ! $this->is_logger_active() ) {
77
+ return;
78
+ }
79
+ $action_key = $this->product->get_key() . '_log_activity';
80
+ if ( ! wp_next_scheduled( $action_key ) ) {
81
+ wp_schedule_single_event( time() + ( rand( 1, 24 ) * 3600 ), $action_key );
82
+ }
83
+ add_action( $action_key, array( $this, 'send_log' ) );
84
+
85
+ }
86
+
87
+ /**
88
+ * Check if the logger is active.
89
+ *
90
+ * @return bool Is logger active?
91
+ */
92
+ private function is_logger_active() {
93
+ if ( ! $this->product->is_wordpress_available() ) {
94
+ return true;
95
+ }
96
+ $pro_slug = $this->product->get_pro_slug();
97
+
98
+ if ( ! empty( $pro_slug ) ) {
99
+ $all_products = Loader::get_products();
100
+ if ( isset( $all_products[ $pro_slug ] ) ) {
101
+ return true;
102
+ }
103
+ }
104
+
105
+ return ( get_option( $this->product->get_key() . '_logger_flag', 'no' ) === 'yes' );
106
+ }
107
+
108
+ /**
109
+ * Add notification to queue.
110
+ *
111
+ * @param array $all_notifications Previous notification.
112
+ *
113
+ * @return array All notifications.
114
+ */
115
+ public function add_notification( $all_notifications ) {
116
+
117
+ $message = apply_filters( $this->product->get_key() . '_logger_heading', 'Do you enjoy <b>{product}</b>? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.' );
118
+
119
+ $message = str_replace(
120
+ array( '{product}' ),
121
+ $this->product->get_friendly_name(),
122
+ $message
123
+ );
124
+ $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', 'Sure, I would love to help.' );
125
+ $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', 'No, thanks.' );
126
+
127
+ $all_notifications[] = [
128
+ 'id' => $this->product->get_key() . '_logger_flag',
129
+ 'message' => $message,
130
+ 'ctas' => [
131
+ 'confirm' => [
132
+ 'link' => '#',
133
+ 'text' => $button_submit,
134
+ ],
135
+ 'cancel' => [
136
+ 'link' => '#',
137
+ 'text' => $button_cancel,
138
+ ],
139
+ ],
140
+ ];
141
+
142
+ return $all_notifications;
143
+ }
144
+
145
+ /**
146
+ * Send the statistics to the api endpoint.
147
+ */
148
+ public function send_log() {
149
+ $environment = array();
150
+ $theme = wp_get_theme();
151
+ $environment['theme'] = array();
152
+ $environment['theme']['name'] = $theme->get( 'Name' );
153
+ $environment['theme']['author'] = $theme->get( 'Author' );
154
+ $environment['plugins'] = get_option( 'active_plugins' );
155
+
156
+ wp_remote_post(
157
+ self::TRACKING_ENDPOINT,
158
+ array(
159
+ 'method' => 'POST',
160
+ 'timeout' => 3,
161
+ 'redirection' => 5,
162
+ 'headers' => array(
163
+ 'X-ThemeIsle-Event' => 'log_site',
164
+ ),
165
+ 'body' => array(
166
+ 'site' => get_site_url(),
167
+ 'slug' => $this->product->get_slug(),
168
+ 'version' => $this->product->get_version(),
169
+ 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
170
+ 'environment' => $environment,
171
+ 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
172
+ ),
173
+ )
174
+ );
175
+ }
176
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Notification.php ADDED
@@ -0,0 +1,456 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The notification model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Product;
16
+
17
+ // Exit if accessed directly.
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Notification module for ThemeIsle SDK.
24
+ */
25
+ class Notification extends Abstract_Module {
26
+ /**
27
+ * Show notifications only after the user has the product installed after this amount of time, in hours.
28
+ */
29
+ const MIN_INSTALL_TIME = 100;
30
+ /**
31
+ * How much time should we show the notification, in days.
32
+ */
33
+ const MAX_TIME_TO_LIVE = 7;
34
+
35
+ /**
36
+ * Number of days between notifications.
37
+ */
38
+ const TIME_BETWEEN_NOTIFICATIONS = 5;
39
+
40
+ /**
41
+ * Holds a possible notification list.
42
+ *
43
+ * @var array Notifications list.
44
+ */
45
+ private static $notifications = [];
46
+
47
+ /**
48
+ * Show notification data.
49
+ */
50
+ public static function show_notification() {
51
+
52
+ $current_notification = self::get_last_notification();
53
+
54
+ $notification_details = [];
55
+ // Check if the saved notification is still present among the possible ones.
56
+ if ( ! empty( $current_notification ) ) {
57
+ $notification_details = self::get_notification_details( $current_notification );
58
+ if ( empty( $notification_details ) ) {
59
+ $current_notification = [];
60
+ }
61
+ }
62
+ // Check if the notificatin is expired.
63
+ if ( ! empty( $current_notification ) && self::is_notification_expired( $current_notification ) ) {
64
+ update_option( $current_notification['id'], 'no' );
65
+ self::set_last_active_notification_timestamp();
66
+ $current_notification = [];
67
+ }
68
+ // If we don't have any saved notification, get a new one.
69
+ if ( empty( $current_notification ) ) {
70
+ $notification_details = self::get_random_notification();
71
+ if ( empty( $notification_details ) ) {
72
+ return;
73
+ }
74
+ self::set_active_notification(
75
+ [
76
+ 'id' => $notification_details['id'],
77
+ 'display_at' => time(),
78
+ ]
79
+ );
80
+ }
81
+ if ( empty( $notification_details ) ) {
82
+ return;
83
+ }
84
+ $notification_html = self::get_notification_html( $notification_details );
85
+ do_action( $notification_details['id'] . '_before_render' );
86
+
87
+ echo $notification_html;
88
+
89
+ do_action( $notification_details['id'] . '_after_render' );
90
+ self::render_snippets();
91
+ }
92
+
93
+ /**
94
+ * Get last notification details.
95
+ *
96
+ * @return array Last notification details.
97
+ */
98
+ private static function get_last_notification() {
99
+ $notification = self::get_notifications_metadata();
100
+
101
+ return isset( $notification['last_notification'] ) ? $notification['last_notification'] : [];
102
+ }
103
+
104
+ /**
105
+ * Get notification center details.
106
+ *
107
+ * @return array Notification center details.
108
+ */
109
+ private static function get_notifications_metadata() {
110
+
111
+ $data = get_option(
112
+ 'themeisle_sdk_notifications',
113
+ [
114
+ 'last_notification' => [],
115
+ 'last_notification_active' => 0,
116
+ ]
117
+ );
118
+
119
+ return $data;
120
+
121
+ }
122
+
123
+ /**
124
+ * Check if the notification is still possible.
125
+ *
126
+ * @param array $notification Notification to check.
127
+ *
128
+ * @return array Either is still active or not.
129
+ */
130
+ private static function get_notification_details( $notification ) {
131
+ $notifications = array_filter(
132
+ self::$notifications,
133
+ function ( $value ) use ( $notification ) {
134
+ if ( isset( $value['id'] ) && isset( $notification['id'] ) && $value['id'] === $notification['id'] ) {
135
+ return true;
136
+ }
137
+
138
+ return false;
139
+ }
140
+ );
141
+
142
+ return ! empty( $notifications ) ? reset( $notifications ) : [];
143
+ }
144
+
145
+ /**
146
+ * Check if the notification is expired.
147
+ *
148
+ * @param array $notification Notification to check.
149
+ *
150
+ * @return bool Either the notification is due.
151
+ */
152
+ private static function is_notification_expired( $notification ) {
153
+ if ( ! isset( $notification['display_at'] ) ) {
154
+ return true;
155
+ }
156
+
157
+ $notifications = array_filter(
158
+ self::$notifications,
159
+ function ( $value ) use ( $notification ) {
160
+ if ( isset( $value['id'] ) && isset( $notification['id'] ) && $value['id'] === $notification['id'] ) {
161
+ return true;
162
+ }
163
+
164
+ return false;
165
+ }
166
+ );
167
+
168
+ if ( empty( $notifications ) ) {
169
+ return true;
170
+ }
171
+ $notification_definition = reset( $notifications );
172
+
173
+ $when_to_expire = isset( $notification_definition['expires_at'] )
174
+ ? $notification_definition['expires_at'] :
175
+ ( isset( $notification_definition['expires'] )
176
+ ? ( $notification['display_at'] + $notification_definition['expires'] ) :
177
+ ( $notification['display_at'] + self::MAX_TIME_TO_LIVE * DAY_IN_SECONDS )
178
+ );
179
+
180
+ return ( $when_to_expire - time() ) < 0;
181
+ }
182
+
183
+ /**
184
+ * Set last notification details.
185
+ */
186
+ private static function set_last_active_notification_timestamp() {
187
+ $metadata = self::get_notifications_metadata();
188
+ $metadata['last_notification_active'] = time();
189
+ update_option( 'themeisle_sdk_notifications', $metadata );
190
+ }
191
+
192
+ /**
193
+ * Return notification to show.
194
+ *
195
+ * @return array Notification data.
196
+ */
197
+ public static function get_random_notification() {
198
+ if ( ( time() - self::get_last_active_notification_timestamp() ) < self::TIME_BETWEEN_NOTIFICATIONS * DAY_IN_SECONDS ) {
199
+ return [];
200
+ }
201
+
202
+ $notifications = self::$notifications;
203
+ $notifications = array_filter(
204
+ $notifications,
205
+ function ( $value ) {
206
+ if ( isset( $value['sticky'] ) && true === $value['sticky'] ) {
207
+ return true;
208
+ }
209
+
210
+ return false;
211
+ }
212
+ );
213
+ // No priority notifications, use all.
214
+ if ( empty( $notifications ) ) {
215
+ $notifications = self::$notifications;
216
+ }
217
+ if ( empty( $notifications ) ) {
218
+ return [];
219
+ }
220
+ $notifications = array_values( $notifications );
221
+
222
+ return $notifications[ array_rand( $notifications, 1 ) ];
223
+
224
+ }
225
+
226
+ /**
227
+ * Get last notification details.
228
+ *
229
+ * @return array Last notification details.
230
+ */
231
+ private static function get_last_active_notification_timestamp() {
232
+ $notification = self::get_notifications_metadata();
233
+
234
+ return isset( $notification['last_notification_active'] ) ? $notification['last_notification_active'] : 0;
235
+ }
236
+
237
+ /**
238
+ * Get last notification details.
239
+ *
240
+ * @param array $notification Notification data.
241
+ */
242
+ private static function set_active_notification( $notification ) {
243
+ $metadata = self::get_notifications_metadata();
244
+ $metadata['last_notification'] = $notification;
245
+ update_option( 'themeisle_sdk_notifications', $metadata );
246
+ }
247
+
248
+ /**
249
+ * Get notification html.
250
+ *
251
+ * @param array $notification_details Notification details.
252
+ *
253
+ * @return string Html for notice.
254
+ */
255
+ public static function get_notification_html( $notification_details ) {
256
+ $default = [
257
+ 'id' => '',
258
+ 'heading' => '',
259
+ 'message' => '',
260
+ 'ctas' => [
261
+ 'confirm' => [
262
+ 'link' => '#',
263
+ 'text' => '',
264
+ ],
265
+ 'cancel' => [
266
+ 'link' => '#',
267
+ 'text' => '',
268
+ ],
269
+ ],
270
+ ];
271
+ $notification_details = wp_parse_args( $notification_details, $default );
272
+
273
+ $notification_html = '<div class="notice notice-success is-dismissible themeisle-sdk-notice" data-notification-id="' . esc_attr( $notification_details['id'] ) . '" id="' . esc_attr( $notification_details['id'] ) . '-notification"> <div class="themeisle-sdk-notification-box">';
274
+
275
+ if ( ! empty( $notification_details['heading'] ) ) {
276
+ $notification_html .= sprintf( '<h4>%s</h4>', wp_kses_post( $notification_details['heading'] ) );
277
+ }
278
+ if ( ! empty( $notification_details['message'] ) ) {
279
+ $notification_html .= wp_kses_post( $notification_details['message'] );
280
+ }
281
+ $notification_html .= '<div class="actions">';
282
+
283
+ if ( ! empty( $notification_details['ctas']['confirm']['text'] ) ) {
284
+ $notification_html .= sprintf(
285
+ '<a href="%s" target="_blank" class=" button button-primary %s" data-confirm="yes" >%s</a>',
286
+ esc_url( $notification_details['ctas']['confirm']['link'] ),
287
+ esc_attr( $notification_details['id'] . '_confirm' ),
288
+ wp_kses_post( $notification_details['ctas']['confirm']['text'] )
289
+ );
290
+ }
291
+
292
+ if ( ! empty( $notification_details['ctas']['cancel']['text'] ) ) {
293
+ $notification_html .= sprintf(
294
+ '<a href="%s" class=" button %s" data-confirm="no">%s</a>',
295
+ esc_url( $notification_details['ctas']['cancel']['link'] ),
296
+ esc_attr( $notification_details['id'] ) . '_cancel',
297
+ wp_kses_post( $notification_details['ctas']['cancel']['text'] )
298
+ );
299
+ }
300
+
301
+ $notification_html .= '</div>';
302
+ $notification_html .= ' </div>';
303
+ $notification_html .= ' </div>';
304
+
305
+ return $notification_html;
306
+ }
307
+
308
+ /**
309
+ * Adds js snippet for hiding the notice.
310
+ */
311
+ public static function render_snippets() {
312
+
313
+ ?>
314
+ <style type="text/css">
315
+ .themeisle-sdk-notification-box {
316
+ padding: 3px;
317
+ }
318
+
319
+ .themeisle-sdk-notification-box .actions {
320
+ margin-top: 6px;
321
+ margin-bottom: 4px;
322
+ }
323
+
324
+ .themeisle-sdk-notification-box .button {
325
+ margin-right: 5px;
326
+ }
327
+ </style>
328
+ <script type="text/javascript">
329
+ (function ($) {
330
+ $(document).ready(function () {
331
+ $('#wpbody-content').on('click', ".themeisle-sdk-notice a.button, .themeisle-sdk-notice .notice-dismiss", function (e) {
332
+
333
+ var container = $('.themeisle-sdk-notice');
334
+ var link = $(this);
335
+ var notification_id = container.attr('data-notification-id');
336
+ var confirm = link.attr('data-confirm');
337
+ if (typeof confirm === "undefined") {
338
+ confirm = 'no';
339
+ }
340
+ $.post(
341
+ ajaxurl,
342
+ {
343
+ 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
344
+ 'action': 'themeisle_sdk_dismiss_notice',
345
+ 'id': notification_id,
346
+ 'confirm': confirm
347
+ }
348
+ );
349
+ if (confirm === 'yes') {
350
+ $(this).trigger('themeisle-sdk:confirmed');
351
+ } else {
352
+ $(this).trigger('themeisle-sdk:canceled');
353
+ }
354
+ container.hide();
355
+ if (link.attr('href') === '#') {
356
+ return false;
357
+ }
358
+ });
359
+ });
360
+ })(jQuery);
361
+ </script>
362
+ <?php
363
+ }
364
+
365
+ /**
366
+ * Dismiss the notification.
367
+ */
368
+ static function dismiss() {
369
+ check_ajax_referer( (string) __CLASS__, 'nonce' );
370
+
371
+ $id = isset( $_POST['id'] ) ? sanitize_text_field( $_POST['id'] ) : '';
372
+ $confirm = isset( $_POST['confirm'] ) ? sanitize_text_field( $_POST['confirm'] ) : 'no';
373
+
374
+ if ( empty( $id ) ) {
375
+ wp_send_json( [] );
376
+ }
377
+ self::set_last_active_notification_timestamp();
378
+ update_option( $id, $confirm );
379
+ do_action( $id . '_process_confirm', $confirm );
380
+ wp_send_json( [] );
381
+ }
382
+
383
+ /**
384
+ * Check if we should load the notification module.
385
+ *
386
+ * @param Product $product Product to check.
387
+ *
388
+ * @return bool Should we load this?
389
+ */
390
+ public function can_load( $product ) {
391
+
392
+ if ( $this->is_from_partner( $product ) ) {
393
+ return false;
394
+ }
395
+ if ( ! current_user_can( 'manage_options' ) ) {
396
+ return false;
397
+ }
398
+ if ( ( time() - $product->get_install_time() ) < ( self::MIN_INSTALL_TIME * HOUR_IN_SECONDS ) ) {
399
+ return false;
400
+ }
401
+
402
+ return true;
403
+ }
404
+
405
+ /**
406
+ * Setup notifications queue.
407
+ */
408
+ public static function setup_notifications() {
409
+ $notifications = apply_filters( 'themeisle_sdk_registered_notifications', [] );
410
+ $notifications = array_filter(
411
+ $notifications,
412
+ function ( $value ) {
413
+ if ( ! isset( $value['id'] ) ) {
414
+ return false;
415
+ }
416
+ if ( get_option( $value['id'], '' ) !== '' ) {
417
+ return false;
418
+ }
419
+
420
+ return apply_filters( $value['id'] . '_should_show', true );
421
+ }
422
+ );
423
+ self::$notifications = $notifications;
424
+ }
425
+ /**
426
+ * Load the module logic.
427
+ *
428
+ * @param Product $product Product to load the module for.
429
+ *
430
+ * @return Notification Module instance.
431
+ */
432
+ public function load( $product ) {
433
+ $this->product = $product;
434
+
435
+ $notifications = apply_filters( 'themeisle_sdk_registered_notifications', [] );
436
+ $notifications = array_filter(
437
+ $notifications,
438
+ function ( $value ) {
439
+ if ( ! isset( $value['id'] ) ) {
440
+ return false;
441
+ }
442
+ if ( get_option( $value['id'], '' ) !== '' ) {
443
+ return false;
444
+ }
445
+
446
+ return apply_filters( $value['id'] . '_should_show', true );
447
+ }
448
+ );
449
+ self::$notifications = $notifications;
450
+ add_action( 'admin_notices', array( __CLASS__, 'show_notification' ) );
451
+ add_action( 'wp_ajax_themeisle_sdk_dismiss_notice', array( __CLASS__, 'dismiss' ) );
452
+ add_action( 'admin_head', array( __CLASS__, 'setup_notifications' ) );
453
+
454
+ return $this;
455
+ }
456
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Review.php ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The Review model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Product;
16
+
17
+ // Exit if accessed directly.
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Review module for ThemeIsle SDK.
24
+ */
25
+ class Review extends Abstract_Module {
26
+
27
+ /**
28
+ * Check if we should load module for this.
29
+ *
30
+ * @param Product $product Product to check.
31
+ *
32
+ * @return bool Should load ?
33
+ */
34
+ public function can_load( $product ) {
35
+ if ( $this->is_from_partner( $product ) ) {
36
+ return false;
37
+ }
38
+ if ( ! $product->is_wordpress_available() ) {
39
+ return false;
40
+ }
41
+
42
+ return apply_filters( $product->get_slug() . '_sdk_should_review', true );
43
+ }
44
+
45
+
46
+ /**
47
+ * Add notification to queue.
48
+ *
49
+ * @param array $all_notifications Previous notification.
50
+ *
51
+ * @return array All notifications.
52
+ */
53
+ public function add_notification( $all_notifications ) {
54
+
55
+ $developers = [
56
+ 'Bogdan',
57
+ 'Marius',
58
+ 'Hardeep',
59
+ 'Rodica',
60
+ 'Stefan',
61
+ 'Uriahs',
62
+ 'Madalin',
63
+ 'Radu',
64
+ 'Silviu',
65
+ 'Andrei',
66
+ ];
67
+
68
+ $link = 'https://wordpress.org/support/' . $this->product->get_type() . '/' . $this->product->get_slug() . '/reviews/#wporg-footer';
69
+
70
+ $message = apply_filters( $this->product->get_key() . '_feedback_review_message', '<p>Hey, it’s great to see you have <b>{product}</b> active for a few days now. How is everything going? If you can spare a few moments to rate it on WordPress.org it would help us a lot (and boost my motivation). Cheers! <br/> <br/>~ {developer}, developer of {product}</p>' );
71
+
72
+ $button_submit = apply_filters( $this->product->get_key() . '_feedback_review_button_do', 'Ok, I will gladly help.' );
73
+ $button_cancel = apply_filters( $this->product->get_key() . '_feedback_review_button_cancel', 'No, thanks.' );
74
+ $message = str_replace(
75
+ [ '{product}', '{developer}' ],
76
+ [
77
+ $this->product->get_friendly_name(),
78
+ $developers[ strlen( get_site_url() ) % 10 ],
79
+ ],
80
+ $message
81
+ );
82
+
83
+ $all_notifications[] = [
84
+ 'id' => $this->product->get_key() . '_review_flag',
85
+ 'message' => $message,
86
+ 'ctas' => [
87
+ 'confirm' => [
88
+ 'link' => $link,
89
+ 'text' => $button_submit,
90
+ ],
91
+ 'cancel' => [
92
+ 'link' => '#',
93
+ 'text' => $button_cancel,
94
+ ],
95
+ ],
96
+ ];
97
+
98
+ return $all_notifications;
99
+ }
100
+
101
+
102
+ /**
103
+ * Load module logic.
104
+ *
105
+ * @param Product $product Product to load.
106
+ *
107
+ * @return Review Module instance.
108
+ */
109
+ public function load( $product ) {
110
+
111
+ $this->product = $product;
112
+
113
+ add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
114
+
115
+ return $this;
116
+ }
117
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Rollback.php ADDED
@@ -0,0 +1,376 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The rollback class for ThemeIsle SDK.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Rollback
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ // Exit if accessed directly.
15
+ use ThemeisleSDK\Common\Abstract_Module;
16
+ use ThemeisleSDK\Product;
17
+
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Rollback for ThemeIsle SDK.
24
+ */
25
+ class Rollback extends Abstract_Module {
26
+
27
+ /**
28
+ * Add js scripts for themes rollback.
29
+ */
30
+ public function add_footer() {
31
+ $screen = get_current_screen();
32
+ if ( ! isset( $screen->parent_file ) ) {
33
+ return;
34
+ }
35
+ if ( 'themes.php' !== $screen->parent_file ) {
36
+ return;
37
+ }
38
+ if ( ! $this->product->is_theme() ) {
39
+ return;
40
+ }
41
+ $version = $this->get_rollback();
42
+ if ( empty( $version ) ) {
43
+ return;
44
+ }
45
+ ?>
46
+ <script type="text/javascript">
47
+ jQuery(document).ready(function ($) {
48
+ setInterval(checkTheme, 500);
49
+
50
+ function checkTheme() {
51
+ var theme = '<?php echo esc_attr( $this->product->get_slug() ); ?>-action';
52
+
53
+ if (jQuery('#' + theme).length > 0) {
54
+ if (jQuery('.theme-overlay.active').is(':visible')) {
55
+ if (jQuery('#' + theme + '-rollback').length === 0) {
56
+ jQuery('.theme-actions .active-theme').prepend('<a class="button" style="float:left" id="' + theme + '-rollback" href="<?php echo esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) ); ?>">Rollback to v<?php echo esc_attr( $version['version'] ); ?></a>')
57
+ }
58
+ }
59
+
60
+ }
61
+ }
62
+ })
63
+
64
+ </script>
65
+ <?php
66
+
67
+ }
68
+
69
+ /**
70
+ * Get the last rollback for this product.
71
+ *
72
+ * @return array The rollback version.
73
+ */
74
+ public function get_rollback() {
75
+ $rollback = array();
76
+ $versions = $this->get_api_versions();
77
+ $versions = apply_filters( $this->product->get_key() . '_rollbacks', $versions );
78
+ if ( empty( $versions ) ) {
79
+ return $rollback;
80
+ }
81
+ if ( $versions ) {
82
+ usort( $versions, array( $this, 'sort_rollback_array' ) );
83
+ foreach ( $versions as $version ) {
84
+ if ( isset( $version['version'] ) && isset( $version['url'] ) && version_compare( $this->product->get_version(), $version['version'], '>' ) ) {
85
+ $rollback = $version;
86
+ break;
87
+ }
88
+ }
89
+ }
90
+
91
+ return $rollback;
92
+ }
93
+
94
+ /**
95
+ * Get versions array from wp.org
96
+ *
97
+ * @return array Array of versions.
98
+ */
99
+ private function get_api_versions() {
100
+
101
+ $cache_key = $this->product->get_key() . '_' . preg_replace( '/[^0-9a-zA-Z ]/m', '', $this->product->get_version() ) . 'versions';
102
+ $cache_versions = get_transient( $cache_key );
103
+ if ( false === $cache_versions ) {
104
+ $versions = $this->get_remote_versions();
105
+ set_transient( $cache_key, $versions, 5 * DAY_IN_SECONDS );
106
+ } else {
107
+ $versions = is_array( $cache_versions ) ? $cache_versions : array();
108
+ }
109
+
110
+ return $versions;
111
+ }
112
+
113
+ /**
114
+ * Get remote versions zips.
115
+ *
116
+ * @return array Array of available versions.
117
+ */
118
+ private function get_remote_versions() {
119
+ $url = $this->get_versions_api_url();
120
+ if ( empty( $url ) ) {
121
+ return [];
122
+ }
123
+ $response = wp_remote_get( $url );
124
+ if ( is_wp_error( $response ) ) {
125
+ return array();
126
+ }
127
+ $response = wp_remote_retrieve_body( $response );
128
+
129
+ if ( is_serialized( $response ) ) {
130
+ $response = maybe_unserialize( $response );
131
+ } else {
132
+ $response = json_decode( $response );
133
+ }
134
+
135
+ if ( ! is_object( $response ) ) {
136
+ return array();
137
+ }
138
+ if ( ! isset( $response->versions ) ) {
139
+ return array();
140
+ }
141
+
142
+ $versions = array();
143
+ foreach ( $response->versions as $key => $value ) {
144
+ $versions[] = array(
145
+ 'version' => is_object( $value ) ? $value->version : $key,
146
+ 'url' => is_object( $value ) ? $value->file : $value,
147
+ );
148
+ }
149
+
150
+ return $versions;
151
+ }
152
+
153
+ /**
154
+ * Return url where to check for versions.
155
+ *
156
+ * @return string Url where to check for versions.
157
+ */
158
+ private function get_versions_api_url() {
159
+ if ( $this->product->is_wordpress_available() && $this->product->is_plugin() ) {
160
+ return sprintf( 'https://api.wordpress.org/plugins/info/1.0/%s', $this->product->get_slug() );
161
+ }
162
+ if ( $this->product->is_wordpress_available() && $this->product->is_theme() ) {
163
+ return sprintf( 'https://api.wordpress.org/themes/info/1.1/?action=theme_information&request[slug]=%s&request[fields][versions]=true', $this->product->get_slug() );
164
+ }
165
+ $license = $this->product->get_license();
166
+ if ( $this->product->requires_license() && strlen( $license ) < 10 ) {
167
+ return '';
168
+ }
169
+
170
+ return sprintf( '%s?edd_action=get_versions&name=%s&url=%s&license=%s', $this->product->get_store_url(), urlencode( $this->product->get_name() ), urlencode( get_site_url() ), $license );
171
+ }
172
+
173
+ /**
174
+ * Show the rollback links in the plugin page.
175
+ *
176
+ * @param array $links Plugin links.
177
+ *
178
+ * @return array $links Altered links.
179
+ */
180
+ public function add_rollback_link( $links ) {
181
+ $version = $this->get_rollback();
182
+ if ( empty( $version ) ) {
183
+ return $links;
184
+ }
185
+ $links[] = '<a href="' . wp_nonce_url( admin_url( 'admin-post.php?action=' . $this->product->get_key() . '_rollback' ), $this->product->get_key() . '_rollback' ) . '">' . sprintf( apply_filters( $this->product->get_key() . '_rollback_label', 'Rollback to v%s' ), $version['version'] ) . '</a>';
186
+
187
+ return $links;
188
+ }
189
+
190
+ /**
191
+ * Start the rollback operation.
192
+ */
193
+ public function start_rollback() {
194
+ if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( $_GET['_wpnonce'], $this->product->get_key() . '_rollback' ) ) {
195
+ wp_nonce_ays( '' );
196
+ }
197
+
198
+ if ( $this->product->is_plugin() ) {
199
+ $this->start_rollback_plugin();
200
+
201
+ return;
202
+ }
203
+ if ( $this->product->is_theme() ) {
204
+ $this->start_rollback_theme();
205
+
206
+ return;
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Start the rollback operation for the plugin.
212
+ */
213
+ private function start_rollback_plugin() {
214
+ $rollback = $this->get_rollback();
215
+ $plugin_transient = get_site_transient( 'update_plugins' );
216
+ $plugin_folder = $this->product->get_slug();
217
+ $plugin_file = $this->product->get_file();
218
+ $version = $rollback['version'];
219
+ $temp_array = array(
220
+ 'slug' => $plugin_folder,
221
+ 'new_version' => $version,
222
+ 'package' => $rollback['url'],
223
+ );
224
+
225
+ $temp_object = (object) $temp_array;
226
+ $plugin_transient->response[ $plugin_folder . '/' . $plugin_file ] = $temp_object;
227
+ set_site_transient( 'update_plugins', $plugin_transient );
228
+
229
+ $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
230
+
231
+ if ( false === $transient ) {
232
+ set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
233
+ require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
234
+ $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
235
+ $plugin = $plugin_folder . '/' . $plugin_file;
236
+ $nonce = 'upgrade-plugin_' . $plugin;
237
+ $url = 'update.php?action=upgrade-plugin&plugin=' . urlencode( $plugin );
238
+ $upgrader_skin = new \Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) );
239
+ $upgrader = new \Plugin_Upgrader( $upgrader_skin );
240
+ $upgrader->upgrade( $plugin );
241
+ delete_transient( $this->product->get_key() . '_warning_rollback' );
242
+ wp_die(
243
+ '',
244
+ $title,
245
+ array(
246
+ 'response' => 200,
247
+ )
248
+ );
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Start the rollback operation for the theme.
254
+ */
255
+ private function start_rollback_theme() {
256
+ add_filter( 'update_theme_complete_actions', array( $this, 'alter_links_theme_upgrade' ) );
257
+ $rollback = $this->get_rollback();
258
+ $transient = get_site_transient( 'update_themes' );
259
+ $folder = $this->product->get_slug();
260
+ $version = $rollback['version'];
261
+ $temp_array = array(
262
+ 'new_version' => $version,
263
+ 'package' => $rollback['url'],
264
+ );
265
+
266
+ $transient->response[ $folder . '/style.css' ] = $temp_array;
267
+ set_site_transient( 'update_themes', $transient );
268
+
269
+ $transient = get_transient( $this->product->get_key() . '_warning_rollback' );
270
+
271
+ if ( false === $transient ) {
272
+ set_transient( $this->product->get_key() . '_warning_rollback', 'in progress', 30 );
273
+ require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
274
+ $title = sprintf( apply_filters( $this->product->get_key() . '_rollback_message', 'Rolling back %s to v%s' ), $this->product->get_name(), $version );
275
+ $theme = $folder . '/style.css';
276
+ $nonce = 'upgrade-theme_' . $theme;
277
+ $url = 'update.php?action=upgrade-theme&theme=' . urlencode( $theme );
278
+
279
+ $upgrader = new \Theme_Upgrader( new \Theme_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'theme' ) ) );
280
+ $upgrader->upgrade( $theme );
281
+ delete_transient( $this->product->get_key() . '_warning_rollback' );
282
+ wp_die(
283
+ '',
284
+ $title,
285
+ array(
286
+ 'response' => 200,
287
+ )
288
+ );
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Alter links and remove duplicate customize message.
294
+ *
295
+ * @param array $links Array of old links.
296
+ *
297
+ * @return mixed Array of links.
298
+ */
299
+ public function alter_links_theme_upgrade( $links ) {
300
+ if ( isset( $links['preview'] ) ) {
301
+ $links['preview'] = str_replace( '<span aria-hidden="true">Customize</span>', '', $links['preview'] );
302
+ }
303
+
304
+ return $links;
305
+ }
306
+
307
+ /**
308
+ * Loads product object.
309
+ *
310
+ * @param Product $product Product object.
311
+ *
312
+ * @return bool Should we load the module?
313
+ */
314
+ public function can_load( $product ) {
315
+ if ( $this->is_from_partner( $product ) ) {
316
+ return false;
317
+ }
318
+ if ( $product->is_theme() && ! current_user_can( 'switch_themes' ) ) {
319
+ return false;
320
+ }
321
+
322
+ if ( $product->is_plugin() && ! current_user_can( 'install_plugins' ) ) {
323
+ return false;
324
+ }
325
+
326
+ return true;
327
+ }
328
+
329
+ /**
330
+ * Sort the rollbacks array in descending order.
331
+ *
332
+ * @param mixed $a First version to compare.
333
+ * @param mixed $b Second version to compare.
334
+ *
335
+ * @return bool Which version is greater?
336
+ */
337
+ public function sort_rollback_array( $a, $b ) {
338
+ return version_compare( $a['version'], $b['version'], '<' ) > 0;
339
+ }
340
+
341
+ /**
342
+ * Load module logic.
343
+ *
344
+ * @param Product $product Product object.
345
+ *
346
+ * @return $this Module object.
347
+ */
348
+ public function load( $product ) {
349
+ $this->product = $product;
350
+ $this->show_link();
351
+ $this->add_hooks();
352
+
353
+ return $this;
354
+ }
355
+
356
+ /**
357
+ * If product can be rolled back, show the link to rollback.
358
+ */
359
+ private function show_link() {
360
+ add_filter(
361
+ 'plugin_action_links_' . plugin_basename( $this->product->get_basefile() ),
362
+ array(
363
+ $this,
364
+ 'add_rollback_link',
365
+ )
366
+ );
367
+ }
368
+
369
+ /**
370
+ * Set the rollback hook. Strangely, this does not work if placed in the ThemeIsle_SDK_Rollback class, so it is being called from there instead.
371
+ */
372
+ public function add_hooks() {
373
+ add_action( 'admin_post_' . $this->product->get_key() . '_rollback', array( $this, 'start_rollback' ) );
374
+ add_action( 'admin_footer', array( $this, 'add_footer' ) );
375
+ }
376
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Translate.php ADDED
@@ -0,0 +1,918 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The translate model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Modules
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Product;
16
+
17
+ // Exit if accessed directly.
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Translate module for ThemeIsle SDK.
24
+ */
25
+ class Translate extends Abstract_Module {
26
+ /**
27
+ * List of available locales.
28
+ *
29
+ * @var array Array of available locals.
30
+ */
31
+ private static $locales = array(
32
+ 'af' => array(
33
+ 'slug' => 'af',
34
+ 'name' => 'Afrikaans',
35
+ ),
36
+ 'ak' => array(
37
+ 'slug' => 'ak',
38
+ 'name' => 'Akan',
39
+ ),
40
+ 'am' => array(
41
+ 'slug' => 'am',
42
+ 'name' => 'Amharic',
43
+ ),
44
+ 'ar' => array(
45
+ 'slug' => 'ar',
46
+ 'name' => 'Arabic',
47
+ ),
48
+ 'arq' => array(
49
+ 'slug' => 'arq',
50
+ 'name' => 'Algerian Arabic',
51
+ ),
52
+ 'ary' => array(
53
+ 'slug' => 'ary',
54
+ 'name' => 'Moroccan Arabic',
55
+ ),
56
+ 'as' => array(
57
+ 'slug' => 'as',
58
+ 'name' => 'Assamese',
59
+ ),
60
+ 'ast' => array(
61
+ 'slug' => 'ast',
62
+ 'name' => 'Asturian',
63
+ ),
64
+ 'az' => array(
65
+ 'slug' => 'az',
66
+ 'name' => 'Azerbaijani',
67
+ ),
68
+ 'azb' => array(
69
+ 'slug' => 'azb',
70
+ 'name' => 'South Azerbaijani',
71
+ ),
72
+ 'az_TR' => array(
73
+ 'slug' => 'az-tr',
74
+ 'name' => 'Azerbaijani (Turkey)',
75
+ ),
76
+ 'ba' => array(
77
+ 'slug' => 'ba',
78
+ 'name' => 'Bashkir',
79
+ ),
80
+ 'bal' => array(
81
+ 'slug' => 'bal',
82
+ 'name' => 'Catalan (Balear)',
83
+ ),
84
+ 'bcc' => array(
85
+ 'slug' => 'bcc',
86
+ 'name' => 'Balochi Southern',
87
+ ),
88
+ 'bel' => array(
89
+ 'slug' => 'bel',
90
+ 'name' => 'Belarusian',
91
+ ),
92
+ 'bg_BG' => array(
93
+ 'slug' => 'bg',
94
+ 'name' => 'Bulgarian',
95
+ ),
96
+ 'bn_BD' => array(
97
+ 'slug' => 'bn',
98
+ 'name' => 'Bengali',
99
+ ),
100
+ 'bo' => array(
101
+ 'slug' => 'bo',
102
+ 'name' => 'Tibetan',
103
+ ),
104
+ 'bre' => array(
105
+ 'slug' => 'br',
106
+ 'name' => 'Breton',
107
+ ),
108
+ 'bs_BA' => array(
109
+ 'slug' => 'bs',
110
+ 'name' => 'Bosnian',
111
+ ),
112
+ 'ca' => array(
113
+ 'slug' => 'ca',
114
+ 'name' => 'Catalan',
115
+ ),
116
+ 'ceb' => array(
117
+ 'slug' => 'ceb',
118
+ 'name' => 'Cebuano',
119
+ ),
120
+ 'ckb' => array(
121
+ 'slug' => 'ckb',
122
+ 'name' => 'Kurdish (Sorani)',
123
+ ),
124
+ 'co' => array(
125
+ 'slug' => 'co',
126
+ 'name' => 'Corsican',
127
+ ),
128
+ 'cs_CZ' => array(
129
+ 'slug' => 'cs',
130
+ 'name' => 'Czech',
131
+ ),
132
+ 'cy' => array(
133
+ 'slug' => 'cy',
134
+ 'name' => 'Welsh',
135
+ ),
136
+ 'da_DK' => array(
137
+ 'slug' => 'da',
138
+ 'name' => 'Danish',
139
+ ),
140
+ 'de_DE' => array(
141
+ 'slug' => 'de',
142
+ 'name' => 'German',
143
+ ),
144
+ 'de_CH' => array(
145
+ 'slug' => 'de-ch',
146
+ 'name' => 'German (Switzerland)',
147
+ ),
148
+ 'dv' => array(
149
+ 'slug' => 'dv',
150
+ 'name' => 'Dhivehi',
151
+ ),
152
+ 'dzo' => array(
153
+ 'slug' => 'dzo',
154
+ 'name' => 'Dzongkha',
155
+ ),
156
+ 'el' => array(
157
+ 'slug' => 'el',
158
+ 'name' => 'Greek',
159
+ ),
160
+ 'art_xemoji' => array(
161
+ 'slug' => 'art-xemoji',
162
+ 'name' => 'Emoji',
163
+ ),
164
+ 'en_US' => array(
165
+ 'slug' => 'en',
166
+ 'name' => 'English',
167
+ ),
168
+ 'en_AU' => array(
169
+ 'slug' => 'en-au',
170
+ 'name' => 'English (Australia)',
171
+ ),
172
+ 'en_CA' => array(
173
+ 'slug' => 'en-ca',
174
+ 'name' => 'English (Canada)',
175
+ ),
176
+ 'en_GB' => array(
177
+ 'slug' => 'en-gb',
178
+ 'name' => 'English (UK)',
179
+ ),
180
+ 'en_NZ' => array(
181
+ 'slug' => 'en-nz',
182
+ 'name' => 'English (New Zealand)',
183
+ ),
184
+ 'en_ZA' => array(
185
+ 'slug' => 'en-za',
186
+ 'name' => 'English (South Africa)',
187
+ ),
188
+ 'eo' => array(
189
+ 'slug' => 'eo',
190
+ 'name' => 'Esperanto',
191
+ ),
192
+ 'es_ES' => array(
193
+ 'slug' => 'es',
194
+ 'name' => 'Spanish (Spain)',
195
+ ),
196
+ 'es_AR' => array(
197
+ 'slug' => 'es-ar',
198
+ 'name' => 'Spanish (Argentina)',
199
+ ),
200
+ 'es_CL' => array(
201
+ 'slug' => 'es-cl',
202
+ 'name' => 'Spanish (Chile)',
203
+ ),
204
+ 'es_CO' => array(
205
+ 'slug' => 'es-co',
206
+ 'name' => 'Spanish (Colombia)',
207
+ ),
208
+ 'es_CR' => array(
209
+ 'slug' => 'es-cr',
210
+ 'name' => 'Spanish (Costa Rica)',
211
+ ),
212
+ 'es_GT' => array(
213
+ 'slug' => 'es-gt',
214
+ 'name' => 'Spanish (Guatemala)',
215
+ ),
216
+ 'es_MX' => array(
217
+ 'slug' => 'es-mx',
218
+ 'name' => 'Spanish (Mexico)',
219
+ ),
220
+ 'es_PE' => array(
221
+ 'slug' => 'es-pe',
222
+ 'name' => 'Spanish (Peru)',
223
+ ),
224
+ 'es_PR' => array(
225
+ 'slug' => 'es-pr',
226
+ 'name' => 'Spanish (Puerto Rico)',
227
+ ),
228
+ 'es_VE' => array(
229
+ 'slug' => 'es-ve',
230
+ 'name' => 'Spanish (Venezuela)',
231
+ ),
232
+ 'et' => array(
233
+ 'slug' => 'et',
234
+ 'name' => 'Estonian',
235
+ ),
236
+ 'eu' => array(
237
+ 'slug' => 'eu',
238
+ 'name' => 'Basque',
239
+ ),
240
+ 'fa_IR' => array(
241
+ 'slug' => 'fa',
242
+ 'name' => 'Persian',
243
+ ),
244
+ 'fa_AF' => array(
245
+ 'slug' => 'fa-af',
246
+ 'name' => 'Persian (Afghanistan)',
247
+ ),
248
+ 'fuc' => array(
249
+ 'slug' => 'fuc',
250
+ 'name' => 'Fulah',
251
+ ),
252
+ 'fi' => array(
253
+ 'slug' => 'fi',
254
+ 'name' => 'Finnish',
255
+ ),
256
+ 'fo' => array(
257
+ 'slug' => 'fo',
258
+ 'name' => 'Faroese',
259
+ ),
260
+ 'fr_FR' => array(
261
+ 'slug' => 'fr',
262
+ 'name' => 'French (France)',
263
+ ),
264
+ 'fr_BE' => array(
265
+ 'slug' => 'fr-be',
266
+ 'name' => 'French (Belgium)',
267
+ ),
268
+ 'fr_CA' => array(
269
+ 'slug' => 'fr-ca',
270
+ 'name' => 'French (Canada)',
271
+ ),
272
+ 'frp' => array(
273
+ 'slug' => 'frp',
274
+ 'name' => 'Arpitan',
275
+ ),
276
+ 'fur' => array(
277
+ 'slug' => 'fur',
278
+ 'name' => 'Friulian',
279
+ ),
280
+ 'fy' => array(
281
+ 'slug' => 'fy',
282
+ 'name' => 'Frisian',
283
+ ),
284
+ 'ga' => array(
285
+ 'slug' => 'ga',
286
+ 'name' => 'Irish',
287
+ ),
288
+ 'gd' => array(
289
+ 'slug' => 'gd',
290
+ 'name' => 'Scottish Gaelic',
291
+ ),
292
+ 'gl_ES' => array(
293
+ 'slug' => 'gl',
294
+ 'name' => 'Galician',
295
+ ),
296
+ 'gn' => array(
297
+ 'slug' => 'gn',
298
+ 'name' => 'Guaraní',
299
+ ),
300
+ 'gsw' => array(
301
+ 'slug' => 'gsw',
302
+ 'name' => 'Swiss German',
303
+ ),
304
+ 'gu' => array(
305
+ 'slug' => 'gu',
306
+ 'name' => 'Gujarati',
307
+ ),
308
+ 'hat' => array(
309
+ 'slug' => 'hat',
310
+ 'name' => 'Haitian Creole',
311
+ ),
312
+ 'hau' => array(
313
+ 'slug' => 'hau',
314
+ 'name' => 'Hausa',
315
+ ),
316
+ 'haw_US' => array(
317
+ 'slug' => 'haw',
318
+ 'name' => 'Hawaiian',
319
+ ),
320
+ 'haz' => array(
321
+ 'slug' => 'haz',
322
+ 'name' => 'Hazaragi',
323
+ ),
324
+ 'he_IL' => array(
325
+ 'slug' => 'he',
326
+ 'name' => 'Hebrew',
327
+ ),
328
+ 'hi_IN' => array(
329
+ 'slug' => 'hi',
330
+ 'name' => 'Hindi',
331
+ ),
332
+ 'hr' => array(
333
+ 'slug' => 'hr',
334
+ 'name' => 'Croatian',
335
+ ),
336
+ 'hu_HU' => array(
337
+ 'slug' => 'hu',
338
+ 'name' => 'Hungarian',
339
+ ),
340
+ 'hy' => array(
341
+ 'slug' => 'hy',
342
+ 'name' => 'Armenian',
343
+ ),
344
+ 'id_ID' => array(
345
+ 'slug' => 'id',
346
+ 'name' => 'Indonesian',
347
+ ),
348
+ 'ido' => array(
349
+ 'slug' => 'ido',
350
+ 'name' => 'Ido',
351
+ ),
352
+ 'is_IS' => array(
353
+ 'slug' => 'is',
354
+ 'name' => 'Icelandic',
355
+ ),
356
+ 'it_IT' => array(
357
+ 'slug' => 'it',
358
+ 'name' => 'Italian',
359
+ ),
360
+ 'ja' => array(
361
+ 'slug' => 'ja',
362
+ 'name' => 'Japanese',
363
+ ),
364
+ 'jv_ID' => array(
365
+ 'slug' => 'jv',
366
+ 'name' => 'Javanese',
367
+ ),
368
+ 'ka_GE' => array(
369
+ 'slug' => 'ka',
370
+ 'name' => 'Georgian',
371
+ ),
372
+ 'kab' => array(
373
+ 'slug' => 'kab',
374
+ 'name' => 'Kabyle',
375
+ ),
376
+ 'kal' => array(
377
+ 'slug' => 'kal',
378
+ 'name' => 'Greenlandic',
379
+ ),
380
+ 'kin' => array(
381
+ 'slug' => 'kin',
382
+ 'name' => 'Kinyarwanda',
383
+ ),
384
+ 'kk' => array(
385
+ 'slug' => 'kk',
386
+ 'name' => 'Kazakh',
387
+ ),
388
+ 'km' => array(
389
+ 'slug' => 'km',
390
+ 'name' => 'Khmer',
391
+ ),
392
+ 'kn' => array(
393
+ 'slug' => 'kn',
394
+ 'name' => 'Kannada',
395
+ ),
396
+ 'ko_KR' => array(
397
+ 'slug' => 'ko',
398
+ 'name' => 'Korean',
399
+ ),
400
+ 'kir' => array(
401
+ 'slug' => 'kir',
402
+ 'name' => 'Kyrgyz',
403
+ ),
404
+ 'lb_LU' => array(
405
+ 'slug' => 'lb',
406
+ 'name' => 'Luxembourgish',
407
+ ),
408
+ 'li' => array(
409
+ 'slug' => 'li',
410
+ 'name' => 'Limburgish',
411
+ ),
412
+ 'lin' => array(
413
+ 'slug' => 'lin',
414
+ 'name' => 'Lingala',
415
+ ),
416
+ 'lo' => array(
417
+ 'slug' => 'lo',
418
+ 'name' => 'Lao',
419
+ ),
420
+ 'lt_LT' => array(
421
+ 'slug' => 'lt',
422
+ 'name' => 'Lithuanian',
423
+ ),
424
+ 'lv' => array(
425
+ 'slug' => 'lv',
426
+ 'name' => 'Latvian',
427
+ ),
428
+ 'me_ME' => array(
429
+ 'slug' => 'me',
430
+ 'name' => 'Montenegrin',
431
+ ),
432
+ 'mg_MG' => array(
433
+ 'slug' => 'mg',
434
+ 'name' => 'Malagasy',
435
+ ),
436
+ 'mk_MK' => array(
437
+ 'slug' => 'mk',
438
+ 'name' => 'Macedonian',
439
+ ),
440
+ 'ml_IN' => array(
441
+ 'slug' => 'ml',
442
+ 'name' => 'Malayalam',
443
+ ),
444
+ 'mlt' => array(
445
+ 'slug' => 'mlt',
446
+ 'name' => 'Maltese',
447
+ ),
448
+ 'mn' => array(
449
+ 'slug' => 'mn',
450
+ 'name' => 'Mongolian',
451
+ ),
452
+ 'mr' => array(
453
+ 'slug' => 'mr',
454
+ 'name' => 'Marathi',
455
+ ),
456
+ 'mri' => array(
457
+ 'slug' => 'mri',
458
+ 'name' => 'Maori',
459
+ ),
460
+ 'ms_MY' => array(
461
+ 'slug' => 'ms',
462
+ 'name' => 'Malay',
463
+ ),
464
+ 'my_MM' => array(
465
+ 'slug' => 'mya',
466
+ 'name' => 'Myanmar (Burmese)',
467
+ ),
468
+ 'ne_NP' => array(
469
+ 'slug' => 'ne',
470
+ 'name' => 'Nepali',
471
+ ),
472
+ 'nb_NO' => array(
473
+ 'slug' => 'nb',
474
+ 'name' => 'Norwegian (Bokmål)',
475
+ ),
476
+ 'nl_NL' => array(
477
+ 'slug' => 'nl',
478
+ 'name' => 'Dutch',
479
+ ),
480
+ 'nl_BE' => array(
481
+ 'slug' => 'nl-be',
482
+ 'name' => 'Dutch (Belgium)',
483
+ ),
484
+ 'nn_NO' => array(
485
+ 'slug' => 'nn',
486
+ 'name' => 'Norwegian (Nynorsk)',
487
+ ),
488
+ 'oci' => array(
489
+ 'slug' => 'oci',
490
+ 'name' => 'Occitan',
491
+ ),
492
+ 'ory' => array(
493
+ 'slug' => 'ory',
494
+ 'name' => 'Oriya',
495
+ ),
496
+ 'os' => array(
497
+ 'slug' => 'os',
498
+ 'name' => 'Ossetic',
499
+ ),
500
+ 'pa_IN' => array(
501
+ 'slug' => 'pa',
502
+ 'name' => 'Punjabi',
503
+ ),
504
+ 'pl_PL' => array(
505
+ 'slug' => 'pl',
506
+ 'name' => 'Polish',
507
+ ),
508
+ 'pt_BR' => array(
509
+ 'slug' => 'pt-br',
510
+ 'name' => 'Portuguese (Brazil)',
511
+ ),
512
+ 'pt_PT' => array(
513
+ 'slug' => 'pt',
514
+ 'name' => 'Portuguese (Portugal)',
515
+ ),
516
+ 'ps' => array(
517
+ 'slug' => 'ps',
518
+ 'name' => 'Pashto',
519
+ ),
520
+ 'rhg' => array(
521
+ 'slug' => 'rhg',
522
+ 'name' => 'Rohingya',
523
+ ),
524
+ 'ro_RO' => array(
525
+ 'slug' => 'ro',
526
+ 'name' => 'Romanian',
527
+ ),
528
+ 'roh' => array(
529
+ 'slug' => 'roh',
530
+ 'name' => 'Romansh',
531
+ ),
532
+ 'ru_RU' => array(
533
+ 'slug' => 'ru',
534
+ 'name' => 'Russian',
535
+ ),
536
+ 'rue' => array(
537
+ 'slug' => 'rue',
538
+ 'name' => 'Rusyn',
539
+ ),
540
+ 'rup_MK' => array(
541
+ 'slug' => 'rup',
542
+ 'name' => 'Aromanian',
543
+ ),
544
+ 'sah' => array(
545
+ 'slug' => 'sah',
546
+ 'name' => 'Sakha',
547
+ ),
548
+ 'sa_IN' => array(
549
+ 'slug' => 'sa-in',
550
+ 'name' => 'Sanskrit',
551
+ ),
552
+ 'scn' => array(
553
+ 'slug' => 'scn',
554
+ 'name' => 'Sicilian',
555
+ ),
556
+ 'si_LK' => array(
557
+ 'slug' => 'si',
558
+ 'name' => 'Sinhala',
559
+ ),
560
+ 'sk_SK' => array(
561
+ 'slug' => 'sk',
562
+ 'name' => 'Slovak',
563
+ ),
564
+ 'sl_SI' => array(
565
+ 'slug' => 'sl',
566
+ 'name' => 'Slovenian',
567
+ ),
568
+ 'sna' => array(
569
+ 'slug' => 'sna',
570
+ 'name' => 'Shona',
571
+ ),
572
+ 'snd' => array(
573
+ 'slug' => 'snd',
574
+ 'name' => 'Sindhi',
575
+ ),
576
+ 'so_SO' => array(
577
+ 'slug' => 'so',
578
+ 'name' => 'Somali',
579
+ ),
580
+ 'sq' => array(
581
+ 'slug' => 'sq',
582
+ 'name' => 'Albanian',
583
+ ),
584
+ 'sq_XK' => array(
585
+ 'slug' => 'sq-xk',
586
+ 'name' => 'Shqip (Kosovo)',
587
+ ),
588
+ 'sr_RS' => array(
589
+ 'slug' => 'sr',
590
+ 'name' => 'Serbian',
591
+ ),
592
+ 'srd' => array(
593
+ 'slug' => 'srd',
594
+ 'name' => 'Sardinian',
595
+ ),
596
+ 'su_ID' => array(
597
+ 'slug' => 'su',
598
+ 'name' => 'Sundanese',
599
+ ),
600
+ 'sv_SE' => array(
601
+ 'slug' => 'sv',
602
+ 'name' => 'Swedish',
603
+ ),
604
+ 'sw' => array(
605
+ 'slug' => 'sw',
606
+ 'name' => 'Swahili',
607
+ ),
608
+ 'syr' => array(
609
+ 'slug' => 'syr',
610
+ 'name' => 'Syriac',
611
+ ),
612
+ 'szl' => array(
613
+ 'slug' => 'szl',
614
+ 'name' => 'Silesian',
615
+ ),
616
+ 'ta_IN' => array(
617
+ 'slug' => 'ta',
618
+ 'name' => 'Tamil',
619
+ ),
620
+ 'ta_LK' => array(
621
+ 'slug' => 'ta-lk',
622
+ 'name' => 'Tamil (Sri Lanka)',
623
+ ),
624
+ 'tah' => array(
625
+ 'slug' => 'tah',
626
+ 'name' => 'Tahitian',
627
+ ),
628
+ 'te' => array(
629
+ 'slug' => 'te',
630
+ 'name' => 'Telugu',
631
+ ),
632
+ 'tg' => array(
633
+ 'slug' => 'tg',
634
+ 'name' => 'Tajik',
635
+ ),
636
+ 'th' => array(
637
+ 'slug' => 'th',
638
+ 'name' => 'Thai',
639
+ ),
640
+ 'tir' => array(
641
+ 'slug' => 'tir',
642
+ 'name' => 'Tigrinya',
643
+ ),
644
+ 'tl' => array(
645
+ 'slug' => 'tl',
646
+ 'name' => 'Tagalog',
647
+ ),
648
+ 'tr_TR' => array(
649
+ 'slug' => 'tr',
650
+ 'name' => 'Turkish',
651
+ ),
652
+ 'tt_RU' => array(
653
+ 'slug' => 'tt',
654
+ 'name' => 'Tatar',
655
+ ),
656
+ 'tuk' => array(
657
+ 'slug' => 'tuk',
658
+ 'name' => 'Turkmen',
659
+ ),
660
+ 'twd' => array(
661
+ 'slug' => 'twd',
662
+ 'name' => 'Tweants',
663
+ ),
664
+ 'tzm' => array(
665
+ 'slug' => 'tzm',
666
+ 'name' => 'Tamazight (Central Atlas)',
667
+ ),
668
+ 'ug_CN' => array(
669
+ 'slug' => 'ug',
670
+ 'name' => 'Uighur',
671
+ ),
672
+ 'uk' => array(
673
+ 'slug' => 'uk',
674
+ 'name' => 'Ukrainian',
675
+ ),
676
+ 'ur' => array(
677
+ 'slug' => 'ur',
678
+ 'name' => 'Urdu',
679
+ ),
680
+ 'uz_UZ' => array(
681
+ 'slug' => 'uz',
682
+ 'name' => 'Uzbek',
683
+ ),
684
+ 'vi' => array(
685
+ 'slug' => 'vi',
686
+ 'name' => 'Vietnamese',
687
+ ),
688
+ 'wa' => array(
689
+ 'slug' => 'wa',
690
+ 'name' => 'Walloon',
691
+ ),
692
+ 'xho' => array(
693
+ 'slug' => 'xho',
694
+ 'name' => 'Xhosa',
695
+ ),
696
+ 'xmf' => array(
697
+ 'slug' => 'xmf',
698
+ 'name' => 'Mingrelian',
699
+ ),
700
+ 'yor' => array(
701
+ 'slug' => 'yor',
702
+ 'name' => 'Yoruba',
703
+ ),
704
+ 'zh_CN' => array(
705
+ 'slug' => 'zh-cn',
706
+ 'name' => 'Chinese (China)',
707
+ ),
708
+ 'zh_HK' => array(
709
+ 'slug' => 'zh-hk',
710
+ 'name' => 'Chinese (Hong Kong)',
711
+ ),
712
+ 'zh_TW' => array(
713
+ 'slug' => 'zh-tw',
714
+ 'name' => 'Chinese (Taiwan)',
715
+ ),
716
+ 'de_DE_formal' => array(
717
+ 'slug' => 'de/formal',
718
+ 'name' => 'German (Formal)',
719
+ ),
720
+ 'nl_NL_formal' => array(
721
+ 'slug' => 'nl/formal',
722
+ 'name' => 'Dutch (Formal)',
723
+ ),
724
+ 'de_CH_informal' => array(
725
+ 'slug' => 'de-ch/informal',
726
+ 'name' => 'Chinese (Taiwan)',
727
+ ),
728
+ 'pt_PT_ao90' => array(
729
+ 'slug' => 'pt/ao90',
730
+ 'name' => 'Portuguese (Portugal, AO90)',
731
+ ),
732
+ );
733
+
734
+ /**
735
+ * Check if we should load module for this.
736
+ *
737
+ * @param Product $product Product to check.
738
+ *
739
+ * @return bool Should load ?
740
+ */
741
+ public function can_load( $product ) {
742
+ if ( $this->is_from_partner( $product ) ) {
743
+ return false;
744
+ }
745
+ if ( ! $product->is_wordpress_available() ) {
746
+ return false;
747
+ }
748
+
749
+ $lang = $this->get_user_locale();
750
+
751
+ if ( 'en_US' === $lang ) {
752
+ return false;
753
+ }
754
+
755
+ $languages = $this->get_translations( $product );
756
+
757
+ if ( ! is_array( $languages ) ) {
758
+ return false;
759
+ }
760
+
761
+ if ( ! isset( $languages['translations'] ) ) {
762
+ return false;
763
+ }
764
+
765
+ $languages = $languages['translations'];
766
+
767
+ $available = wp_list_pluck( $languages, 'language' );
768
+
769
+ if ( in_array( $lang, $available ) ) {
770
+ return false;
771
+ }
772
+
773
+ if ( ! isset( self::$locales[ $lang ] ) ) {
774
+ return false;
775
+ }
776
+
777
+ return apply_filters( $product->get_slug() . '_sdk_enable_translate', true );
778
+ }
779
+
780
+ /**
781
+ * Get the user's locale.
782
+ */
783
+ private function get_user_locale() {
784
+ global $wp_version;
785
+ if ( version_compare( $wp_version, '4.7.0', '>=' ) ) {
786
+ return get_user_locale();
787
+ }
788
+ $user = wp_get_current_user();
789
+ if ( $user ) {
790
+ $locale = $user->locale;
791
+ }
792
+
793
+ return $locale ? $locale : get_locale();
794
+ }
795
+
796
+ /**
797
+ * Fetch translations from api.
798
+ *
799
+ * @param Product $product Product to check.
800
+ *
801
+ * @return mixed Translation array.
802
+ */
803
+ private function get_translations( $product ) {
804
+ $cache_key = $product->get_key() . '_all_languages';
805
+ $translations = get_transient( $cache_key );
806
+
807
+ if ( false === $translations ) {
808
+ require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
809
+ $translations = translations_api(
810
+ $product->get_type() . 's',
811
+ array(
812
+ 'slug' => $product->get_slug(),
813
+ 'version' => $product->get_version(),
814
+ )
815
+ );
816
+ set_transient( $cache_key, $translations, WEEK_IN_SECONDS );
817
+ }
818
+
819
+ return $translations;
820
+
821
+ }
822
+
823
+ /**
824
+ * Add notification to queue.
825
+ *
826
+ * @param array $all_notifications Previous notification.
827
+ *
828
+ * @return array All notifications.
829
+ */
830
+ public function add_notification( $all_notifications ) {
831
+
832
+ $lang = $this->get_user_locale();
833
+ $link = $this->get_locale_paths( $lang );
834
+ $language_meta = self::$locales[ $lang ];
835
+
836
+ $heading = apply_filters( $this->product->get_key() . '_feedback_translate_heading', 'Improve {product}' );
837
+ $heading = str_replace(
838
+ array( '{product}' ),
839
+ $this->product->get_friendly_name(),
840
+ $heading
841
+ );
842
+ $message = apply_filters(
843
+ $this->product->get_key() . '_feedback_translation',
844
+ 'Translating <b>{product}</b> into as many languages as possible is a huge project. We still need help with a lot of them, so if you are good at translating into <b>{language}</b>, it would be greatly appreciated.
845
+ The process is easy, and you can join by following the link below!'
846
+ );
847
+
848
+ $message = str_replace(
849
+ [ '{product}', '{language}' ],
850
+ [
851
+ $this->product->get_friendly_name(),
852
+ $language_meta['name'],
853
+ ],
854
+ $message
855
+ );
856
+
857
+ $button_submit = apply_filters( $this->product->get_key() . '_feedback_translate_button_do', 'Ok, I will gladly help.' );
858
+ $button_cancel = apply_filters( $this->product->get_key() . '_feedback_translate_button_cancel', 'No, thanks.' );
859
+
860
+ $all_notifications[] = [
861
+ 'id' => $this->product->get_key() . '_translate_flag',
862
+ 'heading' => $heading,
863
+ 'message' => $message,
864
+ 'ctas' => [
865
+ 'confirm' => [
866
+ 'link' => $link,
867
+ 'text' => $button_submit,
868
+ ],
869
+ 'cancel' => [
870
+ 'link' => '#',
871
+ 'text' => $button_cancel,
872
+ ],
873
+ ],
874
+ ];
875
+
876
+ return $all_notifications;
877
+ }
878
+
879
+ /**
880
+ * Return the locale path.
881
+ *
882
+ * @param string $locale Locale code.
883
+ *
884
+ * @return string Locale path.
885
+ */
886
+ private function get_locale_paths( $locale ) {
887
+ if ( empty( $locale ) ) {
888
+ return '';
889
+ }
890
+
891
+ $slug = isset( self::$locales[ $locale ] ) ? self::$locales[ $locale ]['slug'] : '';
892
+ if ( empty( $slug ) ) {
893
+ return '';
894
+ }
895
+ if ( strpos( $slug, '/' ) === false ) {
896
+ $slug .= '/default';
897
+ }
898
+ $url = 'https://translate.wordpress.org/projects/wp-' . $this->product->get_type() . 's/' . $this->product->get_slug() . '/' . ( $this->product->get_type() === 'plugin' ? 'dev/' : '' ) . $slug . '?filters%5Bstatus%5D=untranslated&sort%5Bby%5D=random';
899
+
900
+ return $url;
901
+ }
902
+
903
+ /**
904
+ * Load module logic.
905
+ *
906
+ * @param Product $product Product to load.
907
+ *
908
+ * @return Translate Module instance.
909
+ */
910
+ public function load( $product ) {
911
+
912
+ $this->product = $product;
913
+
914
+ add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
915
+
916
+ return $this;
917
+ }
918
+ }
vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php ADDED
@@ -0,0 +1,728 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The deactivate feedback model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Feedback
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK\Modules;
13
+
14
+ use ThemeisleSDK\Common\Abstract_Module;
15
+ use ThemeisleSDK\Product;
16
+
17
+ // Exit if accessed directly.
18
+ if ( ! defined( 'ABSPATH' ) ) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Uninstall feedback module for ThemeIsle SDK.
24
+ */
25
+ class Uninstall_Feedback extends Abstract_Module {
26
+ /**
27
+ * How many seconds before the deactivation window is triggered for themes?
28
+ *
29
+ * @var int Number of days.
30
+ */
31
+ const AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS = 3;
32
+ /**
33
+ * How many days before the deactivation window pops up again for the theme?
34
+ *
35
+ * @var int Number of days.
36
+ */
37
+ const PAUSE_DEACTIVATE_WINDOW_DAYS = 100;
38
+ /**
39
+ * Where to send the data.
40
+ *
41
+ * @var string Endpoint url.
42
+ */
43
+ const FEEDBACK_ENDPOINT = 'http://feedback.themeisle.com/wordpress/wp-json/__pirate_feedback_/v1/feedback';
44
+
45
+ /**
46
+ * Default options for plugins.
47
+ *
48
+ * @var array $options_plugin The main options list for plugins.
49
+ */
50
+ private $options_plugin = array(
51
+ 'I found a better plugin' => array(
52
+ 'id' => 3,
53
+ 'type' => 'text',
54
+ 'placeholder' => 'What\'s the plugin\'s name?',
55
+ ),
56
+ 'I could not get the plugin to work' => array(
57
+ 'id' => 4,
58
+ ),
59
+ 'I no longer need the plugin' => array(
60
+ 'id' => 5,
61
+ 'type' => 'textarea',
62
+ 'placeholder' => 'If you could improve one thing about our product, what would it be?',
63
+ ),
64
+ 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
65
+ 'id' => 6,
66
+ ),
67
+ );
68
+ /**
69
+ * Default options for theme.
70
+ *
71
+ * @var array $options_theme The main options list for themes.
72
+ */
73
+ private $options_theme = array(
74
+ 'I don\'t know how to make it look like demo' => array(
75
+ 'id' => 7,
76
+ ),
77
+ 'It lacks options' => array(
78
+ 'id' => 8,
79
+ ),
80
+ 'Is not working with a plugin that I need' => array(
81
+ 'id' => 9,
82
+ 'type' => 'text',
83
+ 'placeholder' => 'What is the name of the plugin',
84
+ ),
85
+ 'I want to try a new design, I don\'t like {theme} style' => array(
86
+ 'id' => 10,
87
+ ),
88
+ );
89
+ /**
90
+ * Default other option.
91
+ *
92
+ * @var array $other The other option
93
+ */
94
+ private $other = array(
95
+ 'Other' => array(
96
+ 'id' => 999,
97
+ 'type' => 'textarea',
98
+ 'placeholder' => 'cmon cmon tell us',
99
+ ),
100
+ );
101
+ /**
102
+ * Default heading for plugin.
103
+ *
104
+ * @var string $heading_plugin The heading of the modal
105
+ */
106
+ private $heading_plugin = 'Quick Feedback <span>Because we care about our clients, please leave us feedback.</span>';
107
+ /**
108
+ * Default heading for theme.
109
+ *
110
+ * @var string $heading_theme The heading of the modal
111
+ */
112
+ private $heading_theme = 'Looking to change {theme}? <span> What does not work for you?</span>';
113
+ /**
114
+ * Default submit button action text.
115
+ *
116
+ * @var string $button_submit The text of the deactivate button
117
+ */
118
+ private $button_submit = 'Submit &amp; Deactivate';
119
+ /**
120
+ * Default cancel button.
121
+ *
122
+ * @var string $button_cancel The text of the cancel button
123
+ */
124
+ private $button_cancel = 'Skip &amp; Deactivate';
125
+
126
+ /**
127
+ * Loads the additional resources
128
+ */
129
+ function load_resources() {
130
+ add_thickbox();
131
+
132
+ $id = $this->product->get_key() . '_deactivate';
133
+
134
+ $this->add_css( $this->product->get_type(), $this->product->get_key() );
135
+ $this->add_js( $this->product->get_type(), $this->product->get_key(), '#TB_inline?' . apply_filters( $this->product->get_key() . '_feedback_deactivate_attributes', 'width=600&height=550' ) . '&inlineId=' . $id );
136
+
137
+ echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
138
+ }
139
+
140
+ /**
141
+ * Loads the css
142
+ *
143
+ * @param string $type The type of product.
144
+ * @param string $key The product key.
145
+ */
146
+ function add_css( $type, $key ) {
147
+ $key = esc_attr( $key );
148
+ $suffix = Product::THEME_TYPE === $type ? 'theme-install-php' : 'plugins-php';
149
+ $icon = esc_attr( apply_filters( $this->product->get_slug() . '_uninstall_feedback_icon', '' ) );
150
+ if ( empty( $icon ) ) {
151
+ $icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkVDM0M4RkYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkVDM0M5MEYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2RUMzQzhERjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM2RUMzQzhFRjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KBNOswAAFtFJREFUeNrkWwmUXVWV3W/8Y81zkVAhgUwQg00IAYIRGcRuERDSKqALtVEbxRYcGzWIuhatKCYuUXQtERRtFAccQCDtckCZwpRISEIlIXMqlaGGP///ht7n3vd//YRUUkljN718a53U+++//97d95yzz3BvjDAM8fd02May4YndaZhoDErYeu/laCyN8rN16PuDAPA83mcAjjOxd8jcVypydhrlKspCSidlhPIk5T8p9/+PAP8fTrZJaaQ0UFxKiVKk/CvlU5Rk3b0C+gTKFZRvUa75/wJ4EuVcyimU2RGQdkqCkoOBDExjBoJx3Uwm5OlXt4bFrIPgTXSJK+DY59PEO8a5s0mPiEPyfUrwMieh3ED57qsTsJBhoXAOmps+gd6u85AvGtgxQEOmJcfj+vvxDsvS/hzsB5pkgA9QplJuoux59QD2g1ZUvCXhVe+4pnjxJc5gdx8SxTza1jwDY9ntMDdsBlLJQ4O2CTogRs+vBzydFmLCMm98NWl4OvL5O3Hd+09/9p8/iK/9GOjfRHZKpnHZWy7AlbfPRuK918DYTm3H3PHZWrQbVnHKtUBbh201EvSFvHLX0TLlK3ksRLG4HPPmnL7+0vfiaz8EOkwP+aduwPKbZ+DadyzBnVuPBa4nEQf+/hqW0zKvZcqkJoYmi0DTMXo2+cyltiu8oSi+HQrR3UG5+n9Fw6bFmRYJOVehUf/VAsrPacodOPtM3LcmjmPSwMz4cvzXAJEXt6C89gv49rJTcMk3zkdPL8e9e0iTVNHTTziuGTi9D5jF73oaNVg5RnLAjiywagfwp01ybiJufQOOuYMTdf9hg3s5H83oEQIWhYwOMGySf2KNFTjJchW0EMmPKB1KMx2d2LQFGCKtvPD0A1izbitnitcZbrat+T12Fi8i4C5g6y49kDkk7re/RoNtTmo+DiKmFlPupaZPbAPOp3VceSLwYD/fttrFUPlbSNsL+YgtB48QjGKmje+ceBlKlqsATBywIe82sG9TC5OhONqP2wOnucB0wRY13Cn6qQWPYgEtVNZvf8/J3RhnZAprrtjY81qkxHX3jGrtvn8esHgm0wzek6Vf76Y2Q19ncibBmymeM1Mz+H1IS2ji9XfPAuZzAm5+ajLWDn8JKfvymgprQczHyvbpGEh14f2nX89sLyVsehQmbQewKj5GBxtQzMXQ3DvyWcvxz9rPvFf9Fed+ELjnl8Q07To07FyJ3MATCDouxXmL344pO55nmsFs8avMHE8jmH1/puzmkEsarBo7n2dweCbn06YFxJizWJzFErVW5Kwez8m45VTgM08txqqhu5C0HxyDHNIIDSxedCP6Ozk5Bb6rNHzkpCWQTJqlwQcWcgkUh+NXG2b4sf1uSjDGPvQITh98Bh/5F35s6UXTovvR+eaVuPD6O/DRt8bg/uL7CK+nj75mI7DtD0CefhkUopfYkUZtDdyn75Y2kMz+wvtW6s8yMRmCaCLwG2Za6E5ch4xnoMLPZUo2g3uPPQfr25iNFob3U76BpUMTVK2JBLOmP37hU5hE5yzBvbZz2p6lyXYSiH/AvBVLCI/pRvnmG7Fy8nysYtgVEz+jIYPuu7+NSvIe2OfZMIvh4YuQevIRkxYtx6fxd662hkZOzu9257Fk/esZrlaI2arY+PY70d8yhRNZOWKWPobSS4fPFBx37YaeHkwdGrgCqfDWZGveRHAQI6GWje07EXvfRzB/0XzMn0UfzdBnH/oLwrOogTcfS7BbtSaPxL7kfp+aLayliR+nJytDEz8jnsRpDW/F45kVFTfE0rmXo7+VPOqXjygOn0f5qXgk5QnKc9Ty50MVfozbGjqyVFFwIFWM0XkioXPiB8hct9wGfI15Qmo3gnfSb3MZVW4e1SGmHtL8K1u1G1QYciyCflPqPFRK9ouN0/CJM6+LNBtOKA6Lqy6hfJri1H5jWbFUIX9D75597yM/NSWaiwfG4ZeDlpw4ldLvjXO23zOPeYMPw9/HqY5pRj+qg8/1yebYp0ktzwfNDGdgvnvcKnd6P7yKDmcTzLQE7Oc4SMflty1xA21JEyazng8v/4110uDmrrAphBXzdK47kUNYdS7j94ITEI7uhOkEh56sCefsGQ1cEotkIV3+ePKUm856txCXlKCXqLzgMIDfqEowaqQ1YaCv0URrjJyciGHu9k24+k8PsiB1EW8q6rg40S6GzPbZ3bSnOK1xAJZtHrpwmHDM4HODnDbtcAiPetNnb8x1fBFmebnK+oBHKVeOZ9JMBPEfHKDbTrBdKZMZX4gS3TDvmHjvA79BayGDYSONWKo8ce36BNZGgCd3EmyRRDt8BMw8kaNquhXmLC3vrHhOj2GXqp54POUHUVL0hQM1fBXvOjnlGOgm2Arjrcdn5VwHJ2zZggueXYEc4tSOD8vxxupW4zDAJcuaxBDSmUaQzzKS5HXV87cowWFMgWPElBtSHLPGW1I/L64HzGwB75KTjqShrI3JlBprgbnoPz3xONqZrVRoEKYVQrGzmJSkhgJ6PABGBLiPBBW3SJySXHhjJd8rfhiK/CVtF8X1pk3EdP4iL/x36ZOZtUonxClJ3iQ3lqldscQK70tmczj/mRUoE6z8TqolBboKWDqSVeDjabvZ0n7MxCH0A/ytjqyf5msspTCxTpvDEdCmHtZrKYuqgC8VbTe5ot1QZWjyg6ztYNbmzZi+Y5tkViqlNKhdQ4BVw45Dc3Uj0CIHalvuFfsJyuqrMLReAcI6+DGCHsX+AccZRPSR4JCa40bVtF8no4tJ4a7GxXELWLnRDyUBt7DghReQCop8gHFAmhdGPWd7f007ddqu4hLt+gX6vuTJCX4MXnHvlVRzS2lmrfgQxYVROtDg1sb+D6Zql4Y4PsY6ltasAQfanA3Px4xtWyIXqFZd9EXF0KFuw4h2rQioAu3UmbmpQUtiIKHDFKtoQTlb0t+9YkeFFtmNFUNMJw0ydGjUwErH16VNR6/rkT9zJCSJc8tNnjLnkD5rIp3N44TB7UzHx8KI75mcxGiw5XIENgLp2AdoPLq2Tx6aV1qOt01CcUieUTk8w0848SpjXeFUPDvUQmCBAloFK2IyZzC1jlIy8mnqN2bVlDWPlqnVhlwO7SOj/DymjYCARdRgBbA8yHXHfLhewwJW/GSbaJkaDrKwk0m4bXMwujkLv1JSWaJ6vIyoKvJMSWwM6XuVyXWM374kO8FBJknYKYn1T07hKzxyjPbfsE7qWoEyIsxU8SliNvFdZdJ8sctEIVEq1/xXDCVkdVQpOHAk+ZDYVSCQpubIj0w9SDVoQycnTGIwyAcOcBr7mAp6MSS6ephenonsrrX06wzcRJSLmJoMaYD0FpvjINsZbeQhxvAKx5HfiFR7hWltXV9bUtyB45G6YzPMS0scq1XTcFjT8Jiz26r0k4nlVS9ATUJ+jpVKcFgD1/uwvKY4GkeyI6fnbZQgWlt0fSqrDPJ039DgxfSFmkd5/Uk+9DiadSWrfhZjgRxrWohyIY+glFcmboQmgcdYVzTDdJs4KQ0E18RrBGi5KA3vRqb/e2jsLfKxjp5ctxW4mwnRmgHFlZ7y33BMwxHVBDqSlgVwuxF94YU6u/KV8UtzkjE3Yrux0B4qwGHF4kB4U5GmNkoQba21RoGWqI8soMVzHufnN1CaWc/6jh4N73HTSdJoS9TlqIoVdTwkhPH54u+Bg1hbL7zhhfByD8BtciS7AJa3oXD3Ls73ND7Oh7TpqiYtMELolkBkEFmzuqajTDnyYb/6i4NkRAKYZSdBM5pZUWjas0f/KBar8+U6ApNguJevepD3S1oq5WFYjjqT9GOPbiEpZ00KWgLpcVV0p0OE1uE0dHGiCLSBz3osicqyvchk5V1mzb9rJh2pStrdUSDca0buq8ZbZWgvMt4SycejnRgHKYCkiad8VF5C08fOnWPsXGXsGmh+bqTJ/5Gv+4skeOL/uxWJVTMwMuH+f2vnVcCVKMaWYIiKfsf33pLF8EuuKtsrDv1eIkagDTqo8+OSF1Y1vM6MNF5LOJT/Rg5QJPuWGGfNAzoH8rk4EkdxOKGb8uI8+6i1wUHdxKuxdB14N5J7ONCnKEkBRMuo7NXaRtSDluEoYNXzYIxn42KFW2H8mr/9RoD8YAK5bJqG7yGXSMC3rJqGa2YtU1RbnsJacZS9QlyS45vRzETxB3kOcJQAmlnlAC8v6Ya2NaG7saTSTbUSsX2H1mZ3J99i6BaPYYyJpO5Fyvd8zdxn82Ux+nSZBOinOIBG3cEQkgqicCXEZEvSQlm5De6d62CtcMmPDvYNtCh05GXsaGmlm/Pd5aI230hpokBZoeF8+VXA2yX58ALNxYrMOMNhpYJhFv4bWzswbe+gWp4/0JdL+RiGCbplCrVbbeYx91Ya6u2l9jy9hUHFV1NPgISpMuUXPF8VgZ7O8zSBm6MRUdmatITtZa1pE8H+gdHg90xP88yVYw72bGiHR841VdAMsbp7kn5HqJspSsOGNueK1uJW6cvZ0Yr6BWOa9RnfPSU+zbm/vRMX9P91nGIsxMiuBrXkku6kFXhV0FsYn8mufX3UakL7uBFpu8ri0vXYxGvfpbRR+qQ/ymE2+nqhf4TnWzlhLxLwFko+VGwfsHzd3d+OYjamwIp2C2T21cccq0mwluqHKsUs+DV3FJy7BfCDlE+q7ocCW1Ga0H+BZ6YcC+8xs6b9AwHLRO3a1KxCTLo9r8OQaGcX/ZmlJSZz5pv5vR1qbVc3usgT04a+f4R/VxDg414UNH3USjaJ55KvM8Hw6Q4717eiRP5wIt5leoLdqUb0d3VANe/qxik/r/PfX1cbAOTN8F7RqMkSzvA9DVYYkgnBo32TsT3Vwhf44y4/BjTnLRtbMTSQ1pwvaaGQlmRh617UMjwytvovImvDVUJL8LzBlrKGk0CRxSdh9WaGuTSvxwzkMzG8tJYxl2DdCFKoSj0Pz07qow83wygXUQ1Gmp1R5SQx598qwAZ1bwTBZw2/sgu+NmVEJm0z192VTuGxqceypK1gvCpW6ksh602bmrCV4rGiUhqVBN3k+fAwTZOgX1jDV/PdmYzWpLCqG9XTMgFy7lRragkbJKB8EQMbXWxY08yCy1Wldf3CiVS/D594orIaQ1mo7pULCZfHNsfcSxnU+7Sk7RJiA5/+Sf7gzv1MWkyLL//ZSSfirc8/zzwjPKAuHnt5Ujieyf3OXUkMZ1z09mTR0soUUIBX15IlKxOti7nXJyhG3Sq/76kmurx+eNjFjp2NJPE4Gvn8GIz9Jl2UsLmhDQ/PnKUX2eQdQri81w9q95JR8c0xi4wiMjV9l+GX51C7HzUi4hJN28UAj0yZhGe6e3Dqzu3Iwh23G5siMGmrDBdsrNnYgPSuBDoIurWpzCTMZ4IU+a56pRexeFhXaxsoknn3jiSxZyiGQs5BOrTQRgDmAWCrgH8697UYbOZ00BoNy9HRgn4fmrWGrCwobKgDnNAxTmvu0wQ7jdq9WJk1NW3zb9G1cMcpc3Dab7brimmcJpzyKYLu5PAkaR3OGViXt2EPkNASHhqZbCQI3LGDagRRIMuUfNFGJm+xxONAPQspPqNLadXcr8yrHi45ZWeiEXedOo+2WyJ1cGRq+cZSZaTkBtT0V3jh9v04x3SeQpibxxtGRKPSLriaoNtpWgurmnaLJfxqxhRc8WwfXrd9G0Zgjdt3rA6skeWdLEEXGY4ynLgcZ2AoK9SnSa32+9BQnmhT4jxvJcAUn+9EXYvxmkEpavfW+QuxpZ2ESu2GaoVfp6msukbD0FrCRy57Wa8g9p5f0s+eRzi0AIYnhWmZEc94yPTKi0hkvaJpiw5VJE+v7whx0Ysb4Pr2YZeFor6m0riYZRMhNfJvo3wmoJQ6t9DMJKOV0hY6PLcI+uDmW//cBpTxdFcvPn7hBZxAQ2l3LKMz/0jbvoqgfnawBTvLeRvhpVfDSD3Hp3GWStKkdzJGJfaQEeTONYJyl1FxOePD2HT2UnrALrxx5SSUEE60vVYDL3bhEk6cwJIEFuNfV5X7Ri3OH+6pYsoVMvn7Lv5HvNTWBlfiOlSltJl+chOB/htls+ztODjgxbKKx9fGNsFs+gPM9ntZkrK+tEdGjHz3b81ifD7cHZPDObfAbFmJJ2ZmMXVLA07d2oa8mt8j7i++TCa+ZhgyGnhYsuhM/Oqk6YiXmDeY5mBoWt8kwA9QHmYY9BXYcQDbtWEECf3XGoLR8X2QMSgztgT5rvuQ2ngG0ttglRLw3AAfvfZpdIzE8PrVnRhGpa67ZEZtfh0fxwCadZVW9bpRIz8j+nSo60Jdab7rK/Pm4tvzZiNeLA7CjP2ARHUbtfvShNcmEj9JtEWl0J66TZ6S2b4OZmkx06+FLDSVFdRWP8m07QT8nS/NxzmruzEkoGMBUhcW4E4vo9zvIv/LJIKyLLP6SF2Uh9PnofRXF7n7Eyp0WC28fnEOdpeP4tMMQcvjasKc7gqSb8nDag5QfDSO/J8lswoU2K/PnYUbz16wwTGdH5pm7K7QcjZSFGGFJsWOxIrxL8W0Dgp4drSzzVHNSr3Fty3a0jv+ki9BNzHkfHXpPFzy5CTElg0geWlG0yqDcf7HDdjzuVZ0LtuN+Hl5XWyzasrc3ozh25rQ+d1diJ1WrDWbRm5uRebeNLp/NAB7dinaZ2lg9DOt2Ht3E76+YMajSxfM/QFJ7Sem6exToBTYIwcsfxdR7o7ATsw0JFelVg1iuXXzdFy7uEHFT5BtmQUwQlRQejyO+MKC6lQq77HKCAs+ys/FEDtLth/FdP/KLiEYZhnX7yB2ulyXriSvx3i+r1z6ycfmfehtfed/H+1WOc2iIqiCOgrAJC21sYRFLO6LAM+e6Hq0RQ2ULQ99cwy8OdHNCyIs4o0043ce9hQBm6Tt9PB6g4qehpGFPZlAPH52u/X1MAnDzcCeRAMrs7Jy5DoLkYATksoWEyflbyqY7s7n9/WgUIrBdkNNSgKoKkbd+SFIq/6KOP5llPOjnaq7J7QIz/LOzUlY4ODcTmqL3uB06hXYkpR3BGx31V3nfaVQA3Wi+90u1ZVU99ukEIelnt2uvy+45tSpQ6nvXPgAnrrsDlwxaxUrRwsFz8HRHPYBw1+ktv8CA9FC7oSOuBnuYaLcBrvDqHU7jfU6T5LNKwJA9aaCqKMRRDvsOnV3RJp0og11Pa0nSMrRIK9VUtLLE3M6d+Dui36IM57ehqWr3oD+zGRYTFmtowQcQv9HC9Hy6ye42WCfZeDz81NSxFpfVqZbXVU0qsCk5OvV8xdGSyWmdD9oAW5v1I2sjO3ZkL2V1fv90aoidJzypca2cc3Jf8a7pq/CHS8uwJfXnIvthW7FsbI74Uj3Sz9GOScC/fNqDXmQTRXS87mlFARnzYwnll3U1JZFmR7g7dba9Bjh1F4Ot4IKjSUY0vslKzs0CLle3qZ70GLS5c16c4rBqqL8kloN1PsqX9K9aea7+42gHEfaKeLDJz+MNRd/HjedfB+unPYnloQWg4F52Dh8qO8lHk+Jtv+INWSjpp+MarjAYvvnfVNxSXOrlJWP8pY07BaClRLUl//g8Fma7FJqmfVAU3Q9WMfrzFF9ZkdxQ5GTtGoN40lev4cfblVmbST0xBnmI/xHdhcVDo6A8++UlH0+t28qrlxxPVbnZnBOjYOy9OG2Hm6OZPz9/q6EHNG4eTlHuIQaPY7mzN+Yn1N9JMMq0mQ/icquHmpwLa/LXotHVPEalD5EP23l9VUc+fUc9UoOKQU/9x7OLSndelJfHwesckRqtKyVdnLbOjQ4hUPuATP+3v4r3n8LMAAsR90w+kkNLQAAAABJRU5ErkJggg==';
152
+ }
153
+ ?>
154
+ <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
155
+ input[name="ti-deactivate-option"] ~ div {
156
+ display: none;
157
+ }
158
+
159
+ input[name="ti-deactivate-option"]:checked ~ div {
160
+ display: block;
161
+ }
162
+
163
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
164
+ background: none !important;
165
+ }
166
+
167
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
168
+ background: url('<?php echo $icon; ?>') 40px 30px no-repeat;
169
+ border: none;
170
+ box-sizing: border-box;
171
+ color: #373e40;
172
+ font-size: 24px;
173
+ font-weight: 700;
174
+ height: 90px;
175
+ padding: 40px 40px 0 120px;
176
+ text-transform: uppercase;
177
+ width: 100%;
178
+ }
179
+
180
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul i {
181
+ padding-left: 5px;
182
+ margin: 0 1px;
183
+ }
184
+
185
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul strong {
186
+ width: 125px;
187
+ display: block;
188
+ margin: 0;
189
+ float: left;
190
+ }
191
+
192
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul {
193
+ margin-left: 39px;
194
+ margin-top: 2px;
195
+ padding-top: 0px;
196
+ }
197
+
198
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content p {
199
+ font-style: italic;
200
+ margin-bottom: 0px;
201
+ }
202
+
203
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content {
204
+ display: none;
205
+ }
206
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure-content {
207
+ display: block;
208
+ position:absolute;
209
+ bottom: 100px;
210
+ }
211
+
212
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure {
213
+ top: -130px;
214
+ }
215
+
216
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open {
217
+ height: 590px !important;
218
+ }
219
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure {
220
+ position: absolute;
221
+ top: -50px;
222
+ font-size: 13px;
223
+ color: #8d9192;
224
+ font-weight: 400;
225
+ right: 40px;
226
+ }
227
+
228
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
229
+ box-sizing: border-box;
230
+ padding: 30px 40px;
231
+ background-color: #eaeaea;
232
+ }
233
+
234
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button {
235
+ background: #ec5d60;
236
+ border: none;
237
+ box-shadow: none;
238
+ color: #ffffff;
239
+ font-size: 15px;
240
+ font-weight: 700;
241
+ height: auto;
242
+ line-height: 20px;
243
+ padding: 10px 15px;
244
+ text-transform: uppercase;
245
+ -webkit-transition: 0.3s ease;
246
+ -moz-transition: 0.3s ease;
247
+ -ms-transition: 0.3s ease;
248
+ -o-transition: 0.3s ease;
249
+ transition: 0.3s ease;
250
+ }
251
+
252
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary {
253
+ background: transparent;
254
+ box-shadow: none;
255
+ color: #8d9192;
256
+ font-weight: 400;
257
+ float: right;
258
+ line-height: 40px;
259
+ padding: 0;
260
+ text-decoration: underline;
261
+ text-shadow: none;
262
+ text-transform: none;
263
+ }
264
+
265
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:hover {
266
+ background: #e83f42;
267
+ }
268
+
269
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
270
+ background: transparent;
271
+ }
272
+
273
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:focus {
274
+ box-shadow: none;
275
+ outline: none;
276
+ }
277
+
278
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:active {
279
+ box-shadow: none;
280
+ transform: translateY(0);
281
+ }
282
+
283
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:disabled {
284
+ cursor: not-allowed;
285
+ }
286
+
287
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
288
+ text-decoration: none;
289
+ }
290
+
291
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
292
+ background-color: #ffffff;
293
+ }
294
+
295
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list {
296
+ margin: 0;
297
+ }
298
+
299
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
300
+ color: #373e40;
301
+ font-size: 13px;
302
+ margin-bottom: 5px;
303
+ }
304
+
305
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li label {
306
+ margin-left: 10px;
307
+ line-height: 28px;
308
+ font-size: 15px;
309
+ }
310
+
311
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list input[type=radio] {
312
+ margin-top: 1px;
313
+ }
314
+
315
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxContent {
316
+ box-sizing: border-box;
317
+ height: auto !important;
318
+ padding: 20px 40px;
319
+ width: 100% !important;
320
+ }
321
+
322
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
323
+ padding: 10px 15px;
324
+ width: 100%;
325
+ }
326
+
327
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
328
+ margin: 10px 30px;
329
+ }
330
+
331
+ .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
332
+ box-sizing: border-box;
333
+ display: block;
334
+ float: none;
335
+ font-weight: 700;
336
+ line-height: 1;
337
+ padding: 0;
338
+ text-align: left;
339
+ width: 100%;
340
+ }
341
+
342
+ .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle span {
343
+ color: #8d9192;
344
+ display: block;
345
+ font-size: 15px;
346
+ font-weight: 400;
347
+ margin-top: 5px;
348
+ text-transform: none;
349
+ }
350
+
351
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
352
+ width: 100%;
353
+ display: block;
354
+ position: absolute;
355
+ left: 0;
356
+ bottom: 0;
357
+ }
358
+
359
+ .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
360
+ font-size: 32px;
361
+ }
362
+
363
+ .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
364
+ color: #eee;
365
+ }
366
+
367
+ .<?php echo $key; ?>-container #TB_closeWindowButton {
368
+ left: auto;
369
+ right: -5px;
370
+ top: -35px;
371
+ color: #eee;
372
+ }
373
+
374
+ .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
375
+ text-align: right;
376
+ line-height: 25px;
377
+ width: 25px;
378
+ height: 25px;
379
+ }
380
+
381
+ .<?php echo $key; ?>-container #TB_closeWindowButton:focus .tb-close-icon {
382
+ box-shadow: none;
383
+ outline: none;
384
+ }
385
+
386
+ .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
387
+ font: normal 25px dashicons;
388
+ }
389
+
390
+ body.<?php echo $suffix; ?> .<?php echo $key; ?>-container {
391
+ margin: auto !important;
392
+ height: 500px !important;
393
+ top: 0 !important;
394
+ left: 0 !important;
395
+ bottom: 0 !important;
396
+ right: 0 !important;
397
+ width: 600px !important;
398
+ }
399
+ </style>
400
+ <?php
401
+ do_action( $this->product->get_key() . '_uninstall_feedback_after_css' );
402
+ }
403
+
404
+ /**
405
+ * Loads the js.
406
+ *
407
+ * @param string $type The type of product.
408
+ * @param string $key The product key.
409
+ * @param string $src The url that will hijack the deactivate button url.
410
+ */
411
+ function add_js( $type, $key, $src ) {
412
+ $heading = Product::PLUGIN_TYPE === $type ? $this->heading_plugin : str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
413
+ $key = esc_attr( $key );
414
+ $heading = apply_filters( $this->product->get_key() . '_feedback_deactivate_heading', $heading );
415
+ ?>
416
+ <script type="text/javascript" id="ti-deactivate-js">
417
+ (function ($) {
418
+ $(document).ready(function () {
419
+ var auto_trigger = false;
420
+ var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
421
+ <?php
422
+ if ( 'theme' === $type ) {
423
+ ?>
424
+ auto_trigger = true;
425
+ if ($('a.ti-auto-anchor').length == 0) {
426
+ $('body').append($('<a class="ti-auto-anchor" href=""></a>'));
427
+ }
428
+ target_element = 'a.ti-auto-anchor';
429
+ <?php
430
+ }
431
+ ?>
432
+
433
+ if (auto_trigger) {
434
+ setTimeout(function () {
435
+ $('a.ti-auto-anchor').trigger('click');
436
+ }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
437
+ }
438
+ $(document).on('thickbox:removed', function () {
439
+ $.post(ajaxurl, {
440
+ 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
441
+ 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
442
+ 'type': '<?php echo $type; ?>',
443
+ 'key': '<?php echo $key; ?>'
444
+ });
445
+ });
446
+ var href = $(target_element).attr('href');
447
+ $('#<?php echo $key; ?>ti-deactivate-no').attr('data-ti-action', href).on('click', function (e) {
448
+ e.preventDefault();
449
+ e.stopPropagation();
450
+
451
+ $('body').unbind('thickbox:removed');
452
+ tb_remove();
453
+ var redirect = $(this).attr('data-ti-action');
454
+ if (redirect !== '') {
455
+ location.href = redirect;
456
+ }
457
+ });
458
+
459
+ $('#<?php echo $key; ?> ul.ti-list label, #<?php echo $key; ?> ul.ti-list input[name="ti-deactivate-option"]').on('click', function (e) {
460
+ $('#<?php echo $key; ?>ti-deactivate-yes').val($('#<?php echo $key; ?>ti-deactivate-yes').attr('data-after-text'));
461
+
462
+ var radio = $(this).prop('tagName') === 'LABEL' ? $(this).parent() : $(this);
463
+ if (radio.parent().find('textarea').length > 0 && radio.parent().find('textarea').val().length === 0) {
464
+ $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
465
+ radio.parent().find('textarea').on('keyup', function (ee) {
466
+ if ($(this).val().length === 0) {
467
+ $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
468
+ } else {
469
+ $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
470
+ }
471
+ });
472
+ } else {
473
+ $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
474
+ }
475
+ });
476
+ $("#<?php echo $key; ?>-info-disclosure").on('click', function () {
477
+ $("#TB_window").toggleClass("<?php echo $key; ?>-container-disc-open");
478
+ return false;
479
+ });
480
+ $('#<?php echo $key; ?>ti-deactivate-yes').attr('data-ti-action', href).on('click', function (e) {
481
+ e.preventDefault();
482
+ e.stopPropagation();
483
+ $.post(ajaxurl, {
484
+ 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
485
+ 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
486
+ 'id': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().attr('ti-option-id'),
487
+ 'msg': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().find('textarea').val(),
488
+ 'type': '<?php echo $type; ?>',
489
+ });
490
+ var redirect = $(this).attr('data-ti-action');
491
+ if (redirect != '') {
492
+ location.href = redirect;
493
+ } else {
494
+ $('body').unbind('thickbox:removed');
495
+ tb_remove();
496
+ }
497
+ });
498
+
499
+ $(target_element).attr('name', '<?php echo wp_kses( $heading, array( 'span' => array() ) ); ?>').attr('href', '<?php echo $src; ?>').addClass('thickbox');
500
+ var thicbox_timer;
501
+ $(target_element).on('click', function () {
502
+ tiBindThickbox();
503
+ });
504
+
505
+ function tiBindThickbox() {
506
+ var thicbox_timer = setTimeout(function () {
507
+ if ($("#<?php echo esc_html( $key ); ?>").is(":visible")) {
508
+ $("body").trigger('thickbox:iframe:loaded');
509
+ $("#TB_window").addClass("<?php echo $key; ?>-container");
510
+ clearTimeout(thicbox_timer);
511
+ $('body').unbind('thickbox:removed');
512
+ } else {
513
+ tiBindThickbox();
514
+ }
515
+ }, 100);
516
+ }
517
+ });
518
+ })(jQuery);
519
+ </script>
520
+ <?php
521
+
522
+ do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
523
+ }
524
+
525
+ /**
526
+ * Generates the HTML.
527
+ *
528
+ * @param string $type The type of product.
529
+ * @param string $key The product key.
530
+ */
531
+ function get_html( $type, $key ) {
532
+ $options = Product::PLUGIN_TYPE === $type ? $this->options_plugin : $this->options_theme;
533
+ $button_cancel = Product::PLUGIN_TYPE === $type ? $this->button_cancel : 'Skip';
534
+ $button_submit = Product::PLUGIN_TYPE === $type ? $this->button_submit : 'Submit';
535
+ $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
536
+ $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $button_submit );
537
+ $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $button_cancel );
538
+
539
+ $options += $this->other;
540
+
541
+ $list = '';
542
+ foreach ( $options as $title => $attributes ) {
543
+ $id = $attributes['id'];
544
+ $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
545
+ if ( array_key_exists( 'type', $attributes ) ) {
546
+ $list .= '<div>';
547
+ $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
548
+ switch ( $attributes['type'] ) {
549
+ case 'text':
550
+ $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
551
+ break;
552
+ case 'textarea':
553
+ $list .= '<textarea style="width: 100%" rows="2" name="comments" placeholder="' . $placeholder . '"></textarea>';
554
+ break;
555
+ }
556
+ $list .= '</div>';
557
+ }
558
+ $list .= '</li>';
559
+ }
560
+
561
+ $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
562
+ $disclosure_labels = array_merge(
563
+ [
564
+ 'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No domain name, email address or IP addresses are transmited after you submit the survey.',
565
+ 'items' => [
566
+ sprintf( '%s %s version %s %s %s %s', '<strong>', ucwords( $this->product->get_type() ), '</strong>', '<code>', $this->product->get_version(), '</code>' ),
567
+ sprintf( '%s Uninstall reason %s %s Selected reson from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
568
+ ],
569
+ ],
570
+ $disclosure_new_labels
571
+ );
572
+
573
+ $info_disclosure_link = '<a href="#" id="' . $this->product->get_key() . '-info-disclosure">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
574
+ $info_disclosure_content = '<div id="' . $this->product->get_key() . '-info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
575
+ foreach ( $disclosure_labels['items'] as $disclosure_item ) {
576
+ $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
577
+ }
578
+ $info_disclosure_content .= '</ul></div>';
579
+
580
+ return
581
+ '<div id="' . $this->product->get_key() . '"><ul class="ti-list">' . $list . '</ul>'
582
+ . $info_disclosure_content
583
+ . '<div class="actions">'
584
+ . get_submit_button(
585
+ $button_submit,
586
+ 'secondary',
587
+ $this->product->get_key() . 'ti-deactivate-yes',
588
+ false,
589
+ array(
590
+ 'data-after-text' => $button_submit,
591
+ 'disabled' => true,
592
+ )
593
+ )
594
+ . wp_kses_post( $info_disclosure_link )
595
+ . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
596
+ . '</div></div>';
597
+ }
598
+
599
+ /**
600
+ * Randomizes the options array.
601
+ *
602
+ * @param array $options The options array.
603
+ */
604
+ function randomize_options( $options ) {
605
+ $new = array();
606
+ $keys = array_keys( $options );
607
+ shuffle( $keys );
608
+
609
+ foreach ( $keys as $key ) {
610
+ $new[ $key ] = $options[ $key ];
611
+ }
612
+
613
+ return $new;
614
+ }
615
+
616
+ /**
617
+ * Called when the deactivate button is clicked.
618
+ */
619
+ function post_deactivate() {
620
+ check_ajax_referer( (string) __CLASS__, 'nonce' );
621
+
622
+ $this->post_deactivate_or_cancel();
623
+
624
+ if ( empty( $_POST['id'] ) ) {
625
+
626
+ wp_send_json( [] );
627
+
628
+ return;
629
+ }
630
+ $this->call_api(
631
+ array(
632
+ 'type' => 'deactivate',
633
+ 'id' => $_POST['id'],
634
+ 'comment' => isset( $_POST['msg'] ) ? $_POST['msg'] : '',
635
+ )
636
+ );
637
+ wp_send_json( [] );
638
+
639
+ }
640
+
641
+ /**
642
+ * Called when the deactivate/cancel button is clicked.
643
+ */
644
+ private function post_deactivate_or_cancel() {
645
+ if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) {
646
+ return;
647
+ }
648
+ if ( 'theme' !== $_POST['type'] ) {
649
+ return;
650
+ }
651
+
652
+ set_transient( 'ti_sdk_pause_' . $_POST['key'], true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );
653
+
654
+ }
655
+
656
+ /**
657
+ * Calls the API
658
+ *
659
+ * @param array $attributes The attributes of the post body.
660
+ *
661
+ * @return bool Is the request succesfull?
662
+ */
663
+ protected function call_api( $attributes ) {
664
+ $slug = $this->product->get_slug();
665
+ $version = $this->product->get_version();
666
+ $attributes['slug'] = $slug;
667
+ $attributes['version'] = $version;
668
+
669
+ $response = wp_remote_post(
670
+ self::FEEDBACK_ENDPOINT,
671
+ array(
672
+ 'body' => $attributes,
673
+ )
674
+ );
675
+
676
+ return is_wp_error( $response );
677
+ }
678
+
679
+ /**
680
+ * Should we load this object?.
681
+ *
682
+ * @param Product $product Product object.
683
+ *
684
+ * @return bool Should we load the module?
685
+ */
686
+ public function can_load( $product ) {
687
+ if ( $this->is_from_partner( $product ) ) {
688
+ return false;
689
+ }
690
+ if ( $product->is_theme() && ( false !== get_transient( 'ti_sdk_pause_' . $product->get_key(), false ) ) ) {
691
+ return false;
692
+ }
693
+
694
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
695
+ return true;
696
+ }
697
+ global $pagenow;
698
+
699
+ if ( ! isset( $pagenow ) || empty( $pagenow ) ) {
700
+ return false;
701
+ }
702
+
703
+ if ( $product->is_plugin() && 'plugins.php' !== $pagenow ) {
704
+ return false;
705
+
706
+ }
707
+ if ( $product->is_theme() && 'theme-install.php' !== $pagenow ) {
708
+ return false;
709
+ }
710
+
711
+ return true;
712
+ }
713
+
714
+ /**
715
+ * Loads module hooks.
716
+ *
717
+ * @param Product $product Product details.
718
+ *
719
+ * @return Uninstall_Feedback Current module instance.
720
+ */
721
+ public function load( $product ) {
722
+ $this->product = $product;
723
+ add_action( 'admin_head', array( $this, 'load_resources' ) );
724
+ add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
725
+
726
+ return $this;
727
+ }
728
+ }
vendor/codeinwp/themeisle-sdk/src/Product.php ADDED
@@ -0,0 +1,383 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * The product model class for ThemeIsle SDK
4
+ *
5
+ * @package ThemeIsleSDK
6
+ * @subpackage Product
7
+ * @copyright Copyright (c) 2017, Marius Cristea
8
+ * @license http://opensource.org/licenses/gpl-3.0.php GNU Public License
9
+ * @since 1.0.0
10
+ */
11
+
12
+ namespace ThemeisleSDK;
13
+
14
+ // Exit if accessed directly.
15
+ if ( ! defined( 'ABSPATH' ) ) {
16
+ exit;
17
+ }
18
+
19
+ /**
20
+ * Product model for ThemeIsle SDK.
21
+ */
22
+ class Product {
23
+ /**
24
+ * Define plugin type string.
25
+ */
26
+ const PLUGIN_TYPE = 'plugin';
27
+ /**
28
+ * Define theme type string.
29
+ */
30
+ const THEME_TYPE = 'theme';
31
+ /**
32
+ * If the product has a pro version, contains the pro slug.
33
+ *
34
+ * @var string $pro_slug Pro slug, if available.
35
+ */
36
+ public $pro_slug;
37
+ /**
38
+ * Current product slug.
39
+ *
40
+ * @var string $slug THe product slug.
41
+ */
42
+ private $slug;
43
+ /**
44
+ * Product basefile, with the proper metadata.
45
+ *
46
+ * @var string $basefile The file with headers.
47
+ */
48
+ private $basefile;
49
+ /**
50
+ * Type of the product.
51
+ *
52
+ * @var string $type The product type ( plugin | theme ).
53
+ */
54
+ private $type;
55
+ /**
56
+ * The file name.
57
+ *
58
+ * @var string $file The file name.
59
+ */
60
+ private $file;
61
+ /**
62
+ * Product name, fetched from the file headers.
63
+ *
64
+ * @var string $name The product name.
65
+ */
66
+ private $name;
67
+ /**
68
+ * Product normalized key.
69
+ *
70
+ * @var string $key The product ready key.
71
+ */
72
+ private $key;
73
+ /**
74
+ * Product store url.
75
+ *
76
+ * @var string $store_url The store url.
77
+ */
78
+ private $store_url;
79
+ /**
80
+ * Product install timestamp.
81
+ *
82
+ * @var int $install The date of install.
83
+ */
84
+ private $install;
85
+ /**
86
+ * Product store/author name.
87
+ *
88
+ * @var string $store_name The store name.
89
+ */
90
+ private $store_name;
91
+ /**
92
+ * Does the product requires license.
93
+ *
94
+ * @var bool $requires_license Either user needs to activate it with license.
95
+ */
96
+ private $requires_license;
97
+ /**
98
+ * Is the product available on wordpress.org
99
+ *
100
+ * @var bool $wordpress_available Either is available on WordPress or not.
101
+ */
102
+ private $wordpress_available;
103
+ /**
104
+ * Current version of the product.
105
+ *
106
+ * @var string $version The product version.
107
+ */
108
+ private $version;
109
+
110
+ /**
111
+ * ThemeIsle_SDK_Product constructor.
112
+ *
113
+ * @param string $basefile Product basefile.
114
+ */
115
+ public function __construct( $basefile ) {
116
+ if ( ! empty( $basefile ) ) {
117
+ if ( is_readable( $basefile ) ) {
118
+ $this->basefile = $basefile;
119
+ $this->setup_from_path();
120
+ $this->setup_from_fileheaders();
121
+ }
122
+ }
123
+ $install = get_option( $this->get_key() . '_install', 0 );
124
+ if ( 0 === $install ) {
125
+ $install = time();
126
+ update_option( $this->get_key() . '_install', time() );
127
+ }
128
+ $this->install = $install;
129
+
130
+ }
131
+
132
+ /**
133
+ * Setup props from path.
134
+ */
135
+ public function setup_from_path() {
136
+ $this->file = basename( $this->basefile );
137
+ $dir = dirname( $this->basefile );
138
+ $this->slug = basename( $dir );
139
+ $exts = explode( '.', $this->basefile );
140
+ $ext = $exts[ count( $exts ) - 1 ];
141
+ if ( 'css' === $ext ) {
142
+ $this->type = 'theme';
143
+ }
144
+ if ( 'php' === $ext ) {
145
+ $this->type = 'plugin';
146
+ }
147
+ $this->key = self::key_ready_name( $this->slug );
148
+ }
149
+
150
+ /**
151
+ * Normalize string.
152
+ *
153
+ * @param string $string the String to be normalized for cron handler.
154
+ *
155
+ * @return string $name The normalized string.
156
+ */
157
+ static function key_ready_name( $string ) {
158
+ return str_replace( '-', '_', strtolower( trim( $string ) ) );
159
+ }
160
+
161
+ /**
162
+ * Setup props from fileheaders.
163
+ */
164
+ public function setup_from_fileheaders() {
165
+ $file_headers = array(
166
+ 'Requires License' => 'Requires License',
167
+ 'WordPress Available' => 'WordPress Available',
168
+ 'Pro Slug' => 'Pro Slug',
169
+ 'Version' => 'Version',
170
+ );
171
+ if ( 'plugin' === $this->type ) {
172
+ $file_headers['Name'] = 'Plugin Name';
173
+ $file_headers['AuthorName'] = 'Author';
174
+ $file_headers['AuthorURI'] = 'Author URI';
175
+ }
176
+ if ( 'theme' === $this->type ) {
177
+ $file_headers['Name'] = 'Theme Name';
178
+ $file_headers['AuthorName'] = 'Author';
179
+ $file_headers['AuthorURI'] = 'Author URI';
180
+ }
181
+ $file_headers = get_file_data( $this->basefile, $file_headers );
182
+
183
+ $this->name = $file_headers['Name'];
184
+ $this->store_name = $file_headers['AuthorName'];
185
+ $this->author_url = $file_headers['AuthorURI'];
186
+ $this->store_url = $file_headers['AuthorURI'];
187
+
188
+ $this->requires_license = ( 'yes' === $file_headers['Requires License'] ) ? true : false;
189
+ $this->wordpress_available = ( 'yes' === $file_headers['WordPress Available'] ) ? true : false;
190
+ $this->pro_slug = ! empty( $file_headers['Pro Slug'] ) ? $file_headers['Pro Slug'] : '';
191
+ $this->version = $file_headers['Version'];
192
+
193
+ }
194
+
195
+ /**
196
+ * Return the product key.
197
+ *
198
+ * @return string The product key.
199
+ */
200
+ public function get_key() {
201
+ return $this->key;
202
+ }
203
+ /**
204
+ * Check if the product is either theme or plugin.
205
+ *
206
+ * @return string Product type.
207
+ */
208
+ public function get_type() {
209
+ return $this->type;
210
+ }
211
+
212
+ /**
213
+ * Return if the product is used as a plugin.
214
+ *
215
+ * @return bool Is plugin?
216
+ */
217
+ public function is_plugin() {
218
+ return self::PLUGIN_TYPE === $this->type;
219
+ }
220
+
221
+ /**
222
+ * Return if the product is used as a theme.
223
+ *
224
+ * @return bool Is theme ?
225
+ */
226
+ public function is_theme() {
227
+ return self::THEME_TYPE === $this->type;
228
+ }
229
+
230
+ /**
231
+ * Returns the product slug.
232
+ *
233
+ * @return string The product slug.
234
+ */
235
+ public function get_slug() {
236
+ return $this->slug;
237
+ }
238
+
239
+ /**
240
+ * The magic var_dump info method.
241
+ *
242
+ * @return array Debug info.
243
+ */
244
+ public function __debugInfo() {
245
+ return array(
246
+ 'name' => $this->name,
247
+ 'slug' => $this->slug,
248
+ 'version' => $this->version,
249
+ 'basefile' => $this->basefile,
250
+ 'key' => $this->key,
251
+ 'type' => $this->type,
252
+ 'store_name' => $this->store_name,
253
+ 'store_url' => $this->store_url,
254
+ 'wordpress_available' => $this->wordpress_available,
255
+ 'requires_license' => $this->requires_license,
256
+ );
257
+
258
+ }
259
+
260
+ /**
261
+ * Getter for product version.
262
+ *
263
+ * @return string The product version.
264
+ */
265
+ public function get_version() {
266
+ return $this->version;
267
+ }
268
+
269
+ /**
270
+ * Returns current product license, if available.
271
+ *
272
+ * @return string Return license key, if available.
273
+ */
274
+ public function get_license() {
275
+
276
+ if ( ! $this->requires_license() && ! $this->is_wordpress_available() ) {
277
+ return 'free';
278
+ }
279
+ $license_data = get_option( $this->get_key() . '_license_data', '' );
280
+
281
+ if ( empty( $license_data ) ) {
282
+ return get_option( $this->get_key() . '_license', '' );
283
+ }
284
+ if ( ! isset( $license_data->key ) ) {
285
+ return get_option( $this->get_key() . '_license', '' );
286
+ }
287
+
288
+ return $license_data->key;
289
+ }
290
+
291
+ /**
292
+ * Either the product requires license or not.
293
+ *
294
+ * @return bool Either requires license or not.
295
+ */
296
+ public function requires_license() {
297
+ return $this->requires_license;
298
+ }
299
+
300
+ /**
301
+ * If product is available on wordpress.org or not.
302
+ *
303
+ * @return bool Either is wp available or not.
304
+ */
305
+ public function is_wordpress_available() {
306
+ return $this->wordpress_available;
307
+ }
308
+
309
+ /**
310
+ * Return friendly name.
311
+ *
312
+ * @return string Friendly name.
313
+ */
314
+ public function get_friendly_name() {
315
+ $name = apply_filters( $this->get_key() . '_friendly_name', trim( str_replace( 'Lite', '', $this->get_name() ) ) );
316
+ $name = rtrim( $name, '- ()' );
317
+
318
+ return $name;
319
+ }
320
+
321
+ /**
322
+ * Getter for product name.
323
+ *
324
+ * @return string The product name.
325
+ */
326
+ public function get_name() {
327
+ return $this->name;
328
+ }
329
+
330
+ /**
331
+ * Returns the Store name.
332
+ *
333
+ * @return string Store name.
334
+ */
335
+ public function get_store_name() {
336
+ return $this->store_name;
337
+ }
338
+
339
+ /**
340
+ * Returns the store url.
341
+ *
342
+ * @return string The store url.
343
+ */
344
+ public function get_store_url() {
345
+ return $this->store_url;
346
+ }
347
+
348
+ /**
349
+ * Returns product basefile, which holds the metaheaders.
350
+ *
351
+ * @return string The product basefile.
352
+ */
353
+ public function get_basefile() {
354
+ return $this->basefile;
355
+ }
356
+
357
+ /**
358
+ * Returns product filename.
359
+ *
360
+ * @return string The product filename.
361
+ */
362
+ public function get_file() {
363
+ return $this->file;
364
+ }
365
+ /**
366
+ * Returns the pro slug, if available.
367
+ *
368
+ * @return string The pro slug.
369
+ */
370
+ public function get_pro_slug() {
371
+ return $this->pro_slug;
372
+ }
373
+
374
+ /**
375
+ * Return the install timestamp.
376
+ *
377
+ * @return int The install timestamp.
378
+ */
379
+ public function get_install_time() {
380
+ return $this->install;
381
+ }
382
+
383
+ }
vendor/codeinwp/themeisle-sdk/start.php CHANGED
@@ -7,32 +7,42 @@
7
  * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
8
  * @since 1.1.0
9
  */
 
 
 
 
 
 
10
  $products = apply_filters( 'themeisle_sdk_products', array() );
11
  $path = dirname( __FILE__ );
12
- $files_to_load = array(
13
- 'class-themeisle-sdk-loader.php',
14
- 'class-themeisle-sdk-product.php',
15
- 'class-themeisle-sdk-logger.php',
16
- 'class-themeisle-sdk-licenser.php',
17
- 'class-themeisle-sdk-rollback.php',
18
- 'class-themeisle-sdk-feedback-factory.php',
19
- 'class-themeisle-sdk-feedback.php',
20
- 'class-themeisle-sdk-feedback-deactivate.php',
21
- 'class-themeisle-sdk-feedback-review.php',
22
- 'class-themeisle-sdk-feedback-translate.php',
23
- 'class-themeisle-sdk-notification-manager.php',
24
- 'class-themeisle-sdk-widget.php',
25
- 'class-themeisle-sdk-widget-dashboard-blog.php',
26
- 'class-themeisle-sdk-widgets-factory.php',
27
- 'class-themeisle-sdk-endpoints.php',
28
- );
 
 
29
 
30
  foreach ( $files_to_load as $file ) {
31
- $file_path = $path . '/' . $file;
32
- if ( is_readable( $file_path ) ) {
33
- require_once $file_path;
34
  }
35
  }
 
 
 
36
  foreach ( $products as $product ) {
37
- ThemeIsle_SDK_Loader::init_product( $product );
38
  }
7
  * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
8
  * @since 1.1.0
9
  */
10
+
11
+ namespace ThemeisleSDK;
12
+
13
+ if ( ! defined( 'ABSPATH' ) ) {
14
+ exit;
15
+ }
16
  $products = apply_filters( 'themeisle_sdk_products', array() );
17
  $path = dirname( __FILE__ );
18
+ $files_to_load = [
19
+ $path . '/src/' . 'Loader.php',
20
+ $path . '/src/' . 'Product.php',
21
+
22
+ $path . '/src/' . 'Common/Abstract_module.php',
23
+ $path . '/src/' . 'Common/Module_factory.php',
24
+
25
+ $path . '/src/' . 'Modules/Dashboard_widget.php',
26
+ $path . '/src/' . 'Modules/Rollback.php',
27
+ $path . '/src/' . 'Modules/Uninstall_feedback.php',
28
+ $path . '/src/' . 'Modules/Licenser.php',
29
+ $path . '/src/' . 'Modules/Endpoint.php',
30
+ $path . '/src/' . 'Modules/Notification.php',
31
+ $path . '/src/' . 'Modules/Logger.php',
32
+ $path . '/src/' . 'Modules/Translate.php',
33
+ $path . '/src/' . 'Modules/Review.php',
34
+ ];
35
+
36
+ $files_to_load = array_merge( $files_to_load, apply_filters( 'themeisle_sdk_required_files', [] ) );
37
 
38
  foreach ( $files_to_load as $file ) {
39
+ if ( is_readable( $file ) ) {
40
+ require_once $file;
 
41
  }
42
  }
43
+
44
+ Loader::init();
45
+
46
  foreach ( $products as $product ) {
47
+ Loader::add_product( $product );
48
  }
vendor/codeinwp/themeisle-sdk/tests/bootstrap.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * PHPUnit bootstrap file
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ // Determine the tests directory (from a WP dev checkout).
9
+ // Try the WP_TESTS_DIR environment variable first.
10
+ $_tests_dir = getenv( 'WP_TESTS_DIR' );
11
+ // See if we're installed inside an existing WP dev instance.
12
+ if ( ! $_tests_dir ) {
13
+ $_try_tests_dir = dirname( __FILE__ ) . '/../../../../../tests/phpunit';
14
+ if ( file_exists( $_try_tests_dir . '/includes/functions.php' ) ) {
15
+ $_tests_dir = $_try_tests_dir;
16
+ }
17
+ }
18
+ // Fallback.
19
+ if ( ! $_tests_dir ) {
20
+ $_tests_dir = '/tmp/wordpress-tests-lib';
21
+ }
22
+ // Give access to tests_add_filter() function.
23
+ require_once $_tests_dir . '/includes/functions.php';
24
+ /**
25
+ * Manually load the plugin being tested.
26
+ */
27
+ function _manually_load_plugin() {
28
+ require dirname( dirname( __FILE__ ) ) . '/load.php';
29
+ }
30
+
31
+ tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );
32
+ // Start up the WP testing environment.
33
+ require $_tests_dir . '/includes/bootstrap.php';
vendor/codeinwp/themeisle-sdk/tests/dashboard-widget-test.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Dashboard widget related tests.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test Dashboard widget class.
10
+ */
11
+ class Dashboard_Widget_Test extends WP_UnitTestCase {
12
+
13
+ /**
14
+ * Test product from partner loading.
15
+ */
16
+ public function test_product_partner_module_loading() {
17
+
18
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
19
+
20
+ \ThemeisleSDK\Loader::add_product( $file );
21
+
22
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
23
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
24
+ $modules['sample_theme_external'] = array_filter(
25
+ $modules['sample_theme_external'],
26
+ function ( $value ) {
27
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Dashboard_widget' );
28
+ }
29
+ );
30
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 0 );
31
+
32
+ }
33
+
34
+ /**
35
+ * Test if dashboard widget is disabled on partners.
36
+ */
37
+ public function test_dashboard_widget_can_load_partner() {
38
+
39
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
40
+ $product = new \ThemeisleSDK\Product( $file );
41
+
42
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Dashboard_Widget() )->can_load( $product ) );
43
+
44
+ }
45
+
46
+ /**
47
+ * Test if dashboard widget is disabled on partners.
48
+ */
49
+ public function test_dashboard_widget_can_load_regular() {
50
+
51
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
52
+ $product = new \ThemeisleSDK\Product( $file );
53
+
54
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Dashboard_Widget() )->can_load( $product ) );
55
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Dashboard_Widget', ( new \ThemeisleSDK\Modules\Dashboard_Widget() )->load( $product ) );
56
+
57
+ }
58
+
59
+ }
vendor/codeinwp/themeisle-sdk/tests/endpoint-test.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Endpoint feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test endpoint feature.
10
+ */
11
+ class Endpoint_Test extends WP_UnitTestCase {
12
+
13
+
14
+ /**
15
+ * Test product from partner loading.
16
+ */
17
+ public function test_product_partner_module_loading() {
18
+
19
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
20
+
21
+ \ThemeisleSDK\Loader::add_product( $file );
22
+
23
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
24
+
25
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
26
+ $modules['sample_theme_external'] = array_filter(
27
+ $modules['sample_theme_external'],
28
+ function ( $value ) {
29
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Endpoint' );
30
+ }
31
+ );
32
+ $this->assertCount( 1, $modules['sample_theme_external'] );
33
+
34
+ }
35
+
36
+ /**
37
+ * Test product from partner loading.
38
+ */
39
+ public function test_endpoint_product_loading() {
40
+
41
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
42
+
43
+ \ThemeisleSDK\Loader::add_product( $file );
44
+
45
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
46
+
47
+ $this->assertArrayHasKey( 'sample_theme', $modules );
48
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
49
+
50
+ }
51
+
52
+ /**
53
+ * Test if endpoint is disabled on partners.
54
+ */
55
+ public function test_endpoint_can_load_partner() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
58
+ $product = new \ThemeisleSDK\Product( $file );
59
+
60
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Endpoint() )->can_load( $product ) );
61
+
62
+ }
63
+
64
+
65
+ /**
66
+ * Test if endpoint should load for admins.
67
+ */
68
+ public function test_endpoint_can_load() {
69
+
70
+ $file = dirname( __FILE__ ) . '/sample_products/sample_plugin/plugin_file.php';
71
+ $product = new \ThemeisleSDK\Product( $file );
72
+
73
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Endpoint() )->can_load( $product ) );
74
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Endpoint', ( new \ThemeisleSDK\Modules\Endpoint() )->load( $product ) );
75
+
76
+ }
77
+
78
+
79
+ }
vendor/codeinwp/themeisle-sdk/tests/licenser-test.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Licenser feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test licenser feature.
10
+ */
11
+ class Licenser_Test extends WP_UnitTestCase {
12
+
13
+
14
+ /**
15
+ * Test product from partner loading.
16
+ */
17
+ public function test_product_partner_module_loading() {
18
+
19
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
20
+
21
+ \ThemeisleSDK\Loader::add_product( $file );
22
+
23
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
24
+
25
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
26
+ $modules['sample_theme_external'] = array_filter(
27
+ $modules['sample_theme_external'],
28
+ function ( $value ) {
29
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Licenser' );
30
+ }
31
+ );
32
+ $this->assertCount( 1, $modules['sample_theme_external'] );
33
+
34
+ }
35
+
36
+ /**
37
+ * Test product from partner loading.
38
+ */
39
+ public function test_licenser_product_loading() {
40
+
41
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
42
+
43
+ \ThemeisleSDK\Loader::add_product( $file );
44
+
45
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
46
+
47
+ $this->assertArrayHasKey( 'sample_theme', $modules );
48
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
49
+
50
+ }
51
+
52
+ /**
53
+ * Test if licenser is disabled on partners.
54
+ */
55
+ public function test_licenser_can_load_partner() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
58
+ $product = new \ThemeisleSDK\Product( $file );
59
+
60
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Licenser() )->can_load( $product ) );
61
+
62
+ }
63
+
64
+
65
+ /**
66
+ * Test if licenser should load for admins.
67
+ */
68
+ public function test_licenser_can_load() {
69
+
70
+ $file = dirname( __FILE__ ) . '/sample_products/sample_plugin/plugin_file.php';
71
+ $product = new \ThemeisleSDK\Product( $file );
72
+
73
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Licenser() )->can_load( $product ) );
74
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Licenser', ( new \ThemeisleSDK\Modules\Licenser() )->load( $product ) );
75
+
76
+ }
77
+
78
+
79
+ }
vendor/codeinwp/themeisle-sdk/tests/loader-test.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Loader manager test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test loader manager.
10
+ *
11
+ * @runTestsInSeparateProcesses
12
+ */
13
+ class Loader_Test extends WP_UnitTestCase {
14
+
15
+ /**
16
+ * Test loading of invalid file.
17
+ */
18
+ public function test_products_invalid_subscribe() {
19
+ $file = dirname( __FILE__ ) . '/invalid/sample_products/sample_plugin/plugin-file.php';
20
+ \ThemeisleSDK\Loader::add_product( $file );
21
+ $this->assertEmpty( ThemeisleSDK\Loader::get_products() );
22
+ }
23
+
24
+ /**
25
+ * Test loading of plugin file.
26
+ */
27
+ public function test_products_valid_subscribe_plugin() {
28
+ $file = dirname( __FILE__ ) . '/sample_products/sample_plugin/plugin_file.php';
29
+
30
+ \ThemeisleSDK\Loader::add_product( $file );
31
+
32
+ $this->assertEquals( count( ThemeisleSDK\Loader::get_products() ), 1 );
33
+ }
34
+
35
+ /**
36
+ * Test loading of theme file.
37
+ */
38
+ public function test_products_valid_subscribe_theme() {
39
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
40
+
41
+ \ThemeisleSDK\Loader::add_product( $file );
42
+
43
+ $this->assertEquals( count( ThemeisleSDK\Loader::get_products() ), 1 );
44
+ }
45
+
46
+
47
+ }
vendor/codeinwp/themeisle-sdk/tests/loading-test.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * `loading` test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test sdk loading.
10
+ *
11
+ * @runTestsInSeparateProcesses
12
+ */
13
+ class Sdk_Loading_Test extends WP_UnitTestCase {
14
+ /**
15
+ * Test if the SDK is loading properly and version is exported.
16
+ */
17
+ public function test_version_exists() {
18
+ global $themeisle_sdk_max_version;
19
+ $this->assertTrue( isset( $themeisle_sdk_max_version ) );
20
+ $this->assertTrue( version_compare( '0.0.1', $themeisle_sdk_max_version, '<' ) );
21
+ }
22
+
23
+ /**
24
+ * Test that classes are properly loaded.
25
+ */
26
+ public function test_class_loading() {
27
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Loader' ) );
28
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Product' ) );
29
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Dashboard_Widget' ) );
30
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Rollback' ) );
31
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Uninstall_Feedback' ) );
32
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Licenser' ) );
33
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Endpoint' ) );
34
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Notification' ) );
35
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Logger' ) );
36
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Translate' ) );
37
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Modules\\Review' ) );
38
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Common\\Abstract_Module' ) );
39
+ $this->assertTrue( class_exists( 'ThemeisleSDK\\Common\\Module_factory' ) );
40
+ }
41
+
42
+ /**
43
+ * Test the loaded products.
44
+ */
45
+ public function test_loaded_defaults() {
46
+ $this->assertEquals( count( \ThemeisleSDK\Loader::get_products() ), 0 );
47
+ $this->assertGreaterThan( 0, count( \ThemeisleSDK\Loader::get_modules() ) );
48
+
49
+ }
50
+
51
+
52
+ }
vendor/codeinwp/themeisle-sdk/tests/logger-test.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Logger feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test logger feature.
10
+ */
11
+ class Logger_Test extends WP_UnitTestCase {
12
+
13
+
14
+ public function test_product_partner_module_loading() {
15
+
16
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
17
+
18
+ \ThemeisleSDK\Loader::add_product( $file );
19
+
20
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
21
+
22
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
23
+ $modules['sample_theme_external'] = array_filter(
24
+ $modules['sample_theme_external'],
25
+ function ( $value ) {
26
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Logger' );
27
+ }
28
+ );
29
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 1 );
30
+
31
+ }
32
+
33
+ public function test_product_loading() {
34
+
35
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
36
+
37
+ \ThemeisleSDK\Loader::add_product( $file );
38
+
39
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
40
+
41
+ $this->assertArrayHasKey( 'sample_theme', $modules );
42
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
43
+
44
+ }
45
+
46
+ public function test_can_load_partner() {
47
+
48
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
49
+ $product = new \ThemeisleSDK\Product( $file );
50
+
51
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Logger() )->can_load( $product ) );
52
+
53
+ }
54
+
55
+ public function test_load_normal() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
58
+
59
+ $product = new \ThemeisleSDK\Product( $file );
60
+
61
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Logger() )->can_load( $product ) );
62
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Logger', ( new \ThemeisleSDK\Modules\Logger() )->load( $product ) );
63
+
64
+ }
65
+
66
+
67
+ }
vendor/codeinwp/themeisle-sdk/tests/notification-test.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Notification feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test notification feature.
10
+ */
11
+ class Notification_Test extends WP_UnitTestCase {
12
+
13
+ protected static $editor_id;
14
+ protected static $admin_id;
15
+
16
+ public static function wpSetUpBeforeClass( $factory ) {
17
+ self::$editor_id = $factory->user->create(
18
+ array(
19
+ 'role' => 'editor',
20
+ )
21
+ );
22
+ self::$admin_id = $factory->user->create(
23
+ array(
24
+ 'role' => 'administrator',
25
+ )
26
+ );
27
+
28
+ wp_set_current_user( self::$editor_id );
29
+ }
30
+
31
+ public static function wpTearDownAfterClass() {
32
+ self::delete_user( self::$editor_id );
33
+ self::delete_user( self::$admin_id );
34
+ }
35
+
36
+ public function test_product_partner_module_loading() {
37
+
38
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
39
+
40
+ \ThemeisleSDK\Loader::add_product( $file );
41
+
42
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
43
+
44
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
45
+ $modules['sample_theme_external'] = array_filter(
46
+ $modules['sample_theme_external'],
47
+ function ( $value ) {
48
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Notification' );
49
+ }
50
+ );
51
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 0 );
52
+
53
+ }
54
+
55
+ public function test_notification_product_loading() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
58
+
59
+ \ThemeisleSDK\Loader::add_product( $file );
60
+
61
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
62
+
63
+ $this->assertArrayHasKey( 'sample_theme', $modules );
64
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
65
+
66
+ }
67
+
68
+ public function test_notification_can_load_partner() {
69
+
70
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
71
+ $product = new \ThemeisleSDK\Product( $file );
72
+
73
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Notification() )->can_load( $product ) );
74
+
75
+ }
76
+
77
+ public function test_notification_load_non_admins() {
78
+ wp_set_current_user( self::$editor_id );
79
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
80
+ $product = new \ThemeisleSDK\Product( $file );
81
+
82
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Notification() )->can_load( $product ) );
83
+
84
+ }
85
+
86
+ public function test_notification_not_load_for_new() {
87
+ wp_set_current_user( self::$admin_id );
88
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
89
+
90
+ $product = new \ThemeisleSDK\Product( $file );
91
+
92
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Notification() )->can_load( $product ) );
93
+
94
+ }
95
+
96
+ public function test_notification_load_old() {
97
+ wp_set_current_user( self::$admin_id );
98
+
99
+ update_option( 'sample_theme_install', ( time() - MONTH_IN_SECONDS ) );
100
+
101
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
102
+
103
+ $product = new \ThemeisleSDK\Product( $file );
104
+
105
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Notification() )->can_load( $product ) );
106
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Notification', ( new \ThemeisleSDK\Modules\Notification() )->load( $product ) );
107
+
108
+ }
109
+
110
+
111
+ }
vendor/codeinwp/themeisle-sdk/tests/old/loading-test.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Loading test for lower PHP versions.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test sdk loading.
10
+ */
11
+ class Sdk_Loading_Old_Test extends WP_UnitTestCase {
12
+ /**
13
+ * Test if the SDK is not loading on lower php versions.
14
+ */
15
+ public function test_sdk_not_loaded() {
16
+ $this->assertFalse( class_exists( 'ThemeisleSDK\\Loader' ) );
17
+ }
18
+
19
+ }
vendor/codeinwp/themeisle-sdk/tests/product-test.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Product data tests.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test product class.
10
+ */
11
+ class Product_Test extends WP_UnitTestCase {
12
+ /**
13
+ * Test product from plugin
14
+ */
15
+ public function test_product_from_plugin() {
16
+
17
+ $file = dirname( __FILE__ ) . '/sample_products/sample_plugin/plugin_file.php';
18
+
19
+ $product = new \ThemeisleSDK\Product( $file );
20
+
21
+ $this->assertEquals( $product->get_type(), 'plugin' );
22
+ $this->assertEquals( $product->get_slug(), 'sample_plugin' );
23
+ $this->assertEquals( $product->get_store_name(), 'ThemeIsle' );
24
+ $this->assertEquals( $product->get_version(), '1.1.1' );
25
+ $this->assertGreaterThanOrEqual( $product->get_install_time(), time() );
26
+ $this->assertEquals( $product->get_store_url(), 'https://themeisle.com' );
27
+ $this->assertFalse( $product->requires_license() );
28
+ $this->assertFalse( $product->is_wordpress_available() );
29
+ }
30
+
31
+ /**
32
+ * Test product from theme.
33
+ */
34
+ public function test_product_from_theme() {
35
+
36
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
37
+
38
+ $product = new \ThemeisleSDK\Product( $file );
39
+
40
+ $this->assertEquals( $product->get_type(), 'theme' );
41
+ $this->assertEquals( $product->get_slug(), 'sample_theme' );
42
+ $this->assertEquals( $product->get_store_name(), 'ThemeIsle' );
43
+ $this->assertEquals( $product->get_version(), '2.0.18' );
44
+ $this->assertGreaterThanOrEqual( $product->get_install_time(), time() );
45
+ $this->assertEquals( $product->get_store_url(), 'https://themeisle.com' );
46
+ $this->assertTrue( $product->requires_license() );
47
+ $this->assertTrue( $product->is_wordpress_available() );
48
+ }
49
+ }
vendor/codeinwp/themeisle-sdk/tests/review-test.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Review feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test review feature.
10
+ */
11
+ class Review_Test extends WP_UnitTestCase {
12
+
13
+
14
+ public function test_product_partner_module_loading() {
15
+
16
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
17
+
18
+ \ThemeisleSDK\Loader::add_product( $file );
19
+
20
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
21
+
22
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
23
+ $modules['sample_theme_external'] = array_filter(
24
+ $modules['sample_theme_external'],
25
+ function ( $value ) {
26
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Review' );
27
+ }
28
+ );
29
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 0 );
30
+
31
+ }
32
+
33
+ public function test_product_loading() {
34
+
35
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
36
+
37
+ \ThemeisleSDK\Loader::add_product( $file );
38
+
39
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
40
+
41
+ $this->assertArrayHasKey( 'sample_theme', $modules );
42
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
43
+
44
+ }
45
+
46
+ public function test_can_load_partner() {
47
+
48
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
49
+ $product = new \ThemeisleSDK\Product( $file );
50
+
51
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Review() )->can_load( $product ) );
52
+
53
+ }
54
+
55
+ public function test_load_normal() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
58
+
59
+ $product = new \ThemeisleSDK\Product( $file );
60
+
61
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Review() )->can_load( $product ) );
62
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Review', ( new \ThemeisleSDK\Modules\Review() )->load( $product ) );
63
+
64
+ }
65
+
66
+
67
+ }
vendor/codeinwp/themeisle-sdk/tests/rollback-test.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Rollback feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test Rollback feature.
10
+ */
11
+ class Rollback_Test extends WP_UnitTestCase {
12
+
13
+ protected static $editor_id;
14
+ protected static $admin_id;
15
+
16
+ public static function wpSetUpBeforeClass( $factory ) {
17
+ self::$editor_id = $factory->user->create(
18
+ array(
19
+ 'role' => 'editor',
20
+ )
21
+ );
22
+ self::$admin_id = $factory->user->create(
23
+ array(
24
+ 'role' => 'administrator',
25
+ )
26
+ );
27
+
28
+ wp_set_current_user( self::$editor_id );
29
+ }
30
+
31
+ public static function wpTearDownAfterClass() {
32
+ self::delete_user( self::$editor_id );
33
+ self::delete_user( self::$admin_id );
34
+ }
35
+
36
+ /**
37
+ * Test product from partner loading.
38
+ */
39
+ public function test_product_partner_module_loading() {
40
+
41
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
42
+
43
+ \ThemeisleSDK\Loader::add_product( $file );
44
+
45
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
46
+
47
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
48
+ $modules['sample_theme_external'] = array_filter(
49
+ $modules['sample_theme_external'],
50
+ function ( $value ) {
51
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Rollback' );
52
+ }
53
+ );
54
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 0 );
55
+
56
+ }
57
+
58
+ /**
59
+ * Test product from partner loading.
60
+ */
61
+ public function test_rollback_product_loading() {
62
+
63
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
64
+
65
+ \ThemeisleSDK\Loader::add_product( $file );
66
+
67
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
68
+
69
+ $this->assertArrayHasKey( 'sample_theme', $modules );
70
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
71
+
72
+ }
73
+
74
+ /**
75
+ * Test if rollback is disabled on partners.
76
+ */
77
+ public function test_rollback_can_load_partner() {
78
+
79
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
80
+ $product = new \ThemeisleSDK\Product( $file );
81
+
82
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Rollback() )->can_load( $product ) );
83
+
84
+ }
85
+
86
+ /**
87
+ * Test if rollback should not load for non admins.
88
+ */
89
+ public function test_rollback_not_load_non_admins() {
90
+
91
+ wp_set_current_user( self::$editor_id );
92
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
93
+ $product = new \ThemeisleSDK\Product( $file );
94
+
95
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Rollback() )->can_load( $product ) );
96
+
97
+ }
98
+
99
+ /**
100
+ * Test if rollback should load for admins.
101
+ */
102
+ public function test_rollback_not_load_admins() {
103
+
104
+ wp_set_current_user( self::$admin_id );
105
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
106
+ $product = new \ThemeisleSDK\Product( $file );
107
+
108
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Rollback() )->can_load( $product ) );
109
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Rollback', ( new \ThemeisleSDK\Modules\Rollback() )->load( $product ) );
110
+
111
+ }
112
+
113
+
114
+ }
vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_plugin/plugin_file.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Plugin Name: Sample plugin.
4
+ * Description: Sample description
5
+ * Version: 1.1.1
6
+ * Author: ThemeIsle
7
+ * Author URI: https://themeisle.com
8
+ * License: GPL-2.0+
9
+ * License URI: http://www.gnu.org/licenses/gpl-2.0.txt
10
+ * Text Domain: sample-plugin
11
+ * WordPress Available: no
12
+ * Requires License: no
13
+ */
vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_theme/style.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Theme Name: Test theme
3
+ Author: ThemeIsle
4
+ Author URI: https://themeisle.com
5
+ Version: 2.0.18
6
+ License: GNU General Public License v2 or later
7
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html s
8
+ WordPress Available: yes
9
+ Requires License: yes
10
+ */
vendor/codeinwp/themeisle-sdk/tests/sample_products/sample_theme_external/style.css ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Theme Name: Test theme
3
+ Author: ThemeIsle
4
+ Author URI: https://prothemedesign.com
5
+ Version: 2.0.18
6
+ License: GNU General Public License v2 or later
7
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html s
8
+ WordPress Available: no
9
+ Requires License: yes
10
+ */
vendor/codeinwp/themeisle-sdk/tests/translate-test.php ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Translate feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test translate feature.
10
+ */
11
+ class Translate_Test extends WP_UnitTestCase {
12
+
13
+
14
+ public function test_product_partner_module_loading() {
15
+
16
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
17
+
18
+ \ThemeisleSDK\Loader::add_product( $file );
19
+
20
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
21
+
22
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
23
+ $modules['sample_theme_external'] = array_filter(
24
+ $modules['sample_theme_external'],
25
+ function ( $value ) {
26
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Translate' );
27
+ }
28
+ );
29
+ $this->assertEquals( count( $modules['sample_theme_external'] ), 0 );
30
+
31
+ }
32
+
33
+ public function test_product_loading() {
34
+
35
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
36
+
37
+ \ThemeisleSDK\Loader::add_product( $file );
38
+
39
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
40
+
41
+ $this->assertArrayHasKey( 'sample_theme', $modules );
42
+ $this->assertGreaterThan( 0, count( $modules['sample_theme'] ) );
43
+
44
+ }
45
+
46
+ public function test_can_load_partner() {
47
+
48
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
49
+ $product = new \ThemeisleSDK\Product( $file );
50
+
51
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Translate() )->can_load( $product ) );
52
+
53
+ }
54
+
55
+ public function test_load_normal_english() {
56
+
57
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
58
+
59
+ $product = new \ThemeisleSDK\Product( $file );
60
+
61
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Translate() )->can_load( $product ) );
62
+
63
+ }
64
+
65
+ public function test_load_non_english() {
66
+ add_filter(
67
+ 'locale',
68
+ function () {
69
+ return 'fy';
70
+ }
71
+ );
72
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
73
+
74
+ $product = new \ThemeisleSDK\Product( $file );
75
+
76
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Translate() )->can_load( $product ) );
77
+
78
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Translate', ( new \ThemeisleSDK\Modules\Translate() )->load( $product ) );
79
+
80
+ }
81
+
82
+
83
+ }
vendor/codeinwp/themeisle-sdk/tests/uninstall-feedback-test.php ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Uninstall feature test.
4
+ *
5
+ * @package ThemeIsleSDK
6
+ */
7
+
8
+ /**
9
+ * Test Uninstall feedback feature.
10
+ */
11
+ class Uninstall_Feedback_Test extends WP_UnitTestCase {
12
+
13
+
14
+ /**
15
+ * Test product from partner loading.
16
+ */
17
+ public function test_product_partner_module_loading() {
18
+
19
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
20
+
21
+ \ThemeisleSDK\Loader::add_product( $file );
22
+
23
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
24
+
25
+ $this->assertArrayHasKey( 'sample_theme_external', $modules );
26
+ $modules['sample_theme_external'] = array_filter(
27
+ $modules['sample_theme_external'],
28
+ function ( $value ) {
29
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Uninstall_Feedback' );
30
+ }
31
+ );
32
+ $this->assertCount( 0, $modules['sample_theme_external'] );
33
+
34
+ }
35
+
36
+ /**
37
+ * Test product from partner loading.
38
+ */
39
+ public function test_un_feedback_product_loading() {
40
+
41
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
42
+ global $pagenow;
43
+ $pagenow = 'theme-install.php';
44
+ \ThemeisleSDK\Loader::add_product( $file );
45
+
46
+ $modules = \ThemeisleSDK\Common\Module_Factory::get_modules_map();
47
+
48
+ $this->assertArrayHasKey( 'sample_theme', $modules );
49
+ $modules['sample_theme'] = array_filter(
50
+ $modules['sample_theme'],
51
+ function ( $value ) {
52
+ return ( get_class( $value ) === 'ThemeisleSDK\\Modules\\Uninstall_Feedback' );
53
+ }
54
+ );
55
+ $this->assertCount( 1, $modules['sample_theme'] );
56
+ }
57
+
58
+ /**
59
+ * Test if uninstall feedback is disabled on partners.
60
+ */
61
+ public function test_un_feedback_can_load_partner() {
62
+
63
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme_external/style.css';
64
+ $product = new \ThemeisleSDK\Product( $file );
65
+
66
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->can_load( $product ) );
67
+
68
+ }
69
+
70
+
71
+ /**
72
+ * Test if uninstall feedback should load for non whitelisted pages.
73
+ */
74
+ public function test_un_feedback_load_non_pages() {
75
+
76
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
77
+ $product = new \ThemeisleSDK\Product( $file );
78
+ global $pagenow;
79
+ $pagenow = 'index.php';
80
+ $this->assertFalse( ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->can_load( $product ) );
81
+
82
+ }
83
+
84
+ /**
85
+ * Test if uninstall feedback should load for plugins listing.
86
+ */
87
+ public function test_un_feedback_load_plugins_pages() {
88
+
89
+ $file = dirname( __FILE__ ) . '/sample_products/sample_plugin/plugin-file.php';
90
+ $product = new \ThemeisleSDK\Product( $file );
91
+ global $pagenow;
92
+ $pagenow = 'plugins.php';
93
+
94
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->can_load( $product ) );
95
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Uninstall_Feedback', ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->load( $product ) );
96
+
97
+ }
98
+
99
+ /**
100
+ * Test if uninstall feedback should load for themes install.
101
+ */
102
+ public function test_un_feedback_load_themes_pages() {
103
+
104
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
105
+ $product = new \ThemeisleSDK\Product( $file );
106
+ global $pagenow;
107
+ $pagenow = 'theme-install.php';
108
+
109
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->can_load( $product ) );
110
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Uninstall_Feedback', ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->load( $product ) );
111
+
112
+ }
113
+
114
+ /**
115
+ * Test if uninstall feedback loads on ajax requests.
116
+ */
117
+ public function test_un_feedback_load_ajax() {
118
+
119
+ $file = dirname( __FILE__ ) . '/sample_products/sample_theme/style.css';
120
+ $product = new \ThemeisleSDK\Product( $file );
121
+
122
+ define( 'DOING_AJAX', true );
123
+
124
+ $this->assertTrue( ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->can_load( $product ) );
125
+ $this->assertInstanceOf( 'ThemeisleSDK\\Modules\\Uninstall_Feedback', ( new \ThemeisleSDK\Modules\Uninstall_Feedback() )->load( $product ) );
126
+
127
+ }
128
+
129
+
130
+ }
vendor/composer/autoload_files.php CHANGED
@@ -6,6 +6,5 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
- '957c51f8f334b5ea3be310bfb8b3492c' => $vendorDir . '/codeinwp/themeisle-sdk/load.php',
10
  'e703aeb0864a8fb0d43dfe8b54c1a0ea' => $vendorDir . '/codeinwp/themeisle-sdk/load.php',
11
  );
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  'e703aeb0864a8fb0d43dfe8b54c1a0ea' => $vendorDir . '/codeinwp/themeisle-sdk/load.php',
10
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit547363de495c427ec824cfa76390bced
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit547363de495c427ec824cfa76390bced
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit547363de495c427ec824cfa76390bced', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit547363de495c427ec824cfa76390bced', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
@@ -42,14 +42,14 @@ class ComposerAutoloaderInit547363de495c427ec824cfa76390bced
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
- composerRequire547363de495c427ec824cfa76390bced($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
- function composerRequire547363de495c427ec824cfa76390bced($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInita782336d552cb538f39c8cfe5ec6b2ad
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInita782336d552cb538f39c8cfe5ec6b2ad', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInita782336d552cb538f39c8cfe5ec6b2ad', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
42
 
43
  $includeFiles = require __DIR__ . '/autoload_files.php';
44
  foreach ($includeFiles as $fileIdentifier => $file) {
45
+ composerRequirea782336d552cb538f39c8cfe5ec6b2ad($fileIdentifier, $file);
46
  }
47
 
48
  return $loader;
49
  }
50
  }
51
 
52
+ function composerRequirea782336d552cb538f39c8cfe5ec6b2ad($fileIdentifier, $file)
53
  {
54
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
55
  require $file;
vendor/composer/autoload_real_52.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
- class ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a {
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
@@ -39,7 +39,6 @@ class ComposerAutoloaderInit67eebdd3d03b1090fd92d4e0d8ca307a {
39
 
40
  $loader->register(true);
41
 
42
- require $vendorDir . '/codeinwp/themeisle-sdk/load.php';
43
  require $vendorDir . '/codeinwp/themeisle-sdk/load.php';
44
 
45
  return $loader;
2
 
3
  // autoload_real_52.php generated by xrstf/composer-php52
4
 
5
+ class ComposerAutoloaderInitd52742cd39f648242626aa88f81155f0 {
6
  private static $loader;
7
 
8
  public static function loadClassLoader($class) {
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInitd52742cd39f648242626aa88f81155f0', 'loadClassLoader'), true /*, true */);
23
  self::$loader = $loader = new xrstf_Composer52_ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInitd52742cd39f648242626aa88f81155f0', 'loadClassLoader'));
25
 
26
  $vendorDir = dirname(dirname(__FILE__));
27
  $baseDir = dirname($vendorDir);
39
 
40
  $loader->register(true);
41
 
 
42
  require $vendorDir . '/codeinwp/themeisle-sdk/load.php';
43
 
44
  return $loader;
vendor/composer/installed.json CHANGED
@@ -6,22 +6,22 @@
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
- "reference": "951cde6e799e00d46a52416b62221fd771ddc326"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/951cde6e799e00d46a52416b62221fd771ddc326",
14
- "reference": "951cde6e799e00d46a52416b62221fd771ddc326",
15
  "shasum": ""
16
  },
17
- "time": "2018-11-26 14:24:47",
18
- "type": "library",
19
- "installation-source": "dist",
20
- "autoload": {
21
- "files": [
22
- "load.php"
23
- ]
24
  },
 
 
 
25
  "notification-url": "https://packagist.org/downloads/",
26
  "license": [
27
  "GPL-2.0+"
@@ -33,7 +33,7 @@
33
  "homepage": "https://themeisle.com"
34
  }
35
  ],
36
- "description": "ThemeIsle SDK ",
37
  "homepage": "https://github.com/Codeinwp/themeisle-sdk",
38
  "keywords": [
39
  "wordpress"
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
+ "reference": "cf03ee5b93c6ca66f0c1a4916309f1270fe12319"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/cf03ee5b93c6ca66f0c1a4916309f1270fe12319",
14
+ "reference": "cf03ee5b93c6ca66f0c1a4916309f1270fe12319",
15
  "shasum": ""
16
  },
17
+ "require-dev": {
18
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
19
+ "squizlabs/php_codesniffer": "^3.1",
20
+ "wp-coding-standards/wpcs": "^1.0.0"
 
 
 
21
  },
22
+ "time": "2019-01-28 12:17:14",
23
+ "type": "library",
24
+ "installation-source": "source",
25
  "notification-url": "https://packagist.org/downloads/",
26
  "license": [
27
  "GPL-2.0+"
33
  "homepage": "https://themeisle.com"
34
  }
35
  ],
36
+ "description": "ThemeIsle SDK.",
37
  "homepage": "https://github.com/Codeinwp/themeisle-sdk",
38
  "keywords": [
39
  "wordpress"
wp-product-review.php CHANGED
@@ -15,7 +15,7 @@
15
  * Plugin Name: WP Product Review Lite
16
  * Plugin URI: https://themeisle.com/plugins/wp-product-review/
17
  * Description: The highest rated and most complete review plugin, now with rich snippets support. Easily turn your basic posts into in-depth reviews.
18
- * Version: 3.4.10
19
  * Author: ThemeIsle
20
  * Author URI: https://themeisle.com/
21
  * Requires at least: 3.5
@@ -67,7 +67,7 @@ register_deactivation_hook( __FILE__, 'deactivate_wppr' );
67
  */
68
  function run_wppr() {
69
 
70
- define( 'WPPR_LITE_VERSION', '3.4.10' );
71
  define( 'WPPR_PATH', dirname( __FILE__ ) );
72
  define( 'WPPR_SLUG', 'wppr' );
73
  define( 'WPPR_UPSELL_LINK', 'https://themeisle.com/plugins/wp-product-review/' );
15
  * Plugin Name: WP Product Review Lite
16
  * Plugin URI: https://themeisle.com/plugins/wp-product-review/
17
  * Description: The highest rated and most complete review plugin, now with rich snippets support. Easily turn your basic posts into in-depth reviews.
18
+ * Version: 3.5.0
19
  * Author: ThemeIsle
20
  * Author URI: https://themeisle.com/
21
  * Requires at least: 3.5
67
  */
68
  function run_wppr() {
69
 
70
+ define( 'WPPR_LITE_VERSION', '3.5.0' );
71
  define( 'WPPR_PATH', dirname( __FILE__ ) );
72
  define( 'WPPR_SLUG', 'wppr' );
73
  define( 'WPPR_UPSELL_LINK', 'https://themeisle.com/plugins/wp-product-review/' );