16f83d637da64be29b0de1c4868deef2 - Version 1.1.1

Version Notes

first release

Download this release

Release Info

Developer Rui Wang
Extension 16f83d637da64be29b0de1c4868deef2
Version 1.1.1
Comparing to
See all releases


Version 1.1.1

Files changed (25) hide show
  1. app/code/community/SecureAccounts/ManageAccounts/Block/Customer/Grid.php +87 -0
  2. app/code/community/SecureAccounts/ManageAccounts/Block/Render/Compromise.php +132 -0
  3. app/code/community/SecureAccounts/ManageAccounts/Block/Secure.php +39 -0
  4. app/code/community/SecureAccounts/ManageAccounts/Helper/Data.php +368 -0
  5. app/code/community/SecureAccounts/ManageAccounts/Model/Compromisedusers.php +42 -0
  6. app/code/community/SecureAccounts/ManageAccounts/Model/Observer.php +61 -0
  7. app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers.php +42 -0
  8. app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers/Collection.php +42 -0
  9. app/code/community/SecureAccounts/ManageAccounts/controllers/AjaxController.php +139 -0
  10. app/code/community/SecureAccounts/ManageAccounts/controllers/PasswordController.php +173 -0
  11. app/code/community/SecureAccounts/ManageAccounts/etc/adminhtml.xml +58 -0
  12. app/code/community/SecureAccounts/ManageAccounts/etc/config.xml +140 -0
  13. app/code/community/SecureAccounts/ManageAccounts/etc/system.xml +107 -0
  14. app/code/community/SecureAccounts/ManageAccounts/sql/secureaccounts_manageaccounts_setup/install-1.0.0.php +68 -0
  15. app/design/frontend/base/default/layout/secureaccounts/manageaccounts/manageaccounts.xml +46 -0
  16. app/design/frontend/base/default/template/secureaccounts/manageaccounts/login_url.phtml +36 -0
  17. app/design/frontend/base/default/template/secureaccounts/manageaccounts/resetpassword.phtml +78 -0
  18. app/etc/modules/SecureAccounts_ManageAccounts.xml +40 -0
  19. app/locale/en_US/template/email/secureaccounts/manageaccounts/password_compromise_reset_template.html +156 -0
  20. js/secureaccounts/manageaccounts/jquery.validate.js +1365 -0
  21. js/secureaccounts/manageaccounts/login.js +16 -0
  22. js/secureaccounts/manageaccounts/resetpassword.js +33 -0
  23. package.xml +18 -0
  24. skin/frontend/base/default/secureaccounts/manageaccounts/css/bootstrap.min.css +5 -0
  25. skin/frontend/base/default/secureaccounts/manageaccounts/css/custom_styles.css +14 -0
app/code/community/SecureAccounts/ManageAccounts/Block/Customer/Grid.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Class For Adding Column To Customer Grid In Admin Section
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid {
37
+
38
+ public function setCollection($collection) {
39
+
40
+ $customers = Mage::getModel("customer/customer")->getCollection()->getData();
41
+ foreach ($customers as $customer):
42
+ $customerId = $customer['entity_id'];
43
+ $email = $customer['email'];
44
+ $loadcustomer = Mage::getModel('customer/customer')->load($customerId);
45
+ $temp = explode(':', $loadcustomer->getData("password_hash"));
46
+ $hash = $temp[0];
47
+ Mage::helper('manageaccounts')->checkdeletecustomer($customerId, $hash);
48
+ $isexists = Mage::helper('manageaccounts')->getIfCustomer($customerId);
49
+ if (!$isexists):
50
+ $getallcompromised[] = $customerId;
51
+ endif;
52
+
53
+ endforeach;
54
+
55
+
56
+ // $getallcompromised = Mage::helper('manageaccounts')->getallcompromised();
57
+
58
+ Mage::getSingleton('core/session')->setAllCompromised($getallcompromised);
59
+ $collection->addAttributeToSelect('compromise');
60
+ parent::setCollection($collection);
61
+ }
62
+
63
+ /**
64
+ * @category Preksh
65
+ * @package SecureAccounts_ManageAccounts
66
+ * @function For Adding Compromised Column In Customer Grid
67
+ * @author Priyanka <priyanka@preksh.com>
68
+ * @date 4th April, 2016
69
+ */
70
+ protected function _prepareColumns() {
71
+
72
+ parent::_prepareColumns();
73
+
74
+ if (Mage::helper('manageaccounts')->ismoduleenabled()):
75
+ $this->addColumn('compromise', array(
76
+ 'header' => Mage::helper('customer')->__('Compromised'),
77
+ 'index' => 'compromise',
78
+ 'type' => 'text',
79
+ 'width' => '100px',
80
+ 'renderer' => 'SecureAccounts_ManageAccounts_Block_Render_Compromise',
81
+ ));
82
+ endif;
83
+
84
+ return parent::_prepareColumns();
85
+ }
86
+
87
+ }
app/code/community/SecureAccounts/ManageAccounts/Block/Render/Compromise.php ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Class For Encrypting Customer's Passwords
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ /**
37
+ * Block For Checking Compromised Customers
38
+ *
39
+ * @category Preksh
40
+ * @package SecureAccounts_ManageAccounts
41
+ * @author Priyanka <priyanka@preksh.com>
42
+ * @date 4th April, 2016
43
+ */
44
+ class SecureAccounts_ManageAccounts_Block_Render_Compromise extends
45
+ Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract {
46
+
47
+ /**
48
+ * @category Preksh
49
+ * @package SecureAccounts_ManageAccounts
50
+ * @function For Rendering Compromised Column In Customer Grid
51
+ * @author Priyanka <priyanka@preksh.com>
52
+ * @date 4th April, 2016
53
+ */
54
+ public function render(Varien_Object $row) {
55
+ $callapiflag = 0;
56
+ $email = $row->getData("email");
57
+ $customerId = $row->getData("entity_id");
58
+ $customer = Mage::getModel('customer/customer')->load($customerId);
59
+ $temp = explode(':', $customer->getData("password_hash"));
60
+ $hash = $temp[0];
61
+ $salt = $temp[1];
62
+ $token = Mage::getStoreConfig('manageaccounts/general/tokenkey');
63
+ $noofcustomers = Mage::getStoreConfig('manageaccounts/general/noofcustomers');
64
+ $getapi = array_slice(Mage::getSingleton('core/session')->getAllCompromised(), 0, $noofcustomers);
65
+ if (in_array($customerId, $getapi)):
66
+ $data = $this->private_preserving_compromise_detection($customerId, $email, $hash, $salt, $token);
67
+ else:
68
+ $data = Mage::helper('manageaccounts')->checkemailstatus($email);
69
+ endif;
70
+ return $data;
71
+ }
72
+
73
+ /**
74
+ * @category Preksh
75
+ * @package SecureAccounts_ManageAccounts
76
+ * @function For Detecting Compromised Customers
77
+ * @author Priyanka <priyanka@preksh.com>
78
+ * @date 4th April, 2016
79
+ */
80
+ public function private_preserving_compromise_detection($customerId, $email, $password_hash, $salt, $token) {
81
+ //Get API base url from store configuration
82
+ $API_BASE_URL = Mage::getStoreConfig('manageaccounts/general/appbaseurl');
83
+
84
+ //Create anonymized email for sending to API
85
+ $anonymized_email = $email;
86
+ $anonymized_email[0] = '_';
87
+ $anonymized_email[1] = '_';
88
+
89
+ //Call to API
90
+ $url_req = $API_BASE_URL . 'token=' . $token . '&mode=privacy_preserving_account_query_salt&email=' . $anonymized_email . '&salt=' . $salt; //to test server
91
+ $ch = curl_init();
92
+ $timeout = 600;
93
+ curl_setopt($ch, CURLOPT_URL, $url_req);
94
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
95
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
96
+ $json_str = curl_exec($ch);
97
+ curl_close($ch);
98
+
99
+ $result = json_decode($json_str, true);
100
+ if ($result['result'] != 'succeeded') {
101
+ return "unknown";
102
+ }
103
+
104
+ //Checking for compromised status
105
+ $records = $result['records'];
106
+ foreach ($records as $row) {
107
+
108
+ if ($email == $row['email']) {
109
+ $hash_algorithm = $row['hash_algorithm'];
110
+ if ($hash_algorithm['ca_hash'] == 'bcrypt') {
111
+ if (!isset($bcrypt))
112
+ // $bcrypt = new Bcrypt();
113
+ $hash = Mage::helper('manageaccounts')->hash($password_hash, $hash_algorithm['ca_salt']);
114
+ if ($hash == $row['password_hash']) {
115
+ $compromised_status = 1;
116
+ //Save customer in compromised table
117
+ // Mage::helper('manageaccounts')->compromised($row['email'], $password_hash);
118
+ //Check email is sent or not
119
+ // return Mage::helper('manageaccounts')->checkemailstatus($row['email']);
120
+ } else {
121
+ $compromised_status = 0;
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ Mage::helper('manageaccounts')->compromised($email, $password_hash, $compromised_status);
128
+ return Mage::helper('manageaccounts')->checkemailstatus($email);
129
+
130
+ }
131
+
132
+ }
app/code/community/SecureAccounts/ManageAccounts/Block/Secure.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Block For ManageAccounts
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Block_Secure extends Mage_Core_Block_Template {
37
+
38
+
39
+ }
app/code/community/SecureAccounts/ManageAccounts/Helper/Data.php ADDED
@@ -0,0 +1,368 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Helper For SecureAccounts_ManageAccounts
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Helper_Data extends Mage_Core_Helper_Abstract {
37
+
38
+ /**
39
+ * Helper Function To Insert Row In Compromised Table
40
+ *
41
+ * @category Preksh
42
+ * @package SecureAccounts_ManageAccounts
43
+ * @author Priyanka <priyanka@preksh.com>
44
+ * @date 4th April, 2016
45
+ */
46
+ public function compromised($email, $hashpassword, $compromised_status) {
47
+ date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
48
+ $today = date("Y-m-d H:i:s");
49
+ $customer = Mage::getModel("customer/customer");
50
+ $customer->setWebsiteId(1)
51
+ ->loadByEmail($email);
52
+ $model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
53
+ ->addFieldToFilter('customer_id', $customer->getId())
54
+ ->getData();
55
+ if (count($model) == 0):
56
+ $compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers");
57
+ //Insert row if it is not already present in table
58
+
59
+ $compromisedcollection->setCustomerId($customer->getId())
60
+ ->setCompromised($compromised_status)
61
+ ->setPasswordHash($hashpassword)
62
+ ->setUpdatedDate($today)
63
+ ->setCheckedDate($today);
64
+ try {
65
+ $compromisedcollection->save();
66
+ return true;
67
+ } catch (Exception $ex) {
68
+ return false;
69
+ }
70
+ endif;
71
+ }
72
+
73
+ public function getallcompromised() {
74
+ $customerstocallapi = array();
75
+ $customers = Mage::getModel("customer/customer")->getCollection()->getData();
76
+
77
+ $model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
78
+ ->addFieldToFilter('compromised', array(1, 2))
79
+ ->addFieldToSelect('customer_id')
80
+ ->getData();
81
+ foreach ($model as $key => $val):
82
+ $customerids[] = $val['customer_id'];
83
+ endforeach;
84
+
85
+
86
+ foreach ($customers as $customer):
87
+ if (!in_array($customer['entity_id'], $customerids)):
88
+ $customerstocallapi[] = $customer['entity_id'];
89
+ endif;
90
+ endforeach;
91
+
92
+
93
+
94
+ return $customerstocallapi;
95
+ }
96
+
97
+ /**
98
+ * Helper Function To Delete Compromised Customer From Table
99
+ *
100
+ * @category Preksh
101
+ * @package SecureAccounts_ManageAccounts
102
+ * @author Priyanka <priyanka@preksh.com>
103
+ * @date 4th April, 2016
104
+ */
105
+ public function checkdeletecustomer($customerId, $hash) {
106
+ //check more than predefined days
107
+ $model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")
108
+ ->getCollection()
109
+ ->addFieldToFilter('customer_id', $customerId)
110
+ ->getFirstItem();
111
+ date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
112
+ $today = date("Y-m-d");
113
+ $day15 = date('Y-m-d', strtotime($model->getCheckedDate() . ' + ' . Mage::getStoreConfig('manageaccounts/general/noofdays') . ' days'));
114
+
115
+ //check if customer has reset his password
116
+
117
+ try {
118
+ if (($today > $day15) || ($hash != $model->getPasswordHash())):
119
+ $model->setId($model->getId())->delete();
120
+ endif;
121
+ return true;
122
+ } catch (Exception $ex) {
123
+ return false;
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Helper Function To Delete Compromised Customer From Table After Resetting The Password
129
+ *
130
+ * @category Preksh
131
+ * @package SecureAccounts_ManageAccounts
132
+ * @author Priyanka <priyanka@preksh.com>
133
+ * @date 4th April, 2016
134
+ */
135
+ public function deletecompromised($customerid) {
136
+ $model = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
137
+ ->addFieldToFilter('customer_id', $customerid)->getFirstItem();
138
+ try {
139
+ //Delete cusomer details from compromised table
140
+ $model->setId($model->getId())->delete();
141
+ return true;
142
+ } catch (Exception $ex) {
143
+ return false;
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Helper Function To Check Customer Is Compromised Or Not
149
+ *
150
+ * @category Preksh
151
+ * @package SecureAccounts_ManageAccounts
152
+ * @author Priyanka <priyanka@preksh.com>
153
+ * @date 4th April, 2016
154
+ */
155
+ public function getIfCustomer($customerid) {
156
+ $compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
157
+ ->addFieldToFilter('customer_id', $customerid)
158
+ ->getData();
159
+
160
+ return count($compromisedcollection);
161
+ }
162
+
163
+ public function getIfCompromisedCustomer($customerid) {
164
+ $compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
165
+ ->addFieldToFilter('customer_id', $customerid)
166
+ ->addFieldToFilter('compromised', 2)
167
+ ->getData();
168
+
169
+ return count($compromisedcollection);
170
+ }
171
+
172
+ /**
173
+ * Helper Function To Check Module Is Enabled Or Not
174
+ *
175
+ * @category Preksh
176
+ * @package SecureAccounts_ManageAccounts
177
+ * @author Priyanka <priyanka@preksh.com>
178
+ * @date 4th April, 2016
179
+ */
180
+ public function ismoduleenabled() {
181
+ return Mage::getStoreConfig('manageaccounts/general/active');
182
+ }
183
+
184
+ /**
185
+ * Helper Function To Return Url To Check Customer Is Compromised Or Not
186
+ *
187
+ * @category Preksh
188
+ * @package SecureAccounts_ManageAccounts
189
+ * @author Priyanka <priyanka@preksh.com>
190
+ * @date 4th April, 2016
191
+ */
192
+ public function getloginurl() {
193
+ return Mage::getBaseUrl() . 'manageaccounts/ajax/login';
194
+ }
195
+
196
+ /**
197
+ * Helper Function To Check Email Is Sent Or Not
198
+ *
199
+ * @category Preksh
200
+ * @package SecureAccounts_ManageAccounts
201
+ * @author Priyanka <priyanka@preksh.com>
202
+ * @date 4th April, 2016
203
+ */
204
+ public function checkemailstatus($email) {
205
+ date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
206
+ $today = date("Y-m-d H:i:s");
207
+ $customer = Mage::getModel("customer/customer");
208
+ $customer->setWebsiteId(1)
209
+ ->loadByEmail($email);
210
+ $compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
211
+ ->addFieldToFilter('customer_id', $customer->getId())
212
+ ->getFirstItem();
213
+ //If 1=> Not Sent , 2=> Sent
214
+ if ($compromisedcollection->getCompromised() == 2):
215
+ $send_date = date_format(date_create($compromisedcollection->getUpdatedDate()), "M d,Y g:i A");
216
+ return "Mail Sent On " . $send_date;
217
+ elseif ($compromisedcollection->getCompromised() == 1):
218
+ $url = Mage::helper("adminhtml")->getUrl('manageaccount/password/reset/customer_id/' . $customer->getId());
219
+ return '<a href="' . Mage::helper("adminhtml")->getUrl('manageaccounts/password/reset/customer_id/' . $customer->getId()) . '">Reset password</a>';
220
+ else:
221
+ return 'No';
222
+ endif;
223
+ }
224
+
225
+ /**
226
+ * Helper Function To Change Compromised Status After Sending Mail
227
+ *
228
+ * @category Preksh
229
+ * @package SecureAccounts_ManageAccounts
230
+ * @author Priyanka <priyanka@preksh.com>
231
+ * @date 4th April, 2016
232
+ */
233
+ public function changeemailstatus($customerid) {
234
+ date_default_timezone_set(Mage::getStoreConfig('general/locale/timezone'));
235
+ $today = date("Y-m-d H:i:s");
236
+
237
+ $compromisedcollection = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->getCollection()
238
+ ->addFieldToFilter('customer_id', $customerid)
239
+ ->getFirstItem();
240
+ if (count($compromisedcollection) > 0):
241
+ //Change compromised status to 2
242
+ $compromised = Mage::getModel("secureaccounts_manageaccounts/compromisedusers")->load($compromisedcollection->getId());
243
+ $compromised->setCompromised(2)
244
+ ->setUpdatedDate($today);
245
+ try {
246
+ $compromised->save();
247
+ return true;
248
+ } catch (Exception $ex) {
249
+ return false;
250
+ }
251
+ endif;
252
+ }
253
+
254
+ /**
255
+ * Helper Function For Encryption
256
+ *
257
+ * @category Preksh
258
+ * @package SecureAccounts_ManageAccounts
259
+ * @author Priyanka <priyanka@preksh.com>
260
+ * @date 4th April, 2016
261
+ */
262
+ private $rounds;
263
+
264
+ public function __construct($rounds = 12) {
265
+ if (CRYPT_BLOWFISH != 1) {
266
+ throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
267
+ }
268
+
269
+ $this->rounds = $rounds;
270
+ }
271
+
272
+ public function hash($input, $salt) {
273
+ $hash = crypt($input, $salt);
274
+
275
+ if (strlen($hash) > 13)
276
+ return $hash;
277
+
278
+ return false;
279
+ }
280
+
281
+ public function verify($input, $existingHash) {
282
+ $hash = crypt($input, $existingHash);
283
+
284
+ return $hash === $existingHash;
285
+ }
286
+
287
+ private function getSalt() {
288
+ $salt = sprintf('$2a$%02d$', $this->rounds);
289
+
290
+ $bytes = $this->getRandomBytes(16);
291
+
292
+ $salt .= $this->encodeBytes($bytes);
293
+
294
+ return $salt;
295
+ }
296
+
297
+ private $randomState;
298
+
299
+ private function getRandomBytes($count) {
300
+ $bytes = '';
301
+
302
+ if (function_exists('openssl_random_pseudo_bytes') &&
303
+ (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
304
+ $bytes = openssl_random_pseudo_bytes($count);
305
+ }
306
+
307
+ if ($bytes === '' && is_readable('/dev/urandom') &&
308
+ ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
309
+ $bytes = fread($hRand, $count);
310
+ fclose($hRand);
311
+ }
312
+
313
+ if (strlen($bytes) < $count) {
314
+ $bytes = '';
315
+
316
+ if ($this->randomState === null) {
317
+ $this->randomState = microtime();
318
+ if (function_exists('getmypid')) {
319
+ $this->randomState .= getmypid();
320
+ }
321
+ }
322
+
323
+ for ($i = 0; $i < $count; $i += 16) {
324
+ $this->randomState = md5(microtime() . $this->randomState);
325
+
326
+ if (PHP_VERSION >= '5') {
327
+ $bytes .= md5($this->randomState, true);
328
+ } else {
329
+ $bytes .= pack('H*', md5($this->randomState));
330
+ }
331
+ }
332
+
333
+ $bytes = substr($bytes, 0, $count);
334
+ }
335
+
336
+ return $bytes;
337
+ }
338
+
339
+ private function encodeBytes($input) {
340
+ // The following is code from the PHP Password Hashing Framework
341
+ $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
342
+
343
+ $output = '';
344
+ $i = 0;
345
+ do {
346
+ $c1 = ord($input[$i++]);
347
+ $output .= $itoa64[$c1 >> 2];
348
+ $c1 = ($c1 & 0x03) << 4;
349
+ if ($i >= 16) {
350
+ $output .= $itoa64[$c1];
351
+ break;
352
+ }
353
+
354
+ $c2 = ord($input[$i++]);
355
+ $c1 |= $c2 >> 4;
356
+ $output .= $itoa64[$c1];
357
+ $c1 = ($c2 & 0x0f) << 2;
358
+
359
+ $c2 = ord($input[$i++]);
360
+ $c1 |= $c2 >> 6;
361
+ $output .= $itoa64[$c1];
362
+ $output .= $itoa64[$c2 & 0x3f];
363
+ } while (1);
364
+
365
+ return $output;
366
+ }
367
+
368
+ }
app/code/community/SecureAccounts/ManageAccounts/Model/Compromisedusers.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Model For SecureAccounts_ManageAccounts
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Model_Compromisedusers extends Mage_Core_Model_Abstract {
37
+
38
+ protected function _construct() {
39
+ $this->_init('secureaccounts_manageaccounts/compromisedusers');
40
+ }
41
+
42
+ }
app/code/community/SecureAccounts/ManageAccounts/Model/Observer.php ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Observer For Adding Button To Customer Grid
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Model_Observer {
37
+
38
+ /**
39
+ * Function To Add Bulk Reset Button In Customer Grid
40
+ *
41
+ * @category Preksh
42
+ * @package SecureAccounts_ManageAccounts
43
+ * @author Priyanka <priyanka@preksh.com>
44
+ * @date 4th April, 2016
45
+ */
46
+ public function addButtonTest($observer) {
47
+ if (Mage::helper('manageaccounts')->ismoduleenabled()):
48
+ $container = $observer->getBlock();
49
+ if (null !== $container && $container->getType() == 'adminhtml/customer') {
50
+ $data = array(
51
+ 'label' => 'Bulk Reset',
52
+ 'class' => 'some-class',
53
+ 'onclick' => 'setLocation(\'' . Mage::helper("adminhtml")->getUrl('manageaccount/password/bulkreset/') . '\')',
54
+ );
55
+ $container->addButton('button_identifier', $data);
56
+ }
57
+ return $this;
58
+ endif;
59
+ }
60
+
61
+ }
app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Model For SecureAccounts_ManageAccounts
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Model_Resource_Compromisedusers extends Mage_Core_Model_Resource_Db_Abstract {
37
+
38
+ protected function _construct() {
39
+ $this->_init('secureaccounts_manageaccounts/compromisedusers', 'id');
40
+ }
41
+
42
+ }
app/code/community/SecureAccounts/ManageAccounts/Model/Resource/Compromisedusers/Collection.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Model Collection For SecureAccounts_ManageAccounts
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_Model_Resource_Compromisedusers_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
37
+
38
+ public function _construct() {
39
+ $this->_init('secureaccounts_manageaccounts/compromisedusers');
40
+ }
41
+
42
+ }
app/code/community/SecureAccounts/ManageAccounts/controllers/AjaxController.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Class For Encrypting Customer's Passwords
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+ class SecureAccounts_ManageAccounts_AjaxController extends Mage_Core_Controller_Front_Action {
36
+
37
+ public function indexAction() {
38
+ $this->loadLayout();
39
+ $this->renderLayout();
40
+ }
41
+
42
+ public function resetpasswordpageAction() {
43
+ $this->loadLayout();
44
+ $this->renderLayout();
45
+ }
46
+
47
+ /**
48
+ * @category Preksh
49
+ * @package SecureAccounts_ManageAccounts
50
+ * @function Function To Reset Customer Password
51
+ * @author Priyanka <priyanka@preksh.com>
52
+ * @date 4th April, 2016
53
+ */
54
+ public function resetpasswordAction() {
55
+ $result = array('success' => false);
56
+ $newpassword = $this->getRequest()->getPost('newpassword');
57
+ $custpwdtoken = $this->getRequest()->getPost('token');
58
+ $customer = Mage::getModel('customer/customer')
59
+ ->setWebsiteId(Mage::app()->getStore()->getWebsiteId())
60
+ ->load($this->getRequest()->getPost('custid'));
61
+ if ($customer->getId()):
62
+ try {
63
+ $customer->setPassword($newpassword)->save();
64
+ Mage::helper('manageaccounts')->deletecompromised($customer->getId());
65
+ $result['message'] = 'Please login to your account';
66
+ $result['redirect'] = Mage::getUrl('customer/account/login');
67
+ } catch (Exception $ex) {
68
+ $result['message'] = $ex->getMessage();
69
+ }
70
+ else:
71
+ $result['message'] = 'you are account is not there our database please register';
72
+ endif;
73
+ return $this->getResponse()->setBody(json_encode($result));
74
+ }
75
+
76
+ /**
77
+ * @category Preksh
78
+ * @package SecureAccounts_ManageAccounts
79
+ * @function Function To Check Customer Is Compromised Or Not
80
+ * @author Priyanka <priyanka@preksh.com>
81
+ * @date 4th April, 2016
82
+ */
83
+ public function loginAction() {
84
+ $postVal = $this->getRequest()->getPost('login');
85
+ $email = $postVal['username'];
86
+ $password = $postVal['password'];
87
+ $temp = explode(':', Mage::helper('core')->getHash($password, Mage_Admin_Model_User::HASH_SALT_LENGTH));
88
+ $password_hash = $temp[0];
89
+ $salt = $temp[1];
90
+ $token = Mage::getStoreConfig('manageaccounts/general/tokenkey');
91
+
92
+ $anonymized_email = $email;
93
+ $anonymized_email[0] = '_';
94
+ $anonymized_email[1] = '_';
95
+ //Get API base url from store configuration
96
+ $API_BASE_URL = Mage::getStoreConfig('manageaccounts/general/appbaseurl');
97
+ //Call to API
98
+ $url_req = $API_BASE_URL . 'token=' . $token . '&mode=privacy_preserving_account_query_salt&email=' . $anonymized_email . '&salt=' . $salt; //to test server
99
+ $ch = curl_init();
100
+ $timeout = 600;
101
+ curl_setopt($ch, CURLOPT_URL, $url_req);
102
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
103
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
104
+ $json_str = curl_exec($ch);
105
+ curl_close($ch);
106
+
107
+ $result = json_decode($json_str, true);
108
+ if ($result['result'] != 'succeeded') {
109
+ return "unknown";
110
+ }
111
+ //Checking for compromised status
112
+ $records = $result['records'];
113
+ foreach ($records as $row) {
114
+ if ($email == $row['email']) {
115
+ $hash_algorithm = $row['hash_algorithm'];
116
+ if ($hash_algorithm['ca_hash'] == 'bcrypt') {
117
+ if (!isset($bcrypt))
118
+ // $bcrypt = new Bcrypt();
119
+ $hash = Mage::helper('manageaccounts')->hash($password_hash, $hash_algorithm['ca_salt']);
120
+ if ($hash == $row['password_hash']) {
121
+ //Save customer id in compromised table
122
+
123
+ $customer = Mage::getModel('customer/customer')->setWebsiteId(1)->loadByEmail($email);
124
+ if ($customer):
125
+ $temp = explode(':', $customer->getData("password_hash"));
126
+ $phash = $temp[0];
127
+ endif;
128
+ Mage::helper('manageaccounts')->compromised($row['email'], $phash, 1);
129
+ return 'Yes';
130
+ } else {
131
+ return 'No';
132
+ }
133
+ }
134
+ }
135
+ }
136
+ return "No";
137
+ }
138
+
139
+ }
app/code/community/SecureAccounts/ManageAccounts/controllers/PasswordController.php ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Class For Mail Sending For Resetting Compromised Customer's Password
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ class SecureAccounts_ManageAccounts_PasswordController extends Mage_Adminhtml_Controller_Action {
37
+
38
+ /**
39
+ * @category Preksh
40
+ * @package SecureAccounts_ManageAccounts
41
+ * @function Function To Send Mail For Individual Reset Password Action
42
+ * @author Priyanka <priyanka@preksh.com>
43
+ * @date 4th April, 2016
44
+ */
45
+ public function resetAction() {
46
+
47
+ $customerId = $this->getRequest()->getParam('customer_id');
48
+ $customer = Mage::getModel('customer/customer')->load($customerId);
49
+ $email = $customer->getData("email");
50
+ $customer_name = $customer->getFirstname() . ' ' . $customer->getLastname();
51
+ $storeId = Mage::app()->getStore()->getId();
52
+ if ($customer->getId()) {
53
+ try {
54
+ $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();
55
+ $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
56
+ $template_id = 'password_compromise_reset_template';
57
+ // Load template by template_id
58
+ $email_template = Mage::getModel('core/email_template')->loadDefault($template_id);
59
+ $makeforgoturl = Mage::getBaseUrl() . 'manageaccounts/ajax/resetpasswordpage/' . 'token/' . $newResetPasswordLinkToken . '/customer/' . $customer->getId();
60
+ $email_template_variables = array();
61
+ $email_template_variables['customertoken'] = $newResetPasswordLinkToken;
62
+ $email_template_variables['custid'] = $customer->getId();
63
+ $email_template_variables['forgoturl'] = $makeforgoturl;
64
+ $email_template_variables['customername'] = $customer->getFirstname();
65
+ $email_template_variables['storeurl'] = Mage::getBaseUrl();
66
+ $processed_template = $email_template->getProcessedTemplate($email_template_variables);
67
+
68
+ // Get sender name and email from store configuration
69
+ $sender_name = Mage::getStoreConfig('trans_email/ident_support/name');
70
+ $sender_email = Mage::getStoreConfig('trans_email/ident_support/email');
71
+ $email_template->setSenderName($sender_name);
72
+ $email_template->setSenderEmail($sender_email);
73
+
74
+ $mail = Mage::getModel('core/email')
75
+ ->setToName($customer_name)
76
+ ->setToEmail($email)
77
+ ->setBody($processed_template)
78
+ ->setSubject('Subject :Reset Password')
79
+ ->setFromEmail($sender_email)
80
+ ->setFromName($sender_name)
81
+ ->setType('html');
82
+ $mail->send();
83
+
84
+ //Change status to mail sent
85
+ Mage::helper('manageaccounts')->changeemailstatus($customer->getId());
86
+
87
+ $result['message'] = "Password reset email sent: " . $email;
88
+ } catch (Exception $exception) {
89
+ Mage::log($exception);
90
+ $result['message'] = $exception;
91
+ }
92
+ } else {
93
+ $result['message'] = "Failed to find customer Id";
94
+ }
95
+ Mage::getSingleton('adminhtml/session')->addSuccess($result['message']);
96
+ $this->_redirectUrl(Mage::helper('adminhtml')->getUrl('adminhtml/customer/index/'));
97
+ }
98
+
99
+ /**
100
+ * @category Preksh
101
+ * @package SecureAccounts_ManageAccounts
102
+ * @function Function To Send Mail For Bulk Reset Password Action
103
+ * @author Priyanka <priyanka@preksh.com>
104
+ * @date 4th April, 2016
105
+ */
106
+ public function bulkresetAction() {
107
+ $result = array();
108
+ //Get all compromised customers
109
+ $compromisemodel = Mage::getModel('secureaccounts_manageaccounts/compromisedusers')
110
+ ->getCollection()
111
+ ->addFieldToFilter('compromised', 1)
112
+ ->addFieldToSelect('*');
113
+ if (count($compromisemodel->getData()) > 0):
114
+
115
+ foreach ($compromisemodel->getData() as $key => $compromise):
116
+
117
+ $customer = Mage::getModel('customer/customer')->load($compromise['customer_id']);
118
+ $email = $customer->getData("email");
119
+ $customer_name = $customer->getFirstname() . ' ' . $customer->getLastname();
120
+ $storeId = Mage::app()->getStore()->getId();
121
+ if ($customer->getId()) {
122
+ try {
123
+ $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();
124
+ $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
125
+ $template_id = 'password_compromise_reset_template';
126
+ // Load template by template_id
127
+ $email_template = Mage::getModel('core/email_template')->loadDefault($template_id);
128
+ $makeforgoturl = Mage::getBaseUrl() . 'manageaccounts/ajax/resetpasswordpage/' . 'token/' . $newResetPasswordLinkToken . '/customer/' . $customer->getId();
129
+ $email_template_variables = array();
130
+ $email_template_variables['customertoken'] = $newResetPasswordLinkToken;
131
+ $email_template_variables['custid'] = $customer->getId();
132
+ $email_template_variables['forgoturl'] = $makeforgoturl;
133
+ $email_template_variables['customername'] = $customer->getFirstname();
134
+ $email_template_variables['storeurl'] = Mage::getBaseUrl();
135
+ $processed_template = $email_template->getProcessedTemplate($email_template_variables);
136
+
137
+ // Get sender name and email from store configuration
138
+ $sender_name = Mage::getStoreConfig('trans_email/ident_support/name');
139
+ $sender_email = Mage::getStoreConfig('trans_email/ident_support/email');
140
+ $email_template->setSenderName($sender_name);
141
+ $email_template->setSenderEmail($sender_email);
142
+
143
+ $mail = Mage::getModel('core/email')
144
+ ->setToName($customer_name)
145
+ ->setToEmail($email)
146
+ ->setBody($processed_template)
147
+ ->setSubject('Subject :Reset Password')
148
+ ->setFromEmail($sender_email)
149
+ ->setFromName($sender_name)
150
+ ->setType('html');
151
+ $mail->send();
152
+
153
+ //Change status to mail sent
154
+ Mage::helper('manageaccounts')->changeemailstatus($customer->getId());
155
+
156
+
157
+ $result[$key]['message'] .= "Password reset email sent: " . $email;
158
+ } catch (Exception $exception) {
159
+ Mage::log($exception);
160
+ $result[$key]['message'] .= $exception;
161
+ }
162
+ } else {
163
+ $result[$key]['message'] .= "Failed to find customer Id";
164
+ }
165
+ endforeach;
166
+ else:
167
+ $result[$key]['message'] .= "There are no compromised customer";
168
+ endif;
169
+ Mage::getSingleton('adminhtml/session')->addSuccess($result[$key]['message']);
170
+ $this->_redirectUrl(Mage::helper('adminhtml')->getUrl('adminhtml/customer/index/'));
171
+ }
172
+
173
+ }
app/code/community/SecureAccounts/ManageAccounts/etc/adminhtml.xml ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ *
27
+ * @category Preksh
28
+ * @package SecureAccounts_ManageAccounts
29
+ * @author Priyanka <priyanka@preksh.com>
30
+ * @date 4th April, 2016
31
+ */
32
+ -->
33
+ <config>
34
+
35
+ <acl>
36
+ <resources>
37
+ <all>
38
+ <title>Allow Everything</title>
39
+ </all>
40
+ <admin>
41
+ <children>
42
+ <system>
43
+ <children>
44
+ <config>
45
+ <children>
46
+ <manageaccounts translate="title" module="manageaccounts">
47
+ <title>Secure Login</title>
48
+ </manageaccounts>
49
+ </children>
50
+ </config>
51
+ </children>
52
+ </system>
53
+
54
+ </children>
55
+ </admin>
56
+ </resources>
57
+ </acl>
58
+ </config>
app/code/community/SecureAccounts/ManageAccounts/etc/config.xml ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ *
27
+ * @category Preksh
28
+ * @package SecureAccounts_ManageAccounts
29
+ * @author Priyanka <priyanka@preksh.com>
30
+ * @date 4th April, 2016
31
+ */
32
+ -->
33
+ <config>
34
+ <modules>
35
+ <SecureAccounts_ManageAccounts>
36
+ <version>1.0.0</version>
37
+ </SecureAccounts_ManageAccounts>
38
+ </modules>
39
+ <frontend>
40
+ <routers>
41
+ <manageaccounts>
42
+ <use>standard</use>
43
+ <args>
44
+ <module>SecureAccounts_ManageAccounts</module>
45
+ <frontName>manageaccounts</frontName>
46
+ </args>
47
+ </manageaccounts>
48
+ </routers>
49
+ <layout>
50
+ <updates>
51
+ <manageaccounts>
52
+ <file>secureaccounts/manageaccounts/manageaccounts.xml</file>
53
+ </manageaccounts>
54
+ </updates>
55
+ </layout>
56
+ </frontend>
57
+ <global>
58
+ <events>
59
+
60
+ <adminhtml_widget_container_html_before>
61
+ <observers>
62
+ <add_button_test>
63
+ <class>SecureAccounts_ManageAccounts_Model_Observer</class>
64
+ <method>addButtonTest</method>
65
+ </add_button_test>
66
+ </observers>
67
+ </adminhtml_widget_container_html_before>
68
+
69
+ </events>
70
+ <blocks>
71
+ <manageaccounts>
72
+ <class>SecureAccounts_ManageAccounts_Block</class>
73
+ </manageaccounts>
74
+
75
+ <adminhtml>
76
+ <rewrite>
77
+ <customer_grid>SecureAccounts_ManageAccounts_Block_Customer_Grid</customer_grid>
78
+ </rewrite>
79
+ </adminhtml>
80
+ </blocks>
81
+ <resources>
82
+ <secureaccounts_manageaccounts_setup>
83
+ <setup>
84
+ <module>SecureAccounts_ManageAccounts</module>
85
+ </setup>
86
+ </secureaccounts_manageaccounts_setup>
87
+ </resources>
88
+ <models>
89
+ <secureaccounts_manageaccounts>
90
+ <class>SecureAccounts_ManageAccounts_Model</class>
91
+ <resourceModel>secureaccounts_manageaccounts_resource</resourceModel>
92
+ </secureaccounts_manageaccounts>
93
+ <secureaccounts_manageaccounts_resource>
94
+ <class>SecureAccounts_ManageAccounts_Model_Resource</class>
95
+ <entities>
96
+ <compromisedusers>
97
+ <table>secureaccounts_compromisedusers</table>
98
+ </compromisedusers>
99
+ </entities>
100
+ </secureaccounts_manageaccounts_resource>
101
+ </models>
102
+ <helpers>
103
+ <manageaccounts>
104
+ <class>SecureAccounts_ManageAccounts_Helper</class>
105
+ </manageaccounts>
106
+ </helpers>
107
+
108
+ <template>
109
+ <email>
110
+ <!--Give the template a uniqiue name, you'll need to refer to this later when sending the email-->
111
+ <password_compromise_reset_template>
112
+ <label>Password Reset</label>
113
+ <file>secureaccounts/manageaccounts/password_compromise_reset_template.html</file>
114
+ <type>html</type>
115
+ </password_compromise_reset_template>
116
+ </email>
117
+ </template>
118
+ </global>
119
+ <admin>
120
+ <routers>
121
+ <manageaccounts>
122
+ <use>admin</use>
123
+ <args>
124
+ <module>SecureAccounts_ManageAccounts</module>
125
+ <frontName>manageaccount</frontName>
126
+ </args>
127
+ </manageaccounts>
128
+ </routers>
129
+ </admin>
130
+ <default>
131
+ <manageaccounts>
132
+ <general>
133
+ <appbaseurl>https://www.vericlouds.com/private_search/api.php?</appbaseurl>
134
+ <noofcustomers>100</noofcustomers>
135
+ <noofdays>15</noofdays>
136
+ </general>
137
+
138
+ </manageaccounts>
139
+ </default>
140
+ </config>
app/code/community/SecureAccounts/ManageAccounts/etc/system.xml ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ *
27
+ * @category Preksh
28
+ * @package SecureAccounts_ManageAccounts
29
+ * @author Priyanka <priyanka@preksh.com>
30
+ * @date 4th April, 2016
31
+ */
32
+ -->
33
+ <config>
34
+ <tabs>
35
+ <Secureaccounts_Extensions translate="label" module="manageaccounts">
36
+ <label>Secure Account</label>
37
+ <sort_order>100</sort_order>
38
+ </Secureaccounts_Extensions>
39
+ </tabs>
40
+ <sections>
41
+ <manageaccounts translate="label" module="manageaccounts">
42
+ <label>Secure Login Settings</label>
43
+ <tab>Secureaccounts_Extensions</tab>
44
+ <sort_order>10</sort_order>
45
+ <show_in_default>1</show_in_default>
46
+ <show_in_website>1</show_in_website>
47
+ <show_in_store>1</show_in_store>
48
+ <groups>
49
+ <general translate="label">
50
+ <label>Secure Login Configuration</label>
51
+ <frontend_type>text</frontend_type>
52
+ <sort_order>0</sort_order>
53
+ <show_in_default>1</show_in_default>
54
+ <show_in_website>1</show_in_website>
55
+ <show_in_store>1</show_in_store>
56
+ <fields>
57
+ <active translate="label">
58
+ <label>Enable Module</label>
59
+ <frontend_type>select</frontend_type>
60
+ <source_model>adminhtml/system_config_source_yesno</source_model>
61
+ <sort_order>1</sort_order>
62
+ <show_in_default>1</show_in_default>
63
+ <show_in_website>1</show_in_website>
64
+ <show_in_store>1</show_in_store>
65
+ </active>
66
+ <appbaseurl translate="label">
67
+ <label>App Base Url</label>
68
+ <frontend_type>textarea</frontend_type>
69
+ <comment></comment>
70
+ <sort_order>2</sort_order>
71
+ <show_in_default>1</show_in_default>
72
+ <show_in_website>1</show_in_website>
73
+ <show_in_store>1</show_in_store>
74
+ </appbaseurl>
75
+ <tokenkey translate="label">
76
+ <label>Token Key</label>
77
+ <frontend_type>textarea</frontend_type>
78
+ <comment></comment>
79
+ <sort_order>3</sort_order>
80
+ <show_in_default>1</show_in_default>
81
+ <show_in_website>1</show_in_website>
82
+ <show_in_store>1</show_in_store>
83
+ </tokenkey>
84
+ <noofcustomers translate="label">
85
+ <label>Number of customers</label>
86
+ <frontend_type>text</frontend_type>
87
+ <comment></comment>
88
+ <sort_order>4</sort_order>
89
+ <show_in_default>1</show_in_default>
90
+ <show_in_website>1</show_in_website>
91
+ <show_in_store>1</show_in_store>
92
+ </noofcustomers>
93
+ <noofdays translate="label">
94
+ <label>Number of days</label>
95
+ <frontend_type>text</frontend_type>
96
+ <comment></comment>
97
+ <sort_order>4</sort_order>
98
+ <show_in_default>1</show_in_default>
99
+ <show_in_website>1</show_in_website>
100
+ <show_in_store>1</show_in_store>
101
+ </noofdays>
102
+ </fields>
103
+ </general>
104
+ </groups>
105
+ </manageaccounts>
106
+ </sections>
107
+ </config>
app/code/community/SecureAccounts/ManageAccounts/sql/secureaccounts_manageaccounts_setup/install-1.0.0.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Installer For Sql Tables
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <?php
35
+
36
+ $installer = $this;
37
+ $installer->startSetup();
38
+ $table = $installer->getConnection()
39
+ ->newTable($installer->getTable('secureaccounts_manageaccounts/compromisedusers'))
40
+ ->addColumn('id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
41
+ 'identity' => true,
42
+ 'unsigned' => false,
43
+ 'nullable' => false,
44
+ 'primary' => true,
45
+ ), 'Id')
46
+ ->addColumn('customer_id', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
47
+ 'nullable' => false,
48
+ 'comment' => 'customer id',
49
+ ), 'Customer Id')
50
+ ->addColumn('compromised', Varien_Db_Ddl_Table::TYPE_INTEGER, 11, array(
51
+ 'nullable' => false,
52
+ 'comment' => 'compromised',
53
+ ), 'Compromised')
54
+ ->addColumn('password_hash', Varien_Db_Ddl_Table::TYPE_VARCHAR, null, array(
55
+ 'nullable' => true,
56
+ 'comment' => 'hash password',
57
+ ), 'Hash Password')
58
+ ->addColumn('updated_date', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
59
+ 'nullable' => true,
60
+ 'default' => Varien_Db_Ddl_Table::TIMESTAMP_INIT,
61
+ 'comment' => 'updated date',
62
+ ), 'Date Updated')
63
+ ->addColumn('checked_date', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
64
+ 'nullable' => true,
65
+ 'comment' => 'checked date',
66
+ ), 'Date Checked');
67
+ $installer->getConnection()->createTable($table);
68
+ $installer->endSetup();
app/design/frontend/base/default/layout/secureaccounts/manageaccounts/manageaccounts.xml ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <layout version="0.1.0">
4
+ <manageaccounts_ajax_resetpasswordpage>
5
+ <reference name="head">
6
+ <action method="addJs" ifconfig="manageaccounts/general/active">
7
+ <script>secureaccounts/manageaccounts/resetpassword.js</script>
8
+ </action>
9
+ <action method="addJs" ifconfig="manageaccounts/general/active">
10
+ <script>secureaccounts/manageaccounts/jquery.validate.js</script>
11
+ </action>
12
+ <action method="addCss" ifconfig="manageaccounts/general/active">
13
+ <name>secureaccounts/manageaccounts/css/custom_styles.css</name>
14
+ </action>
15
+ <action method="addCss" ifconfig="manageaccounts/general/active">
16
+ <name>secureaccounts/manageaccounts/css/bootstrap.min.css</name>
17
+ </action>
18
+ </reference>
19
+ <reference name="content">
20
+ <remove name="right.poll"/>
21
+ <remove name="left.newsletter"/>
22
+ <remove name="right.permanent.callout"/>
23
+ <block type="core/template" as="resetpwdemail" name="resetpwdemail">
24
+ <action method="setTemplate" ifconfig="manageaccounts/general/active">
25
+ <template>secureaccounts/manageaccounts/resetpassword.phtml</template>
26
+ </action>
27
+ </block>
28
+ </reference>
29
+ </manageaccounts_ajax_resetpasswordpage>
30
+
31
+ <customer_account_login>
32
+ <reference name="head">
33
+ <action method="addJs" ifconfig="manageaccounts/general/active">
34
+ <script>secureaccounts/manageaccounts/login.js</script>
35
+ </action>
36
+
37
+ </reference>
38
+ <reference name="content">
39
+ <block type="core/template" as="login-url" name="login-url">
40
+ <action method="setTemplate" after="customer_form_login" ifconfig="manageaccounts/general/active">
41
+ <template>secureaccounts/manageaccounts/login_url.phtml</template>
42
+ </action>
43
+ </block>
44
+ </reference>
45
+ </customer_account_login>
46
+ </layout>
app/design/frontend/base/default/template/secureaccounts/manageaccounts/login_url.phtml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Template For Getting Url To Check Compromised Customers
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+ <span id="secureaccount-api-url" style="display:none;">
35
+ <?php echo Mage::helper('manageaccounts')->getloginurl();?>
36
+ </span>
app/design/frontend/base/default/template/secureaccounts/manageaccounts/resetpassword.phtml ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ * Template For Resetting Password
27
+ *
28
+ * @category Preksh
29
+ * @package SecureAccounts_ManageAccounts
30
+ * @author Priyanka <priyanka@preksh.com>
31
+ * @date 4th April, 2016
32
+ */
33
+ ?>
34
+
35
+ <?php
36
+ $currentUrl = Mage::helper('core/url')->getCurrentUrl();
37
+ $getcustId = explode("/customer/", $currentUrl);
38
+ $gettoken = explode("/token/", $getcustId[0]);
39
+ ?>
40
+
41
+ <?php
42
+ //Check if customer is compromised
43
+ $if_compromised_customers = Mage::helper('manageaccounts')->getIfCompromisedCustomer($getcustId[1]);
44
+ if ($if_compromised_customers > 0):
45
+ ?>
46
+ <form action="<?php echo Mage::getBaseUrl() . 'manageaccounts/ajax/resetpassword'; ?>" id="customer-reset-password" method="post">
47
+ <input type="hidden" name="custid" value="<?php echo $getcustId[1]; ?>">
48
+ <input type="hidden" name="token" value="<?php echo $gettoken[1]; ?>">
49
+ <div class="">
50
+ <div class="pmp_login">
51
+
52
+ <div class="row pmp_row-sm-offset-3">
53
+ <div class="col-xs-12 col-sm-10">
54
+ <h2 class="text-center"><?php echo $this->__('Reset Password') ?></h2>
55
+ <div class="form-group">
56
+
57
+ <input type="password" class="form-control" id="newpassword" name="newpassword" placeholder="New Password">
58
+ </div>
59
+ <span class="help-block"></span>
60
+ <div class="form-group">
61
+
62
+ <input type="password" class="form-control" name="confrmpassword" placeholder="Confirm Password">
63
+ </div>
64
+ <span class="help-block"></span>
65
+ <input class="btn btn-md btn-primary btn-block" type="submit" name="submit" value="Reset Password">
66
+ </div>
67
+ </div>
68
+ <div class="row">
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </form>
73
+ <?php else: ?>
74
+ <div class="alert alert-danger fade in text-center">
75
+ <strong>This reset password link is expired!</strong>
76
+ </div>
77
+ <?php endif; ?>
78
+
app/etc/modules/SecureAccounts_ManageAccounts.xml ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <!--
3
+ /**
4
+ * Preksh
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This source file is subject to the Open Software License (OSL 3.0)
9
+ * It is available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to akash@preksh.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade this module to newer
18
+ * versions in the future.
19
+ *
20
+ * @category Preksh
21
+ * @package SecureAccounts_ManageAccounts
22
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
23
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
24
+ */
25
+ /**
26
+ *
27
+ * @category Preksh
28
+ * @package SecureAccounts_ManageAccounts
29
+ * @author Priyanka <priyanka@preksh.com>
30
+ * @date 4th April, 2016
31
+ */
32
+ -->
33
+ <config>
34
+ <modules>
35
+ <SecureAccounts_ManageAccounts>
36
+ <active>true</active>
37
+ <codePool>community</codePool>
38
+ </SecureAccounts_ManageAccounts>
39
+ </modules>
40
+ </config>
app/locale/en_US/template/email/secureaccounts/manageaccounts/password_compromise_reset_template.html ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--
2
+ /**
3
+ * Preksh
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * It is available through the world-wide-web at this URL:
9
+ * http://opensource.org/licenses/osl-3.0.php
10
+ * If you did not receive a copy of the license and are unable to
11
+ * obtain it through the world-wide-web, please send an email
12
+ * to akash@preksh.com so we can send you a copy immediately.
13
+ *
14
+ * DISCLAIMER
15
+ *
16
+ * Do not edit or add to this file if you wish to upgrade this module to newer
17
+ * versions in the future.
18
+ *
19
+ * @category Preksh
20
+ * @package SecureAccounts_ManageAccounts
21
+ * @copyright ©Copyright 2015-16. Preksh Innovations Pvt. Ltd.(www.preksh.com) All Rights Reserved.
22
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
23
+ */
24
+ /**
25
+ *Email Template For Reset Password Email
26
+ * @category Preksh
27
+ * @package SecureAccounts_ManageAccounts
28
+ * @author Priyanka <priyanka@preksh.com>
29
+ * @date 4th April, 2016
30
+ */
31
+ -->
32
+
33
+
34
+ <html>
35
+ <head>
36
+ <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" >
37
+ <title>title</title>
38
+ </head>
39
+ <body style="width: 100%;background-color: #ffffff;margin: 0;padding: 0;-webkit-font-smoothing: antialiased;mso-margin-top-alt: 0px;mso-margin-bottom-alt: 0px;mso-padding-alt: 0px 0px 0px 0px;">
40
+ <table width="100%" class="Bg_Color" bgcolor="#fefefe" cellpadding="0" cellspacing="0" align="center">
41
+ <tbody>
42
+
43
+ <!-- ********************************************************************************************************* -->
44
+ <!-- Begin Module: PreHeader -->
45
+
46
+ <!-- End Module: PreHeader -->
47
+
48
+ <!-- Begin Module: Background Image -->
49
+ <tr>
50
+ <td class="BgImageAltColor" bgcolor="#ffffff" style="-webkit-text-size-adjust: none;">
51
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" align="center" style="clear:both; background: #ebebeb;">
52
+ <tbody>
53
+ <tr>
54
+ <td style="-webkit-text-size-adjust: none;">
55
+ <table width="100%" align="center" cellpadding="0" cellspacing="0">
56
+ <tbody>
57
+ <!-- Begin Module: Header_Text -->
58
+ <tr>
59
+ <td valign="top" style="-webkit-text-size-adjust: none;">
60
+ <table class="BoxWrap" width="600" align="center" cellpadding="0" cellspacing="0" style="background: #ffffff; margin-top: 30px; padding: 10px;">
61
+ <tbody>
62
+ <tr>
63
+ <td valign="top" class="Preheader_Color" bgcolor="#ffffff" style="-webkit-text-size-adjust: none;">
64
+ <table cellpadding="0" cellspacing="0" border="0" class="logo-container">
65
+ <tr>
66
+ <td class="logo">
67
+ <a href="{{var storeurl}}" style="color:#1E7EC8;"><img src="{{skin url="images/logo_email.gif" _area='frontend'}}" alt="Magento" border="0"/></a>
68
+ </td>
69
+ </tr>
70
+ </table>
71
+ </td>
72
+ </tr>
73
+ <tr>
74
+ <td width="100%" height="2" style="-webkit-text-size-adjust: none;"></td>
75
+ </tr>
76
+ <!-- Spacer -->
77
+ <tr>
78
+ <td style="-webkit-text-size-adjust: none;">
79
+ <!-- ************************** -->
80
+ <!-- Paragraph -->
81
+ <table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0" style="border: 1px solid rgb(242, 100, 34); border-bottom:0;">
82
+ <tbody>
83
+ <tr>
84
+ <td width="40%" style="-webkit-text-size-adjust: none;"><hr style="height: 3px; border: 1px solid #b5b5b5;"></td>
85
+ <td style="-webkit-text-size-adjust: none;">
86
+ <h2 style="text-align: center;color: #393939;font-size: 22px;margin: 10px 0 10px 0;font-weight: normal;line-height: 22px;text-decoration: none;text-transform: uppercase;font-family: Helvetica, Arial, sans-serif; text-transform:none;">Hi {{var customername}}</h2>
87
+ </td>
88
+ <td width="40%" style="-webkit-text-size-adjust: none;"><hr style="height: 3px; border: 1px solid #b5b5b5;"></td>
89
+ </tr>
90
+ </tbody>
91
+ </table>
92
+ <table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0" style="border: 1px solid rgb(242, 100, 34);">
93
+ <tr>
94
+ <td class="action-content">
95
+ <table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0">
96
+ <tbody>
97
+ <tr>
98
+ <td style="-webkit-text-size-adjust: none;">
99
+ <h1 style="font-family: Helvetica,Arial,sans-serif; font-weight: normal; font-style: normal; color: rgb(98, 98, 98); padding: 5px 18px; text-transform: none; font-size: 14px; line-height: 20px; text-align: justify;">
100
+ We have recently discovered that the password for your account has been exposed on the Internet. It is critical that you reset your password as soon as possible to protect your account. If you also use the password in other websites or apps, you should also reset password there.
101
+ </h1>
102
+ </td>
103
+ </tr>
104
+
105
+ </tbody>
106
+ </table>
107
+ <table width="35%" align="center" class="Color02_B" bgcolor="#f26422 " cellpadding="3" cellspacing="0">
108
+ <tbody>
109
+ <tr>
110
+ <td style="-webkit-text-size-adjust: none;">
111
+ <h1 style="text-align: center;text-transform: uppercase;font-size: 13px;margin: 0;font-family: Helvetica, Arial, sans-serif;font-weight: normal;font-style: normal;color: #353535;line-height: 40px;"><a href="{{var forgoturl}}" style="text-transform: uppercase;text-decoration: none;color: #ffffff;-webkit-text-size-adjust: none;line-height: 30px;">Reset Password</a></h1></td>
112
+ </tr>
113
+ </tbody>
114
+ </table>
115
+ <table class="BoxWrap" width="100%" cellpadding="2" cellspacing="0">
116
+ <tbody>
117
+ <tr>
118
+ <td style="-webkit-text-size-adjust: none;">
119
+ <h1 style="font-family: Helvetica,Arial,sans-serif; font-weight: normal; font-style: normal; color: rgb(98, 98, 98); padding: 5px 18px; text-transform: none; font-size: 14px; line-height: 20px; text-align: justify;">
120
+ </h1>
121
+ </td>
122
+ </tr>
123
+
124
+ </tbody>
125
+ </table>
126
+
127
+ </td>
128
+ </tr>
129
+ </table>
130
+ </td>
131
+ </tr>
132
+ </tbody>
133
+ </table>
134
+ </td>
135
+ </tr>
136
+ <tr>
137
+ <td valign="top" height="40" style="-webkit-text-size-adjust: none;">&nbsp;
138
+ </td>
139
+ </tr>
140
+ </tbody>
141
+ </table>
142
+ </td>
143
+ </tr>
144
+ </tbody>
145
+ </table>
146
+ </td>
147
+ </tr>
148
+ </tbody>
149
+ </table>
150
+ </body>
151
+ </html>
152
+
153
+
154
+
155
+
156
+
js/secureaccounts/manageaccounts/jquery.validate.js ADDED
@@ -0,0 +1,1365 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jQuery Validation Plugin v1.13.1
3
+ *
4
+ * http://jqueryvalidation.org/
5
+ *
6
+ * Copyright (c) 2014 Jörn Zaefferer
7
+ * Released under the MIT license
8
+ */
9
+ (function( factory ) {
10
+ if ( typeof define === "function" && define.amd ) {
11
+ define( ["jquery"], factory );
12
+ } else {
13
+ factory( jQuery );
14
+ }
15
+ }(function( $ ) {
16
+
17
+ $.extend($.fn, {
18
+ // http://jqueryvalidation.org/validate/
19
+ validate: function( options ) {
20
+
21
+ // if nothing is selected, return nothing; can't chain anyway
22
+ if ( !this.length ) {
23
+ if ( options && options.debug && window.console ) {
24
+ console.warn( "Nothing selected, can't validate, returning nothing." );
25
+ }
26
+ return;
27
+ }
28
+
29
+ // check if a validator for this form was already created
30
+ var validator = $.data( this[ 0 ], "validator" );
31
+ if ( validator ) {
32
+ return validator;
33
+ }
34
+
35
+ // Add novalidate tag if HTML5.
36
+ this.attr( "novalidate", "novalidate" );
37
+
38
+ validator = new $.validator( options, this[ 0 ] );
39
+ $.data( this[ 0 ], "validator", validator );
40
+
41
+ if ( validator.settings.onsubmit ) {
42
+
43
+ this.validateDelegate( ":submit", "click", function( event ) {
44
+ if ( validator.settings.submitHandler ) {
45
+ validator.submitButton = event.target;
46
+ }
47
+ // allow suppressing validation by adding a cancel class to the submit button
48
+ if ( $( event.target ).hasClass( "cancel" ) ) {
49
+ validator.cancelSubmit = true;
50
+ }
51
+
52
+ // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
53
+ if ( $( event.target ).attr( "formnovalidate" ) !== undefined ) {
54
+ validator.cancelSubmit = true;
55
+ }
56
+ });
57
+
58
+ // validate the form on submit
59
+ this.submit( function( event ) {
60
+ if ( validator.settings.debug ) {
61
+ // prevent form submit to be able to see console output
62
+ event.preventDefault();
63
+ }
64
+ function handle() {
65
+ var hidden, result;
66
+ if ( validator.settings.submitHandler ) {
67
+ if ( validator.submitButton ) {
68
+ // insert a hidden input as a replacement for the missing submit button
69
+ hidden = $( "<input type='hidden'/>" )
70
+ .attr( "name", validator.submitButton.name )
71
+ .val( $( validator.submitButton ).val() )
72
+ .appendTo( validator.currentForm );
73
+ }
74
+ result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
75
+ if ( validator.submitButton ) {
76
+ // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
77
+ hidden.remove();
78
+ }
79
+ if ( result !== undefined ) {
80
+ return result;
81
+ }
82
+ return false;
83
+ }
84
+ return true;
85
+ }
86
+
87
+ // prevent submit for invalid forms or custom submit handlers
88
+ if ( validator.cancelSubmit ) {
89
+ validator.cancelSubmit = false;
90
+ return handle();
91
+ }
92
+ if ( validator.form() ) {
93
+ if ( validator.pendingRequest ) {
94
+ validator.formSubmitted = true;
95
+ return false;
96
+ }
97
+ return handle();
98
+ } else {
99
+ validator.focusInvalid();
100
+ return false;
101
+ }
102
+ });
103
+ }
104
+
105
+ return validator;
106
+ },
107
+ // http://jqueryvalidation.org/valid/
108
+ valid: function() {
109
+ var valid, validator;
110
+
111
+ if ( $( this[ 0 ] ).is( "form" ) ) {
112
+ valid = this.validate().form();
113
+ } else {
114
+ valid = true;
115
+ validator = $( this[ 0 ].form ).validate();
116
+ this.each( function() {
117
+ valid = validator.element( this ) && valid;
118
+ });
119
+ }
120
+ return valid;
121
+ },
122
+ // attributes: space separated list of attributes to retrieve and remove
123
+ removeAttrs: function( attributes ) {
124
+ var result = {},
125
+ $element = this;
126
+ $.each( attributes.split( /\s/ ), function( index, value ) {
127
+ result[ value ] = $element.attr( value );
128
+ $element.removeAttr( value );
129
+ });
130
+ return result;
131
+ },
132
+ // http://jqueryvalidation.org/rules/
133
+ rules: function( command, argument ) {
134
+ var element = this[ 0 ],
135
+ settings, staticRules, existingRules, data, param, filtered;
136
+
137
+ if ( command ) {
138
+ settings = $.data( element.form, "validator" ).settings;
139
+ staticRules = settings.rules;
140
+ existingRules = $.validator.staticRules( element );
141
+ switch ( command ) {
142
+ case "add":
143
+ $.extend( existingRules, $.validator.normalizeRule( argument ) );
144
+ // remove messages from rules, but allow them to be set separately
145
+ delete existingRules.messages;
146
+ staticRules[ element.name ] = existingRules;
147
+ if ( argument.messages ) {
148
+ settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
149
+ }
150
+ break;
151
+ case "remove":
152
+ if ( !argument ) {
153
+ delete staticRules[ element.name ];
154
+ return existingRules;
155
+ }
156
+ filtered = {};
157
+ $.each( argument.split( /\s/ ), function( index, method ) {
158
+ filtered[ method ] = existingRules[ method ];
159
+ delete existingRules[ method ];
160
+ if ( method === "required" ) {
161
+ $( element ).removeAttr( "aria-required" );
162
+ }
163
+ });
164
+ return filtered;
165
+ }
166
+ }
167
+
168
+ data = $.validator.normalizeRules(
169
+ $.extend(
170
+ {},
171
+ $.validator.classRules( element ),
172
+ $.validator.attributeRules( element ),
173
+ $.validator.dataRules( element ),
174
+ $.validator.staticRules( element )
175
+ ), element );
176
+
177
+ // make sure required is at front
178
+ if ( data.required ) {
179
+ param = data.required;
180
+ delete data.required;
181
+ data = $.extend( { required: param }, data );
182
+ $( element ).attr( "aria-required", "true" );
183
+ }
184
+
185
+ // make sure remote is at back
186
+ if ( data.remote ) {
187
+ param = data.remote;
188
+ delete data.remote;
189
+ data = $.extend( data, { remote: param });
190
+ }
191
+
192
+ return data;
193
+ }
194
+ });
195
+
196
+ // Custom selectors
197
+ $.extend( $.expr[ ":" ], {
198
+ // http://jqueryvalidation.org/blank-selector/
199
+ blank: function( a ) {
200
+ return !$.trim( "" + $( a ).val() );
201
+ },
202
+ // http://jqueryvalidation.org/filled-selector/
203
+ filled: function( a ) {
204
+ return !!$.trim( "" + $( a ).val() );
205
+ },
206
+ // http://jqueryvalidation.org/unchecked-selector/
207
+ unchecked: function( a ) {
208
+ return !$( a ).prop( "checked" );
209
+ }
210
+ });
211
+
212
+ // constructor for validator
213
+ $.validator = function( options, form ) {
214
+ this.settings = $.extend( true, {}, $.validator.defaults, options );
215
+ this.currentForm = form;
216
+ this.init();
217
+ };
218
+
219
+ // http://jqueryvalidation.org/jQuery.validator.format/
220
+ $.validator.format = function( source, params ) {
221
+ if ( arguments.length === 1 ) {
222
+ return function() {
223
+ var args = $.makeArray( arguments );
224
+ args.unshift( source );
225
+ return $.validator.format.apply( this, args );
226
+ };
227
+ }
228
+ if ( arguments.length > 2 && params.constructor !== Array ) {
229
+ params = $.makeArray( arguments ).slice( 1 );
230
+ }
231
+ if ( params.constructor !== Array ) {
232
+ params = [ params ];
233
+ }
234
+ $.each( params, function( i, n ) {
235
+ source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
236
+ return n;
237
+ });
238
+ });
239
+ return source;
240
+ };
241
+
242
+ $.extend( $.validator, {
243
+
244
+ defaults: {
245
+ messages: {},
246
+ groups: {},
247
+ rules: {},
248
+ errorClass: "error",
249
+ validClass: "valid",
250
+ errorElement: "label",
251
+ focusCleanup: false,
252
+ focusInvalid: true,
253
+ errorContainer: $( [] ),
254
+ errorLabelContainer: $( [] ),
255
+ onsubmit: true,
256
+ ignore: ":hidden",
257
+ ignoreTitle: false,
258
+ onfocusin: function( element ) {
259
+ this.lastActive = element;
260
+
261
+ // Hide error label and remove error class on focus if enabled
262
+ if ( this.settings.focusCleanup ) {
263
+ if ( this.settings.unhighlight ) {
264
+ this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
265
+ }
266
+ this.hideThese( this.errorsFor( element ) );
267
+ }
268
+ },
269
+ onfocusout: function( element ) {
270
+ if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
271
+ this.element( element );
272
+ }
273
+ },
274
+ onkeyup: function( element, event ) {
275
+ if ( event.which === 9 && this.elementValue( element ) === "" ) {
276
+ return;
277
+ } else if ( element.name in this.submitted || element === this.lastElement ) {
278
+ this.element( element );
279
+ }
280
+ },
281
+ onclick: function( element ) {
282
+ // click on selects, radiobuttons and checkboxes
283
+ if ( element.name in this.submitted ) {
284
+ this.element( element );
285
+
286
+ // or option elements, check parent select in that case
287
+ } else if ( element.parentNode.name in this.submitted ) {
288
+ this.element( element.parentNode );
289
+ }
290
+ },
291
+ highlight: function( element, errorClass, validClass ) {
292
+ if ( element.type === "radio" ) {
293
+ this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
294
+ } else {
295
+ $( element ).addClass( errorClass ).removeClass( validClass );
296
+ }
297
+ },
298
+ unhighlight: function( element, errorClass, validClass ) {
299
+ if ( element.type === "radio" ) {
300
+ this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
301
+ } else {
302
+ $( element ).removeClass( errorClass ).addClass( validClass );
303
+ }
304
+ }
305
+ },
306
+
307
+ // http://jqueryvalidation.org/jQuery.validator.setDefaults/
308
+ setDefaults: function( settings ) {
309
+ $.extend( $.validator.defaults, settings );
310
+ },
311
+
312
+ messages: {
313
+ required: "This field is required.",
314
+ remote: "Please fix this field.",
315
+ email: "Please enter a valid email address.",
316
+ url: "Please enter a valid URL.",
317
+ date: "Please enter a valid date.",
318
+ dateISO: "Please enter a valid date ( ISO ).",
319
+ number: "Please enter a valid number.",
320
+ digits: "Please enter only digits.",
321
+ creditcard: "Please enter a valid credit card number.",
322
+ equalTo: "Please enter the same value again.",
323
+ maxlength: $.validator.format( "Please enter no more than {0} characters." ),
324
+ minlength: $.validator.format( "Please enter at least {0} characters." ),
325
+ rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
326
+ range: $.validator.format( "Please enter a value between {0} and {1}." ),
327
+ max: $.validator.format( "Please enter a value less than or equal to {0}." ),
328
+ min: $.validator.format( "Please enter a value greater than or equal to {0}." )
329
+ },
330
+
331
+ autoCreateRanges: false,
332
+
333
+ prototype: {
334
+
335
+ init: function() {
336
+ this.labelContainer = $( this.settings.errorLabelContainer );
337
+ this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
338
+ this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
339
+ this.submitted = {};
340
+ this.valueCache = {};
341
+ this.pendingRequest = 0;
342
+ this.pending = {};
343
+ this.invalid = {};
344
+ this.reset();
345
+
346
+ var groups = ( this.groups = {} ),
347
+ rules;
348
+ $.each( this.settings.groups, function( key, value ) {
349
+ if ( typeof value === "string" ) {
350
+ value = value.split( /\s/ );
351
+ }
352
+ $.each( value, function( index, name ) {
353
+ groups[ name ] = key;
354
+ });
355
+ });
356
+ rules = this.settings.rules;
357
+ $.each( rules, function( key, value ) {
358
+ rules[ key ] = $.validator.normalizeRule( value );
359
+ });
360
+
361
+ function delegate( event ) {
362
+ var validator = $.data( this[ 0 ].form, "validator" ),
363
+ eventType = "on" + event.type.replace( /^validate/, "" ),
364
+ settings = validator.settings;
365
+ if ( settings[ eventType ] && !this.is( settings.ignore ) ) {
366
+ settings[ eventType ].call( validator, this[ 0 ], event );
367
+ }
368
+ }
369
+ $( this.currentForm )
370
+ .validateDelegate( ":text, [type='password'], [type='file'], select, textarea, " +
371
+ "[type='number'], [type='search'] ,[type='tel'], [type='url'], " +
372
+ "[type='email'], [type='datetime'], [type='date'], [type='month'], " +
373
+ "[type='week'], [type='time'], [type='datetime-local'], " +
374
+ "[type='range'], [type='color'], [type='radio'], [type='checkbox']",
375
+ "focusin focusout keyup", delegate)
376
+ // Support: Chrome, oldIE
377
+ // "select" is provided as event.target when clicking a option
378
+ .validateDelegate("select, option, [type='radio'], [type='checkbox']", "click", delegate);
379
+
380
+ if ( this.settings.invalidHandler ) {
381
+ $( this.currentForm ).bind( "invalid-form.validate", this.settings.invalidHandler );
382
+ }
383
+
384
+ // Add aria-required to any Static/Data/Class required fields before first validation
385
+ // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
386
+ $( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
387
+ },
388
+
389
+ // http://jqueryvalidation.org/Validator.form/
390
+ form: function() {
391
+ this.checkForm();
392
+ $.extend( this.submitted, this.errorMap );
393
+ this.invalid = $.extend({}, this.errorMap );
394
+ if ( !this.valid() ) {
395
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
396
+ }
397
+ this.showErrors();
398
+ return this.valid();
399
+ },
400
+
401
+ checkForm: function() {
402
+ this.prepareForm();
403
+ for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
404
+ this.check( elements[ i ] );
405
+ }
406
+ return this.valid();
407
+ },
408
+
409
+ // http://jqueryvalidation.org/Validator.element/
410
+ element: function( element ) {
411
+ var cleanElement = this.clean( element ),
412
+ checkElement = this.validationTargetFor( cleanElement ),
413
+ result = true;
414
+
415
+ this.lastElement = checkElement;
416
+
417
+ if ( checkElement === undefined ) {
418
+ delete this.invalid[ cleanElement.name ];
419
+ } else {
420
+ this.prepareElement( checkElement );
421
+ this.currentElements = $( checkElement );
422
+
423
+ result = this.check( checkElement ) !== false;
424
+ if ( result ) {
425
+ delete this.invalid[ checkElement.name ];
426
+ } else {
427
+ this.invalid[ checkElement.name ] = true;
428
+ }
429
+ }
430
+ // Add aria-invalid status for screen readers
431
+ $( element ).attr( "aria-invalid", !result );
432
+
433
+ if ( !this.numberOfInvalids() ) {
434
+ // Hide error containers on last error
435
+ this.toHide = this.toHide.add( this.containers );
436
+ }
437
+ this.showErrors();
438
+ return result;
439
+ },
440
+
441
+ // http://jqueryvalidation.org/Validator.showErrors/
442
+ showErrors: function( errors ) {
443
+ if ( errors ) {
444
+ // add items to error list and map
445
+ $.extend( this.errorMap, errors );
446
+ this.errorList = [];
447
+ for ( var name in errors ) {
448
+ this.errorList.push({
449
+ message: errors[ name ],
450
+ element: this.findByName( name )[ 0 ]
451
+ });
452
+ }
453
+ // remove items from success list
454
+ this.successList = $.grep( this.successList, function( element ) {
455
+ return !( element.name in errors );
456
+ });
457
+ }
458
+ if ( this.settings.showErrors ) {
459
+ this.settings.showErrors.call( this, this.errorMap, this.errorList );
460
+ } else {
461
+ this.defaultShowErrors();
462
+ }
463
+ },
464
+
465
+ // http://jqueryvalidation.org/Validator.resetForm/
466
+ resetForm: function() {
467
+ if ( $.fn.resetForm ) {
468
+ $( this.currentForm ).resetForm();
469
+ }
470
+ this.submitted = {};
471
+ this.lastElement = null;
472
+ this.prepareForm();
473
+ this.hideErrors();
474
+ this.elements()
475
+ .removeClass( this.settings.errorClass )
476
+ .removeData( "previousValue" )
477
+ .removeAttr( "aria-invalid" );
478
+ },
479
+
480
+ numberOfInvalids: function() {
481
+ return this.objectLength( this.invalid );
482
+ },
483
+
484
+ objectLength: function( obj ) {
485
+ /* jshint unused: false */
486
+ var count = 0,
487
+ i;
488
+ for ( i in obj ) {
489
+ count++;
490
+ }
491
+ return count;
492
+ },
493
+
494
+ hideErrors: function() {
495
+ this.hideThese( this.toHide );
496
+ },
497
+
498
+ hideThese: function( errors ) {
499
+ errors.not( this.containers ).text( "" );
500
+ this.addWrapper( errors ).hide();
501
+ },
502
+
503
+ valid: function() {
504
+ return this.size() === 0;
505
+ },
506
+
507
+ size: function() {
508
+ return this.errorList.length;
509
+ },
510
+
511
+ focusInvalid: function() {
512
+ if ( this.settings.focusInvalid ) {
513
+ try {
514
+ $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
515
+ .filter( ":visible" )
516
+ .focus()
517
+ // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
518
+ .trigger( "focusin" );
519
+ } catch ( e ) {
520
+ // ignore IE throwing errors when focusing hidden elements
521
+ }
522
+ }
523
+ },
524
+
525
+ findLastActive: function() {
526
+ var lastActive = this.lastActive;
527
+ return lastActive && $.grep( this.errorList, function( n ) {
528
+ return n.element.name === lastActive.name;
529
+ }).length === 1 && lastActive;
530
+ },
531
+
532
+ elements: function() {
533
+ var validator = this,
534
+ rulesCache = {};
535
+
536
+ // select all valid inputs inside the form (no submit or reset buttons)
537
+ return $( this.currentForm )
538
+ .find( "input, select, textarea" )
539
+ .not( ":submit, :reset, :image, [disabled], [readonly]" )
540
+ .not( this.settings.ignore )
541
+ .filter( function() {
542
+ if ( !this.name && validator.settings.debug && window.console ) {
543
+ console.error( "%o has no name assigned", this );
544
+ }
545
+
546
+ // select only the first element for each name, and only those with rules specified
547
+ if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
548
+ return false;
549
+ }
550
+
551
+ rulesCache[ this.name ] = true;
552
+ return true;
553
+ });
554
+ },
555
+
556
+ clean: function( selector ) {
557
+ return $( selector )[ 0 ];
558
+ },
559
+
560
+ errors: function() {
561
+ var errorClass = this.settings.errorClass.split( " " ).join( "." );
562
+ return $( this.settings.errorElement + "." + errorClass, this.errorContext );
563
+ },
564
+
565
+ reset: function() {
566
+ this.successList = [];
567
+ this.errorList = [];
568
+ this.errorMap = {};
569
+ this.toShow = $( [] );
570
+ this.toHide = $( [] );
571
+ this.currentElements = $( [] );
572
+ },
573
+
574
+ prepareForm: function() {
575
+ this.reset();
576
+ this.toHide = this.errors().add( this.containers );
577
+ },
578
+
579
+ prepareElement: function( element ) {
580
+ this.reset();
581
+ this.toHide = this.errorsFor( element );
582
+ },
583
+
584
+ elementValue: function( element ) {
585
+ var val,
586
+ $element = $( element ),
587
+ type = element.type;
588
+
589
+ if ( type === "radio" || type === "checkbox" ) {
590
+ return $( "input[name='" + element.name + "']:checked" ).val();
591
+ } else if ( type === "number" && typeof element.validity !== "undefined" ) {
592
+ return element.validity.badInput ? false : $element.val();
593
+ }
594
+
595
+ val = $element.val();
596
+ if ( typeof val === "string" ) {
597
+ return val.replace(/\r/g, "" );
598
+ }
599
+ return val;
600
+ },
601
+
602
+ check: function( element ) {
603
+ element = this.validationTargetFor( this.clean( element ) );
604
+
605
+ var rules = $( element ).rules(),
606
+ rulesCount = $.map( rules, function( n, i ) {
607
+ return i;
608
+ }).length,
609
+ dependencyMismatch = false,
610
+ val = this.elementValue( element ),
611
+ result, method, rule;
612
+
613
+ for ( method in rules ) {
614
+ rule = { method: method, parameters: rules[ method ] };
615
+ try {
616
+
617
+ result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
618
+
619
+ // if a method indicates that the field is optional and therefore valid,
620
+ // don't mark it as valid when there are no other rules
621
+ if ( result === "dependency-mismatch" && rulesCount === 1 ) {
622
+ dependencyMismatch = true;
623
+ continue;
624
+ }
625
+ dependencyMismatch = false;
626
+
627
+ if ( result === "pending" ) {
628
+ this.toHide = this.toHide.not( this.errorsFor( element ) );
629
+ return;
630
+ }
631
+
632
+ if ( !result ) {
633
+ this.formatAndAdd( element, rule );
634
+ return false;
635
+ }
636
+ } catch ( e ) {
637
+ if ( this.settings.debug && window.console ) {
638
+ console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
639
+ }
640
+ throw e;
641
+ }
642
+ }
643
+ if ( dependencyMismatch ) {
644
+ return;
645
+ }
646
+ if ( this.objectLength( rules ) ) {
647
+ this.successList.push( element );
648
+ }
649
+ return true;
650
+ },
651
+
652
+ // return the custom message for the given element and validation method
653
+ // specified in the element's HTML5 data attribute
654
+ // return the generic message if present and no method specific message is present
655
+ customDataMessage: function( element, method ) {
656
+ return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
657
+ method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
658
+ },
659
+
660
+ // return the custom message for the given element name and validation method
661
+ customMessage: function( name, method ) {
662
+ var m = this.settings.messages[ name ];
663
+ return m && ( m.constructor === String ? m : m[ method ]);
664
+ },
665
+
666
+ // return the first defined argument, allowing empty strings
667
+ findDefined: function() {
668
+ for ( var i = 0; i < arguments.length; i++) {
669
+ if ( arguments[ i ] !== undefined ) {
670
+ return arguments[ i ];
671
+ }
672
+ }
673
+ return undefined;
674
+ },
675
+
676
+ defaultMessage: function( element, method ) {
677
+ return this.findDefined(
678
+ this.customMessage( element.name, method ),
679
+ this.customDataMessage( element, method ),
680
+ // title is never undefined, so handle empty string as undefined
681
+ !this.settings.ignoreTitle && element.title || undefined,
682
+ $.validator.messages[ method ],
683
+ "<strong>Warning: No message defined for " + element.name + "</strong>"
684
+ );
685
+ },
686
+
687
+ formatAndAdd: function( element, rule ) {
688
+ var message = this.defaultMessage( element, rule.method ),
689
+ theregex = /\$?\{(\d+)\}/g;
690
+ if ( typeof message === "function" ) {
691
+ message = message.call( this, rule.parameters, element );
692
+ } else if ( theregex.test( message ) ) {
693
+ message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
694
+ }
695
+ this.errorList.push({
696
+ message: message,
697
+ element: element,
698
+ method: rule.method
699
+ });
700
+
701
+ this.errorMap[ element.name ] = message;
702
+ this.submitted[ element.name ] = message;
703
+ },
704
+
705
+ addWrapper: function( toToggle ) {
706
+ if ( this.settings.wrapper ) {
707
+ toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
708
+ }
709
+ return toToggle;
710
+ },
711
+
712
+ defaultShowErrors: function() {
713
+ var i, elements, error;
714
+ for ( i = 0; this.errorList[ i ]; i++ ) {
715
+ error = this.errorList[ i ];
716
+ if ( this.settings.highlight ) {
717
+ this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
718
+ }
719
+ this.showLabel( error.element, error.message );
720
+ }
721
+ if ( this.errorList.length ) {
722
+ this.toShow = this.toShow.add( this.containers );
723
+ }
724
+ if ( this.settings.success ) {
725
+ for ( i = 0; this.successList[ i ]; i++ ) {
726
+ this.showLabel( this.successList[ i ] );
727
+ }
728
+ }
729
+ if ( this.settings.unhighlight ) {
730
+ for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
731
+ this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
732
+ }
733
+ }
734
+ this.toHide = this.toHide.not( this.toShow );
735
+ this.hideErrors();
736
+ this.addWrapper( this.toShow ).show();
737
+ },
738
+
739
+ validElements: function() {
740
+ return this.currentElements.not( this.invalidElements() );
741
+ },
742
+
743
+ invalidElements: function() {
744
+ return $( this.errorList ).map(function() {
745
+ return this.element;
746
+ });
747
+ },
748
+
749
+ showLabel: function( element, message ) {
750
+ var place, group, errorID,
751
+ error = this.errorsFor( element ),
752
+ elementID = this.idOrName( element ),
753
+ describedBy = $( element ).attr( "aria-describedby" );
754
+ if ( error.length ) {
755
+ // refresh error/success class
756
+ error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
757
+ // replace message on existing label
758
+ error.html( message );
759
+ } else {
760
+ // create error element
761
+ error = $( "<" + this.settings.errorElement + ">" )
762
+ .attr( "id", elementID + "-error" )
763
+ .addClass( this.settings.errorClass )
764
+ .html( message || "" );
765
+
766
+ // Maintain reference to the element to be placed into the DOM
767
+ place = error;
768
+ if ( this.settings.wrapper ) {
769
+ // make sure the element is visible, even in IE
770
+ // actually showing the wrapped element is handled elsewhere
771
+ place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
772
+ }
773
+ if ( this.labelContainer.length ) {
774
+ this.labelContainer.append( place );
775
+ } else if ( this.settings.errorPlacement ) {
776
+ this.settings.errorPlacement( place, $( element ) );
777
+ } else {
778
+ place.insertAfter( element );
779
+ }
780
+
781
+ // Link error back to the element
782
+ if ( error.is( "label" ) ) {
783
+ // If the error is a label, then associate using 'for'
784
+ error.attr( "for", elementID );
785
+ } else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
786
+ // If the element is not a child of an associated label, then it's necessary
787
+ // to explicitly apply aria-describedby
788
+
789
+ errorID = error.attr( "id" ).replace( /(:|\.|\[|\])/g, "\\$1");
790
+ // Respect existing non-error aria-describedby
791
+ if ( !describedBy ) {
792
+ describedBy = errorID;
793
+ } else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
794
+ // Add to end of list if not already present
795
+ describedBy += " " + errorID;
796
+ }
797
+ $( element ).attr( "aria-describedby", describedBy );
798
+
799
+ // If this element is grouped, then assign to all elements in the same group
800
+ group = this.groups[ element.name ];
801
+ if ( group ) {
802
+ $.each( this.groups, function( name, testgroup ) {
803
+ if ( testgroup === group ) {
804
+ $( "[name='" + name + "']", this.currentForm )
805
+ .attr( "aria-describedby", error.attr( "id" ) );
806
+ }
807
+ });
808
+ }
809
+ }
810
+ }
811
+ if ( !message && this.settings.success ) {
812
+ error.text( "" );
813
+ if ( typeof this.settings.success === "string" ) {
814
+ error.addClass( this.settings.success );
815
+ } else {
816
+ this.settings.success( error, element );
817
+ }
818
+ }
819
+ this.toShow = this.toShow.add( error );
820
+ },
821
+
822
+ errorsFor: function( element ) {
823
+ var name = this.idOrName( element ),
824
+ describer = $( element ).attr( "aria-describedby" ),
825
+ selector = "label[for='" + name + "'], label[for='" + name + "'] *";
826
+
827
+ // aria-describedby should directly reference the error element
828
+ if ( describer ) {
829
+ selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
830
+ }
831
+ return this
832
+ .errors()
833
+ .filter( selector );
834
+ },
835
+
836
+ idOrName: function( element ) {
837
+ return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
838
+ },
839
+
840
+ validationTargetFor: function( element ) {
841
+
842
+ // If radio/checkbox, validate first element in group instead
843
+ if ( this.checkable( element ) ) {
844
+ element = this.findByName( element.name );
845
+ }
846
+
847
+ // Always apply ignore filter
848
+ return $( element ).not( this.settings.ignore )[ 0 ];
849
+ },
850
+
851
+ checkable: function( element ) {
852
+ return ( /radio|checkbox/i ).test( element.type );
853
+ },
854
+
855
+ findByName: function( name ) {
856
+ return $( this.currentForm ).find( "[name='" + name + "']" );
857
+ },
858
+
859
+ getLength: function( value, element ) {
860
+ switch ( element.nodeName.toLowerCase() ) {
861
+ case "select":
862
+ return $( "option:selected", element ).length;
863
+ case "input":
864
+ if ( this.checkable( element ) ) {
865
+ return this.findByName( element.name ).filter( ":checked" ).length;
866
+ }
867
+ }
868
+ return value.length;
869
+ },
870
+
871
+ depend: function( param, element ) {
872
+ return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
873
+ },
874
+
875
+ dependTypes: {
876
+ "boolean": function( param ) {
877
+ return param;
878
+ },
879
+ "string": function( param, element ) {
880
+ return !!$( param, element.form ).length;
881
+ },
882
+ "function": function( param, element ) {
883
+ return param( element );
884
+ }
885
+ },
886
+
887
+ optional: function( element ) {
888
+ var val = this.elementValue( element );
889
+ return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
890
+ },
891
+
892
+ startRequest: function( element ) {
893
+ if ( !this.pending[ element.name ] ) {
894
+ this.pendingRequest++;
895
+ this.pending[ element.name ] = true;
896
+ }
897
+ },
898
+
899
+ stopRequest: function( element, valid ) {
900
+ this.pendingRequest--;
901
+ // sometimes synchronization fails, make sure pendingRequest is never < 0
902
+ if ( this.pendingRequest < 0 ) {
903
+ this.pendingRequest = 0;
904
+ }
905
+ delete this.pending[ element.name ];
906
+ if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
907
+ $( this.currentForm ).submit();
908
+ this.formSubmitted = false;
909
+ } else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
910
+ $( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
911
+ this.formSubmitted = false;
912
+ }
913
+ },
914
+
915
+ previousValue: function( element ) {
916
+ return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
917
+ old: null,
918
+ valid: true,
919
+ message: this.defaultMessage( element, "remote" )
920
+ });
921
+ }
922
+
923
+ },
924
+
925
+ classRuleSettings: {
926
+ required: { required: true },
927
+ email: { email: true },
928
+ url: { url: true },
929
+ date: { date: true },
930
+ dateISO: { dateISO: true },
931
+ number: { number: true },
932
+ digits: { digits: true },
933
+ creditcard: { creditcard: true }
934
+ },
935
+
936
+ addClassRules: function( className, rules ) {
937
+ if ( className.constructor === String ) {
938
+ this.classRuleSettings[ className ] = rules;
939
+ } else {
940
+ $.extend( this.classRuleSettings, className );
941
+ }
942
+ },
943
+
944
+ classRules: function( element ) {
945
+ var rules = {},
946
+ classes = $( element ).attr( "class" );
947
+
948
+ if ( classes ) {
949
+ $.each( classes.split( " " ), function() {
950
+ if ( this in $.validator.classRuleSettings ) {
951
+ $.extend( rules, $.validator.classRuleSettings[ this ]);
952
+ }
953
+ });
954
+ }
955
+ return rules;
956
+ },
957
+
958
+ attributeRules: function( element ) {
959
+ var rules = {},
960
+ $element = $( element ),
961
+ type = element.getAttribute( "type" ),
962
+ method, value;
963
+
964
+ for ( method in $.validator.methods ) {
965
+
966
+ // support for <input required> in both html5 and older browsers
967
+ if ( method === "required" ) {
968
+ value = element.getAttribute( method );
969
+ // Some browsers return an empty string for the required attribute
970
+ // and non-HTML5 browsers might have required="" markup
971
+ if ( value === "" ) {
972
+ value = true;
973
+ }
974
+ // force non-HTML5 browsers to return bool
975
+ value = !!value;
976
+ } else {
977
+ value = $element.attr( method );
978
+ }
979
+
980
+ // convert the value to a number for number inputs, and for text for backwards compability
981
+ // allows type="date" and others to be compared as strings
982
+ if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
983
+ value = Number( value );
984
+ }
985
+
986
+ if ( value || value === 0 ) {
987
+ rules[ method ] = value;
988
+ } else if ( type === method && type !== "range" ) {
989
+ // exception: the jquery validate 'range' method
990
+ // does not test for the html5 'range' type
991
+ rules[ method ] = true;
992
+ }
993
+ }
994
+
995
+ // maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
996
+ if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
997
+ delete rules.maxlength;
998
+ }
999
+
1000
+ return rules;
1001
+ },
1002
+
1003
+ dataRules: function( element ) {
1004
+ var method, value,
1005
+ rules = {}, $element = $( element );
1006
+ for ( method in $.validator.methods ) {
1007
+ value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
1008
+ if ( value !== undefined ) {
1009
+ rules[ method ] = value;
1010
+ }
1011
+ }
1012
+ return rules;
1013
+ },
1014
+
1015
+ staticRules: function( element ) {
1016
+ var rules = {},
1017
+ validator = $.data( element.form, "validator" );
1018
+
1019
+ if ( validator.settings.rules ) {
1020
+ rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
1021
+ }
1022
+ return rules;
1023
+ },
1024
+
1025
+ normalizeRules: function( rules, element ) {
1026
+ // handle dependency check
1027
+ $.each( rules, function( prop, val ) {
1028
+ // ignore rule when param is explicitly false, eg. required:false
1029
+ if ( val === false ) {
1030
+ delete rules[ prop ];
1031
+ return;
1032
+ }
1033
+ if ( val.param || val.depends ) {
1034
+ var keepRule = true;
1035
+ switch ( typeof val.depends ) {
1036
+ case "string":
1037
+ keepRule = !!$( val.depends, element.form ).length;
1038
+ break;
1039
+ case "function":
1040
+ keepRule = val.depends.call( element, element );
1041
+ break;
1042
+ }
1043
+ if ( keepRule ) {
1044
+ rules[ prop ] = val.param !== undefined ? val.param : true;
1045
+ } else {
1046
+ delete rules[ prop ];
1047
+ }
1048
+ }
1049
+ });
1050
+
1051
+ // evaluate parameters
1052
+ $.each( rules, function( rule, parameter ) {
1053
+ rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
1054
+ });
1055
+
1056
+ // clean number parameters
1057
+ $.each([ "minlength", "maxlength" ], function() {
1058
+ if ( rules[ this ] ) {
1059
+ rules[ this ] = Number( rules[ this ] );
1060
+ }
1061
+ });
1062
+ $.each([ "rangelength", "range" ], function() {
1063
+ var parts;
1064
+ if ( rules[ this ] ) {
1065
+ if ( $.isArray( rules[ this ] ) ) {
1066
+ rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
1067
+ } else if ( typeof rules[ this ] === "string" ) {
1068
+ parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
1069
+ rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
1070
+ }
1071
+ }
1072
+ });
1073
+
1074
+ if ( $.validator.autoCreateRanges ) {
1075
+ // auto-create ranges
1076
+ if ( rules.min != null && rules.max != null ) {
1077
+ rules.range = [ rules.min, rules.max ];
1078
+ delete rules.min;
1079
+ delete rules.max;
1080
+ }
1081
+ if ( rules.minlength != null && rules.maxlength != null ) {
1082
+ rules.rangelength = [ rules.minlength, rules.maxlength ];
1083
+ delete rules.minlength;
1084
+ delete rules.maxlength;
1085
+ }
1086
+ }
1087
+
1088
+ return rules;
1089
+ },
1090
+
1091
+ // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
1092
+ normalizeRule: function( data ) {
1093
+ if ( typeof data === "string" ) {
1094
+ var transformed = {};
1095
+ $.each( data.split( /\s/ ), function() {
1096
+ transformed[ this ] = true;
1097
+ });
1098
+ data = transformed;
1099
+ }
1100
+ return data;
1101
+ },
1102
+
1103
+ // http://jqueryvalidation.org/jQuery.validator.addMethod/
1104
+ addMethod: function( name, method, message ) {
1105
+ $.validator.methods[ name ] = method;
1106
+ $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
1107
+ if ( method.length < 3 ) {
1108
+ $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
1109
+ }
1110
+ },
1111
+
1112
+ methods: {
1113
+
1114
+ // http://jqueryvalidation.org/required-method/
1115
+ required: function( value, element, param ) {
1116
+ // check if dependency is met
1117
+ if ( !this.depend( param, element ) ) {
1118
+ return "dependency-mismatch";
1119
+ }
1120
+ if ( element.nodeName.toLowerCase() === "select" ) {
1121
+ // could be an array for select-multiple or a string, both are fine this way
1122
+ var val = $( element ).val();
1123
+ return val && val.length > 0;
1124
+ }
1125
+ if ( this.checkable( element ) ) {
1126
+ return this.getLength( value, element ) > 0;
1127
+ }
1128
+ return $.trim( value ).length > 0;
1129
+ },
1130
+
1131
+ // http://jqueryvalidation.org/email-method/
1132
+ email: function( value, element ) {
1133
+ // From http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#e-mail-state-%28type=email%29
1134
+ // Retrieved 2014-01-14
1135
+ // If you have a problem with this implementation, report a bug against the above spec
1136
+ // Or use custom methods to implement your own email validation
1137
+ return this.optional( element ) || /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test( value );
1138
+ },
1139
+
1140
+ // http://jqueryvalidation.org/url-method/
1141
+ url: function( value, element ) {
1142
+ // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
1143
+ return this.optional( element ) || /^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
1144
+ },
1145
+
1146
+ // http://jqueryvalidation.org/date-method/
1147
+ date: function( value, element ) {
1148
+ return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
1149
+ },
1150
+
1151
+ // http://jqueryvalidation.org/dateISO-method/
1152
+ dateISO: function( value, element ) {
1153
+ return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
1154
+ },
1155
+
1156
+ // http://jqueryvalidation.org/number-method/
1157
+ number: function( value, element ) {
1158
+ return this.optional( element ) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
1159
+ },
1160
+
1161
+ // http://jqueryvalidation.org/digits-method/
1162
+ digits: function( value, element ) {
1163
+ return this.optional( element ) || /^\d+$/.test( value );
1164
+ },
1165
+
1166
+ // http://jqueryvalidation.org/creditcard-method/
1167
+ // based on http://en.wikipedia.org/wiki/Luhn/
1168
+ creditcard: function( value, element ) {
1169
+ if ( this.optional( element ) ) {
1170
+ return "dependency-mismatch";
1171
+ }
1172
+ // accept only spaces, digits and dashes
1173
+ if ( /[^0-9 \-]+/.test( value ) ) {
1174
+ return false;
1175
+ }
1176
+ var nCheck = 0,
1177
+ nDigit = 0,
1178
+ bEven = false,
1179
+ n, cDigit;
1180
+
1181
+ value = value.replace( /\D/g, "" );
1182
+
1183
+ // Basing min and max length on
1184
+ // http://developer.ean.com/general_info/Valid_Credit_Card_Types
1185
+ if ( value.length < 13 || value.length > 19 ) {
1186
+ return false;
1187
+ }
1188
+
1189
+ for ( n = value.length - 1; n >= 0; n--) {
1190
+ cDigit = value.charAt( n );
1191
+ nDigit = parseInt( cDigit, 10 );
1192
+ if ( bEven ) {
1193
+ if ( ( nDigit *= 2 ) > 9 ) {
1194
+ nDigit -= 9;
1195
+ }
1196
+ }
1197
+ nCheck += nDigit;
1198
+ bEven = !bEven;
1199
+ }
1200
+
1201
+ return ( nCheck % 10 ) === 0;
1202
+ },
1203
+
1204
+ // http://jqueryvalidation.org/minlength-method/
1205
+ minlength: function( value, element, param ) {
1206
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1207
+ return this.optional( element ) || length >= param;
1208
+ },
1209
+
1210
+ // http://jqueryvalidation.org/maxlength-method/
1211
+ maxlength: function( value, element, param ) {
1212
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1213
+ return this.optional( element ) || length <= param;
1214
+ },
1215
+
1216
+ // http://jqueryvalidation.org/rangelength-method/
1217
+ rangelength: function( value, element, param ) {
1218
+ var length = $.isArray( value ) ? value.length : this.getLength( value, element );
1219
+ return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
1220
+ },
1221
+
1222
+ // http://jqueryvalidation.org/min-method/
1223
+ min: function( value, element, param ) {
1224
+ return this.optional( element ) || value >= param;
1225
+ },
1226
+
1227
+ // http://jqueryvalidation.org/max-method/
1228
+ max: function( value, element, param ) {
1229
+ return this.optional( element ) || value <= param;
1230
+ },
1231
+
1232
+ // http://jqueryvalidation.org/range-method/
1233
+ range: function( value, element, param ) {
1234
+ return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
1235
+ },
1236
+
1237
+ // http://jqueryvalidation.org/equalTo-method/
1238
+ equalTo: function( value, element, param ) {
1239
+ // bind to the blur event of the target in order to revalidate whenever the target field is updated
1240
+ // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
1241
+ var target = $( param );
1242
+ if ( this.settings.onfocusout ) {
1243
+ target.unbind( ".validate-equalTo" ).bind( "blur.validate-equalTo", function() {
1244
+ $( element ).valid();
1245
+ });
1246
+ }
1247
+ return value === target.val();
1248
+ },
1249
+
1250
+ // http://jqueryvalidation.org/remote-method/
1251
+ remote: function( value, element, param ) {
1252
+ if ( this.optional( element ) ) {
1253
+ return "dependency-mismatch";
1254
+ }
1255
+
1256
+ var previous = this.previousValue( element ),
1257
+ validator, data;
1258
+
1259
+ if (!this.settings.messages[ element.name ] ) {
1260
+ this.settings.messages[ element.name ] = {};
1261
+ }
1262
+ previous.originalMessage = this.settings.messages[ element.name ].remote;
1263
+ this.settings.messages[ element.name ].remote = previous.message;
1264
+
1265
+ param = typeof param === "string" && { url: param } || param;
1266
+
1267
+ if ( previous.old === value ) {
1268
+ return previous.valid;
1269
+ }
1270
+
1271
+ previous.old = value;
1272
+ validator = this;
1273
+ this.startRequest( element );
1274
+ data = {};
1275
+ data[ element.name ] = value;
1276
+ $.ajax( $.extend( true, {
1277
+ url: param,
1278
+ mode: "abort",
1279
+ port: "validate" + element.name,
1280
+ dataType: "json",
1281
+ data: data,
1282
+ context: validator.currentForm,
1283
+ success: function( response ) {
1284
+ var valid = response === true || response === "true",
1285
+ errors, message, submitted;
1286
+
1287
+ validator.settings.messages[ element.name ].remote = previous.originalMessage;
1288
+ if ( valid ) {
1289
+ submitted = validator.formSubmitted;
1290
+ validator.prepareElement( element );
1291
+ validator.formSubmitted = submitted;
1292
+ validator.successList.push( element );
1293
+ delete validator.invalid[ element.name ];
1294
+ validator.showErrors();
1295
+ } else {
1296
+ errors = {};
1297
+ message = response || validator.defaultMessage( element, "remote" );
1298
+ errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
1299
+ validator.invalid[ element.name ] = true;
1300
+ validator.showErrors( errors );
1301
+ }
1302
+ previous.valid = valid;
1303
+ validator.stopRequest( element, valid );
1304
+ }
1305
+ }, param ) );
1306
+ return "pending";
1307
+ }
1308
+
1309
+ }
1310
+
1311
+ });
1312
+
1313
+ $.format = function deprecated() {
1314
+ throw "$.format has been deprecated. Please use $.validator.format instead.";
1315
+ };
1316
+
1317
+ // ajax mode: abort
1318
+ // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
1319
+ // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
1320
+
1321
+ var pendingRequests = {},
1322
+ ajax;
1323
+ // Use a prefilter if available (1.5+)
1324
+ if ( $.ajaxPrefilter ) {
1325
+ $.ajaxPrefilter(function( settings, _, xhr ) {
1326
+ var port = settings.port;
1327
+ if ( settings.mode === "abort" ) {
1328
+ if ( pendingRequests[port] ) {
1329
+ pendingRequests[port].abort();
1330
+ }
1331
+ pendingRequests[port] = xhr;
1332
+ }
1333
+ });
1334
+ } else {
1335
+ // Proxy ajax
1336
+ ajax = $.ajax;
1337
+ $.ajax = function( settings ) {
1338
+ var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
1339
+ port = ( "port" in settings ? settings : $.ajaxSettings ).port;
1340
+ if ( mode === "abort" ) {
1341
+ if ( pendingRequests[port] ) {
1342
+ pendingRequests[port].abort();
1343
+ }
1344
+ pendingRequests[port] = ajax.apply(this, arguments);
1345
+ return pendingRequests[port];
1346
+ }
1347
+ return ajax.apply(this, arguments);
1348
+ };
1349
+ }
1350
+
1351
+ // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
1352
+ // handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
1353
+
1354
+ $.extend($.fn, {
1355
+ validateDelegate: function( delegate, type, handler ) {
1356
+ return this.bind(type, function( event ) {
1357
+ var target = $(event.target);
1358
+ if ( target.is(delegate) ) {
1359
+ return handler.apply(target, arguments);
1360
+ }
1361
+ });
1362
+ }
1363
+ });
1364
+
1365
+ }));
js/secureaccounts/manageaccounts/login.js ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // check customer is compromised while login
2
+ jQuery(function () {
3
+
4
+ jQuery("#login-form").submit(function( event ) {
5
+ event.preventDefault();
6
+ var self = this;
7
+ jQuery.ajax({
8
+ type: "POST",
9
+ url: jQuery('#secureaccount-api-url').html(),
10
+ data: jQuery("#login-form").serialize(),
11
+ success: function (response) {
12
+ self.submit();
13
+ }
14
+ });
15
+ });
16
+ });
js/secureaccounts/manageaccounts/resetpassword.js ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ // customer reset password
3
+ jQuery(function () {
4
+ jQuery('#customer-reset-password').validate({
5
+ rules: {
6
+ newpassword: "required",
7
+ confrmpassword: {
8
+ equalTo: "#newpassword"
9
+ }
10
+ },
11
+ submitHandler: function (form) {
12
+ jQuery.ajax({
13
+ type: "POST",
14
+ url: jQuery("#customer-reset-password").attr('action'),
15
+ data: jQuery("#customer-reset-password").serialize(),
16
+ cache: false,
17
+ success: function (response) {
18
+ var obj = jQuery.parseJSON(response);
19
+ window.location.href = obj.redirect;
20
+ }
21
+ });
22
+ },
23
+ messages: {
24
+ newpassword: {
25
+ required: 'This is a required field',
26
+ },
27
+ confrmpassword: {
28
+ required: 'This is a required field',
29
+ }
30
+ }
31
+ });
32
+
33
+ });
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>SecureAccounts_ManageAccounts</name>
4
+ <version>1.1.1</version>
5
+ <stability>beta</stability>
6
+ <license>GPL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>An account management extension which tells admin to reset password for those accounts with compromised passwords</summary>
10
+ <description>The extension adds one column to the Manage Customer section in admin portal. From there the admin can see which account has been compromised. By clicking on reset password link for that account, a password reset email is sent to the user.</description>
11
+ <notes>first release</notes>
12
+ <authors><author><name>Rui Wang</name><user>rui</user><email>ruiw@vericlouds.com</email></author></authors>
13
+ <date>2016-05-23</date>
14
+ <time>17:48:12</time>
15
+ <contents><target name="magecommunity"><dir name="SecureAccounts"><dir name="ManageAccounts"><dir name="Block"><dir name="Customer"><file name="Grid.php" hash="41efe77100a07455e1a78d0ebebe2b10"/></dir><dir name="Render"><file name="Compromise.php" hash="a2eb476f1713d2e1d013dbcf830c8d10"/></dir><file name="Secure.php" hash="f08ab99b7557edeec4624aa65e53b8c3"/></dir><dir name="Helper"><file name="Data.php" hash="4cd2a4678ba405acddaa256d0a5a32b2"/></dir><dir name="Model"><file name="Compromisedusers.php" hash="9b8fb993be95e4a55d22eee581378d95"/><file name="Observer.php" hash="51b424e81ed4bd02801455328342a878"/><dir name="Resource"><dir name="Compromisedusers"><file name="Collection.php" hash="5c2a3db88de8ecd2b9437a315506833b"/></dir><file name="Compromisedusers.php" hash="a4b8e2ef8a8891b08abf3f8781a562c6"/></dir></dir><dir name="controllers"><file name="AjaxController.php" hash="690591ee166cc64b124a7db6b38eaa0f"/><file name="PasswordController.php" hash="bf36353b5cb070ef3c9ea9be84b9f8a1"/></dir><dir name="etc"><file name="adminhtml.xml" hash="881c450e4ef7454a7eacf9187851824e"/><file name="config.xml" hash="583ad98add0287d6928b8a95fb01f038"/><file name="system.xml" hash="133e5aa7a78bc5617bae93fc13f24108"/></dir><dir name="sql"><dir name="secureaccounts_manageaccounts_setup"><file name="install-1.0.0.php" hash="7a31fa6208e8433e0f3c66bff2187f72"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="SecureAccounts_ManageAccounts.xml" hash="cec0f45694f542e239ba44abfe0547ce"/></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="secureaccounts"><dir name="manageaccounts"><file name="manageaccounts.xml" hash="b8c028ec2bfdac4ebafa83c8735d00ae"/></dir></dir></dir><dir name="template"><dir name="secureaccounts"><dir name="manageaccounts"><file name="login_url.phtml" hash="6394adab5e858ef910e01c79dc24fc8f"/><file name="resetpassword.phtml" hash="62b9bd023f2f0fd201cdf37c3703618b"/></dir></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><dir name="secureaccounts"><dir name="manageaccounts"><file name="password_compromise_reset_template.html" hash="8424a33885b3f96c6e78cf0822f96326"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="secureaccounts"><dir name="manageaccounts"><dir name="css"><file name="bootstrap.min.css" hash="d961ea9501b06d339a4beec9d95138c4"/><file name="custom_styles.css" hash="51bd715e00fd96adf2560161b11d273e"/></dir></dir></dir></dir></dir></dir></target><target name="mage"><dir name="js"><dir name="secureaccounts"><dir name="manageaccounts"><file name="jquery.validate.js" hash="b55ee47b6bfa9e90625c274e93130239"/><file name="login.js" hash="aaff1f49fb2446ff713466243b7c86f5"/><file name="resetpassword.js" hash="45570e7b8c22012c6821ec9ae126b284"/></dir></dir></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
18
+ </package>
skin/frontend/base/default/secureaccounts/manageaccounts/css/bootstrap.min.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label_c{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
skin/frontend/base/default/secureaccounts/manageaccounts/css/custom_styles.css ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ To change this license header, choose License Headers in Project Properties.
3
+ To change this template file, choose Tools | Templates
4
+ and open the template in the editor.
5
+ */
6
+ /*
7
+ Created on : 30 Mar, 2016, 10:24:32 AM
8
+ Author : priyanka
9
+ */
10
+
11
+ input[type="email"], input[type="search"], input[type="number"], input[type="password"], input[type="tel"], input[type="text"] {
12
+ max-width: 100%;
13
+ width: 100% !important;
14
+ }