Yellow_Pay - Version 0.2.0

Version Notes

Verify signature on inbound IPNs
Add support for full screen invoices

Download this release

Release Info

Developer James Piechota
Extension Yellow_Pay
Version 0.2.0
Comparing to
See all releases


Code changes from version 0.1.7 to 0.2.0

Files changed (30) hide show
  1. app/code/local/Yellow/Bitcoin/Block/Form/Bitcoin.php +72 -52
  2. app/code/local/Yellow/Bitcoin/Block/Fullscreen.php +47 -0
  3. app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Content.php +51 -0
  4. app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Footer.php +122 -0
  5. app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Header.php +56 -0
  6. app/code/local/Yellow/Bitcoin/Block/Status.php +29 -28
  7. app/code/local/Yellow/Bitcoin/Block/Widget.php +61 -62
  8. app/code/local/Yellow/Bitcoin/Helper/Data.php +37 -28
  9. app/code/local/Yellow/Bitcoin/Model/Bitcoin.php +606 -485
  10. app/code/local/Yellow/Bitcoin/Model/Http.php +48 -46
  11. app/code/local/Yellow/Bitcoin/Model/Ipn.php +59 -56
  12. app/code/local/Yellow/Bitcoin/Model/Resource/Ipn.php +79 -70
  13. app/code/local/Yellow/Bitcoin/Model/Resource/Ipn/Collection.php +32 -30
  14. app/code/local/Yellow/Bitcoin/controllers/IndexController.php +199 -110
  15. app/code/local/Yellow/Bitcoin/etc/config.xml +2 -2
  16. app/code/local/Yellow/Bitcoin/etc/system.xml +1 -1
  17. app/code/local/Yellow/Bitcoin/sql/bitcoin_setup/mysql4-install-0.1.0.php +7 -5
  18. app/code/local/Yellow/Bitcoin/sql/bitcoin_setup/mysql4-upgrade-0.1.0-0.1.1.php +3 -3
  19. app/design/frontend/base/default/layout/bitcoin.xml +27 -11
  20. app/design/frontend/base/default/template/bitcoin/form/bitcoin.phtml +4 -3
  21. app/design/frontend/base/default/template/bitcoin/form/logo.phtml +14 -0
  22. app/design/frontend/base/default/template/bitcoin/fullscreen.phtml +47 -0
  23. app/design/frontend/base/default/template/bitcoin/fullscreen/widget/content.phtml +56 -0
  24. app/design/frontend/base/default/template/bitcoin/fullscreen/widget/footer.phtml +36 -0
  25. app/design/frontend/base/default/template/bitcoin/fullscreen/widget/header.phtml +7 -0
  26. app/design/frontend/base/default/template/bitcoin/widget.phtml +50 -47
  27. app/etc/modules/Yellow_Bitcoin.xml +9 -9
  28. package.xml +6 -5
  29. skin/frontend/base/default/css/bitcoin.css +322 -0
  30. skin/frontend/base/default/images/bitcoin/bitcoin_accepted.png +0 -0
app/code/local/Yellow/Bitcoin/Block/Form/Bitcoin.php CHANGED
@@ -1,62 +1,82 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
- /**
28
- * Block for Yellow Bitcoin payment method form
29
- */
30
- class Yellow_Bitcoin_Block_Form_Bitcoin extends Mage_Payment_Block_Form
31
- {
32
-
33
  /**
34
- * Instructions text
35
  *
36
- * @var string
37
- */
38
- protected $_instructions;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  /**
41
- * Block construction. Set block template.
42
  */
43
- protected function _construct()
44
  {
45
- parent::_construct();
46
- $this->setTemplate('bitcoin/form/bitcoin.phtml');
47
- }
48
 
49
- /**
50
- * Get instructions text from config
51
- *
52
- * @return string
53
- */
54
- public function getInstructions()
55
- {
56
- if (is_null($this->_instructions)) {
57
- $this->_instructions = $this->getMethod()->getInstructions();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
- return $this->_instructions;
60
- }
61
 
62
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  /**
 
3
  *
4
+ * The MIT License (MIT)
5
+ *
6
+ * Copyright (c) 2014 YellowPay.co
7
+ *
8
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ * of this software and associated documentation files (the "Software"), to deal
10
+ * in the Software without restriction, including without limitation the rights
11
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ * copies of the Software, and to permit persons to whom the Software is
13
+ * furnished to do so, subject to the following conditions:
14
+ *
15
+ * The above copyright notice and this permission notice shall be included in all
16
+ * copies or substantial portions of the Software.
17
+ *
18
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ * SOFTWARE.
25
+ *
26
+ **/
27
 
28
  /**
29
+ * Block for Yellow Bitcoin payment method form
30
  */
31
+ class Yellow_Bitcoin_Block_Form_Bitcoin extends Mage_Payment_Block_Form
32
  {
 
 
 
33
 
34
+ /**
35
+ * Instructions text
36
+ *
37
+ * @var string
38
+ */
39
+ protected $_instructions;
40
+
41
+ /**
42
+ * Block construction. Set block template.
43
+ */
44
+ protected function _construct()
45
+ {
46
+ $class = Mage::getConfig()->getBlockClassName('core/template');
47
+
48
+ $guide = "";
49
+
50
+ if(Mage::helper("bitcoin")->isFullScreen()){
51
+ $guide = new $class;
52
+ $guide->setTemplate("bitcoin/form/bitcoin.phtml");
53
+ $guide = $guide->toHtml();
54
+ }
55
+
56
+ $logo = new $class;
57
+ $logo->setTemplate('bitcoin/form/logo.phtml');
58
+ $this->setTemplate('bitcoin/form/bitcoin.phtml')
59
+ ->setRedirectMessage(
60
+ Mage::helper('bitcoin')->__('You will be paid via Yellow')
61
+ )
62
+ ->setMethodTitle('')
63
+ ->setMethodLabelAfterHtml($logo->toHtml() . $guide);
64
+
65
+ return parent::_construct();
66
  }
 
 
67
 
68
+ /**
69
+ * Get instructions text from config
70
+ *
71
+ * @return string
72
+ */
73
+ public function getInstructions()
74
+ {
75
+ return;
76
+ if (is_null($this->_instructions)) {
77
+ $this->_instructions = $this->getMethod()->getInstructions();
78
+ }
79
+ return $this->_instructions;
80
+ }
81
+
82
+ }
app/code/local/Yellow/Bitcoin/Block/Fullscreen.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ class Yellow_Bitcoin_Block_Fullscreen extends Yellow_Bitcoin_Block_Widget
29
+ {
30
+ public function GetWidgetUrl()
31
+ {
32
+ $order_id = Mage::getSingleton('checkout/session') ->getLastRealOrderId();
33
+ $order = Mage::getModel("sales/order")->loadBYIncrementId($order_id);
34
+ if (!($order)
35
+ or !($payment = $order->getPayment())
36
+ or !($instance = $payment->getMethodInstance())
37
+ or ($instance->getCode() != 'bitcoin')
38
+ ) {
39
+ return 'no payment';
40
+ }
41
+ if (Mage::getStoreConfig('payment/bitcoin/fullscreen') != 1 ) {
42
+ return 'disabled';
43
+ }
44
+ $invoice = $instance->getInvoiceData();
45
+ return $invoice['url'];
46
+ }
47
+ }
app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Content.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ class Yellow_Bitcoin_Block_Fullscreen_Widget_Content extends Yellow_Bitcoin_Block_Widget
29
+ {
30
+ /**
31
+ * create an invoice & return the url of it
32
+ * @return string
33
+ */
34
+ public function GetWidgetUrl()
35
+ {
36
+ $order_id = Mage::getSingleton('checkout/session') ->getLastRealOrderId();
37
+ $order = Mage::getModel("sales/order")->loadByIncrementId($order_id);
38
+ if (!($order)
39
+ or !($payment = $order->getPayment())
40
+ or !($instance = $payment->getMethodInstance())
41
+ or ($instance->getCode() != 'bitcoin')
42
+ ) {
43
+ return 'no payment';
44
+ }
45
+ if (Mage::getStoreConfig('payment/bitcoin/fullscreen') != 1 ) {
46
+ return 'disabled';
47
+ }
48
+ $invoice = $instance->getInvoiceData();
49
+ return $invoice['url'];
50
+ }
51
+ }
app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Footer.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+
29
+ Class Yellow_Bitcoin_Block_Fullscreen_Widget_Footer extends Yellow_Bitcoin_Block_Fullscreen_Widget_Header
30
+ {
31
+ /**
32
+ * @var Mage_Sales_Model_Order
33
+ */
34
+ public $order;
35
+ /**
36
+ * @return sales email address
37
+ */
38
+ public function getContactEmail(){
39
+ return Mage::getStoreConfig('trans_email/ident_sales/email');
40
+ }
41
+
42
+ /**
43
+ * get customer email
44
+ * @return string
45
+ */
46
+ public function getCustomerEmail(){
47
+ if($this->order instanceof Mage_Sales_Model_Order){
48
+ $email = $this->order->getCustomerEmail();
49
+ }else{
50
+ $email = "";
51
+ }
52
+ return $email;
53
+ }
54
+
55
+ /**
56
+ * get customer email
57
+ * @return string
58
+ */
59
+ public function getCustomerName()
60
+ {
61
+ if($this->order instanceof Mage_Sales_Model_Order){
62
+ $name = Mage::getModel("customer/customer")->load($this->order->getCustomerId())->getName();
63
+ }else{
64
+ $name= "";
65
+ }
66
+ return $name;
67
+ }
68
+
69
+ /**
70
+ * return billing address
71
+ * @return mixed
72
+ */
73
+ public function getBillingAddress(){
74
+ $order = $this->getLastOrder();
75
+ $htmlAddress = $order->getBillingAddress()->format("html");
76
+ return $htmlAddress;
77
+ }
78
+
79
+ /**
80
+ * return yellow invoice data
81
+ * @return array
82
+ */
83
+ public function getInvoiceData()
84
+ {
85
+ $order = $this->getLastOrder();
86
+
87
+ if (!($order)
88
+ or !($payment = $order->getPayment())
89
+ or !($instance = $payment->getMethodInstance())
90
+ or ($instance->getCode() != 'bitcoin')
91
+ ) {
92
+ return 'no payment';
93
+ }
94
+ if (Mage::getStoreConfig('payment/bitcoin/fullscreen') != 1 ) {
95
+ return 'disabled';
96
+ }
97
+ $invoice = $instance->getInvoiceData();
98
+ return $invoice;
99
+ }
100
+
101
+ /**
102
+ * return last order object
103
+ * @return Mage_Sales_Model_Order $order
104
+ */
105
+ public function getLastOrder()
106
+ {
107
+ $order_id = Mage::getSingleton('checkout/session') ->getLastRealOrderId();
108
+ $order = Mage::getModel("sales/order")->loadByIncrementId($order_id);
109
+ $this->order = $order;
110
+ return $this->order;
111
+ }
112
+
113
+
114
+ /**
115
+ * this was made for future use
116
+ *
117
+ * @param $order
118
+ */
119
+ public function setLastOrder($order){
120
+ $this->order = $order;
121
+ }
122
+ }
app/code/local/Yellow/Bitcoin/Block/Fullscreen/Widget/Header.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+
29
+ Class Yellow_Bitcoin_Block_Fullscreen_Widget_Header extends Mage_Core_Block_Template
30
+ {
31
+ /**
32
+ * return store name
33
+ * @return null|string
34
+ */
35
+ public function getStoreName(){
36
+ return Mage::app()->getStore()->getName();
37
+ }
38
+
39
+ /**
40
+ * return store's logo src
41
+ * @return string
42
+ */
43
+ public function getLogoSrc()
44
+ {
45
+ return $this->getSkinUrl(Mage::getStoreConfig('design/header/logo_src'));
46
+ }
47
+
48
+ /**
49
+ * return alt text for store's logo
50
+ * @return mixed
51
+ */
52
+ public function getLogoAlt()
53
+ {
54
+ return Mage::getStoreConfig('design/header/logo_alt');
55
+ }
56
+ }
app/code/local/Yellow/Bitcoin/Block/Status.php CHANGED
@@ -1,30 +1,31 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
 
28
- class Yellow_Bitcoin_Block_Status extends Mage_Core_Block_Template {
29
-
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ class Yellow_Bitcoin_Block_Status extends Mage_Core_Block_Template
29
+ {
30
+
31
+ }
app/code/local/Yellow/Bitcoin/Block/Widget.php CHANGED
@@ -1,74 +1,73 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
-
28
- class Yellow_Bitcoin_Block_Widget extends Mage_Checkout_Block_Onepage_Payment
29
- {
30
 
31
  /**
32
- *
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  **/
34
- protected function _construct()
35
  {
36
- $this->setTemplate('bitcoin/widget.phtml');
37
- parent::_construct();
38
- }
39
 
40
- /**
41
- * @return string
42
- */
43
- public function GetQuoteId()
44
- {
45
- $quote = $this->getQuote();
46
- $quoteId = $quote->getId();
47
-
48
- return $quoteId;
49
- }
50
 
51
- /**
52
- * create an invoice and return the url so that widget.phtml can display it
53
- *
54
- * @return string
55
- */
56
- public function GetWidgetUrl()
57
- {
58
- if (!($quote = Mage::getSingleton('checkout/session')->getQuote())
59
- or !($payment = $quote->getPayment())
60
- or !($instance = $payment->getMethodInstance())
61
- or ($instance->getCode() != 'bitcoin'))
62
  {
63
- return 'no payment';
 
 
 
64
  }
65
- if (Mage::getStoreConfig('payment/bitcoin/fullscreen'))
 
 
 
 
 
 
66
  {
67
- return 'disabled';
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  }
69
- $quote = $this->getQuote();
70
- $payment = $quote->getPayment()->getMethodInstance();
71
- $invoice = $payment->createInvoice($quote , false);
72
- return $invoice['url'];
73
  }
74
- }
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
  /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
  **/
28
+ class Yellow_Bitcoin_Block_Widget extends Mage_Checkout_Block_Onepage_Payment
29
  {
 
 
 
30
 
31
+ /**
32
+ *
33
+ **/
34
+ protected function _construct()
35
+ {
36
+ $this->setTemplate('bitcoin/widget.phtml');
37
+ parent::_construct();
38
+ }
 
 
39
 
40
+ /**
41
+ * @return string
42
+ */
43
+ public function GetQuoteId()
 
 
 
 
 
 
 
44
  {
45
+ $quote = $this->getQuote();
46
+ $quoteId = $quote->getId();
47
+
48
+ return $quoteId;
49
  }
50
+
51
+ /**
52
+ * create an invoice and return the url so that widget.phtml can display it
53
+ *
54
+ * @return string
55
+ */
56
+ public function GetWidgetUrl()
57
  {
58
+ if (!($quote = Mage::getSingleton('checkout/session')->getQuote())
59
+ or !($payment = $quote->getPayment())
60
+ or !($instance = $payment->getMethodInstance())
61
+ or ($instance->getCode() != 'bitcoin')
62
+ ) {
63
+ return 'no payment';
64
+ }
65
+ if (Mage::getStoreConfig('payment/bitcoin/fullscreen')) {
66
+ return 'disabled';
67
+ }
68
+ $quote = $this->getQuote();
69
+ $payment = $quote->getPayment()->getMethodInstance();
70
+ $invoice = $payment->createInvoice($quote, false);
71
+ return $invoice['url'];
72
  }
 
 
 
 
73
  }
 
app/code/local/Yellow/Bitcoin/Helper/Data.php CHANGED
@@ -1,30 +1,39 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
 
28
- class Yellow_Bitcoin_Helper_Data extends Mage_Core_Helper_Abstract {
29
-
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ class Yellow_Bitcoin_Helper_Data extends Mage_Core_Helper_Abstract
29
+ {
30
+ /**
31
+ * check if the fullscreen setting is set to yes / no
32
+ * @return bool
33
+ */
34
+ public function isFullScreen()
35
+ {
36
+ return ( Mage::getStoreConfig('payment/bitcoin/fullscreen') == 1 );
37
+ }
38
+
39
+ }
app/code/local/Yellow/Bitcoin/Model/Bitcoin.php CHANGED
@@ -1,518 +1,639 @@
1
  <?php
2
 
3
- /**
4
- *
5
- * The MIT License (MIT)
6
- *
7
- * Copyright (c) 2014 YellowPay.co
8
- *
9
- * Permission is hereby granted, free of charge, to any person obtaining a copy
10
- * of this software and associated documentation files (the "Software"), to deal
11
- * in the Software without restriction, including without limitation the rights
12
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- * copies of the Software, and to permit persons to whom the Software is
14
- * furnished to do so, subject to the following conditions:
15
- *
16
- * The above copyright notice and this permission notice shall be included in all
17
- * copies or substantial portions of the Software.
18
- *
19
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
- * SOFTWARE.
26
- *
27
- * */
28
- Class Yellow_Bitcoin_Model_Bitcoin extends Mage_Payment_Model_Method_Abstract {
29
-
30
  /**
31
- * Payment method code
32
  *
33
- * @var string
34
- */
35
- protected $_code = 'bitcoin';
36
-
37
- /**
38
- * Payment Method features
39
- * @var bool
40
- */
41
- protected $_isGateway = true;
42
- protected $_canOrder = true;
43
- protected $_canAuthorize = true;
44
- protected $_canCapture = true;
45
- protected $_canCapturePartial = false;
46
- protected $_canCaptureOnce = false;
47
- protected $_canRefund = false;
48
- protected $_canRefundInvoicePartial = false;
49
- protected $_canVoid = false;
50
- protected $_canUseInternal = false;
51
- protected $_canUseCheckout = true;
52
- protected $_canUseForMultishipping = true;
53
- protected $_isInitializeNeeded = false;
54
- protected $_canFetchTransactionInfo = false;
55
- protected $_canReviewPayment = false;
56
- protected $_canCreateBillingAgreement = false;
57
- protected $_canManageRecurringProfiles = true;
58
-
59
- /**
60
- * Cash On Delivery payment block paths
61
- * @var string
62
- */
63
- protected $_formBlockType = 'bitcoin/form_bitcoin';
64
-
65
- /**
66
- * Server Root for Yellow API
67
- * @var String
68
- */
69
- private $server_root = "https://yolanda-perkins.herokuapp.com/";
70
-
71
- /**
72
- * create invoice URI
73
- * @var String
74
- */
75
- private $api_uri_create_invoice = "api/invoice/";
76
-
77
- /**
78
- * check invoice status URI
79
- * @var String
80
- */
81
- private $api_uri_check_payment = "api/invoice/[id]/";
82
-
83
- /**
84
- * @type Mage_Sales_Model_Order
85
- **/
86
- private $order;
87
-
88
- /**
89
- * Check whether payment method can be used
90
- *
91
- * @param Mage_Sales_Model_Quote|null $quote
92
  *
93
- * @return bool
94
- */
95
- public function isAvailable($quote = null) {
96
- parent::isAvailable($quote);
97
- $quoteCurrency = $quote->getData("quote_currency_code");
98
- $currencies = array_map('trim', explode(',', Mage::getStoreConfig('payment/bitcoin/currencies')));
99
- return array_search($quoteCurrency, $currencies) !== false;
100
- }
101
-
102
- /**
103
- * Get instructions text from config
104
  *
105
- * @return string
106
- */
107
- public function getInstructions() {
108
- return trim($this->getConfigData('instructions'));
109
- }
110
-
111
- /**
112
- * can be used in regular checkout
113
- *
114
- * @return bool
115
- */
116
- public function canUseCheckout() {
117
- if (!$this->isApiKeyConfigured()) {
118
- return false;
119
- }
120
- return $this->_canUseCheckout;
121
- }
122
-
123
- /**
124
- * Returns true if the merchant has set their api key
125
  *
126
- * @return boolean
127
- */
128
- public function isApiKeyConfigured() {
129
- $public_key = Mage::helper('core')->decrypt(Mage::getStoreConfig('payment/bitcoin/public_key'));
130
- $private_key = Mage::helper('core')->decrypt(Mage::getStoreConfig('payment/bitcoin/private_key'));
131
- return (!empty($private_key) && !empty($public_key));
132
- }
133
-
134
- /**
135
- * Authorize payment abstract method
136
  *
137
- * @param Varien_Object $payment
138
- * @param float $amount
 
 
 
 
 
139
  *
140
- * @return Mage_Payment_Model_Abstract | direct redirect to Yellow fullscreen payment page
141
- */
142
- public function authorize(Varien_Object $payment, $amount) {
143
- if (!Mage::getStoreConfig('payment/bitcoin/fullscreen')) {
144
- $data = $this->CheckForPayment($payment);
145
- return $data;
146
- } else {
147
- return $this->CreateInvoiceAndRedirect($payment);
148
- }
149
- }
150
 
151
- /**
152
- *
153
- * create a yellow invoice
154
- *
155
- * @param $payment
156
- * @param $amount
157
- *
158
- * @return Yellow_Bitcoin_Model_Bitcoin
159
- */
160
- public function CreateInvoiceAndRedirect($payment) {
161
- $order = $payment->getOrder();
162
- if(is_array($this->createInvoice($order))){
163
- $payment->setIsTransactionPending(true); // status will be PAYMENT_REVIEW instead of PROCESSING
164
- //$orderId = $order->getIncrementId();
165
- //$invoiceId = Mage::getModel('sales/order_invoice_api')->create($orderId, array());
166
- return $this;
167
- }else{
168
- $this->log("an error happened during creating an invoice" . __LINE__);
169
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co"));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  }
171
- }
172
 
173
- /**
174
- * @param Varien_Object $payment
175
- *
176
- * @return Yellow_Bitcoin_Model_Bitcoin
177
- */
178
- public function CheckForPayment($payment) {
179
- $order = $payment->getOrder();
180
- $order->setCanSendNewEmailFlag(false);
181
- $quoteId = $order->getQuoteId();
182
- $ipn = Mage::getModel('bitcoin/ipn');
183
- $invoice = Mage::getSingleton('core/session')->getData("invoice");
184
- $invoice_status = $this->checkInvoice($invoice["id"]);
185
- if(!is_array($invoice_status)){
186
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co"));
187
  }
188
- switch ($invoice_status["status"]) {
189
- case "new":
190
- // This is the error that is displayed to the customer during checkout.
191
- Mage::throwException("Order not paid for. Please pay first and then Place your Order.");
192
- Mage::log('Order not paid for. Please pay first and then Place Your Order.', Zend_Log::CRIT, 'yellow.log');
193
- break;
194
- case "partial":
195
- // This is the error that is displayed to the customer during checkout.
196
- Mage::getResourceModel("bitcoin/ipn")->MarkAsPartial($invoice["id"]);
197
- Mage::throwException("Order is partialy paid for. we don't support partial payment yet.");
198
- Mage::log('Order is partialy paid for. we don\'t support partial payment yet.', Zend_Log::CRIT, 'yellow.log');
199
- break;
200
-
201
- case "authorizing":
202
- Mage::getResourceModel("bitcoin/ipn")->MarkAsAuthorizing($invoice["id"]);
203
- $payment->setIsTransactionPending(true);
204
- $order = $payment->getOrder();
205
- $status_message = "Yellow invoice created , Invoice Id: " .$invoice['id'];
206
- $order->addStatusToHistory( Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW ,$status_message);
207
-
208
- /* start to invoice the order */
209
- /*$order = $payment->getOrder();
210
- $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
211
- if (!count($order->getInvoiceCollection())) {
212
- $invoice = $order->prepareInvoice()
213
- ->setTransactionId(1)
214
- ->addComment('Invoiced automatically from widget payment')
215
- ->register()
216
- ->pay();
217
- $transactionSave = Mage::getModel('core/resource_transaction')
218
- ->addObject($invoice)
219
- ->addObject($invoice->getOrder());
220
- $transactionSave->save();
221
- }*/
222
- /* end invoice the order */
223
- break;
224
- case "paid":
225
- $invoiceModel = Mage::getModel('sales/order_invoice_api');
226
- $invoice_id = $invoiceModel->create($payment->getOrder()->getIncrementId(), array());
227
- $invoiceModel->capture($invoice_id);
228
- break;
229
- case "expired":
230
- Mage::throwException(Mage::helper('bitcoin')->__("I'm sorry the invoice has {$invoice_status["status"]}, please refresh shopping cart."));
231
- break;
232
- case "refund_owed":
233
- Mage::throwException(Mage::helper('bitcoin')->__("Incorrect payment received, please request a refund."));
234
- break;
235
- case "refund_requested":
236
- Mage::throwException(Mage::helper('bitcoin')->__("Refund requested! To place a new order, please refresh shopping cart."));
237
- break;
238
- default:
239
- $this->log("EXCEPTION: UNKNOW STATUES : " . $invoice_status["status"]);
240
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co"));
241
- break;
242
  }
243
- return $this;
244
- }
245
- /**
246
- * read the invoice url from session and redirect to it
247
- *
248
- * @return string
249
- */
250
- public function getOrderPlaceRedirectUrl() {
251
- if (Mage::getStoreConfig('payment/bitcoin/fullscreen')) {
252
- $invoice = Mage::getSingleton('core/session')->getData("invoice");
253
- return $invoice["url"];
254
- } else {
255
- return '';
256
  }
257
- }
258
- /**
259
- *
260
- * @param Mage_Sales_Model_Quote $quote
261
- * @param boolean $redirect
262
- * @return boolean
263
- */
264
- public function createInvoice($quote, $redirect = true) {
265
- $this->clearSessionData();
266
- if (get_class($quote) == "Mage_Sales_Model_Quote") {
267
- $array_key = "quoteId";
268
- $currency_code_key = "quote_currency_code";
269
- } else {
270
- $array_key = "orderId";
271
- $currency_code_key = "order_currency_code";
 
 
272
  }
273
- $base_price = $quote->getData("grand_total");
274
- $base_ccy = $quote->getData($currency_code_key);
275
- $quote_id = $quote->getData("entity_id");
276
- $ipnUrl = Mage::getUrl("bitcoin/index/ipn", array("id" => base64_encode($quote_id)));
277
- $redirectUrl = "";
278
- if ($redirect) {
279
- $redirectUrl = Mage::getUrl("bitcoin/index/status");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
280
  }
281
- $http_client = $this->getHTTPClient();
282
- $yellow_payment_data = array(
283
- "base_price" => $base_price, /// Set to 0.30 for testing
284
- "base_ccy" => $base_ccy, /// Set to "USD" for testing
285
- "callback" => $ipnUrl,
286
- "redirect" => $redirectUrl
287
- );
288
- $post_body = json_encode($yellow_payment_data);
289
- $nonce = round(microtime(true) * 1000);
290
- $url = $this->server_root . $this->api_uri_create_invoice;
291
- $message = $nonce . $url . $post_body;
292
- $private_key = Mage::helper('core')->decrypt($this->getConfiguration("private_key"));
293
- $hash = hash_hmac("sha256", $message, $private_key, false);
294
-
295
- $http_client->setHeaders($this->getHeaders($nonce, $hash));
296
- $http_client->setMethod("POST")
297
- ->setUri($url);
298
- $http_client->setRawData($post_body);
299
- try {
300
- $response = $http_client->request();
301
- if ($response->getStatus() == "200") {
302
- $this->log("Response: " . $response);
303
- $body = $response->getBody();
304
- $data = json_decode($body, true);
305
- /* save the invoice in the database */
306
- $invoice_data = array(
307
- $array_key => $quote_id,
308
- "invoice_id" => $data["id"],
309
- "url" => $data["url"],
310
- "status" => $data["status"],
311
- "address" => $data["address"],
312
- "invoice_price" => $data["invoice_price"],
313
- "invoice_ccy" => $data["invoice_ccy"],
314
- "server_time" => $data["server_time"],
315
- "expiration_time" => $data["expiration"],
316
- "raw_body" => $yellow_payment_data,
317
- "base_price" => $yellow_payment_data["base_price"],
318
- "base_ccy" => $yellow_payment_data["base_ccy"],
319
- "hash" => $hash
320
  );
321
- Mage::getModel("bitcoin/ipn")->saveInvoice($invoice_data);
322
- /* end saving invoice */
323
- Mage::getSingleton('core/session')->setData('invoice', $data);
324
- Mage::getSingleton('core/session')->setData('has_invoice', true);
325
- return $data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
  } else {
327
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co Line:" . __LINE__));
328
- $this->log("I had seen an error code {$response->getStatus()}");
329
- $this->log("response body was :" . json_encode($response->getBody));
330
- return false;
331
  }
332
- } catch (Exception $exc) {
333
- $this->log($exc->getMessage());
334
- $this->log("EXCEPTION:" . json_encode($exc));
335
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co " . $exc->getMessage()));
336
  }
337
- }
338
- /**
339
- * check yellow invoice status over Yellow API
340
- *
341
- * @param integer $id
342
- * @return boolean
343
- *
344
- */
345
- public function checkInvoice($id) {
346
- $url = $this->server_root . str_replace("[id]", $id, $this->api_uri_check_payment);
347
- $nonce = round(microtime(true) * 1000);
348
- $message = $nonce . $url;
349
- $private_key = Mage::helper('core')->decrypt($this->getConfiguration("private_key"));
350
- $hash = hash_hmac("sha256", $message, $private_key, false);
351
- $http_client = $this->getHTTPClient();
352
- $http_client->setHeaders($this->getHeaders($nonce, $hash));
353
- $http_client->setMethod("GET")->setUri($url);
354
- try {
355
- $body = $http_client->request()->getBody();
356
- $data = json_decode($body, true);
357
- Mage::getSingleton('core/session')->setData('check_invoice', $data);
358
- return $data;
359
- } catch (Exception $exc) {
360
- $this->log($exc->getMessage());
361
- $this->log("EXCEPTION:" . json_encode($exc));
362
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co " . $exc->getMessage() ));
363
  }
364
- return false;
365
- }
366
-
367
- /**
368
- * check yellow invoice status over Yellow API
369
- *
370
- * @param integer $id
371
- * @return boolean
372
- *
373
- */
374
-
375
- public function checkInvoiceStatus($id) {
376
- $data = $this->checkInvoice($id);
377
- if (!is_array($data)) {
378
- Mage::throwException(Mage::helper('bitcoin')->__("We're sorry. An internal error happened while completing your request. You can refresh the page to try again. You can always send us an email at support@yellowpay.co + line:" . __LINE__));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  }
380
- if ($data["status"] == "paid") {
381
- $order = $this->getOrder();
382
- $order->addStatusToHistory($this->getSuccessStatus(), "Payment confirmed , invoice Id " . $data["id"], true);
383
- $order->sendNewOrderEmail();
384
- $order->save();
385
- Mage::getResourceModel("bitcoin/ipn")->MarkAsPaid($id);
386
- /* create an invoice */
387
- $invoiceModel = Mage::getModel('sales/order_invoice_api');
388
- $invoice_id = $invoiceModel->create($order->getIncrementId(), array());
389
- $invoiceModel->capture($invoice_id);
390
- return $data["status"];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  }
392
-
393
- if ($data["status"] == "authorizing") {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
394
  $order = $this->getOrder();
395
- $order->addStatusToHistory(Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW , "authorizing payment , it need some time to confirm , invoice Id : {$data['id']}");
396
- $order->save();
397
- Mage::getResourceModel("bitcoin/ipn")->MarkAsAuthorizing($id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  return $data["status"];
399
  }
400
-
401
- if ($data["status"] === "failed") {
402
- $order = $this->getOrder();
403
- $order->addStatusToHistory($this->getFailedStatus(), "client failed to pay , invoice Id : {$data["id"]} ", true);
404
- $order->cancel();
405
- $order->save();
406
- return $data["status"];
 
407
  }
408
- return false;
409
- }
410
 
411
- /**
412
- *
413
- * @param Mage_Sales_Model_Order $order
414
- */
415
- public function setOrder($order) {
416
- $this->order = $order;
417
- }
418
-
419
- /**
420
- *
421
- * @return Mage_Sales_Model_Order
422
- * @throws \Exception
423
- */
424
- public function getOrder() {
425
- if (!$this->order) {
426
- $session = Mage::getSingleton('checkout/session');
427
- if (!$session->getLastRealOrderId()) {
428
- throw new \Exception(" order Id can't be null ", 500);
429
  }
430
- $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
431
- $this->order = $order;
432
  }
433
- return $this->order;
434
- }
435
- /**
436
- * read from magento configuration
437
- *
438
- * @param string $param
439
- * @return type
440
- */
441
- private function getConfiguration($param) {
442
- return $this->getConfigData($param);
443
- }
444
- /**
445
- * get HTTP client
446
- *
447
- * @return \Yellow_Bitcoin_Model_Http
448
- */
449
- private function getHTTPClient() {
450
- return new Yellow_Bitcoin_Model_Http();
451
- }
452
-
453
- /**
454
- * prepare HTTP Headers
455
- *
456
- * @param String $nonce
457
- * @param String$signature
458
- * @return string
459
- */
460
- private function getHeaders($nonce, $signature) {
461
- $headers = array(
462
- "Content-type:application/json",
463
- "API-Key:" . Mage::helper('core')->decrypt($this->getConfiguration('public_key')),
464
- "API-Nonce:$nonce",
465
- "API-Sign:$signature"
466
- );
467
- return $headers;
468
- }
469
-
470
- /**
471
- * returns success status
472
- *
473
- * @return String
474
- */
475
- public function getSuccessStatus() {
476
- return Mage_Sales_Model_Order::STATE_PROCESSING;
477
- }
478
-
479
- /**
480
- * returns failed status
481
- *
482
- * @return String
483
- */
484
- public function getFailedStatus() {
485
- return Mage_Sales_Model_Order::STATE_CANCELED;
486
- }
487
- /**
488
- *
489
- * @param string $invoiceIncrementId
490
- * @return boolean
491
- */
492
- public function captureInvoice($invoiceIncrementId){
493
- return Mage::getModel("sales/order_invoice_api")->capture($invoiceIncrementId);
494
- }
495
 
496
- /**
497
- *
498
- * clear session data
499
- *
500
- * @return boolean
501
- */
502
- public function clearSessionData(){
503
- Mage::getSingleton('core/session')->unsetData("invoice");
504
- Mage::getSingleton('core/session')->unsetData("has_invoice");
505
- Mage::getSingleton('core/session')->unsetData("check_invoice");
506
- return true;
507
- }
508
- /**
509
- * log message to file
510
- *
511
- * @param string $message
512
- * @return boolean
513
- */
514
- private function log($message) {
515
- Mage::log($message, Zend_Log::ERR, "yellow.log");
516
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
517
  }
518
- }
1
  <?php
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  /**
 
4
  *
5
+ * The MIT License (MIT)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  *
7
+ * Copyright (c) 2014 YellowPay.co
 
 
 
 
 
 
 
 
 
 
8
  *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
 
 
 
 
 
 
 
 
18
  *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
  *
27
+ * */
28
+ Class Yellow_Bitcoin_Model_Bitcoin extends Mage_Payment_Model_Method_Abstract
29
+ {
 
 
 
 
 
 
 
30
 
31
+ /**
32
+ * Payment method code
33
+ *
34
+ * @var string
35
+ */
36
+ protected $_code = 'bitcoin';
37
+
38
+ /**
39
+ * Payment Method features
40
+ *
41
+ * @var bool
42
+ */
43
+ protected $_isGateway = true;
44
+ protected $_canOrder = true;
45
+ protected $_canAuthorize = true;
46
+ protected $_canCapture = true;
47
+ protected $_canCapturePartial = false;
48
+ protected $_canCaptureOnce = false;
49
+ protected $_canRefund = false;
50
+ protected $_canRefundInvoicePartial = false;
51
+ protected $_canVoid = false;
52
+ protected $_canUseInternal = false;
53
+ protected $_canUseCheckout = true;
54
+ protected $_canUseForMultishipping = true;
55
+ protected $_isInitializeNeeded = false;
56
+ protected $_canFetchTransactionInfo = false;
57
+ protected $_canReviewPayment = false;
58
+ protected $_canCreateBillingAgreement = false;
59
+ protected $_canManageRecurringProfiles = true;
60
+
61
+ /**
62
+ * Cash On Delivery payment block paths
63
+ *
64
+ * @var string
65
+ */
66
+ protected $_formBlockType = 'bitcoin/form_bitcoin';
67
+
68
+ /**
69
+ * Server Root for Yellow API
70
+ *
71
+ * @var String
72
+ */
73
+ private $server_root = "https://api.yellowpay.co/v1/";
74
+
75
+ /**
76
+ * create invoice URI
77
+ *
78
+ * @var String
79
+ */
80
+ private $api_uri_create_invoice = "invoice/";
81
+
82
+ /**
83
+ * check invoice status URI
84
+ *
85
+ * @var String
86
+ */
87
+ private $api_uri_check_payment = "invoice/[id]/";
88
+
89
+ /**
90
+ * @type Mage_Sales_Model_Order
91
+ **/
92
+ private $order;
93
+
94
+ /**
95
+ * Check whether payment method can be used
96
+ *
97
+ * @param Mage_Sales_Model_Quote|null $quote
98
+ *
99
+ * @return bool
100
+ */
101
+ public function isAvailable($quote = null)
102
+ {
103
+ parent::isAvailable($quote);
104
+ $quoteCurrency = $quote->getData("quote_currency_code");
105
+ $currencies = array_map('trim', explode(',', Mage::getStoreConfig('payment/bitcoin/currencies')));
106
+ return array_search($quoteCurrency, $currencies) !== false;
107
  }
 
108
 
109
+ /**
110
+ * Get instructions text from config
111
+ *
112
+ * @return string
113
+ */
114
+ public function getInstructions()
115
+ {
116
+ return trim($this->getConfigData('instructions'));
 
 
 
 
 
 
117
  }
118
+
119
+ /**
120
+ * can be used in regular checkout
121
+ *
122
+ * @return bool
123
+ */
124
+ public function canUseCheckout()
125
+ {
126
+ if (!$this->isApiKeyConfigured()) {
127
+ return false;
128
+ }
129
+ return $this->_canUseCheckout;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
+
132
+ /**
133
+ * Returns true if the merchant has set their api key
134
+ *
135
+ * @return boolean
136
+ */
137
+ public function isApiKeyConfigured()
138
+ {
139
+ $public_key = Mage::helper('core')->decrypt(Mage::getStoreConfig('payment/bitcoin/public_key'));
140
+ $private_key = Mage::helper('core')->decrypt(Mage::getStoreConfig('payment/bitcoin/private_key'));
141
+ return (!empty($private_key) && !empty($public_key));
 
 
142
  }
143
+
144
+ /**
145
+ * Authorize payment abstract method
146
+ *
147
+ * @param Varien_Object $payment
148
+ * @param float $amount
149
+ *
150
+ * @return Mage_Payment_Model_Abstract | direct redirect to Yellow fullscreen payment page
151
+ */
152
+ public function authorize(Varien_Object $payment, $amount)
153
+ {
154
+ if (!Mage::getStoreConfig('payment/bitcoin/fullscreen')) {
155
+ $data = $this->CheckForPayment($payment);
156
+ return $data;
157
+ } else {
158
+ return $this->CreateInvoiceAndRedirect($payment);
159
+ }
160
  }
161
+
162
+ /**
163
+ *
164
+ * create a yellow invoice
165
+ *
166
+ * @param $payment
167
+ * @param $amount
168
+ *
169
+ * @return Yellow_Bitcoin_Model_Bitcoin
170
+ */
171
+ public function CreateInvoiceAndRedirect($payment)
172
+ {
173
+ $order = $payment->getOrder();
174
+ if (is_array($this->createInvoice($order))) {
175
+ $payment->setIsTransactionPending(true); // status will be PAYMENT_REVIEW instead of PROCESSING
176
+ //$orderId = $order->getIncrementId();
177
+ //$invoiceId = Mage::getModel('sales/order_invoice_api')->create($orderId, array());
178
+ return $this;
179
+ } else {
180
+ $this->log("An error occurred during invoice creation: " . __LINE__);
181
+ Mage::throwException(
182
+ Mage::helper('bitcoin')->__(
183
+ "We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co"
184
+ )
185
+ );
186
+ }
187
  }
188
+
189
+ /**
190
+ * @param Varien_Object $payment
191
+ *
192
+ * @return Yellow_Bitcoin_Model_Bitcoin
193
+ */
194
+ public function CheckForPayment($payment)
195
+ {
196
+ $order = $payment->getOrder();
197
+ $order->setCanSendNewEmailFlag(false);
198
+ $quoteId = $order->getQuoteId();
199
+ $ipn = Mage::getModel('bitcoin/ipn');
200
+ $invoice = Mage::getSingleton('core/session')->getData("invoice");
201
+ $invoice_status = $this->checkInvoice($invoice["id"]);
202
+ if (!is_array($invoice_status)) {
203
+ Mage::throwException(
204
+ Mage::helper('bitcoin')->__(
205
+ "We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co"
206
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  );
208
+ }
209
+ switch ($invoice_status["status"]) {
210
+ case "new":
211
+ // This is the error that is displayed to the customer during checkout.
212
+ Mage::throwException("Order has not been paid. Please pay first and then place your order.");
213
+ Mage::log(
214
+ 'Order has not been paid. Please pay first and then place your order.',
215
+ Zend_Log::CRIT,
216
+ 'yellow.log'
217
+ );
218
+ break;
219
+ case "partial":
220
+ // This is the error that is displayed to the customer during checkout.
221
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsPartial($invoice["id"]);
222
+ Mage::throwException("Order has been partially paid. We don't support partial payment yet.");
223
+ Mage::log(
224
+ 'Order has been partially paid. We don\'t support partial payment yet.',
225
+ Zend_Log::CRIT,
226
+ 'yellow.log'
227
+ );
228
+ break;
229
+
230
+ case "authorizing":
231
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsAuthorizing($invoice["id"]);
232
+ $payment->setIsTransactionPending(true);
233
+ $order = $payment->getOrder();
234
+ $status_message = "Yellow invoice created. Invoice Id: " . $invoice['id'];
235
+ $order->addStatusToHistory(Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW, $status_message);
236
+
237
+ /* start to invoice the order */
238
+ /*$order = $payment->getOrder();
239
+ $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true)->save();
240
+ if (!count($order->getInvoiceCollection())) {
241
+ $invoice = $order->prepareInvoice()
242
+ ->setTransactionId(1)
243
+ ->addComment('Invoiced automatically from widget payment')
244
+ ->register()
245
+ ->pay();
246
+ $transactionSave = Mage::getModel('core/resource_transaction')
247
+ ->addObject($invoice)
248
+ ->addObject($invoice->getOrder());
249
+ $transactionSave->save();
250
+ }*/
251
+ /* end invoice the order */
252
+ break;
253
+ case "paid":
254
+ $invoiceModel = Mage::getModel('sales/order_invoice_api');
255
+ $invoice_id = $invoiceModel->create($payment->getOrder()->getIncrementId(), array());
256
+ $invoiceModel->capture($invoice_id);
257
+ break;
258
+ case "expired":
259
+ Mage::throwException(
260
+ Mage::helper('bitcoin')->__(
261
+ "I'm sorry the invoice has {$invoice_status["status"]}, please refresh the shopping cart."
262
+ )
263
+ );
264
+ break;
265
+ case "refund_owed":
266
+ Mage::throwException(
267
+ Mage::helper('bitcoin')->__("Incorrect payment received, please request a refund.")
268
+ );
269
+ break;
270
+ case "refund_requested":
271
+ Mage::throwException(
272
+ Mage::helper('bitcoin')->__(
273
+ "Refund requested! To place a new order, please refresh shopping cart."
274
+ )
275
+ );
276
+ break;
277
+ default:
278
+ $this->log("EXCEPTION - UNKNOW STATUS: " . $invoice_status["status"]);
279
+ Mage::throwException(
280
+ Mage::helper('bitcoin')->__(
281
+ "We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co"
282
+ )
283
+ );
284
+ break;
285
+ }
286
+ return $this;
287
+ }
288
+
289
+ /**
290
+ * read the invoice url from session and redirect to it
291
+ *
292
+ * @return string
293
+ */
294
+ public function getOrderPlaceRedirectUrl()
295
+ {
296
+ if (Mage::getStoreConfig('payment/bitcoin/fullscreen')) {
297
+ $target_url = Mage::getUrl("bitcoin/index/pay");
298
+ return $target_url;
299
  } else {
300
+ return '';
 
 
 
301
  }
 
 
 
 
302
  }
303
+
304
+ public function getInvoiceData()
305
+ {
306
+ return Mage::getSingleton('core/session')->getData("invoice");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
307
  }
308
+
309
+ /**
310
+ *
311
+ * @param Mage_Sales_Model_Quote $quote
312
+ * @param boolean $redirect
313
+ * @return boolean
314
+ */
315
+ public function createInvoice($quote, $redirect = true)
316
+ {
317
+ $this->clearSessionData();
318
+ if (get_class($quote) == "Mage_Sales_Model_Quote") {
319
+ $array_key = "quoteId";
320
+ $currency_code_key = "quote_currency_code";
321
+ } else {
322
+ $array_key = "orderId";
323
+ $currency_code_key = "order_currency_code";
324
+ }
325
+ $base_price = $quote->getData("grand_total");
326
+ $base_ccy = $quote->getData($currency_code_key);
327
+ $quote_id = $quote->getData("entity_id");
328
+ $ipnUrl = Mage::getUrl("bitcoin/index/ipn", array( "_secure" => true , "id" => base64_encode($quote_id)));
329
+ $redirectUrl = "";
330
+ /*if ($redirect) {
331
+ $redirectUrl = Mage::getUrl("bitcoin/index/status");
332
+ }*/
333
+ $http_client = $this->getHTTPClient();
334
+ $yellow_payment_data = array(
335
+ "base_price" => $base_price, /// Set to 0.30 for testing
336
+ "base_ccy" => $base_ccy, /// Set to "USD" for testing
337
+ "callback" => $ipnUrl,
338
+ "redirect" => $redirectUrl
339
+ );
340
+ $post_body = json_encode($yellow_payment_data);
341
+ $nonce = round(microtime(true) * 1000);
342
+ $url = $this->server_root . $this->api_uri_create_invoice;
343
+ $message = $nonce . $url . $post_body;
344
+ $private_key = Mage::helper('core')->decrypt($this->getConfiguration("private_key"));
345
+ $hash = hash_hmac("sha256", $message, $private_key, false);
346
+
347
+ $http_client->setHeaders($this->getHeaders($nonce, $hash));
348
+ $http_client->setMethod("POST")
349
+ ->setUri($url);
350
+ $http_client->setRawData($post_body);
351
+ try {
352
+ $response = $http_client->request();
353
+ if ($response->getStatus() == "200") {
354
+ $this->log("Response: " . $response);
355
+ $body = $response->getBody();
356
+ $data = json_decode($body, true);
357
+ /* save the invoice in the database */
358
+ $invoice_data = array(
359
+ $array_key => $quote_id,
360
+ "invoice_id" => $data["id"],
361
+ "url" => $data["url"],
362
+ "status" => $data["status"],
363
+ "address" => $data["address"],
364
+ "invoice_price" => $data["invoice_price"],
365
+ "invoice_ccy" => $data["invoice_ccy"],
366
+ "server_time" => $data["server_time"],
367
+ "expiration_time" => $data["expiration"],
368
+ "raw_body" => $yellow_payment_data,
369
+ "base_price" => $yellow_payment_data["base_price"],
370
+ "base_ccy" => $yellow_payment_data["base_ccy"],
371
+ "hash" => $hash
372
+ );
373
+ Mage::getModel("bitcoin/ipn")->saveInvoice($invoice_data);
374
+ /* end saving invoice */
375
+ Mage::getSingleton('core/session')->setData('invoice', $data);
376
+ Mage::getSingleton('core/session')->setData('has_invoice', true);
377
+ return $data;
378
+ } else {
379
+ Mage::throwException($response->getBody());
380
+ $this->log("Error code response received: {$response->getStatus()}");
381
+ $this->log("Response body:" . json_encode($response->getBody()));
382
+ return false;
383
+ }
384
+ } catch (Exception $exc) {
385
+ $this->log($exc->getMessage());
386
+ $this->log("EXCEPTION: " . json_encode($exc));
387
+ Mage::throwException(
388
+ Mage::helper('bitcoin')->__(
389
+ "{$exc->getMessage()}\n We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co"
390
+ )
391
+ );
392
+ }
393
  }
394
+
395
+ /**
396
+ * check yellow invoice status over Yellow API
397
+ *
398
+ * @param integer $id
399
+ * @return boolean
400
+ *
401
+ */
402
+ public function checkInvoice($id)
403
+ {
404
+ $url = $this->server_root . str_replace("[id]", $id, $this->api_uri_check_payment);
405
+ $nonce = round(microtime(true) * 1000);
406
+ $message = $nonce . $url;
407
+ $private_key = Mage::helper('core')->decrypt($this->getConfiguration("private_key"));
408
+ $hash = hash_hmac("sha256", $message, $private_key, false);
409
+ $http_client = $this->getHTTPClient();
410
+ $http_client->setHeaders($this->getHeaders($nonce, $hash));
411
+ $http_client->setMethod("GET")->setUri($url);
412
+ try {
413
+ $body = $http_client->request()->getBody();
414
+ $data = json_decode($body, true);
415
+ Mage::getSingleton('core/session')->setData('check_invoice', $data);
416
+ return $data;
417
+ } catch (Exception $exc) {
418
+ $this->log($exc->getMessage());
419
+ $this->log("EXCEPTION:" . json_encode($exc));
420
+ Mage::throwException(
421
+ Mage::helper('bitcoin')->__(
422
+ "We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co\n" . $exc->getMessage(
423
+ )
424
+ )
425
+ );
426
+ }
427
+ return false;
428
  }
429
+
430
+ /**
431
+ * check yellow invoice status over Yellow API
432
+ *
433
+ * @param integer $id
434
+ * @return boolean
435
+ *
436
+ */
437
+
438
+ public function checkInvoiceStatus($id)
439
+ {
440
+ $data = $this->checkInvoice($id);
441
+ if (!is_array($data)) {
442
+ Mage::throwException(
443
+ Mage::helper('bitcoin')->__(
444
+ "We're sorry, an error has occurred while completing your request. Please refresh the page to try again. If the error persists, please send us an email at support@yellowpay.co\nline: " . __LINE__
445
+ )
446
+ );
447
+ }
448
  $order = $this->getOrder();
449
+ switch ($data["status"]){
450
+ case $data["status"] == "new":
451
+ $this->log("Status page accessed for a new invoice.");
452
+ $this->log("Nothing to do. Redirecting back to the payment page.");
453
+ break;
454
+ case $data["status"] == "paid" :
455
+ $order->addStatusToHistory(
456
+ $this->getSuccessStatus(),
457
+ "Payment confirmed. Invoice Id: " . $data["id"],
458
+ true
459
+ );
460
+ $order->sendNewOrderEmail();
461
+ $order->save();
462
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsPaid($id);
463
+ /* create an invoice */
464
+ $invoiceModel = Mage::getModel('sales/order_invoice_api');
465
+ $invoice_id = $invoiceModel->create($order->getIncrementId(), array());
466
+ $invoiceModel->capture($invoice_id);
467
+ break;
468
+ case $data["status"] == "authorizing":
469
+ $order->addStatusToHistory(
470
+ Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW,
471
+ "Authorizing payment. This typically takes 10 minutes. Invoice Id: {$data['id']}"
472
+ );
473
+ $order->save();
474
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsAuthorizing($id);
475
+ break;
476
+ case $data["status"] == "refund_requested" :
477
+ $order->setState(Mage_Sales_Model_Order::STATE_NEW);
478
+ if(!$order->canCancel()){
479
+ $this->log("Unable to cancel order. Order #" . $order->getIncrementId());
480
+ }else{
481
+ $this->log("refund_requested order");
482
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsRefundRequested($id);
483
+ $order->addStatusToHistory(
484
+ $this->getFailedStatus(),
485
+ "refund_requested. Invoice #{$id} ",
486
+ true
487
+ );
488
+ $order->cancel();
489
+ $order->save();
490
+ $this->log("Order cancelled. Order #" . $order->getIncrementId());
491
+ }
492
+ break;
493
+ case $data["status"] === "failed":
494
+ case $data["status"] === "expired":
495
+ $order->setState(Mage_Sales_Model_Order::STATE_NEW);
496
+ if(!$order->canCancel()){
497
+ $this->log("Unable to cancel order. Order #" . $order->getIncrementId());
498
+ }else{
499
+ $this->log("Order expired");
500
+ Mage::getResourceModel("bitcoin/ipn")->MarkAsExpired($id);
501
+ $order->addStatusToHistory(
502
+ $this->getFailedStatus(),
503
+ "Invoice expired. Invoice #{$id}",
504
+ true
505
+ );
506
+ $order->cancel();
507
+ $order->save();
508
+ $this->log("Order cancelled. Order #" . $order->getIncrementId());
509
+ }
510
+ break;
511
+ default:
512
+ return false;
513
+ break;
514
+ }
515
  return $data["status"];
516
  }
517
+
518
+ /**
519
+ *
520
+ * @param Mage_Sales_Model_Order $order
521
+ */
522
+ public function setOrder($order)
523
+ {
524
+ $this->order = $order;
525
  }
 
 
526
 
527
+ /**
528
+ *
529
+ * @return Mage_Sales_Model_Order
530
+ * @throws \Exception
531
+ */
532
+ public function getOrder()
533
+ {
534
+ if (!$this->order) {
535
+ $session = Mage::getSingleton('checkout/session');
536
+ if (!$session->getLastRealOrderId()) {
537
+ throw new \Exception("Order id can't be null ", 500);
538
+ }
539
+ $order = Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
540
+ $this->order = $order;
 
 
 
 
541
  }
542
+ return $this->order;
 
543
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
544
 
545
+ /**
546
+ * read from magento configuration
547
+ *
548
+ * @param string $param
549
+ * @return type
550
+ */
551
+ public function getConfiguration($param)
552
+ {
553
+ return $this->getConfigData($param);
554
+ }
555
+
556
+ /**
557
+ * get HTTP client
558
+ *
559
+ * @return \Yellow_Bitcoin_Model_Http
560
+ */
561
+ private function getHTTPClient()
562
+ {
563
+ return new Yellow_Bitcoin_Model_Http();
564
+ }
565
+
566
+ /**
567
+ * prepare HTTP Headers
568
+ *
569
+ * @param String $nonce
570
+ * @param String $signature
571
+ * @return string
572
+ */
573
+ private function getHeaders($nonce, $signature)
574
+ {
575
+ $headers = array(
576
+ "Content-type:application/json",
577
+ "API-Key:" . Mage::helper('core')->decrypt($this->getConfiguration('public_key')),
578
+ "API-Nonce:$nonce",
579
+ "API-Sign:$signature"
580
+ );
581
+ return $headers;
582
+ }
583
+
584
+ /**
585
+ * returns success status
586
+ *
587
+ * @return String
588
+ */
589
+ public function getSuccessStatus()
590
+ {
591
+ return Mage_Sales_Model_Order::STATE_PROCESSING;
592
+ }
593
+
594
+ /**
595
+ * returns failed status
596
+ *
597
+ * @return String
598
+ */
599
+ public function getFailedStatus()
600
+ {
601
+ return Mage_Sales_Model_Order::STATE_CANCELED;
602
+ }
603
+
604
+ /**
605
+ *
606
+ * @param string $invoiceIncrementId
607
+ * @return boolean
608
+ */
609
+ public function captureInvoice($invoiceIncrementId)
610
+ {
611
+ return Mage::getModel("sales/order_invoice_api")->capture($invoiceIncrementId);
612
+ }
613
+
614
+ /**
615
+ *
616
+ * clear session data
617
+ *
618
+ * @return boolean
619
+ */
620
+ public function clearSessionData()
621
+ {
622
+ Mage::getSingleton('core/session')->unsetData("invoice");
623
+ Mage::getSingleton('core/session')->unsetData("has_invoice");
624
+ Mage::getSingleton('core/session')->unsetData("check_invoice");
625
+ return true;
626
+ }
627
+
628
+ /**
629
+ * log message to file
630
+ *
631
+ * @param string $message
632
+ * @return boolean
633
+ */
634
+ private function log($message)
635
+ {
636
+ Mage::log($message, Zend_Log::ERR, "yellow.log");
637
+ return true;
638
+ }
639
  }
 
app/code/local/Yellow/Bitcoin/Model/Http.php CHANGED
@@ -1,49 +1,51 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
 
28
- Class Yellow_Bitcoin_Model_Http extends Varien_Http_Client{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- /*
31
- * curl options , might be changed later to be configured
32
- * right now i am using php's default values
33
- */
34
- protected $_allowedParams = array(
35
- 'timeout' => 10, /// this might need to convert to configuration later once needed
36
- 'maxredirects' => CURLOPT_MAXREDIRS,
37
- 'proxy' => CURLOPT_PROXY,
38
- 'ssl_cert' => CURLOPT_SSLCERT,
39
- 'userpwd' => CURLOPT_USERPWD
40
- );
41
-
42
- public function __construct() {
43
- parent::__construct();
44
- $adapter = new Varien_Http_Adapter_Curl();
45
- $adapter->setOptions($this->_allowedParams);
46
- $this->setAdapter($adapter);
47
- return $this;
48
- }
49
- }
 
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ Class Yellow_Bitcoin_Model_Http extends Varien_Http_Client
29
+ {
30
 
31
+ /**
32
+ * curl options , might be changed later to be configured
33
+ * right now i am using php's default values
34
+ */
35
+ protected $_allowedParams = array(
36
+ 'timeout' => 10, /// this might need to convert to configuration later once needed
37
+ 'maxredirects' => CURLOPT_MAXREDIRS,
38
+ 'proxy' => CURLOPT_PROXY,
39
+ 'ssl_cert' => CURLOPT_SSLCERT,
40
+ 'userpwd' => CURLOPT_USERPWD
41
+ );
42
+
43
+ public function __construct()
44
+ {
45
+ parent::__construct();
46
+ $adapter = new Varien_Http_Adapter_Curl();
47
+ $adapter->setOptions($this->_allowedParams);
48
+ $this->setAdapter($adapter);
49
+ return $this;
50
+ }
51
+ }
app/code/local/Yellow/Bitcoin/Model/Ipn.php CHANGED
@@ -1,61 +1,64 @@
1
  <?php
2
 
3
- /**
4
- *
5
- * The MIT License (MIT)
6
- *
7
- * Copyright (c) 2014 YellowPay.co
8
- *
9
- * Permission is hereby granted, free of charge, to any person obtaining a copy
10
- * of this software and associated documentation files (the "Software"), to deal
11
- * in the Software without restriction, including without limitation the rights
12
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- * copies of the Software, and to permit persons to whom the Software is
14
- * furnished to do so, subject to the following conditions:
15
- *
16
- * The above copyright notice and this permission notice shall be included in all
17
- * copies or substantial portions of the Software.
18
- *
19
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
- * SOFTWARE.
26
- *
27
- * */
28
- Class Yellow_Bitcoin_Model_Ipn extends Mage_Core_Model_Abstract {
 
29
 
30
- public function _construct() {
31
- $this->_init('bitcoin/ipn');
32
- return parent::_construct();
33
- }
 
34
 
35
- /**
36
- * saves the invoice to db
37
- *
38
- */
39
- public function saveInvoice($invoice) {
40
- $timezone = Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE);
41
- $now = new \DateTime("now",new \DateTimeZone($timezone));
42
- $this->setQuoteId(isset($invoice['quoteId']) ? $invoice['quoteId'] : NULL);
43
- $this->setOrderId(isset($invoice['orderId']) ? $invoice['orderId'] : NULL);
44
- $this->setInvoiceId($invoice['invoice_id']);
45
- $this->setUrl($invoice['url']);
46
- $this->setrawBody(json_encode($invoice['raw_body']));
47
- $this->setStatus($invoice['status']);
48
- $this->setAddress($invoice["address"]);
49
- $this->setInvoicePrice($invoice["invoice_price"]);
50
- $this->setInvoiceCcy($invoice["invoice_ccy"]);
51
- $this->setBasePrice($invoice["base_price"]);
52
- $this->setBaseCcy($invoice["base_ccy"]);
53
- $this->setServerTime($invoice["server_time"]);
54
- $this->setExpirationTime($invoice["expiration_time"]);
55
- $this->setCreatedAt($now->format("Y-m-d H:i:s"));
56
- $this->setUpdatedAt($now->format("Y-m-d H:i:s"));
57
- $this->setHash($invoice["hash"]);
58
- return $this->save();
59
- }
 
60
 
61
- }
1
  <?php
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ * */
28
+ Class Yellow_Bitcoin_Model_Ipn extends Mage_Core_Model_Abstract
29
+ {
30
 
31
+ public function _construct()
32
+ {
33
+ $this->_init('bitcoin/ipn');
34
+ return parent::_construct();
35
+ }
36
 
37
+ /**
38
+ * saves the invoice to db
39
+ *
40
+ */
41
+ public function saveInvoice($invoice)
42
+ {
43
+ $timezone = Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE);
44
+ $now = new \DateTime("now", new \DateTimeZone($timezone));
45
+ $this->setQuoteId(isset($invoice['quoteId']) ? $invoice['quoteId'] : null);
46
+ $this->setOrderId(isset($invoice['orderId']) ? $invoice['orderId'] : null);
47
+ $this->setInvoiceId($invoice['invoice_id']);
48
+ $this->setUrl($invoice['url']);
49
+ $this->setrawBody(json_encode($invoice['raw_body']));
50
+ $this->setStatus($invoice['status']);
51
+ $this->setAddress($invoice["address"]);
52
+ $this->setInvoicePrice($invoice["invoice_price"]);
53
+ $this->setInvoiceCcy($invoice["invoice_ccy"]);
54
+ $this->setBasePrice($invoice["base_price"]);
55
+ $this->setBaseCcy($invoice["base_ccy"]);
56
+ $this->setServerTime($invoice["server_time"]);
57
+ $this->setExpirationTime($invoice["expiration_time"]);
58
+ $this->setCreatedAt($now->format("Y-m-d H:i:s"));
59
+ $this->setUpdatedAt($now->format("Y-m-d H:i:s"));
60
+ $this->setHash($invoice["hash"]);
61
+ return $this->save();
62
+ }
63
 
64
+ }
app/code/local/Yellow/Bitcoin/Model/Resource/Ipn.php CHANGED
@@ -1,84 +1,93 @@
1
  <?php
2
 
3
- /**
4
- *
5
- * The MIT License (MIT)
6
- *
7
- * Copyright (c) 2014 YellowPay.co
8
- *
9
- * Permission is hereby granted, free of charge, to any person obtaining a copy
10
- * of this software and associated documentation files (the "Software"), to deal
11
- * in the Software without restriction, including without limitation the rights
12
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- * copies of the Software, and to permit persons to whom the Software is
14
- * furnished to do so, subject to the following conditions:
15
- *
16
- * The above copyright notice and this permission notice shall be included in all
17
- * copies or substantial portions of the Software.
18
- *
19
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
- * SOFTWARE.
26
- *
27
- * */
28
- class Yellow_Bitcoin_Model_Resource_Ipn extends Mage_Core_Model_Resource_Db_Abstract {
 
29
 
30
- protected function _construct() {
31
- $this->_init('bitcoin/ipn', 'id');
32
- }
33
-
34
- public function MarkAsAuthorizing($invoice_id) {
35
- return $this->updatePayment($invoice_id, "authorizing");
36
- }
37
 
38
- public function MarkAsPaid($invoice_id) {
39
- return $this->updatePayment($invoice_id, "paid");
40
- }
 
41
 
42
- public function MarkAsPartial($invoice_id) {
43
- return $this->updatePayment($invoice_id, "partial");
44
- }
 
45
 
46
- public function MarkAsExpired($invoice_id) {
47
- return $this->updatePayment($invoice_id, "expired");
48
- }
 
49
 
50
- public function MarkAsRefundOwed($invoice_id) {
51
- return $this->updatePayment($invoice_id, "refund_owed");
52
- }
 
53
 
54
- public function MarkAsRefundPaid($invoice_id) {
55
- return $this->updatePayment($invoice_id, "refund_paid");
56
- }
 
57
 
58
- public function MarkAsRefundRequested($invoice_id) {
59
- return $this->updatePayment($invoice_id, "refund_requested");
60
- }
 
61
 
 
 
 
 
62
 
63
 
64
- private function updatePayment($invoice_id, $status) {
65
- $wa = $this->_getWriteAdapter();
66
- try {
67
- $timezone = Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE);
68
- $now = new \DateTime("now",new \DateTimeZone($timezone));
69
- $where = array();
70
- $wa->beginTransaction();
71
- $fields["status"] = $status;
72
- $fields["updated_at"] = $now->format("Y-m-d H:i:s");
73
- $where[] = $wa->quoteInto("invoice_id = ?", $invoice_id);
74
- $tableName = $this->getTable("bitcoin/ipn");
75
- $wa->update($tableName, $fields, $where);
76
- $wa->commit();
77
- return true;
78
- } catch (Exception $exc) {
79
- $wa->rollBack();
80
- return $exc->getMessage();
 
 
81
  }
82
- }
83
 
84
- }
1
  <?php
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ * */
28
+ class Yellow_Bitcoin_Model_Resource_Ipn extends Mage_Core_Model_Resource_Db_Abstract
29
+ {
30
 
31
+ protected function _construct()
32
+ {
33
+ $this->_init('bitcoin/ipn', 'id');
34
+ }
 
 
 
35
 
36
+ public function MarkAsAuthorizing($invoice_id)
37
+ {
38
+ return $this->updatePayment($invoice_id, "authorizing");
39
+ }
40
 
41
+ public function MarkAsPaid($invoice_id)
42
+ {
43
+ return $this->updatePayment($invoice_id, "paid");
44
+ }
45
 
46
+ public function MarkAsPartial($invoice_id)
47
+ {
48
+ return $this->updatePayment($invoice_id, "partial");
49
+ }
50
 
51
+ public function MarkAsExpired($invoice_id)
52
+ {
53
+ return $this->updatePayment($invoice_id, "expired");
54
+ }
55
 
56
+ public function MarkAsRefundOwed($invoice_id)
57
+ {
58
+ return $this->updatePayment($invoice_id, "refund_owed");
59
+ }
60
 
61
+ public function MarkAsRefundPaid($invoice_id)
62
+ {
63
+ return $this->updatePayment($invoice_id, "refund_paid");
64
+ }
65
 
66
+ public function MarkAsRefundRequested($invoice_id)
67
+ {
68
+ return $this->updatePayment($invoice_id, "refund_requested");
69
+ }
70
 
71
 
72
+ private function updatePayment($invoice_id, $status)
73
+ {
74
+ $wa = $this->_getWriteAdapter();
75
+ try {
76
+ $timezone = Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE);
77
+ $now = new \DateTime("now", new \DateTimeZone($timezone));
78
+ $where = array();
79
+ $wa->beginTransaction();
80
+ $fields["status"] = $status;
81
+ $fields["updated_at"] = $now->format("Y-m-d H:i:s");
82
+ $where[] = $wa->quoteInto("invoice_id = ?", $invoice_id);
83
+ $tableName = $this->getTable("bitcoin/ipn");
84
+ $wa->update($tableName, $fields, $where);
85
+ $wa->commit();
86
+ return true;
87
+ } catch (Exception $exc) {
88
+ $wa->rollBack();
89
+ return $exc->getMessage();
90
+ }
91
  }
 
92
 
93
+ }
app/code/local/Yellow/Bitcoin/Model/Resource/Ipn/Collection.php CHANGED
@@ -1,34 +1,36 @@
1
  <?php
2
- /**
3
- *
4
- * The MIT License (MIT)
5
- *
6
- * Copyright (c) 2014 YellowPay.co
7
- *
8
- * Permission is hereby granted, free of charge, to any person obtaining a copy
9
- * of this software and associated documentation files (the "Software"), to deal
10
- * in the Software without restriction, including without limitation the rights
11
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
- * copies of the Software, and to permit persons to whom the Software is
13
- * furnished to do so, subject to the following conditions:
14
- *
15
- * The above copyright notice and this permission notice shall be included in all
16
- * copies or substantial portions of the Software.
17
- *
18
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
- * SOFTWARE.
25
- *
26
- **/
27
 
28
- class Yellow_Bitcoin_Model_Resource_Ipn_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
- protected function _construct() {
31
- $this->_init('bitcoin/ipn');
32
- }
 
33
 
34
- }
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ **/
28
+ class Yellow_Bitcoin_Model_Resource_Ipn_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
29
+ {
30
 
31
+ protected function _construct()
32
+ {
33
+ $this->_init('bitcoin/ipn');
34
+ }
35
 
36
+ }
app/code/local/Yellow/Bitcoin/controllers/IndexController.php CHANGED
@@ -1,49 +1,101 @@
1
  <?php
2
 
3
- /**
4
- *
5
- * The MIT License (MIT)
6
- *
7
- * Copyright (c) 2014 YellowPay.co
8
- *
9
- * Permission is hereby granted, free of charge, to any person obtaining a copy
10
- * of this software and associated documentation files (the "Software"), to deal
11
- * in the Software without restriction, including without limitation the rights
12
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
- * copies of the Software, and to permit persons to whom the Software is
14
- * furnished to do so, subject to the following conditions:
15
- *
16
- * The above copyright notice and this permission notice shall be included in all
17
- * copies or substantial portions of the Software.
18
- *
19
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
- * SOFTWARE.
26
- *
27
- * */
28
- class Yellow_Bitcoin_IndexController extends Mage_Core_Controller_Front_Action {
 
29
 
30
- public function IpnAction() {
31
- try{
32
- /* need to check the ip address of the source from a whitelist list of ips , otherwise this might be used illegaly to update orders */
33
- $this->log("-----------start an IPN request proccessing ------------");
34
- if ($this->getRequest()->isPost()) {
35
- $id = base64_decode($this->getRequest()->getParam("id"));
36
- $data = file_get_contents('php://input');
37
- $body = json_decode($data, true);
38
- $this->log("Id is :{$id}");
39
- $this->log("I had recived this data :" . $data);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  $url = $body["url"];
41
- /* simple valdation check | might be changed later */
42
  $collection = Mage::getModel("bitcoin/ipn")
43
- ->getCollection()
44
- ->getSelect()
45
- ->where("quote_id = ? OR order_id = ?", $id)
46
- ->where("url =?", $url);
47
  $yellow_log = $collection->query()->fetchAll();
48
  $from_order = $from_quote = false;
49
  if (count($yellow_log) == 1) {
@@ -57,8 +109,8 @@ class Yellow_Bitcoin_IndexController extends Mage_Core_Controller_Front_Action {
57
  $this->log("its an order");
58
  }
59
  } else {
60
- $this->log("the validation has failed , url : {$url}");
61
- $this->log("----------- skipped the IPN request proccessing ---------------------");
62
  return $this->_forward("no-route");
63
  }
64
  if ($from_order) {
@@ -68,53 +120,59 @@ class Yellow_Bitcoin_IndexController extends Mage_Core_Controller_Front_Action {
68
  $order = Mage::getModel('sales/order')->load($id, "quote_id");
69
  }
70
  /* skip quote + authorizing state because the order hasn't been placed yet */
71
- if($from_quote && $body["status"] === "authorizing"){
72
- $this->log(" quote id : {$id} is skipped because the order hasn't placed yet , IPN status {$body["status"]}");
 
 
73
  echo json_encode(array("message" => "skipped"));
74
- $this->log("----------- skipped the IPN request proccessing ---------------------");
75
- return ;
76
  }
77
- if($order->getPayment() instanceof Yellow_Bitcoin_Model_Bitcoin){
78
  $payment = $order->getPayment()->getMethodInstance();
79
- if (!$order || $payment->getCode() <> "bitcoin" || $order->getState() <> Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW) {
80
- $this->log("either this order is not paid via Yellow , or it had unallowed state ");
81
- $this->log("----------- skipped the IPN request proccessing ---------------------");
 
 
82
  return $this->_forward("no-route");
83
  }
84
  }
85
  $this->log(" invoice status : {$body["status"]}");
86
  switch ($body['status']) {
87
  case 'paid':
88
- $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus();
89
- $status_message = "Payment confirmation received , invoice Id : " .$body['id']; // $invoice["message"];
90
  $order->addStatusToHistory($status, $status_message);
91
  $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING);
92
  $order->sendNewOrderEmail();
93
  $order->save();
94
  Mage::getResourceModel("bitcoin/ipn")->MarkAsPaid($body["id"]);
95
- /* create an invoice */
96
  $invoiceModel = Mage::getModel('sales/order_invoice_api');
97
- $invoice_id = $invoiceModel->create($order->getIncrementId(), array());
98
  $invoiceModel->capture($invoice_id);
99
- $this->log("Magento Invoice created !");
100
  break;
101
  case 'reissue':
102
- $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus(); /// this must bn changed when we had reissue / renew payment ready
103
- $status_message = " client has re issued the invoice , invoice Id : " . $body['id']; // $invoice["message"];
 
104
  $order->addStatusToHistory($status, $status_message);
105
  $order->save();
106
  break;
107
  case 'partial':
108
- $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus(); /// this must bn changed when we had partail payment ready
109
- $status_message = " client paid but payment is partial , invoice Id : " . $body['id'] ; // $invoice["message"];
 
110
  $order->addStatusToHistory($status, $status_message);
111
  $order->save();
112
  Mage::getResourceModel("bitcoin/ipn")->MarkAsPartial($body["id"]);
113
  break;
114
  case 'failed':
115
  case 'invalid':
116
- $status = Mage::getModel("bitcoin/bitcoin")->getFailedStatus();
117
- $status_message = " client failed to pay , invoice Id : " . $body['id'] ; // $invoice["message"];
118
  $order->addStatusToHistory($status, $status_message);
119
  $order->setState(Mage_Sales_Model_Order::STATE_HOLDED);
120
  $order->cancel();
@@ -142,61 +200,92 @@ class Yellow_Bitcoin_IndexController extends Mage_Core_Controller_Front_Action {
142
  break;
143
  }
144
  echo json_encode(array("message" => "done"));
145
- } else {
146
- return $this->_forward("no-route");
 
147
  }
148
- $this->log("----------- finished an IPN request proccessing ---------------------");
149
- } catch (\Exception $e){
150
- $this->log( "EXCEPTION:". $e->getMessage . "|" . $e->getLine());
151
  }
152
- }
153
 
154
- public function StatusAction() {
155
- $invoice = Mage::getSingleton('core/session')->getData("invoice");
156
- try {
157
- $id = $invoice["id"];
158
- $model = Mage::getModel('bitcoin/bitcoin');
159
- $order = $this->getOrder();
160
- if (!$order) {
161
- $this->log("this session doesn't has a recent order , maybe he/she is accessing this page directly");
162
- return $this->_forward("no-route");
163
- }
164
- $model->setOrder($order);
165
- $status = $model->checkInvoiceStatus($id);
166
- if($status == false){
167
- $this->log("failed to check invoice status");
168
- return $this->_forward("no-route");
169
- }
170
- switch ($status) {
171
- case "paid":
172
- case "partial":
173
- case "authorizing":
174
- return $this->_redirect('checkout/onepage/success');
175
- break;
176
- case "failed":
177
- return $this->_redirect('checkout/onepage/failure');
178
- break;
179
- default:
180
- $this->log("unknow invoice status , invoice id : {$id}");
181
  return $this->_forward("no-route");
182
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
  }
184
- } catch (Mage_Core_Exception $e) {
185
- $this->log("an error occurred : {$e->getMessage()} on line {$e->getLine()}");
186
- return $this->_redirect('checkout/onepage/failure');
187
  }
188
- }
189
 
190
- private function getOrder() {
191
- $session = Mage::getSingleton('checkout/session');
192
- if (!$session->getLastRealOrderId()) {
193
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
  }
195
- return Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
196
- }
197
 
198
- private function log($message) {
199
- return Mage::log($message, Zend_Log::INFO , "yellow.log");
200
- }
 
 
 
 
 
 
 
 
 
201
 
202
- }
1
  <?php
2
 
3
+ /**
4
+ *
5
+ * The MIT License (MIT)
6
+ *
7
+ * Copyright (c) 2014 YellowPay.co
8
+ *
9
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ * of this software and associated documentation files (the "Software"), to deal
11
+ * in the Software without restriction, including without limitation the rights
12
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ * copies of the Software, and to permit persons to whom the Software is
14
+ * furnished to do so, subject to the following conditions:
15
+ *
16
+ * The above copyright notice and this permission notice shall be included in all
17
+ * copies or substantial portions of the Software.
18
+ *
19
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ * SOFTWARE.
26
+ *
27
+ * */
28
+ class Yellow_Bitcoin_IndexController extends Mage_Core_Controller_Front_Action
29
+ {
30
 
31
+
32
+ public function payAction()
33
+ {
34
+ $this->loadLayout();
35
+ $this->renderLayout();
36
+ }
37
+ public function IpnAction()
38
+ {
39
+ /**
40
+ * return not found on all requests but POST
41
+ */
42
+ $this->log("----------- IPN request validation ------------");
43
+ if (!$this->getRequest()->isPost()) {
44
+ return $this->returnForbidden();
45
+ }
46
+ $ip = long2ip(Mage::helper('core/http')->getRemoteAddr(true));
47
+ $this->log("Start IPN request validation") ;
48
+ $this->log("IP Address of the sender {$ip}");
49
+
50
+ /* start to validate the signature */
51
+ $request = $this->getRequest();
52
+ $payload = $request->getRawBody();
53
+ $public_key = $request->getHeader("API-Key");
54
+ $nonce = $request->getHeader("API-Nonce");
55
+ $request_signature = $request->getHeader("API-Sign");
56
+ $this->log("API-KEY:{$public_key}");
57
+ $this->log("API-Nonce:{$nonce}");
58
+ $this->log("API-Sign:{$request_signature}");
59
+ $this->log("Received payload: " . $payload);
60
+
61
+ if (!$public_key || !$nonce || !$request_signature || !$payload) {
62
+ $this->log("Credentials missing. Exiting.");
63
+ return $this->returnForbidden();
64
+ }
65
+
66
+ $private_key = Mage::helper('core')->decrypt(
67
+ Mage::getModel("bitcoin/bitcoin")->getConfiguration("private_key")
68
+ );
69
+ $url = Mage::helper('core/url')->getCurrentUrl();
70
+ $message = $nonce . $url . $payload;
71
+ $current_signature = hash_hmac("sha256", $message, $private_key, false);
72
+ $this->log("Calculated signature: " . $current_signature);
73
+
74
+ if ($request_signature <> $current_signature) {
75
+ $this->log("IPN VALIDATION FAILED");
76
+ $this->log("Returning 'page not found'");
77
+ $this->log("Your payment data is still safe");
78
+ $this->log("----------- IPN request processing will be skipped -----------");
79
+ return $this->returnForbidden();
80
+ }
81
+ $this->log("VALIDATION PASSED :) Yay");
82
+ /* end of validate the signature */
83
+ /* by this the request has passed validation */
84
+ try {
85
+ /* need to check the ip address of the source from a whitelist list of ips , otherwise this might be used illegaly to update orders */
86
+ $this->log("----------- IPN request processing ------------");
87
+ $id = base64_decode($this->getRequest()->getParam("id"));
88
+ //$data = file_get_contents('php://input');
89
+ $body = json_decode($payload, true);
90
+ $this->log("Id is: {$id}");
91
+ $this->log("Received payload: " . $payload);
92
  $url = $body["url"];
93
+ /* simple validation check | might be changed later */
94
  $collection = Mage::getModel("bitcoin/ipn")
95
+ ->getCollection()
96
+ ->getSelect()
97
+ ->where("quote_id = ? OR order_id = ?", $id)
98
+ ->where("url =?", $url);
99
  $yellow_log = $collection->query()->fetchAll();
100
  $from_order = $from_quote = false;
101
  if (count($yellow_log) == 1) {
109
  $this->log("its an order");
110
  }
111
  } else {
112
+ $this->log("URL validation failed: {$url}");
113
+ $this->log("----------- IPN request processing will be skipped -----------");
114
  return $this->_forward("no-route");
115
  }
116
  if ($from_order) {
120
  $order = Mage::getModel('sales/order')->load($id, "quote_id");
121
  }
122
  /* skip quote + authorizing state because the order hasn't been placed yet */
123
+ if ($from_quote && $body["status"] === "authorizing") {
124
+ $this->log(
125
+ "Quote id {$id} will be skipped because the order hasn't been placed yet. IPN status: {$body["status"]}"
126
+ );
127
  echo json_encode(array("message" => "skipped"));
128
+ $this->log("----------- IPN request processing will be skipped -----------");
129
+ return;
130
  }
131
+ if ($order->getPayment() instanceof Yellow_Bitcoin_Model_Bitcoin) {
132
  $payment = $order->getPayment()->getMethodInstance();
133
+ if (!$order || $payment->getCode() <> "bitcoin" || $order->getState(
134
+ ) <> Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW
135
+ ) {
136
+ $this->log("Either this order is not paid via Yellow, or it has an unallowed state");
137
+ $this->log("----------- IPN request processing will be skipped -----------");
138
  return $this->_forward("no-route");
139
  }
140
  }
141
  $this->log(" invoice status : {$body["status"]}");
142
  switch ($body['status']) {
143
  case 'paid':
144
+ $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus();
145
+ $status_message = "Payment confirmation received. Invoice Id: " . $body['id']; // $invoice["message"];
146
  $order->addStatusToHistory($status, $status_message);
147
  $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING);
148
  $order->sendNewOrderEmail();
149
  $order->save();
150
  Mage::getResourceModel("bitcoin/ipn")->MarkAsPaid($body["id"]);
151
+ /* create an invoice */
152
  $invoiceModel = Mage::getModel('sales/order_invoice_api');
153
+ $invoice_id = $invoiceModel->create($order->getIncrementId(), array());
154
  $invoiceModel->capture($invoice_id);
155
+ $this->log("Magento Invoice created!");
156
  break;
157
  case 'reissue':
158
+ $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus(
159
+ ); /// this must bn changed when we had reissue / renew payment ready
160
+ $status_message = "Client re-issued the invoice. Invoice Id: " . $body['id']; // $invoice["message"];
161
  $order->addStatusToHistory($status, $status_message);
162
  $order->save();
163
  break;
164
  case 'partial':
165
+ $status = Mage::getModel("bitcoin/bitcoin")->getSuccessStatus(
166
+ ); /// this must bn changed when we had partail payment ready
167
+ $status_message = "Client made a partial payment. Invoice Id: " . $body['id']; // $invoice["message"];
168
  $order->addStatusToHistory($status, $status_message);
169
  $order->save();
170
  Mage::getResourceModel("bitcoin/ipn")->MarkAsPartial($body["id"]);
171
  break;
172
  case 'failed':
173
  case 'invalid':
174
+ $status = Mage::getModel("bitcoin/bitcoin")->getFailedStatus();
175
+ $status_message = "Client failed to pay. Invoice Id: " . $body['id']; // $invoice["message"];
176
  $order->addStatusToHistory($status, $status_message);
177
  $order->setState(Mage_Sales_Model_Order::STATE_HOLDED);
178
  $order->cancel();
200
  break;
201
  }
202
  echo json_encode(array("message" => "done"));
203
+ $this->log("----------- IPN request processing complete -----------");
204
+ } catch (\Exception $e) {
205
+ $this->log("EXCEPTION:" . $e->getMessage . "|" . $e->getLine());
206
  }
 
 
 
207
  }
 
208
 
209
+ public function StatusAction()
210
+ {
211
+ $invoice = Mage::getSingleton('core/session')->getData("invoice");
212
+ try {
213
+ $id = $invoice["id"];
214
+ $model = Mage::getModel('bitcoin/bitcoin');
215
+ $order = $this->getOrder();
216
+ if (!$order) {
217
+ $this->log(
218
+ "This session does not have a recent order. This page may have been accessed directly."
219
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  return $this->_forward("no-route");
221
+ }
222
+ $model->setOrder($order);
223
+ $status = $model->checkInvoiceStatus($id);
224
+ if ($status == false) {
225
+ $this->log("Invoice status check failed");
226
+ return $this->_forward("no-route");
227
+ }
228
+ switch ($status) {
229
+ case "new":
230
+ return $this->_redirect('bitcoin/index/pay');
231
+ break;
232
+ case "paid":
233
+ case "partial":
234
+ case "authorizing":
235
+ return $this->_redirect('checkout/onepage/success');
236
+ break;
237
+ case "failed":
238
+ return $this->_redirect('checkout/onepage/failure');
239
+ break;
240
+ case "refund_requested":
241
+ case "refund_owed":
242
+ return $this->_redirect('checkout/onepage/failure');
243
+ break;
244
+ case "expired":
245
+ return $this->_redirect('checkout/onepage/failure');
246
+ break;
247
+ default:
248
+ $this->log("Unknown invoice status. Invoice id: {$id}");
249
+ return $this->_forward("no-route");
250
+ break;
251
+ }
252
+ } catch (Mage_Core_Exception $e) {
253
+ $this->log("An error occurred: {$e->getMessage()} on line {$e->getLine()}");
254
+ return $this->_redirect('checkout/onepage/failure');
255
  }
 
 
 
256
  }
 
257
 
258
+ /**
259
+ * return current object
260
+ * @return bool|Mage_Sales_Model_Order
261
+ */
262
+ private function getOrder()
263
+ {
264
+ $session = Mage::getSingleton('checkout/session');
265
+ if (!$session->getLastRealOrderId()) {
266
+ return false;
267
+ }
268
+ return Mage::getModel('sales/order')->loadByIncrementId($session->getLastRealOrderId());
269
+ }
270
+ /*
271
+ * log message to yellow.log
272
+ */
273
+ private function log($message)
274
+ {
275
+ return Mage::log($message, Zend_Log::INFO, "yellow.log");
276
  }
 
 
277
 
278
+ /**
279
+ *
280
+ * return 403 header
281
+ * @return mixed
282
+ *
283
+ */
284
+ private function returnForbidden(){
285
+ return $this->getResponse()
286
+ ->clearHeaders()
287
+ ->setHttpResponseCode(403)
288
+ ->sendResponse();
289
+ }
290
 
291
+ }
app/code/local/Yellow/Bitcoin/etc/config.xml CHANGED
@@ -29,7 +29,7 @@ SOFTWARE.
29
  <Yellow_Bitcoin>
30
  <version>0.1.1</version>
31
  <depends>
32
- <Mage_Payment />
33
  </depends>
34
  </Yellow_Bitcoin>
35
  </modules>
@@ -113,5 +113,5 @@ SOFTWARE.
113
  <payment_action>authorize</payment_action>
114
  </bitcoin>
115
  </payment>
116
- </default>
117
  </config>
29
  <Yellow_Bitcoin>
30
  <version>0.1.1</version>
31
  <depends>
32
+ <Mage_Payment/>
33
  </depends>
34
  </Yellow_Bitcoin>
35
  </modules>
113
  <payment_action>authorize</payment_action>
114
  </bitcoin>
115
  </payment>
116
+ </default>
117
  </config>
app/code/local/Yellow/Bitcoin/etc/system.xml CHANGED
@@ -86,7 +86,7 @@ SOFTWARE.
86
  <show_in_website>1</show_in_website>
87
  <show_in_store>0</show_in_store>
88
  </allowspecific>
89
-
90
  <specificcountry translate="label">
91
  <label>Countries Payment Applicable From</label>
92
  <frontend_type>multiselect</frontend_type>
86
  <show_in_website>1</show_in_website>
87
  <show_in_store>0</show_in_store>
88
  </allowspecific>
89
+
90
  <specificcountry translate="label">
91
  <label>Countries Payment Applicable From</label>
92
  <frontend_type>multiselect</frontend_type>
app/code/local/Yellow/Bitcoin/sql/bitcoin_setup/mysql4-install-0.1.0.php CHANGED
@@ -1,8 +1,9 @@
1
  <?php
2
- $installer = $this;
3
- $installer->startSetup();
4
 
5
- $installer->run("
 
6
  CREATE TABLE IF NOT EXISTS `{$installer->getTable('bitcoin/ipn')}` (
7
  `id` int(10) unsigned NOT NULL auto_increment,
8
  `quote_id` int(10) unsigned default NULL,
@@ -26,7 +27,8 @@ CREATE TABLE IF NOT EXISTS `{$installer->getTable('bitcoin/ipn')}` (
26
  KEY `order_id` (`order_id`),
27
  KEY `invoice_id` (`invoice_id`)
28
  ) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
29
- ");
 
30
 
31
- $installer->endSetup();
32
 
1
  <?php
2
+ $installer = $this;
3
+ $installer->startSetup();
4
 
5
+ $installer->run(
6
+ "
7
  CREATE TABLE IF NOT EXISTS `{$installer->getTable('bitcoin/ipn')}` (
8
  `id` int(10) unsigned NOT NULL auto_increment,
9
  `quote_id` int(10) unsigned default NULL,
27
  KEY `order_id` (`order_id`),
28
  KEY `invoice_id` (`invoice_id`)
29
  ) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
30
+ "
31
+ );
32
 
33
+ $installer->endSetup();
34
 
app/code/local/Yellow/Bitcoin/sql/bitcoin_setup/mysql4-upgrade-0.1.0-0.1.1.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- $installer = $this;
3
- $installer->startSetup();
4
- $installer->endSetup();
5
 
1
  <?php
2
+ $installer = $this;
3
+ $installer->startSetup();
4
+ $installer->endSetup();
5
 
app/design/frontend/base/default/layout/bitcoin.xml CHANGED
@@ -1,19 +1,35 @@
1
- <?xml version="1.0"?>
2
- <layout version="0.1.0">
3
  <checkout_onepage_review>
4
  <reference name="checkout.onepage.review.info.items.after">
5
  <block name="yellow_widget" type="bitcoin/widget"/>
6
- </reference>
7
  </checkout_onepage_review>
8
- <bitcoin_index_status>
9
- <reference name="root">
 
 
 
10
  <action method="setTemplate">
11
- <template>page/1column.phtml</template>
12
- </action>
13
- </reference>
14
- <reference name="content">
15
- <block type="bitcoin/status" name="bitcoin_status" template="bitcoin/status.phtml"/>
16
- </reference>
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  </bitcoin_index_status>
18
  </layout>
19
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.0">
3
  <checkout_onepage_review>
4
  <reference name="checkout.onepage.review.info.items.after">
5
  <block name="yellow_widget" type="bitcoin/widget"/>
6
+ </reference>
7
  </checkout_onepage_review>
8
+ <bitcoin_index_pay>
9
+ <reference name="root">
10
+ <action method="addBodyClass"><classname></classname></action>
11
+ <remove name="left" />
12
+ <remove name="right" />
13
  <action method="setTemplate">
14
+ <template>page/empty.phtml</template>
15
+ </action>
16
+ </reference>
17
+ <reference name="head">
18
+ <action method="setTitle" translate="title"><title>Pay With Yellow</title></action>
19
+ <action method="addItem"><type>skin_css</type><name>css/bitcoin.css</name><params/></action>
20
+ </reference>
21
+ <reference name="content">
22
+ <block type="bitcoin/fullscreen_widget_content" name="widget_content" template="bitcoin/fullscreen/widget/content.phtml"/>
23
+ </reference>
24
+ </bitcoin_index_pay>
25
+ <bitcoin_index_status>
26
+ <reference name="root">
27
+ <remove name="left" />
28
+ <remove name="right" />
29
+ <action method="setTemplate">
30
+ <template>page/empty.phtml</template>
31
+ </action>
32
+ </reference>
33
  </bitcoin_index_status>
34
  </layout>
35
 
app/design/frontend/base/default/template/bitcoin/form/bitcoin.phtml CHANGED
@@ -1,9 +1,10 @@
1
- <?php if ($this->getInstructions()): ?>
 
2
  <ul class="form-list checkout-agreements" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none;">
3
  <li>
4
  <div class="<?php echo $this->getMethodCode() ?>-instructions-content agreement-content">
5
- <?php echo nl2br($this->getInstructions()) ?>
6
  </div>
7
  </li>
8
  </ul>
9
- <?php endif; ?>
1
+ <?php
2
+ if(Mage::helper("bitcoin")->isFullScreen()):?>
3
  <ul class="form-list checkout-agreements" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none;">
4
  <li>
5
  <div class="<?php echo $this->getMethodCode() ?>-instructions-content agreement-content">
6
+ <?php echo $this->__("After selecting this payment option and placing your order, you will be redirected to a full page invoice to complete the payment");?>
7
  </div>
8
  </li>
9
  </ul>
10
+ <?php endif; ?>
app/design/frontend/base/default/template/bitcoin/form/logo.phtml ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!-- Yellow Logo -->
2
+ <div id="bitcoin" style="float: left;">
3
+ <img src="<?php echo $this->getSkinUrl('images/bitcoin/bitcoin_accepted.png', array('_secure' => true)); ?>"
4
+ alt="<?php echo Mage::helper('bitcoin')->__('Yellow Bitcoin') ?>" class="v-middle" style="height:40px;"/>
5
+ <span style="margin-top: 6px;">
6
+ &nbsp;<?php //echo Mage::helper('bitcoin')->__('Powered By Yellow'); ?>
7
+ <small>
8
+ <a href="<?php echo "http://shubitcoin.com/"; ?>" target="_blank">
9
+ <?php echo Mage::helper('bitcoin')->__('What is Bitcoin ?'); ?>
10
+ </a>
11
+ </small>
12
+ </span>
13
+ </div>
14
+ <!-- Yellow Logo -->
app/design/frontend/base/default/template/bitcoin/fullscreen.phtml ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ $url = $this->GetWidgetUrl();
3
+ $iframe = false;
4
+ switch ($url) {
5
+ case 'no payment':
6
+ case 'disabled':
7
+ $iframe = false;
8
+ break;
9
+ case 'paid':
10
+ echo 'Order payment received. Place Order to complete.';
11
+ $iframe = false;
12
+ break;
13
+ case false:
14
+ echo 'Error creating invoice. Please try again or try another payment solution.';
15
+ $iframe = false;
16
+ break;
17
+ default:
18
+ $iframe = '<iframe src="' . $url . '" style="width:500px; height:255px; overflow:hidden; border:none; margin:auto; display:block;" scrolling="no" allowtransparency="true" frameborder="0"> </iframe>';
19
+ break;
20
+ }
21
+ if ($iframe): echo $iframe;?>
22
+ <script type="text/javascript">
23
+ function invoiceListener(event) {
24
+ if (event.origin != "https://yolanda-perkins.herokuapp.com") {
25
+ alert("Received message from unexpected domain: " + event.origin);
26
+ return;
27
+ }
28
+ switch (event.data) {
29
+ case "authorizing":
30
+ window.location = "<?php echo Mage::getUrl("bitcoin/index/status");?>";
31
+ break;
32
+ case "expired":
33
+ case "refund_requested":
34
+ break;
35
+ default:
36
+ alert("unknown order status :" + event.data);
37
+ break;
38
+ }
39
+ }
40
+ // Attach the message listener
41
+ if (window.addEventListener) {
42
+ addEventListener("message", invoiceListener, false)
43
+ } else {
44
+ attachEvent("onmessage", invoiceListener)
45
+ }
46
+ </script>
47
+ <?php endif; ?>
app/design/frontend/base/default/template/bitcoin/fullscreen/widget/content.phtml ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div id="yp-fullpage-container">
2
+ <?php echo $this->getLayout()->createBlock('bitcoin/fullscreen_widget_header')->setTemplate("bitcoin/fullscreen/widget/header.phtml")->toHtml();?>
3
+ <div id="yp-invoice-body">
4
+ <?php
5
+ $url = $this->GetWidgetUrl();
6
+ $iframe = false;
7
+ switch ($url) {
8
+ case 'no payment':
9
+ case 'disabled':
10
+ $iframe = false;
11
+ break;
12
+ case 'paid':
13
+ echo 'Order payment received. Place Order to complete.';
14
+ $iframe = false;
15
+ break;
16
+ case false:
17
+ echo 'Error creating invoice. Please try again or try another payment solution.';
18
+ $iframe = false;
19
+ break;
20
+ default:
21
+ $iframe = '<iframe src="' . $url . '" scrolling="no" allowtransparency="true" frameborder="0"> </iframe>';
22
+ break;
23
+ }
24
+ if ($iframe): echo $iframe;?>
25
+ <script type="text/javascript">
26
+ function invoiceListener(event) {
27
+ console.log(event);
28
+ if (event.origin != "https://yolanda-perkins.herokuapp.com" && /\.yellowpay\.co$/.test(event.origin) == false ) {
29
+ alert("Received message from unexpected domain: " + event.origin);
30
+ return;
31
+ }
32
+ switch (event.data) {
33
+ case "authorizing":
34
+ case "paid":
35
+ window.location = "<?php echo Mage::getUrl("bitcoin/index/status");?>";
36
+ break;
37
+ case "expired":
38
+ case "refund_requested":
39
+ window.location = "<?php echo Mage::getUrl("bitcoin/index/status");?>";
40
+ break;
41
+ default:
42
+ alert("unknown order status :" + event.data);
43
+ break;
44
+ }
45
+ }
46
+ // Attach the message listener
47
+ if (window.addEventListener) {
48
+ addEventListener("message", invoiceListener, false)
49
+ } else {
50
+ attachEvent("onmessage", invoiceListener)
51
+ }
52
+ </script>
53
+ <?php endif; ?>
54
+ </div>
55
+ <?php echo $this->getLayout()->createBlock('bitcoin/fullscreen_widget_footer')->setTemplate("bitcoin/fullscreen/widget/footer.phtml")->toHtml();?>
56
+ </div>
app/design/frontend/base/default/template/bitcoin/fullscreen/widget/footer.phtml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $storeName = $this->getStoreName()?>
2
+ <?php $invoice = $this->getInvoiceData();?>
3
+ <?php $order = $this->getLastOrder();?>
4
+ <?php //$invoice = array("invoice_ccy" => "invoice_ccy" , "invoice_price" => "invoice_price" , "base_ccy" => "base_ccy" , "base_price" => "base_price");?>
5
+ <div id="yp-fullpage-footer">
6
+ <div id="yp-fullpage-yellow-bar"><div class="yp-bar"></div></div>
7
+ <div id="yp-fullpage-footer-content" class="clearfix">
8
+ <div id="yp-fullpage-invoice">
9
+ <div class="yp-normal-text"><?php echo $this->__("Order# %s" , $order->getIncrementId());?></div>
10
+ <div class="yp-vertical-space-10"></div>
11
+ <div class="yp-normal-text"><?php echo $this->__("Amount Due :");?></div>
12
+ <div class="yp-bolder-text"><?php echo $this->__($invoice["invoice_ccy"]);?> <?php echo $this->__("{$invoice["invoice_price"]}"); ?> </div>
13
+ <div class="yp-vertical-space-10"></div>
14
+ <div id="yp-info"><?php echo $this->__($invoice["invoice_ccy"]);?> <?php echo $this->__("{$invoice["invoice_price"]}"); ?> = <?php echo $this->__($invoice["base_ccy"]);?> <?php echo $this->__("{$invoice["base_price"]}"); ?></div>
15
+ </div>
16
+ <div id="yp-fullpage-info">
17
+ <div class="yp-bolder-text"><?php echo $this->__("%s is proud to accept Bitcoin!" , $storeName);?></div>
18
+ <div class="yp-vertical-space-10"></div>
19
+ <div class="yp-normal-text yp-email-field">
20
+ <span class="icon-mail2 yp-icon"></span>
21
+ <span class=“yp-email-addr"><?php echo $this->escapeHtml($this->getContactEmail());?></span>
22
+ </div>
23
+ <div class="yp-vertical-space-20"></div>
24
+ <div class="yp-bolder-text"><p><?php echo $this->__($this->getCustomerName()); ?></p></div>
25
+ <address>
26
+ <?php echo $this->getBillingAddress();?>
27
+ </address>
28
+ <div class="yp-vertical-space-10"></div>
29
+ <div class="yp-normal-text yp-email-field">
30
+ <span class="icon-mail2 yp-icon"></span>
31
+ <span class=“yp-email-addr"><?php echo $this->escapeHtml($this->getCustomerEmail());?></span>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
app/design/frontend/base/default/template/bitcoin/fullscreen/widget/header.phtml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php $storeName = $this->getStoreName();?>
2
+ <div id="yp-fullpage-header" class="clearfix" >
3
+ <div class="yp-header-logo">
4
+ <a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this->getLogoAlt() ?>"><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>" /></a>
5
+ </div>
6
+ <div class="yp-header-title"><span><?php echo $this->__("Your %s Bitcoin Invoice" , $storeName);?></span></div>
7
+ </div>
app/design/frontend/base/default/template/bitcoin/widget.phtml CHANGED
@@ -1,48 +1,51 @@
1
  <?php
2
- $url = $this->GetWidgetUrl();
3
- $iframe = false;
4
- switch ($url) {
5
- case 'no payment':
6
- case 'disabled':
7
- $iframe = false;
8
- break;
9
- case 'paid':
10
- echo 'Order payment received. Place Order to complete.';
11
- $iframe = false;
12
- break;
13
- case false:
14
- echo 'Error creating invoice. Please try again or try another payment solution.';
15
- $iframe = false;
16
- break;
17
- default:
18
- $iframe = '<iframe src="' . $url . '" style="width:500px; height:255px; overflow:hidden; border:none; margin:auto; display:block;" scrolling="no" allowtransparency="true" frameborder="0"> </iframe>';
19
- break;
20
- }
21
- if ($iframe): echo $iframe;?>
22
- <script type="text/javascript">
23
- function invoiceListener(event) {
24
- if (event.origin != "https://yolanda-perkins.herokuapp.com") {
25
- alert("Received message from unexpected domain: " + event.origin);
26
- return;
27
- }
28
- switch (event.data){
29
- case "authorizing":
30
- buttons = $$("button.btn-checkout");
31
- buttons.each(function(btn) { btn.click(); })
32
- break;
33
- case "expired":
34
- case "refund_requested":
35
- break;
36
- default:
37
- alert("unknown order status :" + event.data);
38
- break;
39
- }
40
- }
41
- // Attach the message listener
42
- if (window.addEventListener) {
43
- addEventListener("message", invoiceListener, false)
44
- } else {
45
- attachEvent("onmessage", invoiceListener)
46
- }
47
- </script>
48
- <?php endif; ?>
 
 
 
1
  <?php
2
+ $url = $this->GetWidgetUrl();
3
+ $iframe = false;
4
+ switch ($url) {
5
+ case 'no payment':
6
+ case 'disabled':
7
+ $iframe = false;
8
+ break;
9
+ case 'paid':
10
+ echo 'Order payment received. Place Order to complete.';
11
+ $iframe = false;
12
+ break;
13
+ case false:
14
+ echo 'Error creating invoice. Please try again or try another payment solution.';
15
+ $iframe = false;
16
+ break;
17
+ default:
18
+ $iframe = '<iframe src="' . $url . '" style="width:500px; height:255px; overflow:hidden; border:none; margin:auto; display:block;" scrolling="no" allowtransparency="true" frameborder="0"> </iframe>';
19
+ break;
20
+ }
21
+ if ($iframe): echo $iframe;?>
22
+ <script type="text/javascript">
23
+ function invoiceListener(event) {
24
+ console.log(event);
25
+ if (event.origin != "https://yolanda-perkins.herokuapp.com" && !/\.yellowpay\.co$/.test(event.origin) ) {
26
+ alert("Received message from unexpected domain: " + event.origin);
27
+ return;
28
+ }
29
+ switch (event.data) {
30
+ case "authorizing":
31
+ buttons = $$("button.btn-checkout");
32
+ buttons.each(function (btn) {
33
+ btn.click();
34
+ })
35
+ break;
36
+ case "expired":
37
+ case "refund_requested":
38
+ break;
39
+ default:
40
+ alert("unknown order status :" + event.data);
41
+ break;
42
+ }
43
+ }
44
+ // Attach the message listener
45
+ if (window.addEventListener) {
46
+ addEventListener("message", invoiceListener, false)
47
+ } else {
48
+ attachEvent("onmessage", invoiceListener)
49
+ }
50
+ </script>
51
+ <?php endif; ?>
app/etc/modules/Yellow_Bitcoin.xml CHANGED
@@ -26,14 +26,14 @@ SOFTWARE.
26
  -->
27
 
28
  <config>
29
- <modules>
30
- <Yellow_Bitcoin>
31
- <active>true</active>
32
- <codePool>local</codePool>
33
- <depends>
34
  <Mage_Payment/>
35
- </depends>
36
- <version>0.1.1</version>
37
- </Yellow_Bitcoin>
38
- </modules>
39
  </config>
26
  -->
27
 
28
  <config>
29
+ <modules>
30
+ <Yellow_Bitcoin>
31
+ <active>true</active>
32
+ <codePool>local</codePool>
33
+ <depends>
34
  <Mage_Payment/>
35
+ </depends>
36
+ <version>0.1.1</version>
37
+ </Yellow_Bitcoin>
38
+ </modules>
39
  </config>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Yellow_Pay</name>
4
- <version>0.1.7</version>
5
  <stability>stable</stability>
6
  <license uri="https://github.com/YellowPay/yellow-magento/blob/master/LICENSE.md">MITL</license>
7
  <channel>community</channel>
@@ -30,11 +30,12 @@ Bitcoin payment is received and the customer is redirected to an order confirmat
30
  &#xD;
31
  6.&#xD;
32
  Yellow converts the received Bitcoin payment into a national currency (like AED) and transfers it to the merchant&#x2019;s bank account</description>
33
- <notes>Hide widget when other payment methods are selected</notes>
 
34
  <authors><author><name>James Piechota</name><user>YellowPay</user><email>james@yellowpay.co</email></author><author><name>Tawfek Daghistani</name><user>tawfekov</user><email>tawfekov@gmail.com</email></author></authors>
35
- <date>2014-10-13</date>
36
- <time>20:30:50</time>
37
- <contents><target name="mageetc"><dir name="modules"><file name="Yellow_Bitcoin.xml" hash="b994ecfa72adf5cac1168178b7dd233c"/></dir></target><target name="magelocal"><dir name="Yellow"><dir name="Bitcoin"><dir name="Block"><dir name="Form"><file name="Bitcoin.php" hash="9f2f3403e2578263b8c73aa495b0b473"/></dir><file name="Index.php" hash="0a2ac65b25a7c31aa457b4688b8c28ac"/><dir name="Info"><file name="Bitcoin.php" hash="7c4f19e8b6cecc559e4df0a215eba6c9"/></dir><file name="Status.php" hash="e437b9f4b6c9349f96520a220228ee4e"/><file name="Widget.php" hash="7be6cd4ce33257dcb9c754b1da6852a6"/></dir><dir name="Helper"><file name="Data.php" hash="53c324df464a427bc974ccb30b9b2b74"/></dir><dir name="Model"><file name="Bitcoin.php" hash="d15d724b03aa7dce33cd7ad65d276557"/><file name="Http.php" hash="301e3a15684059765766403072db1615"/><file name="Ipn.php" hash="c0243c3c80c8bc94604f9b79c569bd6f"/><dir name="Resource"><dir name="Ipn"><file name="Collection.php" hash="d4a1c628a1c815a9a9cc8db6fe84a27d"/></dir><file name="Ipn.php" hash="cb1c60decd1fcc786dbaa30e0bc4314d"/></dir></dir><dir name="controllers"><file name="IndexController.php" hash="00b98e5b0f134fb16f8fcda6de63db06"/></dir><dir name="etc"><file name="config.xml" hash="0c0b116a7afbf509f951dcb7cfdc624e"/><file name="system.xml" hash="1a1b2bd102795f244bb8331a5d419c45"/></dir><dir name="sql"><dir name="bitcoin_setup"><file name="mysql4-install-0.1.0.php" hash="c0ca52e99ed9379d1e417d6fbc409e83"/><file name="mysql4-upgrade-0.1.0-0.1.1.php" hash="029263662ecc7b7dfe8e76cfa907b38b"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="bitcoin"><dir name="form"><file name="bitcoin.phtml" hash="ef1c94b1705cf6a003efe60ffa370662"/></dir><file name="index.phtml" hash="22b757c8eae6298b157dfe59495e0345"/><dir name="info"><file name="bitcoin.phtml" hash="297b5f325aa90c0e8d9df673b5f42654"/></dir><file name="status.phtml" hash="4d7753c3efdcad9a2974b89ec636aa4c"/><file name="widget.phtml" hash="fcce304261bd2d3e8d69c6c15f4a68eb"/></dir></dir><dir name="layout"><file name="bitcoin.xml" hash="71f89164224ff02c8afc1ebad86ed6ee"/></dir></dir></dir></dir></target></contents>
38
  <compatible/>
39
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
40
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Yellow_Pay</name>
4
+ <version>0.2.0</version>
5
  <stability>stable</stability>
6
  <license uri="https://github.com/YellowPay/yellow-magento/blob/master/LICENSE.md">MITL</license>
7
  <channel>community</channel>
30
  &#xD;
31
  6.&#xD;
32
  Yellow converts the received Bitcoin payment into a national currency (like AED) and transfers it to the merchant&#x2019;s bank account</description>
33
+ <notes>Verify signature on inbound IPNs&#xD;
34
+ Add support for full screen invoices</notes>
35
  <authors><author><name>James Piechota</name><user>YellowPay</user><email>james@yellowpay.co</email></author><author><name>Tawfek Daghistani</name><user>tawfekov</user><email>tawfekov@gmail.com</email></author></authors>
36
+ <date>2015-01-07</date>
37
+ <time>21:44:12</time>
38
+ <contents><target name="mageetc"><dir name="modules"><file name="Yellow_Bitcoin.xml" hash="d75406a63e814a73dc7506717f441d5a"/></dir></target><target name="magelocal"><dir name="Yellow"><dir name="Bitcoin"><dir name="Block"><dir name="Form"><file name="Bitcoin.php" hash="2ef2ec92b78dea7b1b75976a78bafb68"/></dir><dir name="Fullscreen"><dir name="Widget"><file name="Content.php" hash="a6430caef4b5b702558b564bf8b8f2f2"/><file name="Footer.php" hash="d1895d526c23235012ca7723b6e84218"/><file name="Header.php" hash="e2ff54196a5acc9369f4101c275d5a7c"/></dir></dir><file name="Fullscreen.php" hash="f79cce61051c201ee842d429cf86f25c"/><file name="Index.php" hash="0a2ac65b25a7c31aa457b4688b8c28ac"/><dir name="Info"><file name="Bitcoin.php" hash="7c4f19e8b6cecc559e4df0a215eba6c9"/></dir><file name="Status.php" hash="4c17f2865abb4b5689b7343fff76c78a"/><file name="Widget.php" hash="43b71ccdec0842c4dd75d6659b6bb341"/></dir><dir name="Helper"><file name="Data.php" hash="ea43d8608c76e2f52ec152069c4f672f"/></dir><dir name="Model"><file name="Bitcoin.php" hash="3d18bf52c0a10b0cd2eccb11d59e851b"/><file name="Http.php" hash="1be33e613418ed606e49aa86ed79246e"/><file name="Ipn.php" hash="63126b7a70d56faeeec0c0b79f6c26d8"/><dir name="Resource"><dir name="Ipn"><file name="Collection.php" hash="1782b9b4bb6a56962f636d18a3d1200d"/></dir><file name="Ipn.php" hash="a89a447c0fdb0e9c8847ed10dd1cb43e"/></dir></dir><dir name="controllers"><file name="IndexController.php" hash="a627fa88d52af525a325a1f89362588f"/></dir><dir name="etc"><file name="config.xml" hash="ec47da48f45364204873b6266645dd48"/><file name="system.xml" hash="43bb2b8a6ce2825cab3817b838bb2a66"/></dir><dir name="sql"><dir name="bitcoin_setup"><file name="mysql4-install-0.1.0.php" hash="a269d6b3312d60d99edb86d8bffb57f6"/><file name="mysql4-upgrade-0.1.0-0.1.1.php" hash="005d74af44930ca0fe850dace1d5e390"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="template"><dir name="bitcoin"><dir name="form"><file name="bitcoin.phtml" hash="0d6b964950b0c9a51b975eb9ee64107c"/><file name="logo.phtml" hash="2f8adb34565c7a20f783f2ee2b244ab9"/></dir><dir name="fullscreen"><dir name="widget"><file name="content.phtml" hash="fd245b27494aa2556cff60332c97d820"/><file name="footer.phtml" hash="695cf39af69bed90a629a654efe8d5fe"/><file name="header.phtml" hash="6cee4d3bc13512d7c1fa74d44d6b97ea"/></dir></dir><file name="fullscreen.phtml" hash="e1b06afea72dd0efca00cd08ce0ae7d3"/><file name="index.phtml" hash="22b757c8eae6298b157dfe59495e0345"/><dir name="info"><file name="bitcoin.phtml" hash="297b5f325aa90c0e8d9df673b5f42654"/></dir><file name="status.phtml" hash="4d7753c3efdcad9a2974b89ec636aa4c"/><file name="widget.phtml" hash="d1b1bd2deb7c51495071d701d209aafa"/></dir></dir><dir name="layout"><file name="bitcoin.xml" hash="0f7367d75bcab10d1fec1e9f3602526b"/></dir></dir></dir></dir></target><target name="mageskin"><dir name="frontend"><dir name="base"><dir name="default"><dir name="css"><file name="bitcoin.css" hash="d42cfe2896c1298edbb9d739d4f22ea9"/></dir><dir name="images"><dir name="bitcoin"><file name="bitcoin_accepted.png" hash="0682420205f3e2001b72901c44073163"/></dir></dir></dir></dir></dir></target></contents>
39
  <compatible/>
40
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
41
  </package>
skin/frontend/base/default/css/bitcoin.css ADDED
@@ -0,0 +1,322 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Product Name: Yellow Payment Widget
3
+ Product URL: http://www.yellowpay.co
4
+ Author: David El Achkar
5
+ Author email: David@yellowpay.co
6
+ Version: 3.0.0
7
+ */
8
+
9
+ /* Full Page Widget CSS */
10
+
11
+ #yp-fullpage-container
12
+ {
13
+ font-family:'Vitesse SSm A','Vitesse SSm B',Arial,sans-serif;
14
+ font-weight:400;
15
+ font-size:13px;
16
+ color:#333333;
17
+ padding: 45px 10px;
18
+ max-width: 625px;
19
+ margin: auto;
20
+ }
21
+
22
+ #yp-fullpage-header
23
+ {
24
+ background-color: #f0f0f0;
25
+ width: 100%;
26
+ }
27
+
28
+ #yp-fullpage-header .yp-header-title
29
+ {
30
+ float: left;
31
+ font-weight: bold;
32
+ padding: 0px 20px;
33
+ height: 65px;
34
+ display: table;
35
+ }
36
+
37
+ #yp-fullpage-header .yp-header-title span
38
+ {
39
+ font-size: 17px;
40
+ line-height: 27px;
41
+ display: table-cell;
42
+ vertical-align: middle;
43
+ }
44
+
45
+ #yp-fullpage-header .yp-header-logo
46
+ {
47
+ float: left;
48
+ background-color: white;
49
+ padding-right: 20px;
50
+ position: relative;
51
+ height: 65px;
52
+ }
53
+
54
+ #yp-fullpage-header .yp-header-logo .logo-img
55
+ {
56
+ max-width: 150px;
57
+ min-width: 1px;
58
+ max-height: 65px;
59
+ min-height: 1px;
60
+ margin: auto;
61
+ }
62
+
63
+ #yp-invoice-body
64
+ {
65
+ position: relative;
66
+ margin: auto;
67
+ }
68
+
69
+ #yp-invoice-body > iframe
70
+ {
71
+ height:255px;
72
+ overflow:hidden;
73
+ border:none;
74
+ margin:auto;
75
+ display:block;
76
+ width: 100%;
77
+ }
78
+
79
+ #yp-fullpage-footer
80
+ {
81
+ background-color: #f0f0f0;
82
+ position: relative;
83
+ }
84
+
85
+ #yp-fullpage-yellow-bar
86
+ {
87
+ background-color: white;
88
+ position: absolute;
89
+ top: 0;
90
+ bottom: 0;
91
+ left: 0;
92
+ z-index: 0;
93
+ }
94
+
95
+ #yp-fullpage-yellow-bar .yp-bar
96
+ {
97
+ background-color: #ffcb20;
98
+ height: 100%;
99
+ width: 35px;
100
+ margin-right: 17px;
101
+ }
102
+
103
+ #yp-fullpage-footer #yp-fullpage-footer-content
104
+ {
105
+ position: relative;
106
+ z-index: 100;
107
+ padding: 45px 0px;
108
+ }
109
+
110
+ #yp-fullpage-footer-content #yp-fullpage-invoice
111
+ {
112
+ float: left;
113
+ background-color: white;
114
+ padding: 25px 25px 25px 10px;
115
+ }
116
+
117
+ #yp-fullpage-footer-content #yp-fullpage-info
118
+ {
119
+ padding-left: 230px;
120
+ padding-right: 20px
121
+ }
122
+
123
+ #yp-fullpage-footer-content #yp-fullpage-invoice .yp-info-link:after
124
+ {
125
+ display: none;
126
+ }
127
+
128
+ #yp-fullpage-info .yp-fullpage-links a
129
+ {
130
+ font-size: 12px;
131
+ font-weight: bold;
132
+ text-decoration: none;
133
+ color: #333333;
134
+ }
135
+
136
+ #yp-fullpage-info .yp-fullpage-links a:not(:last-child):after
137
+ {
138
+ content:"|";
139
+ font-weight: 700;
140
+ padding:0 6px;
141
+ }
142
+
143
+ .yp-vertical-space-10
144
+ {
145
+ width: 100%;
146
+ height: 10px;
147
+ }
148
+
149
+ .yp-vertical-space-20
150
+ {
151
+ width: 100%;
152
+ height: 20px;
153
+ }
154
+
155
+ .yp-bolder-text{
156
+ font-size: 17px;
157
+ font-weight: 500;
158
+ line-height: 20px;
159
+ }
160
+ .yp-normal-text{
161
+ font-size: 13px;
162
+ line-height: 17px;
163
+ }
164
+
165
+ @media only screen and ( max-width: 479px ) {
166
+ #yp-fullpage-footer-content #yp-fullpage-info
167
+ {
168
+ padding: 20px 20px 0px 72px;
169
+ clear: left;
170
+ max-width: none;
171
+ }
172
+
173
+ #yp-fullpage-header .yp-header-logo .logo-img
174
+ {
175
+ max-width: 70px;
176
+ }
177
+ }
178
+
179
+ .clearfix:after {
180
+ visibility:hidden;
181
+ display:block;
182
+ font-size:0;
183
+ content:" ";
184
+ clear:both;height:0
185
+ }
186
+
187
+ .yp-info-link
188
+ {
189
+ text-decoration: none;
190
+ }
191
+
192
+ #yp-icon-info {
193
+ font-size: 11px;
194
+ vertical-align: middle;
195
+ color: #999999;
196
+ padding-left: 4px;
197
+ }
198
+
199
+ #yp-info {
200
+ display: inline-block;
201
+ font-size: 10px;
202
+ line-height: 18px;
203
+ }
204
+
205
+
206
+ /* *************************************** */
207
+ /* * TK - MODIFICATIONS TO ORIGINAL FILE * */
208
+ /* *************************************** */
209
+
210
+ .yp-widget-container {
211
+ margin: auto;
212
+ }
213
+
214
+
215
+ /* *************************************** */
216
+ /* ************ TK - FONTS *************** */
217
+ /* *************************************** */
218
+ @font-face{
219
+ font-family: "Vitesse SSm A";
220
+ src: url(data:application/x-font-woff;base64,d09GRk9UVE8AADp2AA0AAAAAYSgAAQAAAAA4TAAAAioAAAaNAAAAAAAAAABDRkYgAAAJTAAAJqMAADP4ZtqXT0dERUYAAC/wAAAAHgAAACAA5QAER1BPUwAAMBAAAAYUAAAYCq9mu/pHU1VCAAA2JAAAAFoAAACA6gstjk9TLzIAAAGMAAAATwAAAGBWVVZvY21hcAAABmgAAALQAAAEND7Qq2BnYXNwAAA2gAAAAAgAAAAIAAAAC2hlYWQAAAEwAAAANAAAADYDDPYoaGhlYQAAAWQAAAAgAAAAJAejA71obXR4AAA2iAAAAcIAAALEiGUvYW1heHAAAAGEAAAABgAAAAYAuFAAbmFtZQAAAdwAAASJAAALxJpZT6Zwb3N0AAAJOAAAABMAAAAg/7gAMnjaY2BkYGBgZHBUlN/rEs9v85WBm/kFUIThAtvNYBj9//m/u8w/meuBXA4GJpAoAFoWDWd42mNgZGBgPvBfgIGBRfr/8//PmX8yAEVQwCoAo5wHZgAAUAAAuAAAeNpjYGLyZNRhYGVgYdrD1MXAwNADoRnvMhgx/GJAAgsYGOodGBi8YHwPNed8IKWsqMSs8N+C4QTzAYYPQP5skByTKNMeBgUgZAIApsgOZAB42rVUwW7bRhAdWXJsJ7Hh+JhDsUADIykkWVQc28kpgAHDuUaGgRS9rMiVSEfkEsulFQI59Fj01FN76H/00G/oF/Rr+na4gik7sV0UFSHu252ZnfdmBiSiZ60/qEX17y3+NW7Rt9jVeIXWKPS4TYIuPO40fFZpk372+AEsv3m8RhP63eN12my1PN5o4Icr260tjx/RTvsbjx838GbDZ4u+aw883m5weNLAO4zb1OpsYPdj+3uPW3TS/tvjFdrqCI/b9LbT97jT8Fmlp53M4we03vnJ4zX6q/OLx+v0dPUHjzca+GFHrF56/Iiebfzq8eMG3mz4bNHZxp8ebzc4PGngHYePdV6ZZBpb8fz4hRgOBgddvIOBONVqMlNG7Ipj3Rextfmbvb35fN63Va6nRuZx1Q91uhx/unusxWex7PJeTcuZNMHRcHD4sne0fxi86iHFfjAcBr2Dw6AX7A+GwetzZYpEZyLow3iiM3ueWFUUSoxCo1Q2SqWxIimEFNbISGH7UejJMs+umMdJGItUVmKshFHTpLDKqEgkmQiVsRLrRWmSIkpCi2xFfyn+LEaCQk/sXBrlktlYidzoHKHVjWzigy45VaatCFGIrkh1lEywRshrknFpVVdoIyI9z2ZaRrivkYBNSVZYOZuJxIoyh3yZVbgrzRFq2CHWhXXWidEpW2c6lI475zeirr7VokSt7HUBRTm+UCHbnZYzZdLCCRkpc5mESsgpipuqDB6xtEJ9AvECtbNz1FxUECiz6JrsdxMoxs0o9FV4HdnlkEVNbjKaQJDTkJcm14XqixMcpNpxzWBLWVhX5DMlEXuZFBD+1dnbm6vxBIPSWypoiBMJxcucoe3mBeKumbwZcn8ydEyacqrIUEJTisnie/ccpy+wDmmA54C6Hgf4CzpFhMJXboa3wX4Xf3dLH6uLt7jvDe3hmfPTx0mFM437DUmgGPs+vrCa0lvzn+JuZxf0Gf/bbnkPLlMqwUnCGtAR8z2kl9QD3gcK6BVwrWIf/yGeACcHbOvx6YDPXtM5KyvASFOGzAHy1JEnfGLhkeCt4FPgLWgEHgZIwToCH8fCKUlgF9g59o51BI/a+hFnGlW8rZ6u7nPoTHB7DOwiK6xjzmlYs8tgOVLhdpfRMQ75xMK/3l+gNoZ9I77Nem0Fsnw9/xnndgoK5mrBRnKmhTILD7fLcer6WGet7qFN0AesZUNVhr1l7vVEdNmmmfHE7yOv12kZI9op73I2w1YNhhmyaa51ze/LCq6iEq6Dq9UMj+DOCtyd++5LvCvPK8Vp6et9dUOMtfD9du8JVyNtxDpGIXaLul/pN9zJq9m3PO+lnyt7ZwcK+I7RX8VdXcQv+nLGTFP2rDsy4pNLngLFDKd+clOeXuujJSNFn3zFCz93jkE95wLK6g46ldEd3X7H2TNm5zjXE/2l7M2c3UaW63NynxpNfIcWfci54jn3SzGvE++R8qr8PNRxaaNjXY52yqTPe8lZ647/++/eHtdxzJmc7t4tExp6H+l7fFud677dh4H4z9/J+2T5HyrzDxZ7a+QAAAB42p2S+y/WURzH35+HVIouCA99fT2KiohELiUSut+FchnpQiuE3KciUaT7jS6EWq3VVlOp9Vt+SE1a0lrz+BdqM7P5fjrP96E9z9bW1nd7f8/n8z6fnfM653wAWMAoVxAMoa/ISM0tLWaLsQWVsIIOMjzgh0AEIwLRiMVGJCMDuchHIYpRjla04SGe4BleoAvd6EU/hjFCk8mWZpIdOZAjOZMLeZAXedNi8iN/CqYoiqYYiqMdFE8JlEQplEaZlEWH6DDlUB7lUzGVUjmxxknjounW/JAqpRNSlfRLtpe1siTrZE85VH7krmMWrLLgnK8yhiISMViHzUhFpspYhFJxljbcx2PB2IlXeCsY+zCAEYyRtRmjZMIYRCHjjBtMGNPNGAtVxlHBqNW80wyMM/6U7WQn2VVlDDEy8hDreZC/8zf+yv38hT9zH3/iXv7IH7iH33MHt/M9buHb3MxNfJ3PcyOf4wbDy7A161hmiV1ZK7JZbMvThZdomFNGlRFlWIwflR7lvdLNfiJ+o3QpL5VO5bnyXGRP2V78bYCxnrHXQw+GOobaAH2Nvkp/Ul+pL9dnD44OVht74L++LFSY5SVmcdl4dNrEbTCrN87UCV0wcev+slONqK2FIwL+yFm8+YS0onOD/0hCGNwQbqYzOAt30cUTqhck8+CJKFXeWING+KjrpqJArZjwQVb45xURNBawnGQ1ecpU62nTbWwN3gxgJjBrtp29wxw4Ojlr4eIKzJXcZLjrPObN9/RasHCRt89iXz8s8Q9YGohlQcHLQ0LDwlesjFgVCbH9akSvQUxsHJCckgbsy845kns0L7+w6FhxSVlpeUXlieMnq6tUgG1r14lOP7xlY8f2DUjdb7DWG9E2xaPgVIIx3ryrFYl7Musbbty8faepGahtRPs90RPYcesudiPJWJaxF+kHsw7UXbi29dLlKzuvX734G5RI+FN42mNgZgCD/1sZjBiwAAAswgHqAHjapXoJeBTVsn+HZHraBAYVG3CDAEoERVkVUK8giygiKEsIiwJhyx6STGYmmX1PKjOT2TOTzGQPWQEBQYUQEAF3cFdcntfde1XuvaKn4xne/VeHgMBV33vff6a/mdOnT9epU1Wnqn7VHcckJDBxcXGS+Xm5RWLjNuFqRrgjTpgwQJgQLwxNSBsYX0D3/+r4dYiEfDrYezPD3C6/tveaa5gheNNAfsQd02cvXL52c16JLdC45ycyT16QtzU9rzBbvmV9urxo053p6/M3FGwq7mukZxSky3M2Z29SimcbMzYVbCrMKBTbWwrWnx+Ssz69IC9XbOVtycvdlCW2CjJyt4j/RRnZG8/TWd8/Jn3Txozs7PV91PKK1qenb8ot6uvPy8lZf8lp3/j12X0nW+W5W9YXyHOy18v7zufk5asKMrZsLUq+bc645MkTJ959B/5Ompi8IG8TslqQPDZ5Tt6dyVuLivJn3nWXQqG4s0iFzBUgJdWdOFGf4ETJMXEMEx/HsHHMVoa5SsrwDDOcYW6UMKPjmZQ45vZ4ZqKMmcUwaoZ5cAAzfyCznGFSGSYtjlkzgFkfx2xkGBPDtDMMMEwmwzQzjJ5h6hlGwzAFDGNhGBfDKBmmlGF2MExHHLOLYboYZifDlDPM0wwTZphDDHMgjulhmG6GcTDMiwxzZABzjGEiDONnmFcZ5qU45nWGeYVhXmOYSoZ5g2HeYpiTA5j3GObtAcx2hnmfYT5imA/imI8Z5jTDeBnmc4ZpYJgvGMbNMBUM42EYJ8P4GOYwwxyPY7QMY2cYQxxjZhgbw+gYxsoweQxTxjCzGYZjGDnDZDCMgmGKGQbFpGKYrLg4HBli4uyDmWcHoND+gkMfZ7ri9gwwDCgf8Eb8kPgN8Zp4S7wnviZ+R/zfE65KuDFhXsK6hOIEj+QayUhJvaRV8is7gm1mz0qnSRdL90iPcjdwu6+aeNWMq9Ku2nBVfeLwxK2J2xJViY7EaOKexMOJLyV+kDQi6dakqUm5A0cMzBqoHXhgIB0kG+QbFBnUPugXWZ6sS/b3wbMHPzx49+DDV99x9fPXDLtmyzWqa5VDkofcdR1/3ajrQtfVX9d53R5+Gj+PP8af5n8cGj902NBpQ+uH/mPouWGrh20bZh0WGbZn2DvDi4abh/uGNw7vHv769aOuf+76k9d/dX3shiE3TLlh8Y2FN+pu9N/YfuPhGz+78cxNzE2Db7rtpvdu+uqm3ptlN4++edrNy0ckjkgb0TjiwIijI8jIMSNtyWnJGcmmZE9yOLkhuT15b/ILyS8nv5n8afLfk4VRA0YljRoy6t5R6aO2jdo16sSoU6NOj1aPpmMPjn1x7Gtj3xn79dgfx/6aEpcyOGVYysiUsSkTU5akKFLMdBZdkyDYf1XH7OxbaTz5FehDsRskdE1sAQ+9ZjIrNlBClMJAHs7hWGGgJG8xT3AE/RUkstgkGT38hbCCT04kj9NS/JP9QK4SQvxKMkyaSrPpLQAryXBYTVcfhefJapIBa8TmAWzipUN0OPSQbAm5FVvsfrJwKTxFF9IMuNCUPLOKJzmwgubTXJyOPErUwg18JrsN9C6jTxc0NcBn8Jm3IRj0+QKuZuA62WYI2PzGgM5bBHfD3aYivc5g1Nu2AUeuItfzcEbXUVSvDiu8G4B7kt0ASlOpWi7XZUEKpASz6uXV6qhpL3DPsnuh1hsON9QHO+AMR2+MNfCklHxHnEJcKtBS+i11xQZIhPTneZEXg09/kZdA0H8pLz5j8CIvOp2xnxeunxd5fWlYeSkvRXJ9Hy+BrIZLeYl6q8P153mRHSZ/7V3CPwHZJrl82zbTFrgNVngzq/M5K5tqzdSWlGRn2/JgLEz0rO3MaizsML4M3IvsIWgObd/PPXvSA4Sh15ABAIfvBRpHsEnufx/PKAN0AJ1vAjqM3CFR1msj5rApYm2CnfCpq7G6OlgVce0U2emAWntQV6V2F1bczR1j4Yx5V36LojbbkwYcjT83gt/CpoHSow4pai3tcBr+6qkNhoJV9b5mF9flJlPpohX3SeTZatNm4GSxjeftR0a7zpLtPExwzazM96zcvfhLKuOeY+8jQ3KOm/eYO+ynkG88nKc8HZ49bcdPkyHcWnYylW1cbF5pzbPdCxM4pEF2i0S+s31k2246tOnEJCJD0X5Ih7Qv8aS7s5zzQVwlY59vyTKnZy+5nw7B9XxFZE+f8B5ytbg+hu+QyGPkeuFm/rn8I2SQvEpCR73Iw3IyPATNkvnkav7D5Pqq5WSQhDxIj/D3/1KkPULxZABZytPhGthGhmskj5Lp/JqW5XRQg1Yio7eQfcIRPpXeR+9LJfjTQ+4j9/XQ+1hZLP3lb/hRuHQH+Yk8wx+jnY9LUSCvfsPf9fE3Uhld00mn8sIdvb8+DrE7zv0qkTmEUlT9TLYYDCZ1MUf3x5IlBrVVDyVcoZBIJ9EbVpJTh+hgMokMPkgHS5cMpScApx9Rg7snnQSGkjd7U2BvzABANxwHIHcKA4CePHcTbuW1b+O0n3wjnSEs6vuXxda/JrT1Ne+OYdfTJinowGw2cPNHN6o+OSsJRVxV0MJ9iYzeJcwXvDy8SAX6CG54gS6E4/QwGS+u/l1hJi9c/ULsapYqE8438IZPyR08EchC9AECeQSWkB46nvbQcRLZdKL6jL/77c+kdJtwF3+Crfje3RAKBYNhVztunFvZLghbgrqwxpMJabDIqlap1OpcXYZmc6lcV1JSWGjNgflc7kFpxbvuhnC4qioaaPD1NHSFotG2NncLfAinDHu2NSvq8vypaK5T2dWQayxW4EbKAnoVJ/uMdA0dnUi+6L2ZH5MoayaZwvU8CRKNdCfUWqu0IU2wAObAXHWBVqPVFpk3Ig35SvQN7NPQYAmrw+pgLtwPk7VFWvworFvwuoklB8mrvEN6rHrnbvgRvtJ05bfIG/r2S2xc6pnYtympwgT2IHR66+ubmmvaAHcnYXKfm1vFyVqEJ4fekih7UViImo9d1z/6OvYN2Bnc3rpnd/O7QFbise3d9N15rVuCC3DColSe5CO9WnOtoiWvfjGgPugj8sfy8xRKhWkVjshnZZnkrt6beJEaqe1JJq0kv4fmkzpynI4/Rp6UxupSWdkO4WdBz9v/aXouq1MZyfMtwVsz2cVQaFIoMjPUaUCNeITTOjNqFY2mE6ifbPY4tPhqazs7gl1A1nPP0cpUsqxUCnSqPrekRKfXmNchkTXsk6D16APKiGE3kG14+HdHI4FAledZJLKK3Q9V5oA+onJvdU3nZKuFe0VWWaRyi3aDQqHTlZgWAjcTiai9uqAyan7a9iW3hHXSeP/aDvTiHcbjwH3FvgNd3samHV2hQ0BmcMKAH3poJFUqOy7s7uHHpZJAz2SWVpJTpIJ0fgbQQ50AqT8AldPgrbg3gj+LfVHsOwOSPjlFe0aR3WeksnXkrh4etVBFsh+n0+kh4dufcWDqGVZGXiFFyCrJOpcg8RS77FHgnmGjUOn01HEkszchCBD7dhKSJA4kngIgfHtGnGUZSBRgtVmUHE0/xxiApvcyEkvU5ipGYa04r3QCPZOEb1nZPlKOpnBrIn2V/osfmyiTkyxyhidHSOZvNiqH8XC7rkhzwQbRIdzBA0kobS9okdfn+Fai5Q3rJytq30YUGCHavPUNTc3VHUCkXP80f6br6fA8ZV7C/c44QHICGr21tV1doW4gRjw03RlditpC72JcgMjoFSpexz7br+LARqDb8NCnq1R6vdbyJHAqWEjGPAYn6RjKgwQtxd1nKXuQBifbL3xKFvJWcpVi+4IqziF9LdyJDA+Ef6g7xF2V07erbu5fW6RnNIniZM9AnaW6JKz2Fjv/UklHu0oCeq8pYGsE7ufDKay9qbzR/jEXk5LHeNJB8i7KsaoQ7oHp6r69rBL3uswrfE6W8CmJsl3CdT288C15it57jOTFPqR5x8i95KnYt6NTSX2PVPaL8B4awm2Jsg9JomgRq0SLkHssLcDtZFvA4/bUo6H3Jnwhqt+FFvEvoI/Gvi7GX+Hrf4mdPuyUyITBwt7epXwWmw8Gi7WIo7fE/lsF9Frhyx/FQYCDvgAy4ly8xCX3i9Tbkbrf7WpAXymcqwZyS+ycpLLIb8GMpAMzEr+7Eie+uTe+b2Ib3v4j0GtiXyLNW4T/llgbDO58XOcBMrCHn5JKvD2jWTKLRHxA7qWRMaLlhvHGKUDXkBMklTzTR6YC+78HCb2XutFIphH392Kv9zxvqfSARLaDvE8O8OMSZWYy4RA/HmOe/yya17mvia2bLu41ksXdYsATFmLEO4bRTox5GD385BUcRe1pZPE5I12cRuwYPGY4aAIvVDwfq8AN95nwI397ouwBYbowgr8jkabQH/gJibIMsrR3I09TVn4V+/ekNJLyLvvW460lLwHXzb4MbYGGhs4O3z4gk4FMMe7L7ChqyAksAi6NfQzySuYs4cjYJv7ORNkYoh16V6JsgqAl5fzExFaSw09C1t8m7/VO5rtnSTFnMyvxY8qGR7i1k3CyuTiZpXuCMJdID1HuWSkcdNf6A16vz4WqkW0iW+l4nsxin4NGX01NQ4O/BU5zwravDtGUWdIHj+fVLBaZWATZ+qKirCzDGqAj8BCdWkNRu/5lkf0TsL3mnWMcjZPCYqNGrzfoNbZc3GTj2EzQVpp82qCtqmwPt4x1LPHI64qrSxsMzwE3S5iHW3CQu6u+PhSK+g4Ad5g9DJ2ql9dxtEP62PrMEoyGyzAYKr2asLzOsgO3FCcrulyK2u6pwlXsa8+1oUPlXsC0NGAJ6IO6yhLI4iiZmkY03ZPJr1I4YGkrrlXWFnuR5uO4mnxRpDL6BRnZey3/1hdzWTL5XCY/OVEWiyPD+7v2nvuGr631tMBRTuiht638OuaXQo6t1GA0GfUY07n1a9kaW7Q8BE9Di7u2lpM9JGgEBX+6m5au+oKlU+jSWehOH6DoVFd+hW723+hmkWWA7qnozFe8DeRhapcQvnsiSx8ghWhc35O9Q7sn906m43C2f09Mk8rIa2QV5jx9C57bv2AOF9we7gbu0O8suKR7Gi44LO2XSXf/kCqd6/yQaWmktHtqn0zMbQqUidyLrnc5+yjkq2YvttWZq7VV/YJajraXX/IgCkrdx8SURNm9aH5TE8eTKD8NLVo4io0/sNf3+lg+jSzbum8nD0p/39g5WoAWjHa96UORFJ3sX/c7hvXgeNxm3ZOE039kleuATuFIIc3mLzeYm9EP/a6BvX7BwGR0J/nmIH8nmqq+0uQ1+uwhaOWEBDL5EJ1MbniC3jBt5V9jg6SwrrIooooqGyxd0AoNzlont88nka35h1DMk+mx9RKPstIaAW6HGFsr3VGOzBDWvyMCyq2o/Y+Bjo09oAV6q/DAx2JnNnZKZA8ROMjPBHI9WeIEMowumQGwiuSigcwDeg8pIJPJlrfwjG7Afsm7QK+jC2xAryYL3gU4KFJOQyOaRDPpPTRvnmhcW9FFrSanPuDvRqegeof4+A/MzTq/0Wt06qEUNqvmQiqsrttM4pK559lxJEGxGzqgO/IG7IEjyqb7whi+ToejDXAE9qlext+O2t0/kARuDUvjkos3w2pYHpkHGVBiR+BoMBTo/2JGEcbII+gkf5214r9noctUCRKc92npA55tAaMfJRqEGuiKvInUDhTvonG/ILUfaELtRsiC5apFsA6WR4s+VHNl0vvVygJYDumRBZhIZyk2jqMJyCWJ+6VuFxyAHtVbsAuqHQEfflqC73s42RRS9je+c9zBH/ayRzHJq4k0NQa2O79Et1G2xJKvVmNyZ8HkLkOY0ikmcLgPwurKQtcT3BHW/pGhvaBJFSnwPQFc+rer7sxkn4Acc1FRZqb2SaDjgY6rerIzs6GozfwicPNO8qqIoRPNCchIf0ckGg7VuJ7B0Babks2uhxKXOsTJaoVvBSNfTlhdZ+72wsZsMdMYxc6HLGNBYW6udhOM4ejgcak/0IbbUoUusmkJwqO3SQNJ75HSdDKEhU8DLdX4aazcA9w/cOPWWULqsCZQ4EAgGRWOkVM8fRDIUvLZlxcC7feAEa7HCnQ66emLcB7s/AokZAn9DMdibFyCwGrraLFVh9exQbaSxWLlgu8dwr/5+TyWPDq17x97yLTDfHvWzuJ/Yjo0mv0H7Kxr79ixsx1x7jI8sk9t3ZndsaVuLLr20eytsKU4O2vrlhwEsMuALm2bt2MLl0660R881PxmZ2drW0f4O6QzjP0OOtStOZ0ZzTjyITy2zcvMzM3JUk9AOsPYCZAVzm3L7Nr2JpD5HPmSLuHboKYyGIhEXE2OV7jNbNlyu9posJhN9kLgUtgiMDlNHoPfEgEiw8Nd4/d7PV5nA3Bn2Ebw2twWn8FVUrGG28WWHbc1qiL6QEllNk7Gstmgtul0GB0xvRuGhzc/qkTkZmsXHcGEs8Kn/PNsxS5Xtc/n9wUrmoB7m20Cf7nH5DU79Og+50rXuNc6M2EJFBpK8YN01sAqvzykqS6tM+8FnPIZqA0c2M2t+uWZx4hdCnvtDSXVmpC6cj1w09iNoLSXqEpKTEXlKzjC0xJ+C2ZROpfBZ/RaQ7ADOlw1frTukAstgFxzK/tUTrFxE7I+ns7mSWwvjWGycfVLpIK/J5Gs2Iy/MvoEeUqo5j88Lg2Ap9xlc9mcFiiEApvNZrXarOV64Hqe4KHD7FW4uQppfaU7Ai3QavObfBaPzqlB4oMUbXRWjuK/arPffYGtAo+90lppddiguGKd0+q047fMizliXQ5bXlnmhiYuiw7jZyDUUXrV1cqodhf8Hf5etSsaDVdHvZhKf4KZdNQULo0qqzbD7XC7drNSqS5VmjCPrijhX4BoMBKJ1kZ2wc/ws2qXslYVUQaXAXcPuwyUOpVKqVBthlEwKrI5qkCXq3sBlUMkwi882X2Q7kYBAFkozOALxIqb3+A31cK78K631u/3+QMu1Nlx1FnA5jP4DV4FzIbZJoXBYDTobQUo0niSyMNf9a3F9eqQ3I+SXcBugiKDRlMs1+fCNJgWyK1DbTYYngbuDQTQ9f5wqK4+0Ap/RR5GY2I3HVOEZW8LzPl6CGlO52egDh4kz5E3+Geg3hOpaWwKIM6MBxKn31GI1id396l+HRRbVKqCQsNWoHGAsDCjqSBSUmfeB5x3P58Neqc+oK0y1sE/4YyvvqoqEAg40CzfZNshUIYhXuuTQwrcaizWafV6vV2051V0Dk9O76WnRaMQStEqZiZuJTPxVzadxATKf/bg3VJSELuLf4yF8ZYijUar09iy8M5b2AxQu3VBdcjcCd3wcmW4JlIdbg12hXZV1wdrahobK9vgFNe6Slo+21JUqkasoS8yphZlaJTKnBxzPtwP8wPpzdtqi7cbelCsU9gD0Oarq21u9iLyubJmQf4i5IoZ8WWdH2Df9Cv6iFHI5++9olMhlPL3XdFnF7yX+y7xas8Y6QnyBGmHE/SJPliAcKVnKtDVwjlJnSPk9geqI54oBro95mhpjTak8GSKRpcJCrNWU6oyqyAd0j3KapVfHzLXl3F0dSw2VUQ8F7i7B3Og+xNlKNrJPXyqsINkLKHT0IPvJroeqiMBcvJ8oeJcXCpJZOk/Y9/OFNlAP90zBsgA5A2b9AmJ8LcE2ktzpGQj6ZX0l1OIpM+Sfiuq0EhK2hna9T9VVh6MxfPd9HYSIfnSPy2vkC7E6cJtvV7UBGUWXILW9yGi8aIuFs65rPMySE9eF+4RNbOPZPTWoTo66W2XDS7pffYyhdD76NL/oPZ7yN2Dbshv43IfPQpNh5uBFP4+bjd5TG59Jdf2ylIoWC4xVRjBCNyJOfwlYH1jH1g3o5Oh68AApFk4LaHn6O7/wPngA9ocO230SvprPRxC4wV9giHLaJKIkH8hf+sTCdHTq/vO+6FzOxkkSuEXEr5ivWQ4tYkDL4BKsookieadLywi0/hDuDnq65taqjvhH/BjaWdBs7whR0y7qfLnX/rqNP3FnGQSx/YkkHaS9VvhpAgB/z26Qty8WoVtC/rCdKFF6OLhQ92uPLFm58Ysdiy7EnKMcnlBgS4D5nKaC7gvRUC8d9jfFA6HQvWuDtE1i3RD2pA6uA0ehYXaAq1Wo1Ga04FblPo+240WFFZXl/pFX3irtkCDn0LbRkxj0oiUfQE6PY2NzS1hzKylQK7eduBuH4aUo9WtO+Fv3JWA96TQ/TswuAB7p/9HL7lJ6BEFe0U3lQmviHv/iu7RwueX7/4rrr8qvMj/JfEjMrlvt5afbeXrijuMB8TI8DJsj370qqfQrw5pEWaYMbaQ6xAVbPfU1TU1+Vqcn3BPsOWPW4rVGq1GZRNDr7Q/vyuJ6FvLyXCO/ML6nC7vyCoUwQTt/szOooZsz1LgRrNL+/JHi8VqsZrtXqvH4lFGi7yYXtI4dgXk47UiuSGnbBb3Ius4JJaQw+GIEwP93zHQBPsey1SWwhputPQRzyLnGpgJm3RyuaJYtxUWwiPB7FoFR97/hH9oTZYao+UT6MJVlZqQpspaDwfheVekujocrnEjxiJzWXjE8aQ7k3uPnOWxU8xUf8LMJIKajyp9uRV0IEdfYivIIG9rpIbrLyq82OeBLq8skDlkpKjFy3s/xs7p/zHUSkaJOryidxGZe94jXFAWgu7uoZMTybjzZRI8ZfviKlkY+0lE4BeuZwv/EMnRL7quSFRPn0fqc4gG74O1JOWgZE9aqMBb7C52ySsen/dibgQT78WYTWSjyDMytIgObwR6Q9W6rowLOr8ajbnd09Cwc2dgP5CpQKbZjurbjM2q1qcOcme64Dl6/ZOSkmhxXWEjlwZv3Cc5G5MiPE0xZRYrNJoS2/q+dFI0DE1IGTW0nU9F/e3RaChUU4niPsX2INR8aV1FPmTCht8QtJ1MEi36UhxNNpAvRUncSxx9glCjHC5i7MsGNpOvRZFc2hcm/zxP7/4rpESTUEyXkbm46K6uKsTeU3Dd2n0ZXRbM9sxObs+7KK/FEq1DXVGCi7v6MvFhFJ0iis9lrbRX2rgtD70ALYclobLq8igKc5mQzkeV6DPoOKC3GXKVyt9EpEdXbKrgyBZhsoTuomvRG4/zt/aJSbRKwrI+8GLiytFNsYmS8vKKipEoz1Ygt3GypeS1D/iycjpeGP/RBdD8DpAlMeW2ByWWUrOpGLjb1rJttj32DngW6qrC+8SJ3rsIuz9CwB0bL1klNIjmup5cm8JfqEf8H4tvYbGaISVP0cfEYkUfY3cnviCc+F3TxpkmXVaNJ8+wZNEROEwXLQfiuaSID7QpJRdWnGm9WPshJ6RftUDPpG1AXkFxwsqvcVDrxG2w4utmoPsmIshH7Pa9YO3h6WZ2FSg8itr87fITmBMDeaT+pZbttdFa70GU7GaWZp67ie9N/oM05dyN7ALYosvLTd+4bTbQlXg0z96zcXvuTt0bYsa989d4cjcvekNzsRgHSi7zhoiGt5eTYVd4w+cyOuUNWZ5lIu5dCrloPwaDSWfWWEKmoMGPUhUv0cTfta0LWzMRrbQNrRRRXcAd9qi9er+hoajVfBSvDUZX3eKpv+Cqz5X8hMYtjCNpfCgcEe3pn/1eLqL0Z130coP9baKXu1AopzuED/kHLonViWTi5fGkvyJMS3s3iAMF9rwrIkX4j+fE1zuCn4X/+b3X8m9/MQeh8/OYLtyf+BGdjIFHRl6ays/GvwRMwXFvvo+7+sFEcp8Vf2VUgon6Pv5obOpShA8f/TqF7OePnPt+uVQW24wAYz0/BwHG5lcxW5qLjSdf+4afhze92H+JVAz9ZpNXCsEKj8fPnfqpMDJjjEStsmkhn5ssFccp8M7zD0bLLWY9N39Mo+qTnyShSOX5B6PUMRTp0oNEKT7mxTOR+hqSQqr4oC5kbxER73aoclYFw2F3LZyEk5ZadVgb1DrzgJuDWFVj1+nUaosCHoKH3IqwmpPd9+pX/KSPcHMkDJ308cU/GX3rPEzFBoIjEZrInhX+IkznD1GT1EU4//ZwCFMyt5iSLWb3Q8jS93Rtk/NuDNN2wpgwsqr6H/Ct7X/Al5+v3mSlN3FzVr41j4WicnmFkpu78m22ko4Kbdyef+Ep0Fr2KLR5o7Vdnd5nnYTjlrC28ZatKqVOr7U8heQWs+cf4KhDhlYbGcQR0yFqfpV9ExXyLXGLT67eOTt1JxlI36EDd35+lr6zNIuM75CS8RV8JhnRuZqc8kgJRz+XuHQOexC4WjYITqcrKL5E8bkH9+up1QCZZCRA53IA8s4RgA7KgEQL9jK7jqMJ9FMb0ATyqcQetDl0yNGArCP0HVZWT5oj/PxETw3/UOKSffyCxPBs/LEmPJxIvqzsb8VmvMe3eQzVLrYSoLzCzHkazGy5GcqtwNkiQdYDjjKHnvPWrjR7NpjZN038w4nCcjqbj33du1f4mqVjzz3Oh8HrqwhxJrbcaDWbgDNYPOFqt9s70gtOm0vHeevxkkVic1mdZuAQNqpKUDsj6bUf85aySq/H4XZXOqwmU5nVOvL2e/kGj7UpVGA1N3gsPayhTFJWYauwI1WjRTuy3Gz2FFik35j5Zo+pmnVUOl0O4MqlNmeZ04VSq7Q7rSOsYLPbTZxfZXbj2NLXeTe4vBKn1WX3ABd0BX1Bi9c40gJWe5mFa8FR0gNpPN5is7psnpE+qHS7/FxVO0rEUwJgrgSTwljrxrOCvjMJQLDIZSi34h2oqXIPLopOID/zUBTWNMgDNZ5qqOEadOGSUr2uZMQL9BfeAxUuCbKIDIjkwQPVhRaMVA6HwwkucNqdNs5TZWHLrJIyp81hRTxitYAFShtxcigrK7ODFXCQmzOzG8gwlHjQGfDl7chrU9Xo9VYNqCG7vqgNuKrxvBFFpJCaXFbvCC+4XA4fZ3VIyq1IBDh7ucM5srbKow1IyWjyCO9TVxsiwG2vb2hvl9fljSwApaa0sKxFEcgvd/udAajidmTuXrRg/fp1IyDXr6qTr1DlZsN6WHEw/QQ8A12h7e2dGfX6NtgHO3Y6jnFmh8RQotMVgwJKggWt4drqqrAPozFV8/UeW5h1O13Ikt02QmUz13ssUanX7jaOMIPNZjdz/pI+hRHFah51Uo7iLSuzueyYJnhQueDm3Fa30WA2m0eA1WF32cxlFiuKx+S2BMENlQ4kbXWWV6JcnZUOD2etkJTbysvLAL+OMjQO/Lq5Sg+7NZ+32FzukeByOB2OSitOYMG9hCM5euNO3u/E7opyGAF4s2hYI60aKRnm4nEwmpvdPgJsZXY7slbmBCdHJaSHry4NqqvU0c7KxqIGo0GjV2q5I/SDC7uPFm7lWz2mSL3KZMb/vV5PLmv2lsqrsWH2bjBJhZXuPgO0Oe0u0YxdqOuRF0tEFyLExcjxn8XW/qeElxa2LsSNy4NJfxS5GHzOl5wuiT3F8/jpXRYp6MFiMXBLJteXvvmlpKraFYQm7jT6NLtwiO88LanpdNTAfu6d+Upp9f0Sh6HCDGYwlVvK9Jz8LsnlUUrwXdc7lfcOYcaL7z/KmPHMOiaL+SpuZNzaAdcM2DwgOODQgNfj741Pj/clyBIKEvwJjQl/k6RINknaJD2SN9hB7Cj2HlbOtrP/xf4s5aUZUqXUJ90lfU36L+m/uWu4MR3QREohOgNAKUnqj1eXvcjTH6+S/qios7Y3XmKuN4lPhjdjWDJZzHKME+fi+wo2SfVAEqhAy0GSdHkoWHw+FKj0eo1ZDAWpf/rWR+rFVwLcmzEunbgyLm39sxdPkv7sRYVC9k/eTkj6n99MuLTYcfkS8O5vjDsKG5XRXN8yN0efqpU85VK7tEF12BrBgP6au6O6pqqqunIHUl4ivrtkrdKF1W453Mm9xJYRztyat724Ns+b1kd7JeTqlcrcHP06mA6TfFkNhVFVq+GohSNPKST7bWFbla66xFUivoBkzlGrtdpS61a8cQubCaWV2qAmZKkpP8s9xlbQ6/wFzdvqFNtNh3BiuYi5A9Ho9tbg0/A1lxSTSoGO0W1UFIuvNWDqTa9hF0KJR1ulqNXuATKGE6Q/99Ca1B9icThyZlVa19bGoi7j20hrlPhWja+xcUdXFcpyJifE/SCOlCZRW9+bD6OJXUoyyNmvfnsvgM6lh6xAHySHfrjwWsCXaCvCEuEs7I3hGLruGEbuCUI8xB6PnYUNQjWebnocL0yWJEHl7USKmbiV3EylkqRbRLzu6sPrWsTrCsTrD8PDIl7vLzscY4/D9upTL3DzyK2Y4f8ohRdt7fJ6ZVTufRxXetX/pTiQdBnu74YDrijC/gu4n45nF63L0qxAG3qBfR6ixrCmTu7J6Htmf7N5a3GxWq00rRGf7K6AzMhjCJdek770TEfkMN7Ql1yfr4P4tzu+5Z5gYYG5SK3RqFV2MfNnfoO7Ijy7HMf9glxGbMiUxqN0PMwdZcv/amgraCquy/csx3tlf5bxJ10KIC6WU2jCn6IE/n9dtOmDKUlX4IOo0nclPkjqniwo6LiV38Tm3pWGxvO7T9xf+J3H6eruKVc+Tl9y4cl50h+AbnGRy/4QZl8QzH9g5WegBoX8R1j7Mv1wSWVliJxv//9CzklkCp15EuhssojMIgsXIH90hiQJt9nNRAqVE+F2cQMs3dTN1oC/DIO9xaHHzEZdZrDgx1BWgtPo2afzXwdJB9S6AoFg0FMDndBprtEF0WW5ssRV7qJTyIz5QGbTR+ks+uhJ3InPVrJ0CBm0EOgQOgis+4Gwn0iS2iFykoxeKmkyBOzVwPnYKvA53R63xxGEau5ktlT1EB19VFLg1ztLgTOyWjDaLWaLuUwHpVxSFHxlXpPP6NJBDmTbdEaTyWS0K4F7gFWC0WnyGr22ILRDG+abPq/X54gic51Q664K/S8fHFRpai2deNOrQJB5qHwKqHQGZT95En2FJAnRdrvxIJfOuu/rWf0dfAc9B9yn8dS4akv2AlEO68sMZovVainTApfJasDisFaa3eUB2AGNjoA/5Au1bq8KcPKIJK94a7a2WK8qK4UC2OBSVGv8hmpbE3A9bBOEXH5/dcgVhRNc0gEgN4iauhvGi5o6Dx7hAniceQl47I/CcAE1fvyTJHzhddqkK161/fjsJdcqqiw+DXB6o1Gn85qqRgYwXXZ4Me3FdLsMQYnZ7vSNTKp02EwjNawPU6URSVa7KxjA1L/SadPrMIkfmYQSDwaNXh0qRaf1mYIjk/4fbJMmpgB42mNgZGBg4ANiCQYQYGJgBMLtQMwC5jEAAAwnAOoAAHjatVhdaFxFFP6yaeImTTfpJk1i0tY2NTFtQ9VQC9aXqlUoFgURFPFFRQUttWge+hR8EQPSB4NPshStdh8lDwZKQBIkqIW6BYuwIFXYihvlElx/rk1iGL85M3f33rt3t9nt5g4zc2fmzJlzzpy/e9EEoB2H8SRixx8/+QwSp16cOI2d2MJ5KIUYu6bQKPbymbfPIPHGK2+dRo/MNEkLrreiS6BiSDaNmfm+8+xXBUcCIxjDOJ7DqziLSXyINK7gJ/yC3/EHoUaVw3aXSqENCTWFTnWe+OKceR1HVRbH1A94VH2D4+ornCNsMzG2o4srT6sCTzB7ZjlTwAmVF4wuWjg/TRyTxOFyv8P9OYFOc3YRB9SarLShhWsGNsVZl7M5npnjnnnuWeSZLveNyorGpGfWeEoCu6V9nm0nqYkRZpHrGZlt0dygk5z0YxBDGMUBHMXDeIJyiPX2a8l0n+35GkdwCJv+kG5TZ9WPKkUJQFdZmWF17HtOWody9Patqi80rJpRqwaCqzNqzuzbBDrX1bpuq3MRnqvjnJu8Qf94lWWdda0+3Mot0UYJOT6ZrumxKqjr6t/AjtwGsJbB8CYmIyEL1DrzlmWd5IlZM7J98UapkTBzFl5olV1rIe7XbAlIweOrKt2FOm7kvyjJG4q8NTtyhd+Cdw41+nKQJwPJO8nb0ZJIwrF7l7jbNRh8OwirrqkVo/9cd/w0mKr+Cd5tiSb231uZ/VqJf2J1VEZd41umbG2GlhWwK/1eVV7fijX6oNSixmtwq5vSXo/Yt2T7Gxq2qKU3LIWFcv1Tf2pJCt95kZIb0giOyXchdIMb0ZMyGDVHHxxtX45PX6c8OqNPKXLRXsmShebfwndZo8Y6lfdbmbi124XVafHBBjd9NmVSLhefzWv9T9HDZOR+LrNfpm7kS9qpdVu0zJVb1B4pLzafoizdcglx1dPDS3yfovUsCvwsbyhrsPlvzWib1jehZZ6RU/uqFKWQ9uuLPX/ecsaeMFnjpTjKkOqcUFq0ZotJz1+mfWY0dwFv4FmnxrxSJkfX2kOhsr8lPQVjN+TRldOmCT9Nfkp0r4i1XbR0a3ouEDrNeG+iI22PGQj02PPUrNPqKlfmSfMc25BFWx8lcSPoeWvQQWuXDYi8eZ8O9AhtyyKX5Qbg9ttI3OO73D6CMakh+cTM5uQptWVejZBJTWf6/Uzci+V+bxChQ7mGcezYGJqiTUyJ77oQLQ9aUZnvUR8LtVeNXdK2Fm4dC+uks4pMbkO/I7K4kmytl8lSMukN4A3mNJmi33f9OfpGuY2YZC7Ib5h9m6b7uQbqcaWnpyqGZcoqq+koeebbo8j3bZThaE5i1ky9VivfU/lb+W/z7eXrXf8o/AVldXvdvq035s4a5x+i89IN7JJsVSxorj4rlXiWLebIaTXBdiIid8v7spUFK+3rYV+l432Uf6+uC8zM48Xor2n5u6J13pbcK2GMiA01xh3qa6oee2I2NGnzJyd0L5/bt++KX7C6Xipltz7oL6X9WfKVK7pWp8TLCYvfaW51eQfzssbE4iKe9lrzBnMvkkt6+WyuAsUBH1Q9qqm/fLgXime5UXFMcM9tHHfZd7Fjz8rXmiE1Pt7rv5j4DAdleKftByQG7mW9l5HwEHaxmGc/4ZuxBS1oxR1o4+1tpcVsQ4JV/9fbzrkkuhmBdqDXd1AfBrET/RjC3Xzfw5l7cBff9PwgR/dhHIdZy5/h0HgEB+Q/q1diQs02X2mzZYc9uVT6hQZT9tgCS8OgpWSc7Tjnt8q/237yFOTEPHtZDrLstq2W1zBp0/SkyaXJJEzfJRG5l3WE+IYpnW6LZY/8F26W92bzb9mOddUSjlsZd5Cv0pOgnJMsfbyx7aRvJ9vtcktJSjVJ2e4nVWMR0hwIZTaD5CMoTXN6qcRt6bAn+0uyWHbYkhQavAKhYczeRAtnWkOcmKeXZYilx7ZaXgNyG/tIkf6PHpP9raRQ32wzJZKkvHqJu4O39SDhHsIx8vwIHsP9eIrlATyLUziCNzGJk3gH7+IFvIf38RLO4QO8ho/wCdc/xUVMEGvc/rln+R/Y50gBeNpjYGRgYOBiMGCwY2BycfMJYeDLSSzJY5BiYAGKM/z/zwCSR2YzFhcbGDJwgFhAzMTAxsAHxCCeAESeQQOIOYCYD4gZGVYAMQuUZoBiRga2/5EQWQCheQynAAAAAQAB//8ACnjabZJNSJRRFIafc66REESbflCxsqEWCYHGOBGhzUJHMXFUcIKIxtW0m4ESCTRmIVGLYDZBq7BN07po0SzFVT8Yoo1kEC1y1yIMghb1fh+juJjFw3u+e+7hO+e9x3bAgrhDf3AuhhyTvs4Qq/TbA26LvP1g0I8wyCeO24s4N2D1f9v+nKTPMcFnMqxxwg8wpnsj0km/xrj/ptPf0uc1bvqm9L5YVlyUfhF36Qsb0nc6e9TQ99IqOV9hIBzivP+ks6WdLl/llGqP+VOG7Zn6qnNSmra/uEPFpxj2Bbo9pR7SjFmeXr+n+CHdluWy9XLWbyjO0BPqylXEuPJRje7ZIue8RIfunFF/HVbTf1KUpdOe4bq/Ju2vNCOUw2lu+UGmPMEV+y5voGQvyUgf8y3Wqv1SXYKrez40oaWVw3veRLM3IfJgP7EHi7HvyXjmJoQn0oYP+5EPR2Mvsrjo8pzOd31oRkHzzpKINKpTfCn27w/ToaZ89E6NN9HM+QYFsSXmxZIoilG/wFDY1u58JCXa2KDdiqREm80prrPgWe3VjDydkW8fSIYd7dIbemJfC+QpU6HEEvMU9VVli2W+MvofTN6I9wAAeNrtVdtu00AQfecrRn5AIPlOaAI47kOkCHhNQOJx4x3HW7wXdtdx/feMXdIGEtp+QF+89szO5Zw5GhfXt7KFA1ontFoGWZwGgKrSXKj9Mvi2XUeL4Lp8VUj0jDPP/r5aFp0SvzoUHAQn0yJP5++ixWyevY/yNJtleZ5FV/MsymZpnn0IICmLAyquLSgmcRl81tjWaOE1k+YTrC1ajL5qhS6AzrbLoPHefEySvu9jPxi9t8w0Q1xpOaVqRYXK4TNrP54w6XFXa+Ujp2vfM4tBuW2Eg+Mn0LtvEIzVBq0fQNdA3dftffcrHcMP3YFkAyjtodJmCEESlTWdXDhvxa7zGALB57pXrWaccp4UmVxCOc/aFoSHzmgFTA2USxoKtdOFRjs/emur5eRtdcU8DWWqb8GKfePBa+iIG/8vCNftbrCa/COeLVrpRjAbtAfiE9jeIkpUdKNhHvCWGnewQ98jKhgIIFP8AvQvNaGm7FVzkuIuOpzCjrycd1UTqBGH6azRDmNYk0HqsV9FPjmBC8G0yCj2IByBf/4gJ84qsjBCfd43YTxPAk/JqUj+iK8sOLrKCjP2+CKZF8k8IplTpRTjrCfay9XxDd6s3kKeplchPbP0QuX/QiiSh3yFt4yjZPZn+V14dETApiJ61YZsfhwog/srF0UZQt8ImsrI/w7B4p5mQruZ1ryCirTM6LzprHBcVCMcFxfJQ9XjYsantzxt8eT4byl/AwpvQnY=);
221
+ font-weight:300;
222
+ font-style:normal;
223
+ }
224
+ @font-face{
225
+ font-family: "Vitesse SSm B";
226
+ src: url(data:application/x-font-woff;base64,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);
227
+ font-weight:300;
228
+ font-style:normal;
229
+ }
230
+ @font-face{
231
+ font-family: "Vitesse SSm A";
232
+ src: url(data:application/x-font-woff;base64,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);
233
+ font-weight:400;
234
+ font-style:normal;
235
+ }
236
+ @font-face{
237
+ font-family: "Vitesse SSm B";
238
+ src: url(data:application/x-font-woff;base64,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);
239
+ font-weight:400;
240
+ font-style:normal;
241
+ }
242
+ @font-face{
243
+ font-family: "Vitesse SSm A";
244
+ src: url(data:application/x-font-woff;base64,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);
245
+ font-weight:500;
246
+ font-style:normal;
247
+ }
248
+ @font-face{
249
+ font-family: "Vitesse SSm B";
250
+ src: url(data:application/x-font-woff;base64,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);
251
+ font-weight:500;
252
+ font-style:normal;
253
+ }
254
+ @font-face{
255
+ font-family: "Vitesse SSm A";
256
+ src: url(data:application/x-font-woff;base64,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);
257
+ font-weight:700;
258
+ font-style:normal;
259
+ }
260
+ @font-face{
261
+ font-family: "Vitesse SSm B";
262
+ src: url(data:application/x-font-woff;base64,d09GRk9UVE8AABqeAAsAAAAAJCAAAQAAAAAYdAAAAioAAAaNAAAAAAAAAABDRkYgAAAH+AAAD7UAABKkgnZjRkdERUYAABewAAAAHQAAACAAYQAET1MvMgAAAWQAAABRAAAAYFa6OE9jbWFwAAAGRAAAAZ4AAAMmI+RwZWdhc3AAABfQAAAACAAAAAgAAAALaGVhZAAAAQgAAAA0AAAANgKd9nFoaGVhAAABPAAAAB8AAAAkBzMC4mhtdHgAABfYAAAAmgAAAMhxGwrdbWF4cAAAAVwAAAAGAAAABgA0UABuYW1lAAABuAAABIsAAAvEpmVPonBvc3QAAAfkAAAAEwAAACD/uAAyeNpjYGRgYGBkcPx1RvRkPL/NVwZu5hdAEYYLbDd9YPT/v/8tmIuZq4HqOBiYQKIAiJwNpXjaY2BkYGA+8F8ASC75//f/X+ZiBqAICjAAAKo/BxoAAABQAAA0AAB42mNgYopknMDAysDCtIepi4GBoQdCM95lMGL4xYAEFjAw1DswMHjB+B5qzvkMCgwqTMeZFf5bMJxgPsDwASg8GyTHpMi0ByinwMAIAOPdD4oAAAB42rVUwW7bRhAdWXJsJ7Hh+JhDsUADIykkWVQc28kpgAHDuUaGgRS9rMiVSEfkEsulFQI59Fj01FN76H/00G/oF/Rr+na4gik7sV0UFSHu29mZnfdmBiSiZ60/qEX17y3+NW7Rt9jVeIXWKPS4TYIuPO40fFZpk372+AFOfvN4jSb0u8frtNlqebzRwA9XtltbHj+infY3Hj9u4M2GzxZ91x54vN3g8KSBdxi3qdXZwO7H9vcet+ik/bfHK7TVER636W2n73Gn4bNKTzuZxw9ovfOTx2v0V+cXj9fp6eoPHm808MOOWL30+BE92/jV48cNvNnw2aKzjT893m5weNLAOw4f67wyyTS24vnxCzEcDA66eAcDcarVZKaM2BXHui9ia/M3e3vz+bxvq1xPjczjqh/qdDn+dPdYi89i2eW9mpYzaYKj4eDwZe9o/zB41UOK/WA4DHoHB4e9YH8wDF6fK1MkOhNBH4cnOrPniVVFocQoNEplo1QaK5JCSGGNjBS2H4WeLPPsinmchLFIZSXGShg1TQqrjIpEkolQGSuxXpQmKaIktMhW9Jfiz2IkKPTEzqVRLpmNlciNzhFa3cgmPuiSU2XaihCF6IpUR8kEa4S8JhmXVnWFNiLS82ymZYT7Ggn4KMkKK2czkVhR5pAvswp3pTlCDTvEurDudGJ0yqczHUrHnfMbUVffalGiVva6gKIcX6iQz52WM2XSwgkZKXOZhErIKYqbqgwesbRCfQLxArWzc9RcVBAos+ia7HcTKMbNKPRVeB3Z5ZBFTW4ymkCQ05CXJteF6osTGFLtuGY4S1lYV+QzJRF7mRQQ/tXZ25ur8QSD0lsqaAiLhOJlztB28wJx10zeDLk/GTomTTlVZCihKcVk8b17DusLrEMa4DmgrscB/oJOEaHwlZvhbbDfxd/d0sfq4i3ue0N7eOb89GGpYNO435AEirHv4wurKb01/ynudueCPuN/2y3vwWVKJThJnAZ0xHwP6SX1gPeBAnoFXKvYx3+IJ4DlAM8hVmcdsO01nbOyAow0ZcgcIE8decIWC48EbwWfAm9BI/AwQAqnI/BxLJySBOcCO8fesY7gUZ9+hE2jirfV09V9Dp0Jbo+BXWSFdcw5DWt2GSxHKtzuMjrGIVss/Ov9BWpj2Dfi26zXViDL1/OfcW6noGCuFmwkZ1oos/BwuxxW18c6a3UPbYI+YC0bqjLsLXOvJ6LLZ5oZT/w+8nqdljGinfIuZzN8qsEwQzbNta75fVnBVVTCdXC1muER3FmBu3PffYl35XmlsJa+3lc3xFgL32/3nnA10kasYxRit6j7lX7DnbyafcvzXvq5snd2oIDvGP1V3NVF/KIvZ8w0Zc+6IyO2XPIUKGY49ZOb8vRaHy0ZKfrkK174uXMM6jkXUFZ30KmM7uj2O86eMTvHuZ7oL2Vv5uw2slyfk/vUaOI7tOhDzhXPuV+KeZ14j5RX5eehjksbHetytFMmfd5Lzlp3/N9/9/a4jmPO5HT3bpnQ0PtI3+Pb6lz37T4MxH/+Tt4ny/9QmX8AiBdr+AB42q2S3UuUURDGn+dt1bRS11ZTs3X9NlERRCnoQgipoA8ERcULFUQEEalliZYliOgviOgqRM2QSAIRRJQIJXejJCrv5UUE7yNEcGc87vouGxQZOXBm5hmG85vzAeAE4qsINB6WzyjGtMtymRhCC1JwBSUoRyOacdnoVtzAbXShDwMYhR8B3EcQ45jGHL7gK/aYxRx6mMd8FrKSNaxlPRt4la28xlu8wzZ2sJPd7GEv+znMEY7yLv0MMMgQH1KtAivsfeR97H2iaqbwGXoDmnApRr+eRL/3Cz1i6LuG7v5v+qpDV1s3dF2/6zf9rBFd1WVd0Fl9q1M6qRM6rmP6QP06pB3arnVq7kx2ZUd+yg/Zli3ZFFs2ZE0+yUcJywdZkffyTpZkUeZN5Y28lml5JS9lUsbkhcxIbjQaHbSf28/sp/EX+Se7ieOzszgDMBV/HYNW/As55kpJTcPJdGSciuvTB87slZl1kGQn+tyHMScGS5gHyM3DOeQDBU7NW/EHdlVl9cUkWXT+d02FRzluMXwXSsvKSxxd6yR1+1cTnGIAAHjaY2BmAIP/WxmMGLAAACzCAeoAeNpVVwl4FFW2rm6o6koHG1ALR/1MIiiCS0AGVGQZcEEZRUERUVASk5C9k3S6sy/dVdXV3Tnppap6CUkISWchCYGwMzAK6NNB5Tkj+rnx1PeJ6PiWmXnzHLwFN77vnQbx+bpvOvfcuufcU+f8Z7kmZvJkxmQysasq7M7UZI4xjTFuNRkzzcbMScb1k1+YMslPN1+yXJrKkpem6rcwzNRL15Lj0xneZOKnZ961cFmzpyivorrMVZib53IWZOflVuYVO/Jc5VvLCupSVH5xgaOgurg6NS905NZc3uIsLsu/PHm4orLeUVxY5Mya8/DcrAXz5993N/7eOz/r8YoClODImp31cEV2VpHTWfngvHm1tbXZzvrKCpRTWVSfnVdRflnvlOL4x7AMM30SM8PE3GhibmWY2Qwz18TMY5jFDNPEMI8yzFqGedbEbGCYjQyziWFyGEZimGaGOcQw+83MUYY5bGaOMcxXDPOlmfmCYc4zTAvD+BmTj2UWmhkTs5xZyeSaFpuOm86ZKydlTBqYvJ7NZs9yZ7mvLTdbbrfMswQsKj+J9/Lj/BH+eNo9aYvSnkvLSytNa0yDtK60/WlvpH2Y9nUatU6x3mi9w7rQ+rj1eetWq91aY7vf9hvbY7bnbC/Z8rPR5oLhv9Q04ec+eEEgl4A+NnETSzdPPC7ARZmsmJjCkjpjigA/ynSFMYWteFoguINeAtZG37XRMfIkcQnHjNWwj84DKPj9xGo2b6lAZ5MsMttiO2fclC1896Hln2Ao0du7a1f8d/Cf8O+evZVDNb12fVOEz44C+e1uYIdB96leTQo3BB/iybWcn0wTx+wjrr5CfR3wL3x56wNruQ1Q6K6pKS11b4Z7IVvburOy1zUivarwX4lA1+UAawd3SNYk3b898BlPr+OCdLpeMFyRrN4nvQn86WyOZBpThZ3+uE+TY55gE+TARl+VJMmy6LcDn0NWc3Q5uU0QY4EuOARHQ4O6rml6cAj4A/QhrijMlofFoKTxtgvGExfXCnQNtwpKPFVV+fmNTwEtwdH19P68QceY+33gyRrufRiLDwwcONB1CkgJjsa38/Y7Bktiq4CnRRMfCGJUHgbyFA5tOBrV9Wh4D/LdzO2BqE+TYqJmB4qCn5LtHlGWRF8R8t3MFYEYlnTetoT8GzEJxnl6nYXOf3b3LDJlP0yU0lsBqMm4DYCYWHTAd0ZUaP+y5WD5cE1facdalLCRezplSZfd3pIfoNN5cgPX/pnapeEnGhmGFD0AHYrqjYqResiHPMUjt3pFUSxr5enmpeymuqrGuprSEs9WmMNTzhghzfQaOpWOD1jgd5HuREc02hPv0Xjy/Fn2RO/enu7+5Kg22P4xb/vkQ8MhkF9xwY8jnWhYPR4axONu4vohgcfpstoAL8IL3hpJ9HrdgSrUNXMmuY0bhLg/pY3aBI/Del+t6JHklkA1Pr6dc0BrSNJlzZcI/JmnKJreFM8bLetHnx9H2S7uJIzGksnBwZ4j8BcgTNnelZ180HK6a/ceuACfNR+yDyMUY8+hMDv3LBSJLldpibgxkMXbPjWyCCvQW7gqaAnLmqwq2wNneHoDB3RKvGDY3uc6IL6BZxRyb8LuRLJ/dFfHASDT0e6eI8W7q/uLo08CP5dbBy6xoIQXYRt5GAMMCDdRBtX0f4ipiD0xOqIeBP4sNwSdPl3SpWg9rIQVUp0oeuVmxQG87SvjZcMjoJH8f/McLcOIKI5iRNAV3GNQ5K6w5xfUrgb6CtCy7mcO5Pc7RlveQZU2oUr7tvUlR3d1H4bv4T9aDpWNVidLYmuQk+VeAqfnuS1Alsd2xuPoB3UUWaagmRP+lA7h5uDTPF1EnxIIyw3joiZdtv0aWOerRxiIrX7HZSBWQGvYE3PHvH1tZNpo14A+gvp+aKxKhUYBhmuxu7rabm/Mhwfg9r2lpxr4gGVlUznqysCC7txh+4Bjb+sJPLqUOw57E4MDw8Pdh+A8Oqn84GUnneoe3wV/hy+b9tuH0ZzxDXjqVnqNoKrRSErldG4UogicmKg2wwbYIDeIHln2pGKZpnPlIGI2EGNyN5yEk+q2WJSX6Zigqfpl5huRWVc0b9Sj1cGT8JTcKIrI7Esx35hiDkv43lIXvA3vaj2xGHriT2Sz0D4/vnmkPOna5Tn1U4jvjg8P79+/45+BvAKkrOHNvAOO/vKOlKU3cc9AQbPLWVbakAN0EsxJ5OwqHao8JL4N/N+5o5CMvX6kjc73VHhQbclbhiw3IdhSgJb0QML3Bo+IWSVQE2eHJgx5T0zpgvfg3XBvFD9Xg2cnJHwxT9ytudppRmmDQ8Y3sJG/XNz830IZNKteVdaUOHTyQCSVmB+AuvXsxmO1OuaSrdwmqJRqah2OetRvKtBp3TkDjh21g9JrwI9z47A9evK1/Vv2NL0K/FFMSoOx3t6hnd2vA5kH5Nmqb/P3l4wV7rgN1R7h0KdbXSXFBQWlS4CGcexasq9grHivizDAG8sOTTzALYTyjvKR4j2Oj4A04hj4aGz36OhQxzf4Gj3cFzDiHqocK+7/DdAngWZ5ttS4WltafKUo3n1YyOFcmN0lXYx6++Ab+Ebtw4SpxUN9wB/jdkCPd6CFpzUWR0ut4sT3P09uNs4JWVYbyb14O87OEzM9Rc3n6CO0gzxy7gp1fsK5gKNmcoqYF5IXSQd9ceEVaoHFhoVgiJiFW1FClfEOOn4mzpaTSbj2G9x0gjD3cWQKWRnHeKYr78Ocy5D3MLjNK4CuIiGykjR8nCLp4dSjT4GlPL3fndp1/ye4ztC3cN38CZAVVGZtRqZBhFlW25vGvTNIzvdLL7I0d9a/0Fnc6pPV8S3Ar8XUVOapri4ra9oC9AGgi7e9PFLeXz3ieQv4t7gjkIy//xY/b6/wNFeGyUqMNm/z7QTC4ggPbdsWjXaEEfN/wGgeEvfW83SPpbC+UkoBpZtUzCAPcm/ASDSZHB9PHAXyayALWo8WjjuT5dH1aP0HufVQJjqdRYWtLwFdAPTXiZf2FCado6nsZyeDApDrIz3RqKrpoVT5MCMkdb8mY/moA3o9DqU2FVuSvwKlmRHMUsiriVFlBzLyNnozCX0vkKOWw92jYUyGp8n1z3NboMKx/hn+c5o78yw9v3QW2fe9xVZ+2viVcJvV9kdjyYzb0R2fG27jiPAEVwlu2evg50zMEOFJchrd8A8aApj5Dvx1IptVqxJejJQvU/lNVwf4b8kFHb6lF1i1Oi4O/fRAVQf5vxrZ76RYFWR9D9bQ0x6Ya8xgEVkaliJbmGz9mzDbmup5phkVwqaJ1VCAgQD7Nhur2QNnBTKbZtHLPY8h3GElmzFR3YFKXouenWO1nTfuvgjoYrqYLkvh8jzpRnqOlQr0oSv0FcASSpYJc1P08ovt/yeHttIjqW0/w3LhxVtSgPmZpo24MOcXC/ciPfeXGz67mPFLvapIOx5wp5Wc+XFSCtxXjJpvHEiJvULQJ5Cac5XKRWLuVWK5cTCl1U/CfnIMmUuqhbusVy1Fnzf0FEk+RhMgJ1mH/5H+gQxuF+62at3CPda1h4Vsa+dK/FEmz7OS85GfZhOLPxZGNE9XmIsAtLXLvJaUuTYZ2hTgfdsTnAbBQNDN6zs2ytorMndGEuZZjefoSmHi24sHjW85OvvHdUIn6NH2bbzEtYmKLAHv8WqdXaqqZ+oQ8oVbeb0PH3lZX1gJycA3t7TWN8Td2zPptZ8L3kBE14KqGgkqkhRQlMy7lghJTRnY5lDkpOY9wXkCbKDd1+5HqaK3JbNNljWH1/JnWRjUpC4uGAmFg8C3WXyhQCgcCoUj/pCSoYDP75f4WL2s4t7G9wQVwjobUsJ+DfhEOBFNeHUx0wuKP+Dlh3CX5fcvCMjiU8I+LTMKETUc4ztG0SJaA4AcAalW3KEi5bhMsQAJZ9jTpiAHhEJtGr4UvYdcEMDZ2Zx0xbu1Lujmk62dDY3u1oaMN+gPggbtYRZVRAVS4kGDrmov6BAMBkMQhpA/5OO1Di8XUNhAyBdUQATFC15o7MfDIRAI+EEB3KTyMvcKuQEtngjFoxV7Kkbqu91upRmaoKzPiW1Bx50CZgCt1iKFFT1Dh3A4GOWVINumoBDg/W3BUOaODq0lbiEzyW+FaFOXZzvwO7GDGXX1VmQ6oK65sTowVBuvbFNjoTh08HtK9q95PDc3JwPssfpe14Z6exnkwoZX805h6757287RseI+9wgchj3jwbd4Och6Glpba6AWGhKO4c4dXR2dUZ4W0CahT/N1cmoojCr5fRn1PrlP8/ZYdL8qZsjg8/llPtZw2WGkdpOAPmlD8wYCvrA/rEQ0dC6ovKqoqc5DzgAl6A/75IBXQfNIqjcBKkSCKFoJtUXQrqFIUOOVdrbN19YWAPwGAwgO/Kp8ROOKKgWvL6xmQjgYCgYjCh7g9Qf8uBO7rXEhFsLl9jbIAGROAStTabaQG8ICbka4+f0Z4Av4/ahaIAQhbPTICaGrMdHU0dQzFul3JkVPs7uuhX+dfno1+mh1kTCsSdv76iUZ/x/UNTsn642uLpzI+iuSxdioXgagL+QPp2AcRl9n/pzTrgb2/894V2tZavVOJCPXG/8q6Ncx01L32jnMMqaO8ZuWmlpNQ6Y9phOmj8zTzXeY15hfNJeZW7AgU7NxhniojV5HG8km8ug/6KPkEeKkky3ERhwT72IBSTec32FlPUPN3004s7EanyFmS3oL0AIjj20eEbUSNJj3Sn3HpyexoBv3dXDI3cJuK49KY1ikMo1zqS7gNWr+mkuHyP1kMl0DoJBFdDKbDis07O67GnvlI16eLKpj+/1qIOLVvEEPlEFRQFS8ik/y1+Ix12Jf4g36Il61LRF4lacWLjg3WtHn7GrYJR/GczZzB6Bf6+5OJhPjcBY+8O6t3dHUWaPlRni6pIetDnmDqQ6tLQYjMBKMYsaJ6MEeZJzE9WAVRQgoISm4iSccF/hOGnb1NXZV6S/jwWu5XHBJDQ0uV3M+PMKnk9zvlxpraP7ML+jbXEFdVaoN3ILdgIgtuifq74R+3riGvjzzEzpugWVxvDv31g65jwF/ijsGfbEzf0ARZwmFryZKsTPZTCYD/BfZBPQsnYBFBuYbkkNxbRabTm4g1+AtKB07O7II90XQcvenzPZDJNVNpdMZ2OzSdFAuwJ9eY9P/CAOHv6hk97Z0+pLAb8fLXurOEYup3TDEv/uYxZGzeIjd2tEUwr6tnnOC2ytJHo/SAJWo0QxsoQj6Zyas2rjqODaZoLDp7R3eaDPwbryJtOpSR2YcU1dQxxSEqS+ABUL2h6KZ6ZGgT8ps5qII24x0xR9OxDENR0I+dysm1Mz0RDSaSIh6a6sotbZEpURm+v8CGwjSigAAAHjaY2BkYGDgA2IJBhBgYmAEQmMgZgHzGAAGewBmAAAAAAEAAf//AAp42lWMIQ7CQBBF38xKdBMMgmAISSuKAsEmhKQIUhSp4SxVaEwF2JJeAU7AeXAoSmC2CsSb+eL/J4/PWyKQKRu94PVKJi/mljM9sdQzK61Za8XCvncNO21IXJ9EalI3JtEnI2kp9WD7PV7uxBoz0yORqxjoljT4rVN0Pdv/Yp5ecBlDY9I5bftH8AVPSx7QW5dLcgq7xRcx7CpLAAB42u1V227TQBB95ytGfkAg+U5ICjjuQ6QIeE1A4nHjHcdbvBd213H994xd0gYS2n5AX7z2zM7lnDkaF9e3soUDWie0WgZZnAaAqtJcqP0y+LZdR1fBdfmqkOgZZ579fbUsOiV+dSg4CE6mqzxdvIuuZovsfZSn2SzL8yyazxdRNkvz7EMASVkcUHFtQTGJy+CzxrZGC6+ZNJ9gbdFi9FUrdAF0tl0GjffmY5L0fR/7wei9ZaYZ4krLKVUrKlQOn1n78YRJj7taKx85XfueWQzKbSMcHD+B3n2DYKw2aP0Augbqvm7vu1/pGH7oDiQbQGkPlTZDCJKorOnkwnkrdp3HEAg+171qNeOU86TI5BLKeda2IDx0RitgaqBc0lConS402vnRW1stJ2+rK+ZpKFN9C1bsGw9eQ0fc+H9BuG53g9XkH/Fs0Uo3gtmgPRCfwPYWUaKiGw3zgLfUuIMd+h5RwUAAmeIXoH+pCTVlr5qTFHfR4RR25OW8q5pAjThMZ412GMOaDFKP/SryyQlcCKZFRrEH4Qj88wc5cVaRhRHq874J43kSeEpORfJHfGXB0VVWmLHHF8m8SOYRyZwqpRhnPdFero5v8Gb1FvI0nYf0zNILlf8LoUge8hXeMo6S2Z/ld+HREQGbiuhVG7L5caAM7q9cFGUIfSNoKiP/OwSLe5oJ7WZa8woq0jKj86azwnFRjXBcXCQPVY+LGZ/e8rTFk+O/pfwNXDJCig==);
263
+ font-weight:700;
264
+ font-style:normal;
265
+ }
266
+
267
+ @font-face {
268
+ font-family: 'icomoon';
269
+ src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SAyoAAAC8AAAAYGNtYXAaVcxXAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zoivo+IAAAFwAAABZGhlYWQEmpKLAAAC1AAAADZoaGVhB8IDxgAAAwwAAAAkaG10eAYAAAAAAAMwAAAAFGxvY2EAKADGAAADRAAAAAxtYXhwAAsAYQAAA1AAAAAgbmFtZVcZpu4AAANwAAABRXBvc3QAAwAAAAAEuAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADmAAPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOYA//3//wAAAAAAIOYA//3//wAB/+MaBAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAABQAAAIAEAAMgABwAIAA+AEIAXgAAASEiBgcOARURFBYXHgEzITI2Nz4BNRE0JicuASMFFwcRARQGBw4BIyEiJicuATU3Fx4BFx4BMzI2Nz4BPwEXNSc3ESUOAQcOASMiJicuAScBNDY3PgEzITIWFx4BFQEDgP0AGy4SERQUERIuGwMAGy4SERQUERIuG/zA4OADgAoJCBgN/QANGAgJCvuLBw4HBw8ICA8HBw4Hi/vg4P5mBAkFBQoFBQoFBQkE/mYKCQgYDQMADRgICQr+ZgMgFBIRLxr+YBsuEhEUFBESLhsBoBovERIUqKioAVD+iA0YCAkKCgkIGA28aQUHAgMCAgMCBwVpvCioqP6wRQMFAgECAgECBQMBMw0YCAkKCgkIGA3+zQABAAAAAQAABq61Zl8PPPUACwQAAAAAANC+JzcAAAAA0L4nNwAAAAAEAAMgAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAQAAAEAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAgAAAAQAAAAAAAAAAAoAFAAeALIAAQAAAAUAXwAFAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAA4AAAABAAAAAAACAA4ARwABAAAAAAADAA4AJAABAAAAAAAEAA4AVQABAAAAAAAFABYADgABAAAAAAAGAAcAMgABAAAAAAAKADQAYwADAAEECQABAA4AAAADAAEECQACAA4ARwADAAEECQADAA4AJAADAAEECQAEAA4AVQADAAEECQAFABYADgADAAEECQAGAA4AOQADAAEECQAKADQAYwBpAGMAbwBtAG8AbwBuAFYAZQByAHMAaQBvAG4AIAAxAC4AMABpAGMAbwBtAG8AbwBuaWNvbW9vbgBpAGMAbwBtAG8AbwBuAFIAZQBnAHUAbABhAHIAaQBjAG8AbQBvAG8AbgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format('truetype'),
270
+ url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAUkAAsAAAAABNgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDxIDKmNtYXAAAAFoAAAATAAAAEwaVcxXZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAAAWQAAAFkiK+j4mhlYWQAAAMgAAAANgAAADYEmpKLaGhlYQAAA1gAAAAkAAAAJAfCA8ZobXR4AAADfAAAABQAAAAUBgAAAGxvY2EAAAOQAAAADAAAAAwAKADGbWF4cAAAA5wAAAAgAAAAIAALAGFuYW1lAAADvAAAAUUAAAFFVxmm7nBvc3QAAAUEAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA5gADwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDmAP/9//8AAAAAACDmAP/9//8AAf/jGgQAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAUAAACABAADIAAcACAAPgBCAF4AAAEhIgYHDgEVERQWFx4BMyEyNjc+ATURNCYnLgEjBRcHEQEUBgcOASMhIiYnLgE1NxceARceATMyNjc+AT8BFzUnNxElDgEHDgEjIiYnLgEnATQ2Nz4BMyEyFhceARUBA4D9ABsuEhEUFBESLhsDABsuEhEUFBESLhv8wODgA4AKCQgYDf0ADRgICQr7iwcOBwcPCAgPBwcOB4v74OD+ZgQJBQUKBQUKBQUJBP5mCgkIGA0DAA0YCAkK/mYDIBQSES8a/mAbLhIRFBQREi4bAaAaLxESFKioqAFQ/ogNGAgJCgoJCBgNvGkFBwIDAgIDAgcFabwoqKj+sEUDBQIBAgIBAgUDATMNGAgJCgoJCBgN/s0AAQAAAAEAAAautWZfDzz1AAsEAAAAAADQvic3AAAAANC+JzcAAAAABAADIAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAIAAAAEAAAAAAAAAAAKABQAHgCyAAEAAAAFAF8ABQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('woff');
271
+ font-weight: normal;
272
+ font-style: normal;
273
+ }
274
+
275
+ @font-face {
276
+ font-family: 'icomoon';
277
+ src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg6SB64AAAC8AAAAYGNtYXAV0dVfAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5ZtfJqkcAAAFwAAABCGhlYWQEmNpPAAACeAAAADZoaGVhB8IDxgAAArAAAAAkaG10eAYAAAAAAALUAAAAFGxvY2EAKACYAAAC6AAAAAxtYXhwAAkAQQAAAvQAAAAgbmFtZVcZpu4AAAMUAAABRXBvc3QAAwAAAAAEXAAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADqhAPA/8D/wAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIOqE//3//wAAAAAAIOqE//3//wAB/+MVgAADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAwAA/8AEAAPAABwALAA+AAABISIGBw4BFREUFhceATMhMjY3PgE1ETQmJy4BIxUyFhcyFhcJAT4BMz4BMyEBKgEjEycHEQkBEScHEyoBIyEDVf1WJD4XFxsbFxc+JAKqJD4XFxsbFxc+JAMGAwMFAv6V/pUCBQMDBgMCqv1WAgMB4h7pAYABgOke4gEDAv1WA8AbFxc+JP1WJD4XFxsbFxc+JAKqJD4XFxuAAQEDAf7TAS0BAwEB/QABOR7qAmP+MAHQ/Z3qHv7HAAAAAQAAAAEAAHKKAXhfDzz1AAsEAAAAAADQvMrpAAAAANC8yukAAP/ABAADwAAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAAEAAABAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAIAAAAEAAAAAAAAAAAKABQAHgCEAAEAAAAFAD8AAwAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAOAAAAAQAAAAAAAgAOAEcAAQAAAAAAAwAOACQAAQAAAAAABAAOAFUAAQAAAAAABQAWAA4AAQAAAAAABgAHADIAAQAAAAAACgA0AGMAAwABBAkAAQAOAAAAAwABBAkAAgAOAEcAAwABBAkAAwAOACQAAwABBAkABAAOAFUAAwABBAkABQAWAA4AAwABBAkABgAOADkAAwABBAkACgA0AGMAaQBjAG8AbQBvAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADAAaQBjAG8AbQBvAG8Abmljb21vb24AaQBjAG8AbQBvAG8AbgBSAGUAZwB1AGwAYQByAGkAYwBvAG0AbwBvAG4ARgBvAG4AdAAgAGcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAASQBjAG8ATQBvAG8AbgAuAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) format('truetype'),
278
+ url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAATIAAsAAAAABHwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABCAAAAGAAAABgDpIHrmNtYXAAAAFoAAAATAAAAEwV0dVfZ2FzcAAAAbQAAAAIAAAACAAAABBnbHlmAAABvAAAAQgAAAEI18mqR2hlYWQAAALEAAAANgAAADYEmNpPaGhlYQAAAvwAAAAkAAAAJAfCA8ZobXR4AAADIAAAABQAAAAUBgAAAGxvY2EAAAM0AAAADAAAAAwAKACYbWF4cAAAA0AAAAAgAAAAIAAJAEFuYW1lAAADYAAAAUUAAAFFVxmm7nBvc3QAAASoAAAAIAAAACAAAwAAAAMEAAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAA6oQDwP/A/8ADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAgAAAAMAAAAUAAMAAQAAABQABAA4AAAACgAIAAIAAgABACDqhP/9//8AAAAAACDqhP/9//8AAf/jFYAAAwABAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAMAAP/ABAADwAAcACwAPgAAASEiBgcOARURFBYXHgEzITI2Nz4BNRE0JicuASMVMhYXMhYXCQE+ATM+ATMhASoBIxMnBxEJAREnBxMqASMhA1X9ViQ+FxcbGxcXPiQCqiQ+FxcbGxcXPiQDBgMDBQL+lf6VAgUDAwYDAqr9VgIDAeIe6QGAAYDpHuIBAwL9VgPAGxcXPiT9ViQ+FxcbGxcXPiQCqiQ+FxcbgAEBAwH+0wEtAQMBAf0AATke6gJj/jAB0P2d6h7+xwAAAAEAAAABAAByigF4Xw889QALBAAAAAAA0LzK6QAAAADQvMrpAAD/wAQAA8AAAAAIAAIAAAAAAAAAAQAAA8D/wAAABAAAAAAABAAAAQAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAACAAAABAAAAAAAAAAACgAUAB4AhAABAAAABQA/AAMAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADgAAAAEAAAAAAAIADgBHAAEAAAAAAAMADgAkAAEAAAAAAAQADgBVAAEAAAAAAAUAFgAOAAEAAAAAAAYABwAyAAEAAAAAAAoANABjAAMAAQQJAAEADgAAAAMAAQQJAAIADgBHAAMAAQQJAAMADgAkAAMAAQQJAAQADgBVAAMAAQQJAAUAFgAOAAMAAQQJAAYADgA5AAMAAQQJAAoANABjAGkAYwBvAG0AbwBvAG4AVgBlAHIAcwBpAG8AbgAgADEALgAwAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG4AUgBlAGcAdQBsAGEAcgBpAGMAbwBtAG8AbwBuAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');
279
+ font-weight: normal;
280
+ font-style: normal;
281
+ }
282
+
283
+ .icon-mail2:before {
284
+ content: "\e600";
285
+ font-size: 18px;
286
+ }
287
+
288
+ [class^="icon-"], [class*=" icon-"] {
289
+ font-family: 'icomoon';
290
+ speak: none;
291
+ font-style: normal;
292
+ font-weight: normal;
293
+ font-variant: normal;
294
+ text-transform: none;
295
+ line-height: 1;
296
+ /* Better Font Rendering =========== */
297
+ -webkit-font-smoothing: antialiased;
298
+ -moz-osx-font-smoothing: grayscale;
299
+ }
300
+ .icon-mail2.yp-icon:before
301
+ {
302
+ font-size: 15px;
303
+ }
304
+
305
+ .yp-icon
306
+ {
307
+ display: table-cell;
308
+ vertical-align: middle;
309
+ padding: 2px 5px 0px 2px;
310
+ }
311
+
312
+ .yp-email-field
313
+ {
314
+ display: table
315
+ }
316
+
317
+ .yp-email-addr
318
+ {
319
+ display: table-cell;
320
+ vertical-align: middle;
321
+ }
322
+
skin/frontend/base/default/images/bitcoin/bitcoin_accepted.png ADDED
Binary file